| #!/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 random  | 
| import time  | 
|   | 
| #------------------------------------------------------------------------------  | 
| #  | 
|   | 
|   | 
| # ¸±±¾Íæ¼Ò×Öµäkey  | 
| FBPlayerDict_Score = 'FBPD_Score%s'   # Íæ¼Òµ±Ç°»ý·Ö  | 
| FBPlayerDict_KillCnt = 'FBPD_KillCnt'   # Íæ¼Òµ±Ç°É±µÐÊý  | 
| FBPD_LastCheckTick = 'FBPD_LastCheckTick'   # ¼ì²éË¢¹Öʱ¼ä  | 
| FBPlayerDict_ContKillCntEx = 'FBPD_ContKillCntEx'   # Íæ¼Òµ±Ç°×ÜÁ¬É±Êý  | 
| FBPlayerDict_TotalExp = 'FBPlayerDict_TotalExp%s'   # »ñµÃµÄ×ܾÑé  | 
| FBPlayerDict_TotalExpPoint = 'FBPlayerDict_TotalExpPoint%s'   # »ñµÃµÄ×ܾÑéµã  | 
| FBPlayerDict_EnemyID = 'FBPD_EnemyID'   # Íæ¼Ò×î½üÒ»¸ö³ðµÐID  | 
| Map_ElderBattlefield_StartTick = "Map_ElderBattlefield_StartTick"     # ¸±±¾¿ªÊ¼Ê±¼ä  | 
| Map_ElderBattlefield_TopPlayer = "Map_ElderBattlefield_TopPlayer"     # »ý·ÖÍõ  | 
|   | 
|   | 
| #  | 
|   | 
| #µ±Ç°¸±±¾µØÍ¼µÄ״̬  | 
| (  | 
| FB_Step_Open, # ¸±±¾¿ªÆô  | 
| FB_Step_Fighting, # ¸±±¾½øÐÐÖÐ  | 
| FB_Step_Over, # ¸±±¾½áÊø  | 
| ) = range(3)  | 
|   | 
| 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()  | 
| #        FBCommon.DoLogic_FBKickAllPlayer()  | 
| #        GameWorldProcess.CloseFB(tick)  | 
|     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.GetHadDelTicket(curPlayer):  | 
|         FBCommon.SetHadDelTicket(curPlayer)  | 
|         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)  | 
|       | 
|     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)  | 
|     return  | 
|   | 
| ##Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def DoPlayerLeaveFB(curPlayer, tick):  | 
|     OnElderBattlefieldFBResult(curPlayer)  | 
|     return  | 
|   | 
|   | 
| ##Íæ¼ÒÇл»µØÍ¼  | 
| def DoPlayerChangeMapLogic(curPlayer):  | 
|     OnElderBattlefieldFBResult(curPlayer)  | 
|     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()  | 
|             FBCommon.SetFBStep(FB_Step_Over, tick)  | 
|             FBCommon.DoLogic_FBKickAllPlayer()  | 
|             GameWorldProcess.CloseFB(tick)  | 
|         else:  | 
|             __CheckRefreshBuffNPC(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 range(0, 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  | 
|   | 
|   | 
| ##Õ½¶·Âß¼  | 
| # @param tick  Ê±ÖÓ  | 
| # @return ÎÞÒâÒå  | 
| # @remarks Õ½¶·Âß¼  | 
| def GiveJoinPrize():  | 
|     copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     for i in xrange(copyMapPlayerManager.GetPlayerCount()):  | 
|           | 
|         curPlayer = copyMapPlayerManager.GetPlayerByIndex(i)  | 
|           | 
|         if curPlayer == None or curPlayer.IsEmpty():  | 
|             continue  | 
|         OnElderBattlefieldFBResult(curPlayer)  | 
|           | 
|     #»ý·ÖÍõ  | 
|     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)  | 
|     return  | 
|   | 
| def OnElderBattlefieldFBResult(curPlayer):  | 
|     # Íæ¼Ò´¦ÀíÉϹÅÕ½³¡½áËãÐÅÏ¢  | 
|     GameWorld.DebugLog('    Íæ¼Ò´¦ÀíÉϹÅÕ½³¡½áËãÐÅÏ¢ %s' % curPlayer.GetPlayerID())  | 
|     lineID = 0 #GameWorld.GetGameWorld().GetPropertyID() -1  | 
|     fbRewardDict = FBCommon.GetFBLineReward(ChConfig.Def_FBMapID_ElderBattlefield, lineID)  | 
|       | 
|     curStage = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ElderBattlefieldStage, 0)  | 
|     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)  | 
|     if emptySpace < needSpace:  | 
|         PlayerControl.SendMailByKey("ElderBattlefieldMail", [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()  | 
|     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)  | 
|     GameWorld.DebugLog("DoFBHelp %s" % helpDict, playerID)  | 
|     FBCommon.Notify_FBHelp(curPlayer, helpDict)  | 
|     return  | 
|   | 
|   | 
| ##´¦Àí¸±±¾ÖÐɱËÀÍæ¼ÒÂß¼  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param defender ·ÀÊØÕß  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ²¼¶ûÖµ  | 
| # @remarks ´¦Àí¸±±¾ÖÐɱËÀÍæ¼ÒÂß¼  | 
| def DoFBOnKill_Player(curPlayer, defender, tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     GameWorld.DebugLog("DoFBOnKill_Player", playerID)  | 
|   | 
|     addScore = IpyGameDataPY.GetFuncCfg('ElderBattlefieldCfg', 2)  | 
|     updScore = __AddElderBattlefieldPlayerScore(curPlayer, gameFB, addScore)  | 
|       | 
|     # »÷ɱ·½´¦Àí  | 
|     killCnt = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_KillCnt) + 1 # »÷ɱÊý  | 
|     gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_KillCnt, killCnt)  | 
|     contKillCntEx = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_ContKillCntEx) + 1 # Á¬É±Êý  | 
|     gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_ContKillCntEx, contKillCntEx)  | 
|     #Á¬É±¹ã²¥  | 
|     ckillSysList = IpyGameDataPY.GetFuncCfg('ElderBattlefieldSys', 1)  | 
|     baseCnt = IpyGameDataPY.GetFuncCfg('ElderBattlefieldSys', 2)  | 
|     perCnt = IpyGameDataPY.GetFuncCfg('ElderBattlefieldSys', 3)  | 
|     if contKillCntEx >= baseCnt and contKillCntEx % perCnt == 0:  | 
|         sysIndex = min((contKillCntEx - baseCnt) / perCnt, len(ckillSysList)-1)  | 
|         PlayerControl.FBNotify(ckillSysList[sysIndex], [curPlayer.GetName(), contKillCntEx])  | 
|         PlayerControl.NotifyCode(curPlayer, 'AncientBattlefield_10', [contKillCntEx])  | 
|     if contKillCntEx == 5:  | 
|         PlayerControl.NotifyCode(curPlayer, 'AncientBattlefield_10', [5])  | 
|     | 
|     # »÷ɱ·½³É¾Í  | 
|     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_ElderBattlefieldKill, 1)  | 
|     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_ElderBattlefieldConKill, 1, [contKillCntEx])  | 
|       | 
|           | 
|     # ±»É±·½´¦Àí  | 
|     tagPlayerID = defender.GetPlayerID()  | 
|     defContKillCntEx = gameFB.GetPlayerGameFBDictByKey(tagPlayerID, FBPlayerDict_ContKillCntEx)  | 
|     if defContKillCntEx >=baseCnt:  | 
|         PlayerControl.FBNotify('AncientBattlefield_7', [curPlayer.GetName(), defender.GetName(),defContKillCntEx])  | 
|       | 
|     gameFB.SetPlayerGameFBDict(tagPlayerID, FBPlayerDict_ContKillCntEx, 0)  | 
|     #¼Ç¼³ðÈË  | 
|     gameFB.SetPlayerGameFBDict(tagPlayerID, FBPlayerDict_EnemyID, playerID)  | 
|     if tagPlayerID == gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_EnemyID):  | 
|         #»÷ɱ³ðÈ˹㲥  | 
|         PlayerControl.NotifyCode(curPlayer, 'AncientBattlefield_8')  | 
|         gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_EnemyID, 0)  | 
|       | 
|     GameWorld.DebugLog("»÷É±Íæ¼Ò: »÷ɱ=%s,Á¬É±=%s,tagPlayerID=%s,updScore=%s"   | 
|                        % (killCnt, contKillCntEx, tagPlayerID, updScore), playerID)  | 
|       | 
|     DoFBHelp(curPlayer, tick)  | 
|     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  | 
|       | 
|     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 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)  | 
|     return  | 
|   | 
| ## ÉèÖÃÍæ¼ÒËæ»ú×ø±êµã  | 
| def __SetPlayerRandomPos(curPlayer):  | 
|     posX, posY = __GetRandPos()  | 
|     curPlayer.ResetPos(posX, posY)  | 
|     return  | 
|   | 
|   | 
| ## »ñÈ¡¸±±¾Ïß·×î´óÍæ¼ÒÈËÊý  | 
| #  @param None  | 
| #  @return   | 
| def GetFBLineMaxPlayerCount():  | 
|     return IpyGameDataPY.GetFuncCfg('ElderBattlefieldCfg', 3)  | 
|   | 
|   | 
| ## -------------------------------------------------------------------------------------------------  | 
|   | 
|   |