#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package PlayerXMZZ  
 | 
#  
 | 
# @todo:ÏÉħ֮Õù  
 | 
# @author xdh  
 | 
# @date 2017-12-07  
 | 
# @version 1.1  
 | 
#  
 | 
#  
 | 
# ÏêϸÃèÊö: ÏÉħ֮Õù  
 | 
# @change: "2018-07-09 14:30" xdh Ã¿³¡ÌØÊâ´ÎÊý°´ÊÀ½çµÈ¼¶¶ÔÓ¦Õ½Á¦·¶Î§À´Ëæ»ú¶ÔÊÖ  
 | 
#---------------------------------------------------------------------  
 | 
"""Version = 2018-07-09 14:30"""  
 | 
  
 | 
import GameWorld  
 | 
import ShareDefine  
 | 
import IpyGameDataPY  
 | 
import PlayerDBGSEvent  
 | 
import PlayerCompensation  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
import ChConfig  
 | 
import PyGameDataStruct  
 | 
import CommFunc  
 | 
import PyDataManager  
 | 
import PlayerControl  
 | 
import PlayerViewCache  
 | 
import FormulaControl  
 | 
import PlayerUniversalGameRec  
 | 
  
 | 
import random  
 | 
import math  
 | 
import json  
 | 
  
 | 
RecType = ShareDefine.Def_UniversalGameRecType_XMZZStageRecord  
 | 
RecType1 = ShareDefine.Def_UniversalGameRecType_XMZZPKInfoRecord  
 | 
#strValue3 {ͶעË÷Òý:½á¹û,..}  
 | 
g_historyPKDict = {} #ÀúÊ·¶ÔÊÖID»º´æ  
 | 
  
 | 
(  
 | 
Bet_StartTime, #Ͷע¿ªÊ¼Ê±¼ä  
 | 
Bet_EndTime, #Ͷע½áÊøÊ±¼ä  
 | 
Bet_ResultTime, #Ͷע½áËãʱ¼ä  
 | 
Bet_NeedMoney, #ͶעÐèҪǮ  
 | 
) = range(4)  
 | 
  
 | 
(  
 | 
Faction_0, #δ·ÖÅä  
 | 
Faction_1, #ÏÉ×å  
 | 
Faction_2, #ħ×å  
 | 
) = range(0, 3)  
 | 
  
 | 
(  
 | 
Def_Faction1Win, #ÏÉ×åʤÀû  
 | 
Def_Faction2Win, #ħ×åʤÀû  
 | 
Def_Dogfall #ƽ¾Ö  
 | 
) = range(1, 4)  
 | 
  
 | 
  
 | 
## ·þÎñÆ÷¿ªÆôʱ¼ì²é  
 | 
def OnGameServerInitOK():  
 | 
    fbFuncStateKey = ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_XMZZ  
 | 
    gameWorld = GameWorld.GetGameWorld()  
 | 
    isAtCPing = gameWorld.GetDictByKey(fbFuncStateKey) != 0  
 | 
          
 | 
      
 | 
    hasSendAward = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_XMZZIsOver) #ÊÇ·ñ½áËã¹ý  
 | 
      
 | 
    if not isAtCPing and not hasSendAward: #»î¶¯Î´¿ªÆô²¢ÇÒδ½áËã  
 | 
        PyDataManager.GetXMZZManager().GiveXMZZAward()  
 | 
      
 | 
    return  
 | 
  
 | 
def OnXMZZOnLogin(curPlayer):  
 | 
    #Íæ¼ÒµÇ¼  
 | 
    PyDataManager.GetXMZZManager().NotifyXMZZInfo(curPlayer)  
 | 
    PyDataManager.GetXMZZManager().NotifyXMZZSelfInfo(curPlayer)  
 | 
    PlayerUniversalGameRec.SendUniversalGameRecInfo(curPlayer, RecType1)  
 | 
      
 | 
    if curPlayer.GetMapID() == ChConfig.Def_FBMapID_XMZZ:  
 | 
        PyDataManager.GetXMZZManager().SyncXMZZFightInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
def XMZZOndayEx():  
 | 
    #¹ýÌì  
 | 
    global g_historyPKDict  
 | 
    PyDataManager.GetXMZZManager().ResetXMZZ()  
 | 
    g_historyPKDict = {} #ÀúÊ·¶ÔÊÖID»º´æ  
 | 
    return  
 | 
  
 | 
## ÏÉħ֮Õù»î¶¯×´Ì¬±ä¸ü  
 | 
#  @param curPlayer  
 | 
#  @param isOpen  
 | 
#  @return  
 | 
def OnXMZZStateChange(dictName, value):  
 | 
          
 | 
    DoBetResultSaveLogic()  
 | 
      
 | 
    if value == 0: #»î¶¯½áÊø  
 | 
        PyDataManager.GetXMZZManager().GiveXMZZAward()  
 | 
      
 | 
      
 | 
    #hasSendAward = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_XMZZIsOver) #ÊÇ·ñ½áËã¹ý  
 | 
#    if value == 1 and hasSendAward:  
 | 
#        PyDataManager.GetXMZZManager().ResetXMZZ()  
 | 
    return  
 | 
  
 | 
  
 | 
def OnXMZZBet(curPlayer, msgInfo):  
 | 
    ## ÏÉħ֮ÕùͶע  
 | 
    betIndex, betResult, needMoney = msgInfo  
 | 
    fbFuncStateKey = ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_XMZZ  
 | 
    gameWorld = GameWorld.GetGameWorld()  
 | 
    if gameWorld.GetDictByKey(fbFuncStateKey) == 0:  
 | 
        return  
 | 
      
 | 
    #¼Ç¼Ͷע  
 | 
    result = PyDataManager.GetXMZZManager().AddBetRecord(curPlayer, betIndex, betResult, needMoney)  
 | 
    if result:  
 | 
        return [needMoney]  
 | 
      
 | 
