#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerRecover  
 | 
#  
 | 
# @todo:×ÊÔ´ÕÒ»Ø  
 | 
# @author xdh  
 | 
# @date 2018-01-10 22:20  
 | 
# @version 1.0  
 | 
#  
 | 
#  
 | 
# ÏêϸÃèÊö: ×ÊÔ´ÕÒ»Ø  
 | 
#---------------------------------------------------------------------  
 | 
#"""Version = 2018-01-10 22:20"""  
 | 
#---------------------------------------------------------------------  
 | 
import GameWorld  
 | 
import FormulaControl  
 | 
import PlayerControl  
 | 
import ChConfig  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
import IPY_GameWorld  
 | 
import ShareDefine  
 | 
import ItemControler  
 | 
import DataRecordPack  
 | 
import ItemCommon  
 | 
import IpyGameDataPY  
 | 
import FBCommon  
 | 
import GameFuncComm  
 | 
import PlayerTJG  
 | 
import PlayerActivity  
 | 
import PlayerSuccess  
 | 
import PyGameData  
 | 
  
 | 
import copy  
 | 
import datetime  
 | 
  
 | 
(  
 | 
RecoverWay1, #°óÓñÕÒ»Ø  
 | 
RecoverWay2, #ÍÇ®ÕÒ»Ø  
 | 
) = range(2)  
 | 
  
 | 
Def_TJGRecoverID = 1 #ÍÑ»ú¹ÒÕÒ»ØË÷ÒýID  
 | 
Def_QueenRelics = 11 #æ´»ÊÒż£ÕÒ»ØË÷ÒýID  
 | 
## OnDay´¦Àí  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def RecoverOnDay(curPlayer):  
 | 
    AddRecoverTimes(curPlayer)  
 | 
    curTime = GameWorld.GetCurrentTime()  
 | 
      
 | 
    curTimeNum = GameWorld.ChangeTimeStrToNum(str(curTime)[:10], ChConfig.TYPE_Time_Format_Day)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverGainLastTime, curTimeNum)  
 | 
    return  
 | 
  
 | 
## OnLogin´¦Àí  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def RecoverOnLogin(curPlayer):  
 | 
    __NotifyRecoverNum(curPlayer)  
 | 
    return  
 | 
  
 | 
  
 | 
#Ôö¼Ó¿ÉÕһشÎÊý  
 | 
