#!/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 OnLogin(curPlayer):  
 | 
    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.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)  
 | 
    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  
 | 
    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):  
 | 
    # Íæ¼Ò´¦ÀíÉϹÅÕ½³¡½áËãÐÅÏ¢  
 | 
    GameWorld.DebugLog('    Íæ¼Ò´¦ÀíÉϹÅÕ½³¡½áËãÐÅÏ¢ , isLogin=%s' % isLogin, 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)  
 | 
    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()  
 | 
    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  
 | 
  
 | 
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  
 | 
    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)  
 | 
        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], [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.GetObjID(), 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]  
 | 
  
 | 
## -------------------------------------------------------------------------------------------------  
 | 
  
 |