def DoBetResultSaveLogic():  
 | 
    #ÏÉħ֮ÕùѺע½áËã   
 | 
    betTimeDict = IpyGameDataPY.GetFuncEvalCfg('XMZZBetCfg')  
 | 
    if not betTimeDict:  
 | 
        return  
 | 
    curResult = PyDataManager.GetXMZZManager().GetXMZZCurResult()  
 | 
    #curTime = str(GameWorld.GetServerTime())[11:16]  
 | 
    curTime = GameWorld.GetServerTime()  
 | 
    curHour, curMinute = curTime.hour, curTime.minute  
 | 
    GameWorld.DebugLog('    ÏÉħ֮ÕùѺע½áËã  curTime=%s, curResult=%s' % (curTime, curResult))  
 | 
      
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    recordList = universalRecMgr.GetTypeList(RecType)  
 | 
    if recordList.Count() <= 0:  
 | 
        recData = recordList.AddRec()  
 | 
        resutlDict = {}  
 | 
        recData.SetStrValue3(str(resutlDict))  
 | 
    else:  
 | 
        recData = recordList.At(0)  
 | 
        resutlDict = eval(recData.GetStrValue3())  
 | 
                  
 | 
  
 | 
    for betIndex, info in betTimeDict.items():  
 | 
        hour, minute = info[Bet_ResultTime].split(':')  
 | 
        if abs(curHour*60+curMinute - (int(hour)*60+int(minute))) <= 1:  
 | 
            if betIndex not in resutlDict:  
 | 
                resutlDict[betIndex] = curResult  
 | 
                recData.SetStrValue3(str(resutlDict))  
 | 
                GameWorld.DebugLog('    ÏÉħ֮Õù½×¶Î³É¼¨¼Ç¼£¡ betIndex=%s'%betIndex)  
 | 
                if int(betIndex) in [1,2,3]:  
 | 
                    if curResult == Def_Dogfall:  
 | 
                        SavePKRecord('XMZZ_DrawStage', [betIndex], True)  
 | 
                    else:  
 | 
                        SavePKRecord('XMZZ_LeadingStage', [betIndex, curResult], True)  
 | 
#                else:  
 | 
#                    if curResult != Def_Dogfall:  
 | 
#                        PyDataManager.GetXMZZManager().SavePKRecord('XMZZ_Victory', [curResult], True)  
 | 
#                    else:  
 | 
#                        PyDataManager.GetXMZZManager().SavePKRecord('XMZZ_Draw', [], True)  
 | 
                PyDataManager.GetXMZZManager().NotifyXMZZInfo()  
 | 
    return  
 | 
  
 | 
  
 | 
#// AC 01 ÏÉħ֮Õù±¨Ãû #tagCGJoinXMZZ  
 | 
#  
 | 
#struct    tagCGJoinXMZZ  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#};  
 | 
## ·ÖÅäÕóÓª   
 | 
