| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GameWorldLogic.FBProcess.GameLogic_ElderBattlefield  | 
| #  | 
| # @todo:ÉϹÅÕ½³¡  | 
| # @author xdh  | 
| # @date 2016-08-29  | 
| # @version 1.0  | 
| #  | 
| #  | 
| # ÏêϸÃèÊö: ÉϹÅÕ½³¡  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2017-07-12 21:00""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import ChConfig  | 
| import FBCommon  | 
| import GameWorld  | 
| import PlayerControl  | 
| import IpyGameDataPY  | 
| import GameWorldProcess  | 
| import ItemCommon  | 
| import ItemControler  | 
| import IPY_GameWorld  | 
| import ShareDefine  | 
| import PlayerSuccess  | 
| import GameMap  | 
| import BuffSkill  | 
| import FormulaControl  | 
| import PyGameData  | 
| import NPCCustomRefresh  | 
| import SkillShell  | 
| import EventReport  | 
| import SkillCommon  | 
|   | 
| import random  | 
| import time  | 
|   | 
| #------------------------------------------------------------------------------  | 
| #  | 
|   | 
| # ¸±±¾Íæ¼Ò×Öµäkey  | 
| FBPlayerDict_Score = 'FBPD_Score%s'  # Íæ¼Òµ±Ç°»ý·Ö  | 
| FBPlayerDict_KillCnt = 'FBPD_KillCnt'  # Íæ¼Òµ±Ç°É±µÐÊý  | 
| FBPD_LastCheckTick = 'FBPD_LastCheckTick'  # ¼ì²éË¢buffʱ¼ä  | 
| FBPD_LastCheckTick1 = 'FBPD_LastCheckTick1'  # ¼ì²éË¢»úÆ÷ÈËʱ¼ä  | 
| FBPlayerDict_ContKillCntEx = 'FBPD_ContKillCntEx'  # Íæ¼Òµ±Ç°×ÜÁ¬É±Êý  | 
| FBPlayerDict_TotalExp = 'FBPlayerDict_TotalExp%s'  # »ñµÃµÄ×ܾÑé  | 
| FBPlayerDict_TotalExpPoint = 'FBPlayerDict_TotalExpPoint%s'  # »ñµÃµÄ×ܾÑéµã  | 
| FBPlayerDict_EnemyID = 'FBPD_EnemyID'  # Íæ¼Ò×î½üÒ»¸ö³ðµÐID  | 
| FBPlayerDict_RebornBuffLV = 'RebornBuffLV'  # Íæ¼Òµ±Ç°¸´»îBUFFLV  | 
| Map_ElderBattlefield_StartTick = "Map_ElderBattlefield_StartTick"  # ¸±±¾¿ªÊ¼Ê±¼ä  | 
| Map_ElderBattlefield_TopPlayer = "Map_ElderBattlefield_TopPlayer"  # »ý·ÖÍõ  | 
|   | 
| #  | 
| (  | 
| Def_PlayerCnt,  # ÕæÈËÊýÁ¿  | 
| Def_RobotCnt,  # »úÆ÷ÈË×î´óÊýÁ¿  | 
| Def_TotalCnt,  # ÕæÈË+»úÆ÷ÈË×ÜºÍ  | 
| ) = range(3)  | 
|   | 
| #µ±Ç°¸±±¾µØÍ¼µÄ״̬  | 
| (  | 
| FB_Step_Open,  # ¸±±¾¿ªÆô  | 
| FB_Step_Fighting,  # ¸±±¾½øÐÐÖÐ  | 
| FB_Step_Over,  # ¸±±¾½áÊø  | 
| ) = range(3)  | 
|   | 
| def OnFBPlayerOnLogin(curPlayer):  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     if mapID != ChConfig.Def_FBMapID_ElderBattlefield:  | 
|         OnElderBattlefieldFBResult(curPlayer, True)  | 
|     return  | 
|   | 
| def OnElderBattlefieldStateChange(state, tick):  | 
|     #»î¶¯×´Ì¬±ä¸ü  | 
| #    mapID = GameWorld.GetMap().GetMapID()  | 
| #    if mapID != ChConfig.Def_FBMapID_ElderBattlefield:  | 
| #        return  | 
|     GameWorld.DebugLog('    ÉϹÅÕ½³¡»î¶¯×´Ì¬±ä¸ü state=%s' % state)  | 
|   | 
|     if state == 1:  | 
|         GameWorld.GetGameWorld().SetGameWorldDict(Map_ElderBattlefield_StartTick, tick)  | 
|         GameWorld.GetGameWorld().SetGameWorldDict(Map_ElderBattlefield_TopPlayer, 0)  | 
|   | 
|     else:  | 
|         GiveJoinPrize()  | 
|   | 
|     return  | 
|   | 
|   | 
| ##¿ªÆô¸±±¾  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¿ªÆô¸±±¾  | 
| def OnOpenFB(tick):  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     lineID = GameWorld.GetGameWorld().GetPropertyID() - 1  | 
|     refreshIDList = FBCommon.GetFBLineRefreshNPC(mapID, lineID)  | 
|     #GameWorld.Log('    lineID=%s,refreshIDList=%s'%(lineID, refreshIDList))  | 
|     if refreshIDList:  | 
|         for refreshID in refreshIDList:  | 
|             NPCCustomRefresh.SetNPCRefreshByID(refreshID)  | 
|     return  | 
|   | 
|   | 
| ##¹Ø±Õ¸±±¾  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks   | 
| def OnCloseFB(tick):  | 
|     GameWorld.GetGameWorld().SetPropertyID(0)  | 
|     return  | 
|   | 
|   | 
| ## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param mapID µØÍ¼ID  | 
| #  @param lineID Ïß·id  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return ²¼¶ûÖµ  | 
| def OnEnterFBEvent(curPlayer, mapID, lineID, tick):  | 
|     GameWorld.DebugLog("OnEnterFBEvent map %s - %s" % (mapID, lineID))  | 
|   | 
|     return True  | 
|   | 
|   | 
| ##ÊÇ·ñ¿ÉÒÔ½øÈë  | 
| # @param ask ÇëÇó½á¹¹Ìå  | 
| # @param tick Ê±¼ä´Á  | 
| # @return  | 
| def OnChangeMapAsk(ask, tick):  | 
|     GameWorld.DebugLog("OnChangeMapAsk  CopyMapID=%s" % (ask.GetCopyMapID()))  | 
|       | 
|     #¿É½øÈë  | 
|     return IPY_GameWorld.cmeAccept  | 
|   | 
|   | 
| ##Íæ¼Ò½øÈ븱±¾  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks Íæ¼Ò½øÈ븱±¾  | 
| def DoEnterFB(curPlayer, tick):  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     GameWorld.DebugLog("DoEnterFB...", playerID)  | 
|       | 
|     gameFB = GameWorld.GetGameFB()  | 
|     fbStep = gameFB.GetFBStep()  | 
|     startTick = GameWorld.GetGameWorld().GetGameWorldDictByKey(Map_ElderBattlefield_StartTick)  | 
|       | 
|     closeFB_RemainTick = max(0, FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_ElderBattlefield) * 1000 - (tick - startTick))  | 
|     if not closeFB_RemainTick:  | 
|         PlayerControl.PlayerLeaveFB(curPlayer)  | 
|         return  | 
|     curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, closeFB_RemainTick, True)   | 
|       | 
|     if not FBCommon.GetHadSetFBPropertyMark():  | 
|         lineID = GameWorld.GetGameWorld().GetPropertyID() - 1  | 
|         FBCommon.SetFBPropertyMark(lineID)  | 
|           | 
|     if not FBCommon.GetHadDelTicket(curPlayer):  | 
|         FBCommon.SetHadDelTicket(curPlayer)  | 
|         if FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_ElderBattlefield):  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ElderBattlefieldStage, 0)  | 
|             GameWorld.GetGameWorld().SetGameWorldDict(FBPlayerDict_Score % playerID, 0)  | 
|             GameWorld.GetGameWorld().SetGameWorldDict(FBPlayerDict_TotalExp % playerID, 0)  | 
|             GameWorld.GetGameWorld().SetGameWorldDict(FBPlayerDict_TotalExpPoint % playerID, 0)  | 
|             EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_ElderBattlefield, 0, ChConfig.CME_Log_Start)  | 
|     else:  | 
|         rebornBuffLV = GameWorld.GetGameFB().GetPlayerGameFBDictByKey(playerID, FBPlayerDict_RebornBuffLV)  | 
|         __DoAddRebornBuff(curPlayer, rebornBuffLV, tick)  | 
|     DoFBHelp(curPlayer, tick)  | 
|     return  | 
|   | 
|   | 
| ##¸±±¾Íæ¼Ò½øÈëµã, Íæ¼Ò·ÖÉ¢ÔÚ°ë¾¶3¸ñ·¶Î§  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param mapID µØÍ¼ID  | 
| # @param lineId ·ÖÏßID  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ×ø±êÁбí(X,Y)  | 
| # @remarks ¸±±¾Íæ¼Ò½øÈëµã  | 
| def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):  | 
|     return random.choice(ipyEnterPosInfo)  | 
|   | 
|   | 
| ## »ñÈ¡²ãËæ»ú×ø±êµã  | 
| def __GetRandPos():  | 
|     ipyEnterPosInfo = FBCommon.GetFBLineEnterPosInfo(ChConfig.Def_FBMapID_ElderBattlefield, 0)  | 
|     enterPos = random.choice(ipyEnterPosInfo)  | 
|     dist = 3 if len(enterPos) <= 2 else enterPos[2]  | 
|     posPoint = GameMap.GetEmptyPlaceInArea(enterPos[0], enterPos[1], dist)  | 
|     return posPoint.GetPosX(), posPoint.GetPosY()  | 
|   | 
|   | 
| ##Íæ¼ÒÍ˳ö¸±±¾  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| def DoExitFB(curPlayer, tick):  | 
|     buffIDList = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldBuff')  | 
|     for buffID in buffIDList:  | 
|         BuffSkill.DelBuffBySkillID(curPlayer, buffID, tick)  | 
|       | 
|     skillBuffID = IpyGameDataPY.GetFuncCfg('ElderBattlefieldRobot', 3)  | 
|     BuffSkill.DelBuffBySkillID(curPlayer, skillBuffID, tick)  | 
|     FBCommon.UpdFBLineNPCStrengthenLV(curPlayer.GetPlayerID(), True)  | 
|     return  | 
|   | 
|   | 
| ##Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def DoPlayerLeaveFB(curPlayer, tick):  | 
|   | 
|     return  | 
|   | 
|   | 
| ##Íæ¼ÒÇл»µØÍ¼  | 
| def DoPlayerChangeMapLogic(curPlayer):  | 
|     #¸±±¾µÄÁ¬É±£¬³ðµÐ£¬ËÀÍöBUFFÖØÖ㬻ý·Ö²»ÖØÖà  | 
|       | 
|     playerID = curPlayer.GetID()  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_ContKillCntEx, 0)  | 
|     gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_EnemyID, 0)  | 
|     gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_RebornBuffLV, 0)  | 
|     return  | 
|   | 
|   | 
| ##¸±±¾×ÜÂß¼¼ÆÊ±Æ÷  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks ¸±±¾×ÜÂß¼¼ÆÊ±Æ÷  | 
| def OnProcess(tick):  | 
|     fbStep = GameWorld.GetGameFB().GetFBStep()  | 
|     #GameWorld.DebugLog("    OnProcess...")  | 
|     if fbStep == FB_Step_Open:  | 
|         if FBCommon.GetFBFuncOpenState(ChConfig.Def_FBMapID_ElderBattlefield):  | 
|             FBCommon.SetFBStep(FB_Step_Fighting, tick)  | 
|     elif fbStep == FB_Step_Fighting:  | 
|         if not FBCommon.GetFBFuncOpenState(ChConfig.Def_FBMapID_ElderBattlefield):  | 
|             #GiveJoinPrize()  | 
|             #»ý·ÖÍõ  | 
|             topPlayerID = GameWorld.GetGameWorld().GetGameWorldDictByKey(Map_ElderBattlefield_TopPlayer)  | 
|             if topPlayerID:  | 
|                 topAwardList = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldTopAward')  | 
|                 if topAwardList:  | 
|                     PlayerControl.SendMailByKey("ElderBattlefieldTopMail", [topPlayerID], topAwardList)   | 
|                     PlayerControl.WorldNotify(0, 'ElderBattlefieldBest', [PyGameData.g_sgzztopPlayerName, topAwardList[0][0]])  | 
|                 GameWorld.GetGameWorld().SetGameWorldDict(Map_ElderBattlefield_TopPlayer, 0)  | 
|               | 
|               | 
|             FBCommon.SetFBStep(FB_Step_Over, tick)  | 
|             FBCommon.DoLogic_FBKickAllPlayer()  | 
|             GameWorldProcess.CloseFB(tick)  | 
|         else:  | 
|             __CheckRefreshBuffNPC(tick)  | 
|             __RefreshRobot(tick)  | 
|     return  | 
|   | 
|   | 
| def __CheckRefreshBuffNPC(tick):  | 
|     #¼ì²ébuffnpcË¢¹Ö  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     lastCheckTick = gameFB.GetGameFBDictByKey(FBPD_LastCheckTick)  | 
|   | 
|     if lastCheckTick and tick - lastCheckTick < 10000:  | 
|         return  | 
|     gameFB.SetGameFBDict(FBPD_LastCheckTick, tick)  | 
|       | 
|     allRmark = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldBuff', 3)  | 
|     maxCnt = IpyGameDataPY.GetFuncCfg('ElderBattlefieldBuff', 4)  | 
|   | 
|     rmarkList = []  #¿ÉË¢¹ÖµÄ±êʶµã  | 
|     npcCnt = 0  | 
|     gameNPC = GameWorld.GetNPCManager()  | 
|     for i in xrange(gameNPC.GetCustomNPCRefreshCount()):  | 
|         npcRefresh = gameNPC.GetCustomNPCRefreshAt(i)  | 
|         rmark = npcRefresh.GetRefreshMark()  | 
|         if rmark not in allRmark:  | 
|             continue  | 
|         npcCnt += npcRefresh.GetCount()  | 
|         if not npcRefresh.GetCount():  | 
|             rmarkList.append(rmark)  | 
|       | 
|     needAddCnt = maxCnt - npcCnt  | 
|     if not needAddCnt:  | 
|         return  | 
|     random.shuffle(rmarkList)  | 
|     npcID = IpyGameDataPY.GetFuncCfg('ElderBattlefieldBuff', 2)  | 
|     for rMark in rmarkList[:needAddCnt]:  | 
|         NPCCustomRefresh.SetNPCRefresh(rMark, [(npcID, 1)], 1, 1)  | 
|     NPCCustomRefresh.ProcessAllNPCRefresh(tick)  # Á¢¼´³ö·¢Ò»´Î±êʶµãˢР | 
|       | 
|     return  | 
|   | 
|   | 
| def __RefreshRobot(tick):  | 
|     ##ˢлúÆ÷ÈË  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     lastCheckTick = gameFB.GetGameFBDictByKey(FBPD_LastCheckTick1)  | 
|     if lastCheckTick and tick - lastCheckTick < 2000:  | 
|         return  | 
|     gameFB.SetGameFBDict(FBPD_LastCheckTick1, tick)  | 
|     fblineid = GameWorld.GetGameWorld().GetLineID()  | 
|     g_elderBattleRobotDieList = PyGameData.g_elderBattleRobotDieDict.get(fblineid, [])  | 
|     robotCfgDict = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldCfg', 3, {})  | 
|     lineID = GameWorld.GetGameWorld().GetPropertyID() - 1  | 
|     if lineID not in robotCfgDict:  | 
|         return  | 
|     robotMaxLV = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenMaxLV)  | 
|     if GameWorld.GetMapCopyPlayerManager().GetPlayerCount() <= 0 or not robotMaxLV:  | 
|         #GameWorld.DebugLog("Ã»Íæ¼Ò£¬²»Ë¢»úÆ÷ÈË! ")  | 
|         return  | 
|     rmarkList = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldRobot', 5)  | 
|     curNPCCnt = 0  | 
|     robotCntDict = {}  | 
|     gameNPC = GameWorld.GetNPCManager()  | 
|     for i in xrange(gameNPC.GetCustomNPCRefreshCount()):  | 
|         npcRefresh = gameNPC.GetCustomNPCRefreshAt(i)  | 
|         rmark = npcRefresh.GetRefreshMark()  | 
|         if rmark not in rmarkList:  | 
|             continue  | 
|         cnt = npcRefresh.GetCount()  | 
|         robotCntDict[rmark] = cnt  | 
|         curNPCCnt += cnt  | 
|       | 
|     robotCfg = robotCfgDict[lineID]  | 
|     curPlayerCnt = GameWorld.GetMapCopyPlayerManager().GetPlayerCount()  | 
|     maxRobotCnt = min(robotCfg[Def_TotalCnt] - curPlayerCnt, robotCfg[Def_RobotCnt])  | 
|     extraCnt = maxRobotCnt - curNPCCnt - len(g_elderBattleRobotDieList)  | 
|     rebornTime = IpyGameDataPY.GetFuncCfg('ElderBattlefieldRobot')  | 
|     rebornCnt = 0  | 
|     for dieTick in g_elderBattleRobotDieList:  | 
|         if tick - dieTick < rebornTime * 1000:  | 
|             break  | 
|         rebornCnt += 1  | 
|     PyGameData.g_elderBattleRobotDieDict[fblineid] = g_elderBattleRobotDieList[rebornCnt:]  | 
|     refreshCnt = rebornCnt + extraCnt  | 
|     #GameWorld.DebugLog('    Ë¢Ð»úÆ÷ÈË rebornCnt=%s,extraCnt=%s,refreshCnt=%s,robotCntDict=%s'%(rebornCnt, extraCnt,refreshCnt,robotCntDict))  | 
|     if refreshCnt > 0:  | 
|         npcID = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldRobot', 2, {}).get(lineID, 0)  | 
|         if not npcID:  | 
|             return  | 
|           | 
|         random.shuffle(rmarkList)  | 
|         hasRefreshCnt = 0  | 
|         for i, rMark in enumerate(rmarkList):  | 
|             if hasRefreshCnt >=refreshCnt:  | 
|                 break  | 
|             curCnt = robotCntDict.get(rMark, 0)  | 
|             cnt = 1 if i < len(rmarkList)-1 else refreshCnt-hasRefreshCnt  | 
|             hasRefreshCnt += cnt  | 
|             curMaxCnt = curCnt+cnt  | 
|             NPCCustomRefresh.SetNPCRefresh(rMark, [(npcID, cnt)], curMaxCnt, cnt)  | 
|         NPCCustomRefresh.ProcessAllNPCRefresh(tick)  | 
|           | 
|     return  | 
|   | 
|   | 
| ##Õ½¶·Âß¼  | 
| # @param tick  Ê±ÖÓ  | 
| # @return ÎÞÒâÒå  | 
| # @remarks Õ½¶·Âß¼  | 
| def GiveJoinPrize():  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     for i in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(i)  | 
|         if curPlayer == None or not curPlayer.GetInitOK():  | 
|             continue  | 
|         OnElderBattlefieldFBResult(curPlayer)  | 
|           | 
|       | 
|     return  | 
|   | 
|   | 
| def OnElderBattlefieldFBResult(curPlayer, isLogin=False):  | 
|     # Íæ¼Ò´¦ÀíÉϹÅÕ½³¡½áËãÐÅÏ¢  | 
|     curStage = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ElderBattlefieldStage, 0)  | 
|     if not curStage:  | 
|         return  | 
|     GameWorld.DebugLog('    Íæ¼Ò´¦ÀíÉϹÅÕ½³¡½áËãÐÅÏ¢ , isLogin=%s' % isLogin, curPlayer.GetPlayerID())  | 
|     lineID = 0  #GameWorld.GetGameWorld().GetPropertyID() -1  | 
|     fbRewardDict = FBCommon.GetFBLineReward(ChConfig.Def_FBMapID_ElderBattlefield, lineID)  | 
|       | 
|       | 
|     itemList = fbRewardDict.get(curStage, [])  | 
|     succIDList = PlayerSuccess.GetCanGetAwardSuccByType(curPlayer, [ShareDefine.SuccType_ElderBattlefieldKill, ShareDefine.SuccType_ElderBattlefieldConKill])  | 
|     succAwardDict = PlayerSuccess.GiveSuccAward(curPlayer, succIDList, False)  | 
|     if not itemList and not succAwardDict:  | 
|         return  | 
|     rewardItemList = []  | 
|     for itemID, itemCnt in itemList:  | 
|         rewardItemList.append([itemID, itemCnt, 1])  | 
|     for itemID, itemCnt in succAwardDict.items():  | 
|         rewardItemList.append([itemID, itemCnt, 1])  | 
|     needSpace = len(rewardItemList)  | 
|     emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     if mapID != ChConfig.Def_FBMapID_ElderBattlefield or isLogin or emptySpace < needSpace:  | 
|         PlayerControl.SendMailByKey("ElderBattlefieldMail" if mapID == ChConfig.Def_FBMapID_ElderBattlefield else 'ElderBattlefieldMail2', [curPlayer.GetPlayerID()], rewardItemList)  | 
|     else:  | 
|         for itemID, itemCnt, isBind in rewardItemList:  | 
|             ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isBind, [IPY_GameWorld.rptItem], event=["ElderBattlefield", False, {}])  | 
|       | 
|         overDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(itemList), FBCommon.Over_succItemInfo:FBCommon.GetJsonItemList(succAwardDict.items())}  | 
|         FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ElderBattlefield, lineID, 1, overDict)  | 
|     #½áËã¹ý£¬ÖØÖý׶Π | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ElderBattlefieldStage, 0)  | 
|     return  | 
|   | 
|   | 
| def __AddElderBattlefieldPlayerScore(curPlayer, gameFB, addValue):  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     gameWorld = GameWorld.GetGameWorld()  | 
|     updScore = gameWorld.GetGameWorldDictByKey(FBPlayerDict_Score % playerID) + addValue  | 
|     gameWorld.SetGameWorldDict(FBPlayerDict_Score % playerID, updScore)  | 
|     #¸üлý·ÖÍõ  | 
|       | 
|     topPlayerID = gameWorld.GetGameWorldDictByKey(Map_ElderBattlefield_TopPlayer)  | 
|     if not topPlayerID or updScore > gameWorld.GetGameWorldDictByKey(FBPlayerDict_Score % topPlayerID):  | 
|         gameWorld.SetGameWorldDict(Map_ElderBattlefield_TopPlayer, playerID)  | 
|   | 
|         topName = curPlayer.GetName()  | 
|         PyGameData.g_sgzztopPlayerName = topName  | 
|         PlayerControl.WorldNotify(0, 'AncientBattlefield_9', [topName])  | 
|           | 
|     if gameWorld.GetGameWorldDictByKey(Map_ElderBattlefield_TopPlayer) == playerID:  | 
|         playerManager = GameWorld.GetPlayerManager()  | 
|         for i in range(0, playerManager.GetPlayerCount()):  | 
|             player = playerManager.GetPlayerByIndex(i)  | 
|             if player == None or not player.GetInitOK():  | 
|                 continue  | 
|             if player.GetPlayerID() == playerID:  | 
|                 continue  | 
|             DoFBHelp(player, 0)  | 
|     curStage = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ElderBattlefieldStage, 0)  | 
|     stageScoreList = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldCfg', 4)  | 
|       | 
|     if curStage < len(stageScoreList) and updScore >= stageScoreList[curStage]:  | 
|         addTotalExp = 0  | 
|         reExp = PlayerControl.GetPlayerReExp(curPlayer)  | 
|         expFormulaDict = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldExp')  | 
|         for score in stageScoreList[curStage:]:  | 
|             if updScore >= score:  | 
|                 updStage = stageScoreList.index(score) + 1  | 
|                 addExp = eval(FormulaControl.GetCompileFormula("ElderBattlefieldExp%s" % updStage, expFormulaDict[updStage]))  | 
|                 addTotalExp += addExp  | 
|         GameWorld.DebugLog('curStage=%s,updStage=%s,addTotalExp=%s' % (curStage, updStage, addTotalExp), playerID)  | 
|         PlayerControl.PlayerControl(curPlayer).AddExp(addTotalExp)  | 
|         exp = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalExp % playerID)  | 
|         expPoint = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalExpPoint % playerID)  | 
|         totalExp = expPoint * ChConfig.Def_PerPointValue + exp  | 
|         updTotalExp = totalExp + addTotalExp  | 
|         updExp = updTotalExp % ChConfig.Def_PerPointValue  | 
|         updExpPoint = updTotalExp / ChConfig.Def_PerPointValue  | 
|         gameWorld.SetGameWorldDict(FBPlayerDict_TotalExp % playerID, updExp)  | 
|         gameWorld.SetGameWorldDict(FBPlayerDict_TotalExpPoint % playerID, updExpPoint)  | 
|           | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ElderBattlefieldStage, updStage)  | 
|       | 
|     return updScore  | 
|   | 
| #---------------------------------------------------------------------  | 
|   | 
|   | 
| ##»ñµÃ¸±±¾°ïÖúÐÅÏ¢, ÓÃÓÚ֪ͨÕóÓª±È·ÖÌõ  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks ÓÃÓÚ֪ͨÕóÓª±È·ÖÌõ  | 
| def DoFBHelp(curPlayer, tick):  | 
|     gameWorld = GameWorld.GetGameWorld()  | 
|     lineID = gameWorld.GetLineID()  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     score = gameWorld.GetGameWorldDictByKey(FBPlayerDict_Score % playerID)  | 
|     stageScoreList = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldCfg', 4)  | 
|     curStage = min(curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ElderBattlefieldStage, 0) + 1, len(stageScoreList))  | 
|     #killCnt = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_KillCnt)  | 
|     exp = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalExp % playerID)  | 
|     expPoint = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalExpPoint % playerID)  | 
|     helpDict = {FBCommon.Help_score:score, FBCommon.Help_step:curStage,  | 
|                 FBCommon.Help_exp:exp, FBCommon.Help_expPoint:expPoint}  | 
|       | 
|     topPlayerID = gameWorld.GetGameWorldDictByKey(Map_ElderBattlefield_TopPlayer)  | 
|   | 
|     topScore = gameWorld.GetGameWorldDictByKey(FBPlayerDict_Score % topPlayerID)  | 
|       | 
|     helpDict['topName'] = PyGameData.g_sgzztopPlayerName if topPlayerID else ''  | 
|     helpDict['topScore'] = topScore if topPlayerID else 0  | 
|     helpDict['topPlayerID'] = topPlayerID  | 
|     #helpDict[FBCommon.Help_lineID] = GameWorld.GetGameWorld().GetLineID()  | 
|     helpDict['enemyID'] = GameWorld.GetGameFB().GetPlayerGameFBDictByKey(playerID, FBPlayerDict_EnemyID)  | 
|     helpDict[FBCommon.Help_robotJob] = PyGameData.g_fbRobotJobDict.get(lineID, {})  | 
|     GameWorld.DebugLog("DoFBHelp %s" % helpDict, playerID)  | 
|     FBCommon.Notify_FBHelp(curPlayer, helpDict)  | 
|     return  | 
|   | 
| def DoFBOnNPCKill_Player(curNPC, curPlayer, tick):  | 
|     if curNPC.GetNPCID() in IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldRobot', 2, {}).values():  | 
|         DoFBOnKill_Player(curNPC, curPlayer, tick)  | 
|     return  | 
|   | 
| ##´¦Àí¸±±¾ÖÐɱËÀÍæ¼ÒÂß¼  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param defender ·ÀÊØÕß  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ²¼¶ûÖµ  | 
| # @remarks ´¦Àí¸±±¾ÖÐɱËÀÍæ¼ÒÂß¼  | 
| def DoFBOnKill_Player(atkobj, defender, tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     atkIsPlayer = atkobj.GetGameObjType() == IPY_GameWorld.gotPlayer  | 
|     baseCnt = IpyGameDataPY.GetFuncCfg('ElderBattlefieldSys', 2)  | 
|     addScore = 0  | 
|     if atkIsPlayer:  | 
|         playerID = atkobj.GetPlayerID()  | 
|         GameWorld.DebugLog("DoFBOnKill_Player", playerID)  | 
|       | 
|         # »÷ɱ·½´¦Àí  | 
|         killCnt = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_KillCnt) + 1  # »÷ɱÊý  | 
|         gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_KillCnt, killCnt)  | 
|         if killCnt == 1:#Ê×ɱÌáʾ  | 
|             PlayerControl.NotifyCode(atkobj, 'AncientBattlefield_10', [1])  | 
|           | 
|         contKillCntEx = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_ContKillCntEx) + 1  # Á¬É±Êý  | 
|         gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_ContKillCntEx, contKillCntEx)  | 
|         #Á¬É±¹ã²¥  | 
|         ckillSysList = IpyGameDataPY.GetFuncCfg('ElderBattlefieldSys', 1)  | 
|           | 
|         perCnt = IpyGameDataPY.GetFuncCfg('ElderBattlefieldSys', 3)  | 
|         if contKillCntEx >= baseCnt and contKillCntEx % perCnt == 0:  | 
|             sysIndex = min((contKillCntEx - baseCnt) / perCnt, len(ckillSysList) - 1)  | 
|             PlayerControl.FBNotify(ckillSysList[sysIndex], [atkobj.GetName(), contKillCntEx])  | 
|             PlayerControl.NotifyCode(atkobj, 'AncientBattlefield_10', [contKillCntEx])  | 
|         if contKillCntEx == 5:  | 
|             PlayerControl.NotifyCode(atkobj, 'AncientBattlefield_10', [5])  | 
|     | 
|         # »÷ɱ·½³É¾Í  | 
|         PlayerSuccess.DoAddSuccessProgress(atkobj, ShareDefine.SuccType_ElderBattlefieldKill, 1)  | 
|         PlayerSuccess.DoAddSuccessProgress(atkobj, ShareDefine.SuccType_ElderBattlefieldConKill, 1, [contKillCntEx])  | 
|           | 
|         addScore = IpyGameDataPY.GetFuncCfg('ElderBattlefieldCfg', 2)  | 
|           | 
|     # ±»É±·½´¦Àí  | 
|     tagPlayerID = 0  | 
|     if defender.GetGameObjType() == IPY_GameWorld.gotPlayer:  | 
|         tagPlayerID = defender.GetPlayerID()  | 
|         defContKillCntEx = gameFB.GetPlayerGameFBDictByKey(tagPlayerID, FBPlayerDict_ContKillCntEx)  | 
|         if defContKillCntEx >= baseCnt:  | 
|             if atkIsPlayer:  | 
|                 PlayerControl.FBNotify('AncientBattlefield_7', [atkobj.GetName(), defender.GetName(), defContKillCntEx])  | 
|             else:  | 
|                 PlayerControl.FBNotify('AncientBattlefield_robot', [atkobj.GetNPCID(), atkobj.GetID(), defender.GetName(), defContKillCntEx])  | 
|         gameFB.SetPlayerGameFBDict(tagPlayerID, FBPlayerDict_ContKillCntEx, 0)  | 
|         #¼Ç¼³ðÈË  | 
|         if atkIsPlayer:  | 
|               | 
|             gameFB.SetPlayerGameFBDict(tagPlayerID, FBPlayerDict_EnemyID, playerID)  | 
|             if tagPlayerID == gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_EnemyID):  | 
|                 #»÷ɱ³ðÈ˹㲥  | 
|                 PlayerControl.NotifyCode(atkobj, 'AncientBattlefield_8')  | 
|                 gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_EnemyID, 0)  | 
|                 addScore += IpyGameDataPY.GetFuncCfg('ElderBattlefieldPoint', 2)  | 
|             if tagPlayerID == GameWorld.GetGameWorld().GetGameWorldDictByKey(Map_ElderBattlefield_TopPlayer):  | 
|                 addScore += IpyGameDataPY.GetFuncCfg('ElderBattlefieldPoint', 1)  | 
|               | 
|     if atkIsPlayer:  | 
|         updScore = __AddElderBattlefieldPlayerScore(atkobj, gameFB, addScore)  | 
|         GameWorld.DebugLog("»÷É±Íæ¼Ò: »÷ɱ=%s,Á¬É±=%s,tagPlayerID=%s,updScore=%s"   | 
|                                % (killCnt, contKillCntEx, tagPlayerID, updScore), playerID)  | 
|         DoFBHelp(atkobj, tick)  | 
|     if defender.GetGameObjType() == IPY_GameWorld.gotPlayer:  | 
|         DoFBHelp(defender, tick)  | 
|     return True  | 
|   | 
|   | 
| ## Ö´Ðи±±¾É±¹ÖÂß¼  | 
| #  @param curPlayer É±¹ÖµÄÈË  | 
| #  @param curNPC ±»É±µÄ¹Ö  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def DoFB_Player_KillNPC(curPlayer, curNPC, tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     fbStep = gameFB.GetFBStep()  | 
| #    if fbStep != FB_State_Fight:  | 
| #        return  | 
|     if curNPC.GetNPCID() in IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldRobot', 2, {}).values():  | 
|         DoFBOnKill_Player(curPlayer, curNPC, tick)  | 
|         __OnRobotDie(tick)  | 
|     npcid = curNPC.GetNPCID()  | 
|     killNPCScoreDict = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldCfg', 1)  | 
|     addScore = killNPCScoreDict.get(npcid)  | 
|     if not addScore:  | 
|         return  | 
|     __AddElderBattlefieldPlayerScore(curPlayer, gameFB, addScore)  | 
|     DoFBHelp(curPlayer, tick)  | 
|     return  | 
|   | 
| def DoFB_Npc_KillNPC(attacker, curNPC, tick):  | 
|     if curNPC.GetNPCID() in IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldRobot', 2, {}).values():  | 
|         __OnRobotDie(tick)  | 
|     return  | 
|   | 
| def __OnRobotDie(tick):  | 
|     #¼Ç¼»úÆ÷ÈËËÀÍöʱ¼ä  | 
|     lineID = GameWorld.GetGameWorld().GetLineID()  | 
|     if lineID in PyGameData.g_elderBattleRobotDieDict:  | 
|         PyGameData.g_elderBattleRobotDieDict[lineID].append(tick)  | 
|     else:  | 
|         PyGameData.g_elderBattleRobotDieDict[lineID] = [tick]  | 
|     return  | 
|   | 
| def OnMoveTouchNPC(curPlayer, curNPC, tick):  | 
|     #### ´¥ÅöNPC´¦ÀíÂß¼  | 
|     npcid = curNPC.GetNPCID()  | 
|     buffNPCID = IpyGameDataPY.GetFuncCfg('ElderBattlefieldBuff', 2)  | 
|     if npcid != buffNPCID:  | 
|         return  | 
|     buffIDList = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldBuff')  | 
|     for buffID in buffIDList:  | 
|         #GameWorld.DebugLog('´¥ÅöNPC´¦ÀíÂß¼ DelBuffBySkillID=%s'%buffID)  | 
|         BuffSkill.DelBuffBySkillID(curPlayer, buffID, tick)  | 
|     addBuffID = random.choice(buffIDList)  | 
|     #GameWorld.DebugLog('´¥ÅöNPC´¦ÀíÂß¼ addBuffID=%s'%addBuffID)  | 
|     curSkill = GameWorld.GetGameData().GetSkillBySkillID(addBuffID)  | 
|     SkillShell.__DoLogic_AddBuff(curPlayer, curPlayer, curSkill, False, tick, 0, 0)  | 
|     #SkillCommon.AddBuffBySkillType(curPlayer, addBuffID, tick)  | 
|     return  | 
|   | 
|   | 
| #¹ØÏµÓÐ3²ã£¬ÎÞ-ÓѺÃ-µÐÈË  | 
| ##ÅжÏÊÇ·ñÓѺùØÏµ£¬¸Ã²ãÅж¨ÎªÓѺÃÂß¼ÖеÄ×îºóÅÐ¶Ï  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param curTagPlayer Ä¿±êÍæ¼ÒʵÀý  | 
| # @return ²¼¶ûÖµ  | 
| def CheckPlayersRelation_IsFriend(curPlayer, curTagPlayer):  | 
|     return not CanAttackPlayer(curPlayer, curTagPlayer)  | 
|   | 
|   | 
| ##¸±±¾ÖÐ,¹¥»÷¶ÓÓÑÂß¼  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param curTagPlayer Ä¿±êÍæ¼ÒʵÀý  | 
| # @return ²¼¶ûÖµ  | 
| # @remarks  | 
| def DoCanAttackTeamer(curPlayer, curTagPlayer):  | 
|     return CanAttackPlayer(curPlayer, curTagPlayer)  | 
|   | 
|   | 
| ##¸±±¾ÖÐ,ÊÇ·ñ¿É¹¥»÷  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param curTagPlayer Ä¿±êÍæ¼ÒʵÀý  | 
| # @return ²¼¶ûÖµ  | 
| # @remarks ¸±±¾ÖÐ,ÊÇ·ñ¿É¹¥»÷  | 
| def CanAttackPlayer(curPlayer, curTagPlayer):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     fbStep = gameFB.GetFBStep()  | 
|       | 
| #    if fbStep != FB_State_Fight:  | 
| #        return False  | 
|       | 
|     return True  | 
|   | 
|   | 
| ## ÊÇ·ñ¸±±¾¸´»î  | 
| #  @param None  | 
| #  @return ÊÇ·ñ¸±±¾¸´»î  | 
| def OnPlayerReborn():  | 
|     return True  | 
|   | 
|   | 
| ## ÖØÖø±±¾¸´»îÍæ¼Ò×ø±êµã  | 
| # @param None  | 
| # @return ÎÞÒâÒå  | 
| def OnResetFBRebornPlacePos(curPlayer, rebornPlace, tick):  | 
|     __SetPlayerRandomPos(curPlayer)  | 
|     #¸´»î¼Óbuff  | 
|     playerID = curPlayer.GetID()  | 
|     rebornBuffLV = GameWorld.GetGameFB().GetPlayerGameFBDictByKey(playerID, FBPlayerDict_RebornBuffLV)  | 
|     if rebornBuffLV >= IpyGameDataPY.GetFuncCfg('ElderBattlefieldRobot', 4):  | 
|         return  | 
|     __DoAddRebornBuff(curPlayer, rebornBuffLV+1, tick)  | 
|     return  | 
|   | 
| def __DoAddRebornBuff(curPlayer, rebornBuffLV, tick):  | 
|     skillBuffID = IpyGameDataPY.GetFuncCfg('ElderBattlefieldRobot', 3) + rebornBuffLV - 1  | 
|     skillBuff = GameWorld.GetGameData().GetSkillBySkillID(skillBuffID)  | 
|     if not skillBuff:  | 
|         GameWorld.Log("ÉϹŸ´»î¼Óbuff   ÕÒ²»µ½¼¼ÄÜ%s" % skillBuffID)  | 
|         return  | 
|     playerID = curPlayer.GetID()  | 
|     GameWorld.GetGameFB().SetPlayerGameFBDict(playerID, FBPlayerDict_RebornBuffLV, rebornBuffLV)  | 
|     buffType = SkillCommon.GetBuffType(skillBuff)  | 
|     BuffSkill.DoAddBuff(curPlayer, buffType, skillBuff, tick)  | 
|     return  | 
|   | 
| ## ÉèÖÃÍæ¼ÒËæ»ú×ø±êµã  | 
| def __SetPlayerRandomPos(curPlayer):  | 
|     posX, posY = __GetRandPos()  | 
|     curPlayer.ResetPos(posX, posY)  | 
|     return  | 
|   | 
|   | 
| ## »ñÈ¡¸±±¾Ïß·×î´óÍæ¼ÒÈËÊý  | 
| #  @param None  | 
| #  @return   | 
| def GetFBLineMaxPlayerCount(lineID):  | 
|     cfg = IpyGameDataPY.GetFuncEvalCfg('ElderBattlefieldCfg', 3, {}).get(lineID)  | 
|     if not cfg:  | 
|         return 20  | 
|     return cfg[Def_PlayerCnt]  | 
|   | 
| ## -------------------------------------------------------------------------------------------------  | 
|   |