def AddRecoverTimes(curPlayer):  
 | 
    playerLV = curPlayer.GetLV()  
 | 
    if playerLV <= 1: #¸Õ´´½Ç²»Ôö¼Ó´ÎÊý  
 | 
        return  
 | 
    lostOnDayNum = __GetLastRecoverPastDay(curPlayer)  
 | 
    lostOnDayNum = max(0, lostOnDayNum - 1)  
 | 
    GameWorld.DebugLog('    Ôö¼Ó¿ÉÕһشÎÊý lostOnDayNum=%s'%lostOnDayNum)  
 | 
    recoverNumList = []  
 | 
    curTime = GameWorld.GetCurrentTime()  
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
    for i in xrange(ipyDataMgr.GetResourcesBackCount()):  
 | 
        recoverData = ipyDataMgr.GetResourcesBackByIndex(i)  
 | 
        index = recoverData.GetID()  
 | 
        if index == Def_TJGRecoverID:  
 | 
            continue  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HaveRecover % index, 0)  
 | 
        relatedID = recoverData.GetRelatedID()  
 | 
        dailyQuestData = IpyGameDataPY.GetIpyGameDataNotLog('DailyQuest', relatedID)  
 | 
        if not dailyQuestData:  
 | 
            continue  
 | 
        unLockFuncID = dailyQuestData.GetUnLockFuncID()  
 | 
        if unLockFuncID and not GameFuncComm.GetFuncCanUse(curPlayer, unLockFuncID):  
 | 
            continue  
 | 
          
 | 
        if dailyQuestData.GetRelatedType() == 2: #¸±±¾Àà  
 | 
            dataMapID = dailyQuestData.GetRelatedID()  
 | 
            fbIpyData = FBCommon.GetFBIpyData(dataMapID)  
 | 
            if not fbIpyData:  
 | 
                continue  
 | 
            maxTimes = fbIpyData.GetDayTimes()  
 | 
            if not maxTimes:  
 | 
                #ûÓÐÿÈÕ¿ÉÌôÕ½´ÎÊý  
 | 
                continue  
 | 
            historyMaxLine = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBHistoryMaxLine % dataMapID)  
 | 
            if dataMapID in ChConfig.Def_UnRecoverNoPassMap and not historyMaxLine:  
 | 
                #ûͨ¹Ø¹ýµÄÌØÊ⸱±¾²»¿ÉÕÒ»Ø  
 | 
                continue  
 | 
  
 | 
            remainInfo, limitInfo = FBCommon.GetFBDetailCntInfo(curPlayer, dataMapID)  
 | 
            rCommonCnt, rExtraCnt, rBuyCnt, rItemAddCnt, noBuyCnt = remainInfo  
 | 
            rCommonCntlimit, rExtraCntlimit, rBuyCntlimit, rItemAddCntlimit, noBuyCntlimit = limitInfo  
 | 
            if max(remainInfo) == 0 and not lostOnDayNum:  
 | 
                continue  
 | 
            #ÏÞʱ»î¶¯Åжϵ±ÌìÊÇ·ñÓпªÆô  
 | 
            if dataMapID in PyGameData.FBEnterTimeLimiitMapID:  
 | 
                fbOpenCnt = __GetLimitFBCnt(curPlayer, lostOnDayNum+1, dataMapID)  
 | 
                if not fbOpenCnt:  
 | 
                    continue  
 | 
                addCommonCnt = rCommonCnt + (fbOpenCnt-1)*rCommonCntlimit  
 | 
            else:  
 | 
                addCommonCnt = rCommonCnt + lostOnDayNum * rCommonCntlimit  
 | 
              
 | 
            addExtraCnt = rExtraCnt + lostOnDayNum * rExtraCntlimit  
 | 
            addBuyCnt = rBuyCnt  
 | 
            addItemAddCnt = rItemAddCnt #ʹÓÃÎïÆ·Ôö¼ÓµÄ´ÎÊý  
 | 
            addnoBuyCnt = noBuyCnt + lostOnDayNum * noBuyCntlimit  
 | 
              
 | 
              
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverGainData % index, historyMaxLine)  
 | 
            if dataMapID == ChConfig.Def_FBMapID_MunekadoTrial:  
 | 
                historyStar = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, historyMaxLine-1, False, [dataMapID])  
 | 
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverGainDataEx % index, historyStar)  
 | 
              
 | 
            #¸üпÉÕһشÎÊý  
 | 
            curCommonCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBCommonCnt % index, 0)  
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverFBCommonCnt % index,  
 | 
                                               min(addCommonCnt + curCommonCnt, rCommonCntlimit * 2))  
 | 
            curExtraCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBExtraCnt % index, 0)  
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverFBExtraCnt % index,  
 | 
                                               min(addExtraCnt + curExtraCnt, rExtraCntlimit * 2))  
 | 
            curBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBBuyCnt % index, 0)  
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverFBBuyCnt % index,  
 | 
                                               min(addBuyCnt + curBuyCnt, rBuyCntlimit * 2))  
 | 
            curItemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBItemAddCnt % index, 0)  
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverFBItemAddCnt % index,  
 | 
                                               min(addItemAddCnt + curItemAddCnt, rItemAddCntlimit * 2))  
 | 
            curnoBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBNoBuyCnt % index, 0)  
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverFBNoBuyCnt % index,  
 | 
                                               min(addnoBuyCnt + curnoBuyCnt, noBuyCntlimit * 2))  
 | 
            GameWorld.DebugLog('Ôö¼ÓÕһشÎÊýindex=%s,addCommonCnt=%s,addExtraCnt=%s,addBuyCnt=%s,addItemAddCnt=%s,addnoBuyCnt=%s'  
 | 
                               % (index, addCommonCnt, addExtraCnt, addBuyCnt, addItemAddCnt, addnoBuyCnt))  
 | 
              
 | 
              
 | 
            recoverNumList.append(index)  
 | 
        elif dailyQuestData.GetRelatedType() == 1:#ÿÈջ  
 | 
            dailyID = dailyQuestData.GetRelatedID()  
 | 
            curDayTimes, dayTimesLimit = PlayerActivity.GetDailyActionFinishCnt(curPlayer, dailyID)  
 | 
            if dailyID == ShareDefine.DailyActionID_Dice:#ÎÒҪ̫¼«Ö»·ÖÊÇ·ñ²Î¼Ó¹ý£¬Ã»²Î¼Ó¹ý²ÅÄÜÕһأ¬´ÎÊýËã1´Î  
 | 
                dayTimesLimit = 1  
 | 
                if curDayTimes:  
 | 
                    curDayTimes = dayTimesLimit  
 | 
                  
 | 
            if curDayTimes >= dayTimesLimit and not lostOnDayNum:  
 | 
                continue  
 | 
            addCommonCnt = (dayTimesLimit - curDayTimes) + lostOnDayNum * dayTimesLimit  
 | 
            if addCommonCnt <=0:  
 | 
                continue  
 | 
            curCommonCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBCommonCnt % index, 0)  
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverFBCommonCnt % index,  
 | 
                                               min(addCommonCnt + curCommonCnt, dayTimesLimit * 2))  
 | 
            recoverNumList.append(index)  
 | 
            GameWorld.DebugLog('Ôö¼ÓÕһشÎÊýindex=%s,addCommonCnt=%s'  
 | 
                               % (index, addCommonCnt))  
 | 
          
 | 
    __NotifyRecoverNum(curPlayer)  
 | 
    return  
 | 
  
 | 
  
 | 
  
 | 