def OnJoinXMZZ(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    PyDataManager.GetXMZZManager().DoAllocationFaction(curPlayer)  
 | 
    return  
 | 
  
 | 
#// AC 02 ÏÉħ֮ÕùÕ½¶·½áÊø #tagCGXMZZOver  
 | 
#  
 | 
#struct    tagCGXMZZOver  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        IsWin; //ÊÇ·ñʤÀû  
 | 
#    BYTE        HPPer; //Ê£ÓàѪÁ¿°Ù·Ö±È  
 | 
#};  
 | 
def OnXMZZPKOver(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    isWin = clientData.IsWin  
 | 
    isEnd = clientData.IsEnd  
 | 
    HPPer = clientData.HPPer  
 | 
    vsName = clientData.VSName  
 | 
    #¼ÆËãÔö¼Ó»ý·Ö  
 | 
    XMZZPKOver(curPlayer, vsName, isWin, isEnd, HPPer)  
 | 
    return  
 | 
  
 | 
def XMZZStartFight(curPlayer, msgInfo):  
 | 
    ##¿ªÊ¼Õ½¶·  
 | 
    isStart = msgInfo[0]  
 | 
    if isStart:#±¾¾Ö¸Õ¿ªÊ¼ÔòÇå³ýÁ¬Ê¤¼Ç¼  
 | 
        PyDataManager.GetXMZZManager().ResetConWinRecord(curPlayer)  
 | 
          
 | 
    #ɸѡ¶ÔÊÖ  
 | 
    isOK = RandomBattler(curPlayer)  
 | 
    if isOK and isStart:  
 | 
        return True  
 | 
    return   
 | 
  
 | 
  
 | 
  
 | 
  
 | 
def OnGetXMZZWinPrize(curPlayer, msgList):  
 | 
    ##ÁìÈ¡ÏÉħ֮ÕùʤÀû³¡Êý½±Àø  
 | 
    prizeEx = msgList[0]  
 | 
    result = PyDataManager.GetXMZZManager().GetWinCntPrize(curPlayer, prizeEx)  
 | 
    if not result:  
 | 
        return  
 | 
    return [prizeEx]  
 | 
  
 | 
  
 | 
# ÏÉħ֮Õù¹ÜÀí  
 | 
class XMZZManager(object):  
 | 
         
 | 
    def __init__(self):  
 | 
        self.XMZZPlayerDict = {}     # {playerid:data, ...} PyGameDataStruct.tagDBPySealDemonRecord  
 | 
        self.XMZZFactionDict = {Faction_1:[0, 0], Faction_2:[0, 0]}    # {faction:[»ý·Ö, ÈËÊý]}  
 | 
        self.XMZZTopScore = 0 #»ý·ÖÍõ»ý·Ö  
 | 
        self.XMZZTopPlayerName = '' #»ý·ÖÍõÃû  
 | 
        self.vsPlayerIDDict = {} #µ±Ç°¶ÔÊÖID  
 | 
        return  
 | 
  
 | 
    def ResetConWinRecord(self, curPlayer):  
 | 
        ##ÖØÖÃÁ¬Ê¤  
 | 
        playerID = curPlayer.GetID()  
 | 
        if playerID not in self.XMZZPlayerDict:  
 | 
            return  
 | 
        self.XMZZPlayerDict[playerID].ConWinCnt = 0  
 | 
        return  
 | 
      
 | 
    def GetXMZZPKCnt(self, curPlayer):  
 | 
        ##»ñÈ¡ÒÑPK³¡´Î  
 | 
        playerID = curPlayer.GetID()  
 | 
        if playerID not in self.XMZZPlayerDict:  
 | 
            return 0  
 | 
        return self.XMZZPlayerDict[playerID].WinCnt + self.XMZZPlayerDict[playerID].LoseCnt  
 | 
      
 | 
    def GetPlayerXMZZFaction(self, playerID):  
 | 
        ##»ñÈ¡Íæ¼ÒËùÊôÕóÓª  
 | 
        if playerID not in self.XMZZPlayerDict:  
 | 
            return Faction_0  
 | 
        return self.XMZZPlayerDict[playerID].Faction  
 | 
      
 | 
      
 | 
    def SyncXMZZFightInfo(self, curPlayer):  
 | 
        playerID = curPlayer.GetPlayerID()  
 | 
        if playerID not in self.vsPlayerIDDict:  
 | 
            return  
 | 
        pkPlayerID = self.vsPlayerIDDict[playerID]  
 | 
        curCache = PlayerViewCache.FindViewCache(pkPlayerID)  
 | 
        if not curCache:  
 | 
            return  
 | 
          
 | 
        packData = ChPyNetSendPack.tagGCXMZZFightInfo()  
 | 
        packData.Clear()  
 | 
        packData.PlayerID = pkPlayerID  
 | 
        packData.PropData = curCache.PropData  
 | 
        packData.PropDataSize = len(packData.PropData)  
 | 
        NetPackCommon.SendFakePack(curPlayer, packData)  
 | 
        return  
 | 
      
 | 
    def MapServer_XMZZPKInfo(self, curPlayer, overInfo, vsPlayerInfo):  
 | 
        # Í¨ÖªMapServer PKÐÅÏ¢  
 | 
        result = str([overInfo, vsPlayerInfo])  
 | 
        curPlayer.MapServer_QueryPlayerResult(0, 0, "XMZZPKInfo", result, len(result))  
 | 
        return  
 | 
      
 | 
    def AddBetRecord(self, curPlayer, betIndex, betResult, needMoney):  
 | 
        ##ÐÂÔöѺע¼Ç¼  
 | 
        playerID = curPlayer.GetID()  
 | 
        if playerID not in self.XMZZPlayerDict:  
 | 
            GameWorld.DebugLog('    ÏÉħ֮Õùδ·ÖÅäÕóÓªµÄ²»ÄÜѺע', playerID)  
 | 
            return  
 | 
        betInfoDict = eval(self.XMZZPlayerDict[playerID].BetRecord) #{¾º²ÂË÷Òý:[ѺעÄÄ·½Ê¤,ѺÁ˶àÉÙÇ®]}  
 | 
  
 | 
        if betIndex in betInfoDict:  
 | 
            GameWorld.DebugLog('    ÏÉħ֮ÕùÒÑѺע¹ý¸ÃÂÖ´ÎbetIndex=%s' % betIndex, playerID)  
 | 
            #ÒÑѺע¹ý¸ÃÂÖ´Î  
 | 
            return  
 | 
        GameWorld.DebugLog('    ÏÉħ֮ÕùѺע³É¹¦betIndex=%s,betResult=%s' % (betIndex, betResult), playerID)  
 | 
        betInfoDict[betIndex] = [betResult, needMoney]  
 | 
        self.XMZZPlayerDict[playerID].BetRecord = str(betInfoDict)  
 | 
        self.XMZZPlayerDict[playerID].Len = len(str(betInfoDict))  
 | 
        self.NotifyXMZZSelfInfo(curPlayer)  
 | 
        return 1  
 | 
      
 | 
    def GetStageResultRecord(self):  
 | 
        #»ñÈ¡½×¶Î±È·ÖÇé¿ö  
 | 
        universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
        recordList = universalRecMgr.GetTypeList(RecType)  
 | 
        if recordList.Count() <= 0:  
 | 
            resutlDict = {}  
 | 
        else:  
 | 
            recData = recordList.At(0)  
 | 
            resutlDict = eval(recData.GetStrValue3())  
 | 
        return resutlDict  
 | 
      
 | 
    def BetOverLogic(self):  
 | 
        #Ѻע½áËã  
 | 
        resutlDict = self.GetStageResultRecord()  
 | 
          
 | 
        betTimeDict = IpyGameDataPY.GetFuncEvalCfg('XMZZBetCfg')  
 | 
          
 | 
        for playerID, XMZZData in self.XMZZPlayerDict.items():  
 | 
            betInfoDict = eval(XMZZData.BetRecord)  
 | 
            if not betInfoDict:  
 | 
                continue  
 | 
            paramList = [] #Óʼþ²ÎÊý  
 | 
            totalGiveMoney = 0 #ÍÇ®  
 | 
            for betID in [0]: #ÔÝдËÀ˳Ðò  
 | 
                if str(betID) not in betTimeDict:  
 | 
                    GameWorld.ErrLog('XMZZBetCfg Ñº×¢Ë÷ÒýÅäÖÃÒì³££¡')  
 | 
                    return  
 | 
                if betID not in betInfoDict:  
 | 
                    #δͶע  
 | 
                    paramList += [0, 0]  
 | 
                else:  
 | 
                    betSide, needMoney = betInfoDict[betID]  
 | 
                      
 | 
                    if str(betID) in resutlDict: #¸ÃÂÖ´ÎÓÐʤ¸º¼Ç¼ÔòÕý³£½áËã,·ñÔòÍË»ØÑº×¢Ç®  
 | 
                        curResult = resutlDict[str(betID)]  
 | 
                         
 | 
                        isRight = int(betSide == curResult) #ÊÇ·ñѺע¶ÔÁË  
 | 
                        getMoney = needMoney * 2 if isRight else needMoney / 2  
 | 
                        totalGiveMoney += getMoney  
 | 
                        paramList += [isRight + 1, getMoney]  
 | 
                    else:  
 | 
                        totalGiveMoney += needMoney  
 | 
                        paramList += [3, needMoney]  
 | 
                      
 | 
            PlayerCompensation.SendMailByKey('XMZZBet', [playerID], [], paramList, silver=totalGiveMoney)  
 | 
            GameWorld.DebugLog('    ÏÉħ֮ÕùѺע½áËã paramList=%s,totalGiveMoney=%s' % (paramList, totalGiveMoney), playerID)  
 | 
        return  
 | 
      
 | 
    def GetXMZZCurResult(self):  
 | 
        #»ñÈ¡µ±Ç°±È·ÖÇé¿ö  
 | 
        faction_1_Score = self.XMZZFactionDict.get(Faction_1, [0, 0])[0]  
 | 
        faction_2_Score = self.XMZZFactionDict.get(Faction_2, [0, 0])[0]  
 | 
        if faction_1_Score > faction_2_Score:  
 | 
            result = Def_Faction1Win  
 | 
        elif faction_1_Score == faction_2_Score:  
 | 
            result = Def_Dogfall  
 | 
        else:  
 | 
            result = Def_Faction2Win  
 | 
        return result  
 | 
      
 | 
    def DoAllocationFaction(self, curPlayer):  
 | 
        #·ÖÅäÕóÓª  
 | 
        fbFuncStateKey = ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_XMZZ  
 | 
        if GameWorld.GetGameWorld().GetDictByKey(fbFuncStateKey) == 0:  
 | 
            GameWorld.DebugLog('ÏÉħ֮Õù±¨Ãû »î¶¯Î´¿ªÆô£¡')  
 | 
            return  
 | 
          
 | 
        curPlayerID = curPlayer.GetID()  
 | 
        if curPlayerID in self.XMZZPlayerDict:  
 | 
            GameWorld.DebugLog('·ÖÅäÏÉħ֮ÕùÕóÓª ÒÑ·ÖÅä¹ý£¡', curPlayerID)  
 | 
            #ÒÑ·ÖÅä¹ý  
 | 
            return True  
 | 
        Faction_1_Cnt = self.XMZZFactionDict.get(Faction_1, [0, 0])[1]  
 | 
        Faction_2_Cnt = self.XMZZFactionDict.get(Faction_2, [0, 0])[1]  
 | 
        if Faction_1_Cnt < Faction_2_Cnt:  
 | 
            result = Faction_1  
 | 
        else:  
 | 
            result = Faction_2  
 | 
        self.XMZZFactionDict[result][1] += 1  
 | 
          
 | 
        GameWorld.DebugLog('·ÖÅäÏÉħ֮ÕùÕóÓª result=%s' % result, curPlayerID)  
 | 
          
 | 
        record = PyGameDataStruct.tagDBPyXMZZ()  
 | 
        record.clear()  
 | 
        record.PlayerID = curPlayerID  
 | 
        record.Name = curPlayer.GetName()   
 | 
        record.Faction = result  
 | 
        record.BetRecord = '{}'  
 | 
        record.Len = len(record.BetRecord)  
 | 
        self.XMZZPlayerDict[curPlayerID] = record  
 | 
          
 | 
          
 | 
        #֪ͨ¿Í»§¶Ë  
 | 
        self.NotifyXMZZSelfInfo(curPlayer)  
 | 
        self.NotifyXMZZInfo(curPlayer)  
 | 
        return True  
 | 
      
 | 
    def GetWinCntPrize(self, curPlayer, getWinCnt):  
 | 
        #ÁìȡʤÀû³¡´Î½±Àø  
 | 
        playerID = curPlayer.GetID()  
 | 
        if playerID not in self.XMZZPlayerDict:  
 | 
            GameWorld.DebugLog('ÏÉħ֮ÕùÁìȡʤÀû³¡´Î½±Àø  Î´±¨Ãû²Î¼Ó£¡', playerID)  
 | 
            return  
 | 
        if getWinCnt > self.XMZZPlayerDict[playerID].WinCnt:  
 | 
            GameWorld.DebugLog('ÏÉħ֮ÕùÁìȡʤÀû³¡´Î½±Àø  Ê¤³¡Êý²»×ã getWinCnt=%s£¡' % getWinCnt, playerID)  
 | 
            return  
 | 
        winCntAwardDict = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 1, {})  
 | 
        if str(getWinCnt) not in winCntAwardDict:  
 | 
            GameWorld.DebugLog('ÏÉħ֮ÕùÁìȡʤÀû³¡´Î½±Àø  Î´ÅäÖøó¡´Î½±Àø getWinCnt=%s£¡' % getWinCnt, playerID)  
 | 
            return  
 | 
        keyList = [int(cnt) for cnt in winCntAwardDict.keys()]  
 | 
        keyList.sort()  
 | 
        index = keyList.index(getWinCnt)  
 | 
        #ÊÇ·ñÒÑÁìÈ¡  
 | 
        awardRecord = self.XMZZPlayerDict[playerID].WinAwardRecord  
 | 
          
 | 
        if awardRecord & pow(2, index):  
 | 
            GameWorld.DebugLog('ÏÉħ֮ÕùÁìȡʤÀû³¡´Î½±Àø  ÒÑÁìÈ¡¸Ã½±Àø getWinCnt=%s£¡' % getWinCnt, playerID)  
 | 
            #ÒÑÁìÈ¡¸Ã½±Àø  
 | 
            return  
 | 
        self.XMZZPlayerDict[playerID].WinAwardRecord = awardRecord | pow(2, index)  
 | 
        self.NotifyXMZZSelfInfo(curPlayer)  
 | 
        return 1  
 | 
      
 | 
    def GiveXMZZAward(self):  
 | 
        ##»î¶¯½áÊø¸ø½±Àø  
 | 
        if not self.XMZZPlayerDict:  
 | 
            return  
 | 
        hasSendAward = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_XMZZIsOver) #ÊÇ·ñ½áËã¹ý  
 | 
        if hasSendAward:  
 | 
            GameWorld.DebugLog('    GiveXMZZAward ÒѾ½áËã¹ý£¡')  
 | 
            return  
 | 
          
 | 
        winCntAwardDict = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 1, {})  
 | 
        winCntList = [int(cnt) for cnt in winCntAwardDict.keys()]  
 | 
        winCntList.sort()  
 | 
        topScorePlayerID = 0  
 | 
        topScore = 0  
 | 
        Faction_1_IDList = [] #ÏÉ×åÕóÓªÍæ¼Ò  
 | 
        Faction_2_IDList = [] #ħ×åÕóÓªÍæ¼Ò  
 | 
        for playerID, XMZZData in self.XMZZPlayerDict.items():  
 | 
            curWinCnt = XMZZData.WinCnt  
 | 
            winCntAwardRecord = XMZZData.WinAwardRecord  
 | 
            score = XMZZData.Score  
 | 
            faction = XMZZData.Faction  
 | 
            #ʤÀû³¡´Î½±ÀøÓʼþ²¹·¢  
 | 
            if curWinCnt >= winCntList[0]:  
 | 
                winCntAwardList = []  
 | 
                for i, winCnt in enumerate(winCntList):  
 | 
                    if curWinCnt < winCnt:  
 | 
                        break  
 | 
                    if winCntAwardRecord & pow(2, i):  
 | 
                        continue  
 | 
                    winCntAwardRecord |= pow(2, i)  
 | 
                    winCntAwardList += winCntAwardDict[str(winCnt)]  
 | 
                if winCntAwardList:  
 | 
                    XMZZData.WinAwardRecord = winCntAwardRecord #¸üмǼ  
 | 
                    PlayerCompensation.SendMailByKey('XMZZWinCnt', [playerID], winCntAwardList, [curWinCnt])  
 | 
            if score > topScore:  
 | 
                topScorePlayerID = playerID  
 | 
                topScore = score  
 | 
            if faction == Faction_1:  
 | 
                Faction_1_IDList.append(playerID)  
 | 
            else:  
 | 
                Faction_2_IDList.append(playerID)  
 | 
              
 | 
          
 | 
          
 | 
        #µÚÒ»»ý·Ö½±Àø  
 | 
        if topScorePlayerID:  
 | 
            topScoreAward = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 2)  
 | 
            if topScoreAward:  
 | 
                PlayerCompensation.SendMailByKey('XMZZTopScore', [topScorePlayerID], topScoreAward, [topScore])  
 | 
                SavePKRecord('XMZZ_FirstPlace', [self.XMZZTopPlayerName, self.XMZZTopScore], False)  
 | 
          
 | 
        #Ѻע½±Àø  
 | 
        self.BetOverLogic()  
 | 
          
 | 
        #ÕóÓª½±Àø  
 | 
        winAward = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 3)  
 | 
        LoseAward = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 4)  
 | 
        dogfallAward = IpyGameDataPY.GetFuncCfg('XMZZAward', 5)  
 | 
        result = self.GetXMZZCurResult()  
 | 
        if result == Faction_1:  
 | 
            SavePKRecord('XMZZ_Victory', [result], True)            
 | 
            PlayerCompensation.SendMailByKey('XMZZWin', Faction_1_IDList, winAward)  
 | 
            PlayerCompensation.SendMailByKey('XMZZLose', Faction_2_IDList, LoseAward)  
 | 
        elif result == Faction_2:  
 | 
            SavePKRecord('XMZZ_Victory', [result], True)  
 | 
            PlayerCompensation.SendMailByKey('XMZZWin', Faction_2_IDList, winAward)  
 | 
            PlayerCompensation.SendMailByKey('XMZZLose', Faction_1_IDList, LoseAward)  
 | 
        else: #ƽ¾Ö Ë«·½ÕóÓª»ý·Ö´ïµ½1000»ý·ÖʱÉúЧ  
 | 
            XMZZDogFallLimit = IpyGameDataPY.GetFuncCfg('XMZZDogFallLimit')  
 | 
            faction_1_Score = self.XMZZFactionDict.get(Faction_1, [0, 0])[0]  
 | 
            faction_2_Score = self.XMZZFactionDict.get(Faction_2, [0, 0])[0]  
 | 
            if faction_1_Score + faction_2_Score >= XMZZDogFallLimit:  
 | 
                SavePKRecord('XMZZ_Draw', [], True)  
 | 
                  
 | 
                PlayerCompensation.SendMailByKey('XMZZDogfall', Faction_2_IDList + Faction_1_IDList, [], goldPaper=dogfallAward)  
 | 
          
 | 
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_XMZZIsOver, 1)  
 | 
        self.NotifyXMZZInfo()  
 | 
        return  
 | 
      
 | 
    def ResetXMZZ(self):  
 | 
        #ÖØÖÃ  
 | 
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_XMZZIsOver, 0)  
 | 
        self.XMZZPlayerDict = {}  
 | 
        self.XMZZFactionDict = {Faction_1:[0, 0], Faction_2:[0, 0]}  
 | 
        self.XMZZTopPlayerName = ''  
 | 
        self.XMZZTopScore = 0  
 | 
        self.vsPlayerIDDict = {}  
 | 
        GameWorld.GetUniversalRecMgr().Delete(RecType)  
 | 
        GameWorld.GetUniversalRecMgr().Delete(RecType1)  
 | 
        PlayerUniversalGameRec.SendUniversalGameRecInfo(None, RecType1)  
 | 
        playerManager = GameWorld.GetPlayerManager()  
 | 
        for i in range(0, playerManager.GetPlayerCount()):  
 | 
            curPlayer = playerManager.GetPlayerByIndex(i)  
 | 
            if curPlayer == None or not curPlayer.GetInitOK():  
 | 
                continue  
 | 
            self.NotifyXMZZSelfInfo(curPlayer, True)  
 | 
        self.NotifyXMZZInfo()  
 | 
        return  
 | 
      
 | 
    def NotifyXMZZSelfInfo(self, curPlayer, isReset=False):  
 | 
        ##×Ô¼ºÏà¹ØÊý¾Ý  
 | 
        playerID = curPlayer.GetID()  
 | 
        if not isReset and playerID not in self.XMZZPlayerDict:  
 | 
            return  
 | 
        xmzzData = self.XMZZPlayerDict.get(playerID)  
 | 
        packData = ChPyNetSendPack.tagGCXMZZSelfInfo()  
 | 
        packData.Clear()  
 | 
        if xmzzData:  
 | 
            packData.Faction = xmzzData.Faction  
 | 
            packData.Score = xmzzData.Score  
 | 
            packData.WinCnt = xmzzData.WinCnt  
 | 
            packData.WinCntAwardRecord = xmzzData.WinAwardRecord  
 | 
            betInfoDict = eval(xmzzData.BetRecord) #{¾º²ÂË÷Òý:[ѺעÄÄ·½Ê¤,ѺÁ˶àÉÙÇ®]}  
 | 
            packData.BetRecord = json.dumps(betInfoDict, ensure_ascii=False)  
 | 
            packData.Len = len(packData.BetRecord)  
 | 
        NetPackCommon.SendFakePack(curPlayer, packData)  
 | 
        return  
 | 
      
 | 
    def NotifyXMZZInfo(self, curPlayer=None):  
 | 
        #»î¶¯Ïà¹ØÊý¾Ý  
 | 
        packData = ChPyNetSendPack.tagGCXMZZInfo()  
 | 
        packData.Clear()  
 | 
        #resutlDict = self.GetStageResultRecord()  
 | 
        #packData.StageRecord = json.dumps(resutlDict, ensure_ascii=False)  
 | 
        #packData.Len = len(packData.StageRecord)  
 | 
        packData.Score1 = self.XMZZFactionDict[Faction_1][0]  
 | 
        packData.Score2 = self.XMZZFactionDict[Faction_2][0]  
 | 
        packData.TopScore = self.XMZZTopScore  
 | 
        packData.TopName = self.XMZZTopPlayerName  
 | 
          
 | 
        if curPlayer:  
 | 
            NetPackCommon.SendFakePack(curPlayer, packData)  
 | 
        else:  
 | 
            playerManager = GameWorld.GetPlayerManager()  
 | 
            for playerID in self.XMZZPlayerDict.keys():  
 | 
                notifyPlayer = playerManager.FindPlayerByID(playerID)  
 | 
                if notifyPlayer == None:  
 | 
                    continue  
 | 
                if PlayerControl.GetIsTJG(notifyPlayer):  
 | 
                    continue  
 | 
  
 | 
                NetPackCommon.SendFakePack(notifyPlayer, packData)  
 | 
        return  
 | 
      
 | 
    # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup  
 | 
    def GetSaveData(self):  
 | 
        savaData = ""  
 | 
        cntData = ""  
 | 
        cnt = 0  
 | 
        for XMZZData in self.XMZZPlayerDict.values():  
 | 
            cnt += 1  
 | 
            savaData += XMZZData.getBuffer()  
 | 
                  
 | 
        GameWorld.Log("SaveXMZZ cnt :%s" % cnt)  
 | 
        return CommFunc.WriteDWORD(cntData, cnt) + savaData  
 | 
      
 | 
    # ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý  
 | 
    def LoadPyGameData(self, datas, pos, dataslen):  
 | 
        cnt, pos = CommFunc.ReadDWORD(datas, pos)  
 | 
        GameWorld.Log("LoadXMZZ cnt :%s" % cnt)  
 | 
          
 | 
        self.XMZZPlayerDict = {}  
 | 
        self.XMZZFactionDict = {Faction_1:[0, 0], Faction_2:[0, 0]}  
 | 
        self.XMZZTopScore = 0  
 | 
        self.XMZZTopPlayerName = ''  
 | 
        for _ in xrange(cnt):  
 | 
            data = PyGameDataStruct.tagDBPyXMZZ()  
 | 
            data.clear()  
 | 
            pos += data.readData(datas, pos, dataslen)  
 | 
            playerID = data.PlayerID  
 | 
            self.XMZZPlayerDict[playerID] = data  
 | 
            faction = data.Faction  
 | 
            score = data.Score  
 | 
            self.XMZZFactionDict[faction][0] += score  
 | 
            self.XMZZFactionDict[faction][1] += 1  
 | 
            if score > self.XMZZTopScore:  
 | 
                self.XMZZTopScore = score  
 | 
                self.XMZZTopPlayerName = data.Name  
 | 
        return pos  
 | 
  
 | 
  
 | 