## »ñÈ¡µ±Ç°¾àÀëÉÏÒ»´ÎÔö¼Ó×ÊÔ´ÕһصÄÌìÊý  
 | 
def __GetLastRecoverPastDay(curPlayer):  
 | 
    recoverGainLastTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverGainLastTime, 0)  
 | 
    if not recoverGainLastTime:  
 | 
        return 0  
 | 
      
 | 
    curTime = GameWorld.ChangeTimeStrToNum(GameWorld.GetCurrentDataTimeStr())  
 | 
    passTick = max(0, curTime - recoverGainLastTime)  
 | 
    pastDay = passTick / 3600 / 24  
 | 
    return pastDay  
 | 
  
 | 
def __GetLimitFBCnt(curPlayer, pastDay, dataMapID):  
 | 
    # »ñÈ¡ÏÞʱ¸±±¾ÔÚ¼¸Ììǰ¹²¿ªÆôÁ˼¸´Î  
 | 
    if not pastDay:  
 | 
        return 0  
 | 
    curTime = GameWorld.GetCurrentTime()  
 | 
    fbOpenCnt = 0  
 | 
    for diffDays in range(pastDay):  
 | 
        timeData = curTime - datetime.timedelta(days = diffDays+1)  
 | 
        dayStr = '%02d%02d'%(timeData.month, timeData.day)  
 | 
        #GameWorld.DebugLog('    dataMapID=%s,pastDay=%s,dayStr=%s'%(dataMapID, pastDay, dayStr))  
 | 
        if not FBCommon.GetFBHasOpenToday(dataMapID, dayStr):  
 | 
            continue  
 | 
        fbOpenCnt += 1  
 | 
    #GameWorld.DebugLog('    111111111111dataMapID=%s,fbOpenCnt=%s'%(dataMapID,fbOpenCnt))  
 | 
    return fbOpenCnt  
 | 
  
 | 
#// A5 53 ×ÊÔ´Õһؠ#tagCMRecoverGain  
 | 
#  
 | 
#struct    tagCMRecoverGain  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        Type;    // Õһط½Ê½ 0 ÏÉÓñ 1ÍÇ®  
 | 
#    BYTE        Cnt;      
 | 
#    BYTE        IndexList[Cnt];    // ÕÒ»ØË÷ÒýÁÐ±í  
 | 
#    BYTE        RecoverCntList[Cnt];    // Ë÷Òý¶ÔÓ¦ÕһشÎÊýÁÐ±í  
 | 
#};  
 | 