def RandomBattler(curPlayer, overInfo=[]):  
 | 
    #ɸѡ¶ÔÊÖ ¸ù¾ÝÁ¬Ê¤´ÎÊýÒ»¶¨¼¸ÂÊËæ»úµ½¸ß¼¶»úÆ÷ÈË£¬·ñÔòÿ5¸öµÄµÚ1¸öµÍÓÚ×Ô¼ºÕ½Á¦ ÏÈ´ÓС·¶Î§Ëæ»ú£¬ÔÙ´ó·¶Î§Ëæ»ú£¬Ã»ÓÐÔòÓÃNPC  
 | 
    global g_historyPKDict  
 | 
    myPlayerID = curPlayer.GetID()  
 | 
    GameWorld.DebugLog('    ÏÉħ֮Õù¿ªÊ¼É¸Ñ¡¶ÔÊÖ', myPlayerID)  
 | 
    XMZZManager = PyDataManager.GetXMZZManager()  
 | 
    XMZZPlayerDict = XMZZManager.XMZZPlayerDict  
 | 
      
 | 
    if myPlayerID not in XMZZPlayerDict:  
 | 
        GameWorld.DebugLog("    ÏÉħ֮Õùϵͳ×Ô¶¯±¨Ãû!", myPlayerID)  
 | 
        if not XMZZManager.DoAllocationFaction(curPlayer):  
 | 
            GameWorld.DebugLog('    ÏÉħ֮Õùɸѡ¶ÔÊÖ, ÏµÍ³×Ô¶¯±¨Ãûʧ°Ü£¡£¡', myPlayerID)  
 | 
            return  
 | 
          
 | 
    pkPlayerID = 0 # Ä¬Èϵͼ¶»úÆ÷ÈË  
 | 
    isRobotNPC = True  
 | 
    conWinCnt = XMZZPlayerDict[myPlayerID].ConWinCnt #²ÎÊý  
 | 
    XMZZSpecialNPCRate = eval(IpyGameDataPY.GetFuncCompileCfg('XMZZSpecialNPCRate'))  
 | 
    XMZZSuperNPCRate = eval(IpyGameDataPY.GetFuncCompileCfg('XMZZSpecialNPCRate', 2))  
 | 
    XMZZNPCByLVPowerList = IpyGameDataPY.GetFuncEvalCfg('XMZZPKPowerRange', 2)  
 | 
    isByLVPower = conWinCnt + 1 in XMZZNPCByLVPowerList #ÊÇ·ñ°´µÈ¼¶±íÕ½Á¦À´Ëæ»ú·¶Î§  
 | 
    if GameWorld.CanHappen(XMZZSuperNPCRate):  
 | 
        GameWorld.DebugLog('    É¸Ñ¡¶ÔÊÖ  ³¬¼¶»úÆ÷ÈË XMZZSuperNPCRate=%s' % (XMZZSuperNPCRate))  
 | 
        pkPlayerID = 2  
 | 
      
 | 
    elif not isByLVPower and GameWorld.CanHappen(XMZZSpecialNPCRate):  
 | 
        GameWorld.DebugLog('    É¸Ñ¡¶ÔÊÖ  ¸ß¼¶»úÆ÷ÈË XMZZSpecialNPCRate=%s' % (XMZZSpecialNPCRate))  
 | 
        #»úÆ÷ÈËID¹æÔò: ID´Ó0~n, n²»´óÓÚ»úÆ÷ÈËIDÁÐ±í³¤¶È, IDÔ½´ó»úÆ÷ÈËÔ½¸ß¼¶£¬¸ù¾Ý²ß»®ÐèÇó×ÔÔö  
 | 
        #¸ß¼¶»úÆ÷ÈË  
 | 
        pkPlayerID = 1  
 | 
    else:  
 | 
        historyPKList = g_historyPKDict.get(myPlayerID, [])  
 | 
        myFaction = XMZZManager.GetPlayerXMZZFaction(myPlayerID)  
 | 
        if isByLVPower:  
 | 
            worldLv = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)  
 | 
            ipyData = IpyGameDataPY.GetIpyGameData('PlayerLV', worldLv)  
 | 
            myPower = ipyData.GetReFightPower() if ipyData else curPlayer.GetFightPower()   
 | 
        else:  
 | 
            myPower = curPlayer.GetFightPower()  
 | 
        XMZZPKPowerRange = IpyGameDataPY.GetFuncEvalCfg('XMZZPKPowerRange')  
 | 
        minPower1, maxPower1 = myPower * (100 - XMZZPKPowerRange[0][0]) / 100, myPower * (100 + XMZZPKPowerRange[0][1]) / 100  
 | 
        minPower2, maxPower2 = myPower * (100 - XMZZPKPowerRange[1][0]) / 100, myPower * (100 + XMZZPKPowerRange[1][1]) / 100  
 | 
        underList1, aboveList1 = [], [] #С·¶Î§  
 | 
        underList2, aboveList2 = [], [] #´ó·¶Î§  
 | 
          
 | 
        pyViewCacheMgr = PyDataManager.GetPlayerViewCachePyManager()  
 | 
        playerViewCachePyDict = pyViewCacheMgr.playerViewCachePyDict  
 | 
        for playerID, curCache in playerViewCachePyDict.items():  
 | 
            if myPlayerID == playerID:  
 | 
                #²»ºÍ×Ô¼ºpk  
 | 
                continue  
 | 
            if XMZZManager.GetPlayerXMZZFaction(playerID) == myFaction:  
 | 
                #ͬÕóÓªµÄ²»PK  
 | 
                continue  
 | 
            if playerID in historyPKList:  
 | 
                #ÒÑÆ¥Åä¹ýµÄÌø¹ý  
 | 
                continue  
 | 
              
 | 
            propDataDict = PlayerViewCache.GetCachePropDataDict(curCache)  
 | 
            power = propDataDict.get('FightPower', 0)  
 | 
              
 | 
            #GameWorld.DebugLog('    É¸Ñ¡¶ÔÊÖ playerID=%s,power=%s' % (playerID, power))  
 | 
            if minPower1 < power < myPower:  
 | 
                underList1.append(playerID)  
 | 
            if myPower < power < maxPower1:  
 | 
                aboveList1.append(playerID)  
 | 
            if minPower2 < power < myPower:  
 | 
                underList2.append(playerID)  
 | 
            if myPower < power < maxPower2:  
 | 
                aboveList2.append(playerID)  
 | 
        GameWorld.DebugLog('    É¸Ñ¡¶ÔÊÖ myPower=%s,underList1=%s, aboveList1=%s,underList2=%s, aboveList2=%s' % (myPower, underList1, aboveList1, underList2, aboveList2), myPlayerID)  
 | 
  
 | 
        if conWinCnt % 5 == 0 or conWinCnt <= IpyGameDataPY.GetFuncCfg('XMZZPKPowerRange', 3): #ÿ5¸öÆ¥ÅäÕ½Á¦µÍµÄ¶ÔÊÖ  
 | 
            if underList1:  
 | 
                pkPlayerID = underList1[0]  
 | 
            elif underList2:  
 | 
                pkPlayerID = underList2[0]  
 | 
              
 | 
        else:  
 | 
            if underList1 + aboveList1:  
 | 
                pkPlayerID = random.choice(underList1 + aboveList1)  
 | 
            elif underList2 + aboveList2:  
 | 
                pkPlayerID = random.choice(underList2 + aboveList2)  
 | 
            elif historyPKList:  
 | 
                pkPlayerID = random.choice(historyPKList)  
 | 
                #ÖØÖÃÀúÊ·PK¶ÔÊÖ  
 | 
                g_historyPKDict[myPlayerID] = []  
 | 
                  
 | 
        if pkPlayerID:  
 | 
            isRobotNPC = False  
 | 
              
 | 
    if isRobotNPC:  
 | 
        #»úÆ÷ÈË, Ö°ÒµËæ»ú  
 | 
        openJob = IpyGameDataPY.GetFuncEvalCfg("OpenJob")  
 | 
        pkPlayerPropData = {"Job":random.choice(openJob), "LV":curPlayer.GetLV()}  
 | 
    else:  
 | 
        if myPlayerID in g_historyPKDict:  
 | 
            g_historyPKDict[myPlayerID].append(pkPlayerID)  
 | 
        else:  
 | 
            g_historyPKDict[myPlayerID] = [pkPlayerID]  
 | 
              
 | 
        pkPlayerCache = PlayerViewCache.FindViewCache(pkPlayerID)  
 | 
        pkPlayerPropData = {} if not pkPlayerCache else PlayerViewCache.GetCachePropDataDict(pkPlayerCache)  
 | 
    XMZZManager.vsPlayerIDDict[myPlayerID] = pkPlayerID  
 | 
  
 | 
    GameWorld.DebugLog('   ÏÉħ֮ÕùÆ¥Åä¶ÔÊÖÐÅÏ¢ pkPlayerID=%s, pkPlayerPropData=%s, overInfo=%s' % (pkPlayerID, pkPlayerPropData, overInfo), myPlayerID)  
 | 
      
 | 
    #֪ͨǰ¶Ë  
 | 
    packData = ChPyNetSendPack.tagGCXMZZFightInfo()  
 | 
    packData.Clear()  
 | 
    packData.PlayerID = pkPlayerID  
 | 
    packData.PropData = str(pkPlayerPropData)  
 | 
    packData.PropDataSize = len(packData.PropData)  
 | 
    NetPackCommon.SendFakePack(curPlayer, packData)  
 | 
      
 | 
    #֪ͨµØÍ¼  
 | 
    if not pkPlayerPropData:  
 | 
        GameWorld.ErrLog("ÏÉħ֮ÕùûÓÐÆ¥Åäµ½¶ÔÊÖÐÅÏ¢£¡fightPower=%s" % curPlayer.GetFightPower(), myPlayerID)  
 | 
    vsPlayerInfo = [pkPlayerID, pkPlayerPropData]  
 | 
    XMZZManager.MapServer_XMZZPKInfo(curPlayer, overInfo, vsPlayerInfo)  
 | 
    return True  
 | 
  
 | 
  
 | 