def OnRecoverGain(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
      
 | 
    GameWorld.DebugLog("==[PlayerRecover]== In->OnRecoverGain(), Name:%s" % curPlayer.GetPlayerName())  
 | 
      
 | 
    recoverWay = clientData.Type  
 | 
    if recoverWay not in [0, 1]:  
 | 
        GameWorld.DebugLog("OnRecoverGain() hasn't recover way(%s)" % recoverWay)  
 | 
        return  
 | 
    if not clientData.Cnt:  
 | 
        return  
 | 
    recoverIndexList = clientData.IndexList  
 | 
    recoverCntList = clientData.RecoverCntList  
 | 
    costMoneyDict = {}  
 | 
    recoverCntDict = {}  
 | 
    mapIDInfo = []  
 | 
    totalExp, totalSP, totalMoney, totalItemDict = 0, 0, 0, {}  
 | 
    for i, index in enumerate(recoverIndexList):  
 | 
        if index == Def_TJGRecoverID:  
 | 
            recoverCnt = 1  
 | 
        else:  
 | 
            recoverCnt = recoverCntList[i]  
 | 
        ipyData = IpyGameDataPY.GetIpyGameData('ResourcesBack', index)  
 | 
        if not ipyData:  
 | 
            continue  
 | 
          
 | 
        costMoneyList, recoverCnt = __GetRecoverCost(curPlayer, recoverWay, recoverCnt, ipyData)  
 | 
        if not costMoneyList:  
 | 
            continue  
 | 
        for moneyType, moneyCnt in costMoneyList:  
 | 
            costMoneyDict[moneyType] = costMoneyDict.get(moneyType, 0) + moneyCnt  
 | 
        #½±Àø  
 | 
        if ipyData.GetCanBackTimes() and recoverWay == RecoverWay1:  
 | 
            dataMapID = __DoLogicBackTimes(curPlayer, ipyData, recoverCnt)  
 | 
            if dataMapID:  
 | 
                mapIDInfo.append(dataMapID)  
 | 
        else:  
 | 
            exp, sp, money, itemDict = __GetRecoverGain(curPlayer, recoverWay, recoverCnt, ipyData)  
 | 
            totalExp += exp  
 | 
            totalSP += sp  
 | 
            totalMoney += money  
 | 
            for itemID, itemCnt in itemDict.items():  
 | 
                totalItemDict[itemID] = totalItemDict.get(itemID, 0) + itemCnt  
 | 
        recoverCntDict[index] = recoverCnt  
 | 
          
 | 
    if not recoverCntDict:  
 | 
        return  
 | 
      
 | 
    infoDict = {ChConfig.Def_Cost_Reason_SonKey:recoverWay}  
 | 
    for moneyType, moneyCnt in costMoneyDict.items():  
 | 
        costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, moneyType, moneyCnt)  
 | 
        GameWorld.DebugLog('    moneyType=%s,moneyCnt=%s,costMoneyList=%s'%(moneyType, moneyCnt, costMoneyList))  
 | 
        if not costMoneyList:  
 | 
            return  
 | 
        for mType, mCnt in costMoneyList:  
 | 
            PlayerControl.PayMoney(curPlayer, mType, mCnt, ChConfig.Def_Cost_RecoverGain, infoDict)  
 | 
          
 | 
          
 | 
    if totalExp > 0:  
 | 
        PlayerControl.PlayerControl(curPlayer).AddExp(totalExp)  
 | 
          
 | 
    if totalMoney > 0:  
 | 
        PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, totalMoney, ChConfig.Def_GiveMoney_Recover)  
 | 
          
 | 
    if totalSP > 0:  
 | 
        PlayerControl.PlayerAddZhenQi(curPlayer, totalSP, True, True, "Recover")  
 | 
      
 | 
      
 | 
    if totalItemDict:  
 | 
        emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem)  
 | 
        if len(totalItemDict) > emptySpace:  
 | 
            #Óʼþ  
 | 
            prizeItemList = [[itemID, itemCnt, 1] for itemID, itemCnt in totalItemDict.items()]  
 | 
            PlayerControl.SendMailByKey('', [curPlayer.GetPlayerID()], prizeItemList)  
 | 
              
 | 
        else:  
 | 
            for itemID, itemCnt in totalItemDict.items():   
 | 
                ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])  
 | 
    if Def_TJGRecoverID in recoverCntDict:  
 | 
        #ÍÑ»ú¹Ò¾ÑéÕһغóÖØÖà  
 | 
        PlayerTJG.ResetTJGDeadInfo(curPlayer)  
 | 
    if Def_QueenRelics in recoverCntDict:  
 | 
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_QueenRelicsEx, recoverCntDict[Def_QueenRelics])  
 | 
    DataRecordPack.DR_PlayerRecover(curPlayer, recoverWay, recoverCntDict, totalExp, totalMoney, totalSP, totalItemDict)          
 | 
    __SetRecoverNum(curPlayer, recoverCntDict)  
 | 
    __NotifyRecoverNum(curPlayer)  
 | 
    if mapIDInfo:  
 | 
        FBCommon.Sync_FBPlayerFBInfoData(curPlayer, mapIDInfo)  
 | 
    GameWorld.DebugLog("==[PlayerRecover]== Out->OnRecoverGain() recoverWay=%s, costMoneyDict=%s, recoverCntDict=%s, totalExp=%s, totalMoney=%s, totalSP=%s, totalItemDict=%s" % (recoverWay, costMoneyDict, recoverCntDict, totalExp, totalMoney, totalSP, totalItemDict))  
 | 
    return  
 | 
  
 | 