def SavePKRecord(sysMark,paramList=[], isSys=False):  
 | 
    #PKÐÅÏ¢¼Ç¼  
 | 
    if isSys:  
 | 
        PlayerControl.WorldNotify(0, sysMark, paramList)  
 | 
    maxCnt = IpyGameDataPY.GetFuncCfg('XMZZPKRecord', 2)  
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    recordList = universalRecMgr.GetTypeList(RecType1)  
 | 
    if recordList.Count() >= maxCnt:  
 | 
        recordList.Delete(0)  
 | 
      
 | 
      
 | 
    paramList = [str(param) for param in paramList]  
 | 
    strValue3 = '|'.join(paramList)  
 | 
           
 | 
    recData = recordList.AddRec()  
 | 
    recData.SetStrValue1(sysMark)  
 | 
    recData.SetStrValue3(strValue3)  
 | 
    #֪ͨ  
 | 
    #PlayerUniversalGameRec.SendUniversalGameRecInfo(None, RecType1)  
 | 
    return  
 | 
  
 | 
def XMZZPKOver(curPlayer, vsName, isWin=True, isEnd=False, HPPer=100):  
 | 
    #PK½áÊø£¬¸üнá¹û»ý·Ö  
 | 
    playerID = curPlayer.GetID()  
 | 
    XMZZManager = PyDataManager.GetXMZZManager()  
 | 
    if playerID not in XMZZManager.XMZZPlayerDict:  
 | 
        return False  
 | 
      
 | 
    hasSendAward = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_XMZZIsOver) #ÊÇ·ñ½áËã¹ý  
 | 
    if hasSendAward:  
 | 
        GameWorld.DebugLog('    XMZZPKOver ÒѾ½áËã¹ý£¡')  
 | 
        result = [isWin, True, 0, 0, XMZZManager.XMZZPlayerDict[playerID].ConWinCnt]  
 | 
        XMZZManager.MapServer_XMZZPKInfo(curPlayer, result, [])  
 | 
        return False  
 | 
      
 | 
    if playerID not in XMZZManager.vsPlayerIDDict:  
 | 
        GameWorld.DebugLog('    XMZZPKOver Ã»ÓжÔÊÖ self.vsPlayerIDDict=%s'%XMZZManager.vsPlayerIDDict, playerID)  
 | 
        return False  
 | 
    XMZZManager.vsPlayerIDDict.pop(playerID)  
 | 
      
 | 
    oldConWinCnt = XMZZManager.XMZZPlayerDict[playerID].ConWinCnt  
 | 
    needRecordConCntList = IpyGameDataPY.GetFuncEvalCfg('XMZZPKRecord')  
 | 
    if isWin:  
 | 
        XMZZManager.XMZZPlayerDict[playerID].WinCnt += 1  
 | 
        XMZZManager.XMZZPlayerDict[playerID].ConWinCnt += 1  
 | 
    else:  
 | 
        XMZZManager.XMZZPlayerDict[playerID].LoseCnt += 1  
 | 
        #self.XMZZPlayerDict[playerID].ConWinCnt = 0 ÊäÁËÖ±½Ó½áËãÍ˳ö£¬ËùÒÔ´Ë´¦²»ÖØÖà  
 | 
          
 | 
      
 | 
    conWinCnt = XMZZManager.XMZZPlayerDict[playerID].ConWinCnt  
 | 
    addPerList = IpyGameDataPY.GetFuncEvalCfg('XMZZPKAward')  
 | 
    addPerIndex = min(max(0, conWinCnt - 1), len(addPerList)-1)  
 | 
    addPer = addPerList[addPerIndex] #Á¬Ê¤Ôö¼ÓµÄ°Ù·Ö±È  
 | 
    if isWin:  
 | 
        winAddScoreFormula = IpyGameDataPY.GetFuncCompileCfg('XMZZPKAward', 2)  
 | 
        addScore = eval(winAddScoreFormula)  
 | 
        #Á¬Ê¤¼Ç¼  
 | 
        if conWinCnt in needRecordConCntList:  
 | 
            SavePKRecord('XMZZ_Streak', [curPlayer.GetName(), vsName, conWinCnt, addScore])  
 | 
        #Á¬Ê¤³É¾Í  
 | 
        PlayerControl.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_XMZZConWin, 1, [conWinCnt])  
 | 
    else:  
 | 
        failAddScoreFormula = IpyGameDataPY.GetFuncCompileCfg('XMZZPKAward', 3)  
 | 
        addScore = eval(failAddScoreFormula)  
 | 
        if oldConWinCnt in needRecordConCntList:  
 | 
            SavePKRecord('XMZZ_ShutDown', [vsName, curPlayer.GetName(), oldConWinCnt])  
 | 
  
 | 
    #·¢ÖÁµØÍ¼½áËã  
 | 
    result = [isWin, isEnd, addScore, addPer, conWinCnt]  
 | 
      
 | 
    XMZZManager.XMZZPlayerDict[playerID].Score += addScore  
 | 
    if XMZZManager.XMZZPlayerDict[playerID].Score > XMZZManager.XMZZTopScore:  
 | 
        #»ý·ÖÍõ±ä¸ü  
 | 
        XMZZManager.XMZZTopScore = XMZZManager.XMZZPlayerDict[playerID].Score  
 | 
        XMZZManager.XMZZTopPlayerName = XMZZManager.XMZZPlayerDict[playerID].Name  
 | 
          
 | 
    faction = XMZZManager.XMZZPlayerDict[playerID].Faction  
 | 
    XMZZManager.XMZZFactionDict[faction][0] += addScore  
 | 
          
 | 
    #֪ͨ  
 | 
    XMZZManager.NotifyXMZZInfo()  
 | 
    XMZZManager.NotifyXMZZSelfInfo(curPlayer)  
 | 
      
 | 
    if not isEnd:  
 | 
        #Æ¥ÅäÏÂÒ»¸ö¶ÔÊÖ  
 | 
        RandomBattler(curPlayer, result)  
 | 
    else:  
 | 
        XMZZManager.MapServer_XMZZPKInfo(curPlayer, result, [])  
 | 
    GameWorld.DebugLog("¸üÐÂÏÉħ֮Õù»ý·Ö playerID=%s,addScore=%s,addPer=%s,faction=%s,isWin=%s,conWin=%s" %   
 | 
                       (playerID, addScore,addPer, faction, isWin, XMZZManager.XMZZPlayerDict[playerID].ConWinCnt))  
 | 
    return True  
 | 
  
 | 
#// AC 03 ÏÉħ֮ÕùÐÅÏ¢²éѯ #tagCGXMZZInfoQuery  
 | 
#  
 | 
#struct    tagCGXMZZInfoQuery  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#};  
 | 
def OnQueryXMZZInfo(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    PyDataManager.GetXMZZManager().NotifyXMZZInfo(curPlayer)  
 | 
    return 
 |