def __DoLogicBackTimes(curPlayer, recoverData, recoverCnt):  
 | 
    #¸±±¾»ò»î¶¯»Ö¸´´ÎÊý  
 | 
    relatedID = recoverData.GetRelatedID()  
 | 
    dailyQuestData = IpyGameDataPY.GetIpyGameData('DailyQuest', relatedID)  
 | 
    if not dailyQuestData:  
 | 
        return 0  
 | 
    if dailyQuestData.GetRelatedType() == 2: #¸±±¾Àà  
 | 
        dataMapID = dailyQuestData.GetRelatedID()  
 | 
        recoverFbCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RecoverFbCnt % dataMapID)  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RecoverFbCnt % dataMapID, recoverFbCnt + recoverCnt)  
 | 
    else:  
 | 
        return 0  
 | 
    return dataMapID  
 | 
  
 | 
## »ñÈ¡ÏûºÄ  
 | 
#  @param curPlayer  
 | 
#  @param recoverWay Õһط½Ê½  
 | 
#  @param recoverIndex ÕÒ»ØË÷Òý  
 | 
#  @return ½ðÇ®ÀàÐÍ,½ðÇ®ÊýÁ¿,ÕÒ»Ø°Ù·Ö±È  
 | 
def __GetRecoverCost(curPlayer, recoverWay, recoverCnt, ipyData):  
 | 
    index = ipyData.GetID()  
 | 
    if index != Def_TJGRecoverID:  
 | 
        commonCnt, vipExtraCnt = __GetCanRecoverCnt(curPlayer, index)  
 | 
        recoverCnt = min(recoverCnt, commonCnt + vipExtraCnt)  
 | 
      
 | 
    recoverSecond = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TJGDeadPayTime) #¿ÉÕһضàÉÙÃëµÄÍÑ»ú¹Ò¾Ñé  
 | 
    if recoverWay == RecoverWay1: #°óÓñ+ÏÉÓñ  
 | 
        normalCostJade = ipyData.GetNormalCostJade()  
 | 
        vipCostJade = ipyData.GetVipCostJade()  
 | 
        if index == Def_TJGRecoverID:  
 | 
            costMoney = int(normalCostJade * recoverSecond / float(3600))  
 | 
        else:  
 | 
            costMoney = min(commonCnt, recoverCnt) * normalCostJade + vipCostJade * max(0, recoverCnt - commonCnt)  
 | 
        costMoneyList = [[ShareDefine.TYPE_Price_Gold_Paper_Money, costMoney]]  
 | 
    else:  
 | 
        costCopper = ipyData.GetCostCopper()  
 | 
        if index == Def_TJGRecoverID:  
 | 
            costMoney = int(costCopper * recoverSecond / float(3600))  
 | 
        else:  
 | 
            costMoney = recoverCnt * costCopper  
 | 
          
 | 
        costMoneyList = [[IPY_GameWorld.TYPE_Price_Silver_Money, costMoney]]  
 | 
          
 | 
    return costMoneyList, recoverCnt  
 | 
  
 | 
def __GetCanRecoverCnt(curPlayer, index):  
 | 
    #»ñÈ¡¿ÉÕÒ»ØÆÕͨ´ÎÊý£¬vip´ÎÊý  
 | 
    curCommonCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBCommonCnt % index, 0)  
 | 
    curExtraCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBExtraCnt % index, 0)  
 | 
    curBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBBuyCnt % index, 0)  
 | 
    curItemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBItemAddCnt % index, 0)  
 | 
    curnoBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBNoBuyCnt % index, 0)  
 | 
    return curCommonCnt + curExtraCnt + curBuyCnt + curItemAddCnt, curnoBuyCnt  
 | 
  
 | 
def __SetRecoverNum(curPlayer, recoverCntDict):  
 | 
    #¸üÐÂÕһشÎÊý  
 | 
    #ÿÈÕˢдÎÊý£¾VipÂò»ØÀ´Ã»ÓõĴÎÊý£¾¾íÖá¼ÓµÄûÓõĴÎÊý£¾Vip¶îÍâ´ÎÊý£¾Vip¿É¹ºÂòµ«Î´Âò´ÎÊý  
 | 
  
 | 
    for index, recoverCnt in recoverCntDict.items():  
 | 
        curCommonCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBCommonCnt % index, 0)  
 | 
        curExtraCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBExtraCnt % index, 0)  
 | 
        curBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBBuyCnt % index, 0)  
 | 
        curItemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBItemAddCnt % index, 0)  
 | 
        curnoBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverFBNoBuyCnt % index, 0)  
 | 
        cntList = [curCommonCnt, curBuyCnt, curItemAddCnt, curExtraCnt, curnoBuyCnt]  
 | 
        newCntList = copy.deepcopy(cntList)  
 | 
          
 | 
        sumCnt = 0  
 | 
        for i, cnt in enumerate(cntList):  
 | 
            sumCnt += cnt  
 | 
            newCntList[i] = max(0, sumCnt - recoverCnt)  
 | 
            if recoverCnt <= sumCnt:  
 | 
                break  
 | 
        newCommonCnt,newBuyCnt,newItemAddCnt,newExtraCnt,newnoBuyCnt = newCntList  
 | 
   
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverFBCommonCnt % index, newCommonCnt)  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverFBBuyCnt % index, newBuyCnt)  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverFBItemAddCnt % index, newItemAddCnt)  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverFBExtraCnt % index, newExtraCnt)  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RecoverFBNoBuyCnt % index, newnoBuyCnt)  
 | 
        if max(newCommonCnt, newBuyCnt, newItemAddCnt, newExtraCnt, newnoBuyCnt) == 0 and index != Def_TJGRecoverID:  
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HaveRecover % index, 1)  
 | 
          
 | 
    return  
 | 
  
 | 
## »ñÈ¡×ÊÔ´  
 | 
#  @param curPlayer  
 | 
#  @param recoverWay Õһط½Ê½  
 | 
#  @param recoverIndex ÕÒ»ØË÷Òý  
 | 
#  @param recoverNumList ÕһشÎÊýÁÐ±í  
 | 
#  @return ¾Ñé,½ð±Ò,ħ»ê  
 | 
def __GetRecoverGain(curPlayer, recoverWay, recoverCnt, ipyData):  
 | 
    index = ipyData.GetID()  
 | 
    reLV = curPlayer.GetLV()  
 | 
    reExp = PlayerControl.GetPlayerReExp(curPlayer)  
 | 
    expRate = PlayerControl.GetLimitExpRate(curPlayer, ChConfig.ExpRateLimitType_Recover)  
 | 
    extraData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverGainData % index, 0)  
 | 
    dataEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverGainDataEx % index, 0)  
 | 
      
 | 
    tjgExp = 0 #ÍÑ»ú¹ÒÕһؾÑé  
 | 
    exp = 0  
 | 
    sp = 0  
 | 
    money = 0  
 | 
    itemDict = {}  
 | 
    if index == Def_TJGRecoverID:  
 | 
        Exp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TJGDeadExp)  
 | 
        Exp1 = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TJGDeadExp1)  
 | 
        tjgExp = Exp1 * ChConfig.Def_PerPointValue + Exp  
 | 
        
 | 
      
 | 
    awardDict = ipyData.GetJadeReward() if recoverWay == RecoverWay1 else ipyData.GetCopperReward()  
 | 
    expFormula = awardDict.get("exp", '')  
 | 
    if expFormula:  
 | 
        exp = recoverCnt * eval(FormulaControl.GetCompileFormula('ResourcesBackEXP%s_%s' % (recoverWay, index), expFormula))  
 | 
    moneyFormula = awardDict.get("money", '')  
 | 
    if moneyFormula:  
 | 
        money = recoverCnt * eval(FormulaControl.GetCompileFormula('ResourcesBackMoney%s_%s' % (recoverWay, index), moneyFormula))  
 | 
    spFormula = awardDict.get("sp", '')  
 | 
    if spFormula:  
 | 
        sp = recoverCnt * eval(FormulaControl.GetCompileFormula('ResourcesBacksp%s_%s' % (recoverWay, index), spFormula))  
 | 
          
 | 
    itemInfoList = awardDict.get("item", [])  
 | 
    if itemInfoList:  
 | 
        job = curPlayer.GetJob()  
 | 
        jobItemList = ipyData.GetJobItemList()  
 | 
        for itemInfo in itemInfoList:  
 | 
            itemID = itemInfo.get('ItemID', 0)  
 | 
            itemcntFormula = itemInfo.get('ItemCount', '')  
 | 
            if not itemcntFormula:  
 | 
                continue  
 | 
            itemcnt = recoverCnt * eval(FormulaControl.GetCompileFormula('ResourcesBackitem%s_%s_%s' % (recoverWay, index, itemID), itemcntFormula))  
 | 
            if not itemcnt:  
 | 
                continue  
 | 
            itemID = __GetJobItem(job, itemID, jobItemList)  
 | 
            itemDict[itemID] = itemcnt  
 | 
      
 | 
    return exp, sp, money, itemDict  
 | 
  
 | 
def __GetJobItem(job, itemID, jobItemList):  
 | 
    ## »ñÈ¡ÎïÆ·¶ÔÓ¦µÄÖ°ÒµÎïÆ·£¬ Ö°Òµ´Ó1¿ªÊ¼  
 | 
    for jobItemIDList in jobItemList:  
 | 
        if type(jobItemIDList) not in [list, tuple]:  
 | 
            GameWorld.ErrLog("×ÊÔ´ÕÒ»ØÖ°ÒµÎïÆ·×é¸ñʽ´íÎó!itemID=%s,jobItemList=%s" % (itemID, jobItemList))  
 | 
            return itemID  
 | 
        if itemID in jobItemIDList:  
 | 
            if job <= 0 or job > len(jobItemIDList):  
 | 
                GameWorld.ErrLog("×ÊÔ´ÕÒ»ØÖ°ÒµÎïÆ·ÅäÖôíÎó,ûÓиÃÖ°Òµ¶ÔÓ¦ÎïÆ·ID!itemID=%s,job=%s" % (itemID, job))  
 | 
                return itemID  
 | 
            return jobItemIDList[job - 1]  
 | 
    return itemID  
 | 
  
 | 
## Í¨ÖªÕһشÎÊý  
 | 
#  @param curPlayer  
 | 
#  @param recoverIndex ÕÒ»ØË÷Òý  
 | 
#  @param recoverNumList ÕһشÎÊýÁÐ±í  
 | 
#  @return None  
 | 
def __NotifyRecoverNum(curPlayer, recoverNumList=[]):  
 | 
    sendPack = ChPyNetSendPack.tagMCRecoverNum()  
 | 
    sendPack.Clear()  
 | 
    sendPack.NumInfo = []  
 | 
      
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
    for i in xrange(ipyDataMgr.GetResourcesBackCount()):  
 | 
        recoverData = ipyDataMgr.GetResourcesBackByIndex(i)  
 | 
        index = recoverData.GetID()  
 | 
        if recoverNumList and index not in recoverNumList:  
 | 
            continue  
 | 
        commonCnt, vipExtraCnt = __GetCanRecoverCnt(curPlayer, index)  
 | 
        haveRecover = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HaveRecover % index, 0)  
 | 
        if not commonCnt and not vipExtraCnt and not haveRecover:  
 | 
            continue  
 | 
        numInfoPack = ChPyNetSendPack.tagMCRecoverNumInfo()  
 | 
        numInfoPack.Clear()  
 | 
        numInfoPack.Index = index  
 | 
        numInfoPack.RecoverCnt = commonCnt  
 | 
        numInfoPack.ExtraCnt = vipExtraCnt  
 | 
        numInfoPack.ExtraData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverGainData % index, 0)  
 | 
        numInfoPack.ExtraData2 = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RecoverGainDataEx % index, 0)  
 | 
        sendPack.NumInfo.append(numInfoPack)    
 | 
    sendPack.Num = len(sendPack.NumInfo)  
 | 
    NetPackCommon.SendFakePack(curPlayer, sendPack)  
 | 
    return  
 |