#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package GameWorldArena  
 | 
#  
 | 
# @todo:¾º¼¼³¡ - ±¾·þ  
 | 
# @author hxp  
 | 
# @date 2020-12-07  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: ¾º¼¼³¡ - ±¾·þ£¬OnWeekEx ÖØÖ㬿ª·þǰX¶¨ÖÆÌìÄڹ̶¨ÎªÒ»¸öÈü¼¾£¬ºÏ·þ²»´¦Àí  
 | 
#  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2020-12-07 19:30"""  
 | 
#-------------------------------------------------------------------------------  
 | 
  
 | 
import GameWorld  
 | 
import ShareDefine  
 | 
import PlayerControl  
 | 
import FormulaControl  
 | 
import PlayerBillboard  
 | 
import PlayerViewCache  
 | 
import PlayerCompensation  
 | 
import PlayerDBGSEvent  
 | 
import ChPyNetSendPack  
 | 
import DataRecordPack  
 | 
import NetPackCommon  
 | 
import IpyGameDataPY  
 | 
import PyGameData  
 | 
  
 | 
import random  
 | 
import time  
 | 
import json  
 | 
  
 | 
MaxRobotID = 9900 # ×î´ó»úÆ÷ÈËID£¬²»³¬¹ý 9999  
 | 
RandRobotID = 9000 # Ô¤Áô¸øËæ»ú»úÆ÷ÈËÓÃµÄÆðʼID£¬²»³¬¹ý MaxRobotID£¬ÇÒ (MaxRobotID - RandRobotID) ²»Äܳ¬¹ý MaxBattleRecCount  
 | 
MaxBattleRecCount = 50 # Íæ¼Ò×î´ó¶ÔÕ½¼Ç¼±£´æÌõÊý  
 | 
  
 | 
Def_RecType_ArenaBattleRecord = ShareDefine.Def_UniversalGameRecType_ArenaBattleRecord  
 | 
  
 | 
## ¾º¼¼³¡Æ¥ÅäÍæ¼ÒÐÅÏ¢£¬½ö×öÄڴ滺´æ£¬²»×ö³Ö¾Ã»¯´æ´¢£¬ÖØÆô·þÎñÆ÷ʱЧ£¬Ï൱ÓÚά»¤·þÎñÆ÷ºóÍæ¼Ò¿ÉÃâ·ÑË¢ÐÂÒ»´Î  
 | 
class ArenaMatchPlayer():  
 | 
      
 | 
    def __init__(self):  
 | 
        # name¡¢RealmLV¡¢FightPower ²»¼Ç¼£¬ÕæÊµÍæ¼Ò¶Á²é¿´»º´æ£¬»úÆ÷ÈËǰ¶Ë×ÔÐд¦Àí  
 | 
        # RealmLV ¶Á¾³½ç±í°´µÈ¼¶È¡¶ÔÓ¦¾³½ç  
 | 
        # FightPower È¡µÈ¼¶±íÈ¡¶ÔÓ¦²Î¿¼Õ½Á¦  
 | 
        self.ResetData()  
 | 
        return  
 | 
      
 | 
    def ResetData(self):  
 | 
        # Ë¢ÐÂÆ¥ÅäµÄʱºòÐèÒªÖØÖÃÏ£¬²»Öظ´´´½¨ÊµÀý  
 | 
        self.tagPlayerID = 0 # Ð¡ÓÚ10000µÄΪ»úÆ÷ÈËID  
 | 
        self.tagLV = 0  
 | 
        self.tagJob = 0  
 | 
        self.tagScore = 0  
 | 
        return  
 | 
      
 | 
class ArenaBattleRec():  
 | 
    ''' ¾º¼¼³¡¶ÔÕ½¼Ç¼Êý¾Ý  
 | 
        ¶îÍâ˵Ã÷£º  
 | 
        ÒòΪÓÐÖ÷¶¯¶ÔÕ½µÄ²Å»áÉϰñ£¬¶øÖ»ÓжÔÕ½¹ýµÄµÄ²Å»á±»Æ¥Åäµ½£¬ËùÒÔ¿ÉÈÏΪֻҪÓжÔÕ½¼Ç¼£¬×îºóÒ»Ìõ¼Ç¼¼´Îª×îеÄÊý¾Ý¼Ç¼  
 | 
        Òò´Ë¿ÉÒÔÓÃÀ´´æ´¢×ÔÉíÏà¹ØµÄÊý¾Ý£¬¿ÉÓÃÓÚÀëÏß±»±ðÈËÆ¥Å䵽ʱÔÝ´æÊý¾ÝÓã¬ÉÏÏߺóÈ¡×îºóÒ»Ìõ¶ÔÕ½¼Ç¼¸üÐÂÊý¾Ý  
 | 
    '''  
 | 
      
 | 
    def __init__(self, playerID):  
 | 
        self.playerID = playerID  
 | 
        # name¡¢RealmLV¡¢FightPower ²»¼Ç¼£¬ÕæÊµÍæ¼Ò¶Á²é¿´»º´æ£¬»úÆ÷ÈËǰ¶Ë×ÔÐд¦Àí  
 | 
        # RealmLV ¶Á¾³½ç±í°´µÈ¼¶È¡¶ÔÓ¦¾³½ç  
 | 
        # FightPower È¡µÈ¼¶±íÈ¡¶ÔÓ¦²Î¿¼Õ½Á¦  
 | 
        self.tagPlayerID = 0 # Ð¡ÓÚ10000µÄΪ»úÆ÷ÈËID  
 | 
        self.tagLV = 0  
 | 
        self.tagJob = 0  
 | 
        self.tagScore = 0  
 | 
          
 | 
        self.addScore = 0  
 | 
        self.isWin = 0  
 | 
        self.battleTime = 0  
 | 
          
 | 
        # ¶îÍâ´æ´¢µÄ¸öÈ˼Ǽ  
 | 
        self.isDispose = 0 # ÊÇ·ñÒѾ´¦Àí¹ý¸Ã¼Ç¼£¬ÀëÏß/ÍÑ»ú±»Ìôսʱ£¬ÔÝʱΪδ´¦Àí£¬ÉÏÏߺóͬ²½´¦Àí  
 | 
        self.updScore = 0  
 | 
        return  
 | 
      
 | 
''' ¶ÔÕ½¼Ç¼  ShareDefine.Def_UniversalGameRecType_ArenaBattleRecord  
 | 
value1        playerID    Íæ¼ÒID  
 | 
value2        tagPlayerID    Ä¿±êÍæ¼ÒID£¬Ð¡ÓÚ10000Ϊ»úÆ÷ÈË  
 | 
value3        tagLVJob        Ä¿±êµÈ¼¶Ö°Òµ£¬Ò»°ã»úÆ÷ÈËʱÓÐÓà lv*10 + job  
 | 
value4        tagScore        Ä¿±ê»ý·Ö£¬·Çʵʱ»ý·Ö£¬Ò»°ã»úÆ÷ÈËʱÓÐÓà  
 | 
strValue1    resultInfo    isWin,addScore  
 | 
strValue2    updInfo    isDispose,updScore  
 | 
'''  
 | 
  
 | 
''' °ñµ¥Êý¾Ý '''  
 | 
def GetArenaBillID(billData): return billData.GetID()  
 | 
def GetArenaBillName(billData): return billData.GetName1()  
 | 
def SetArenaBillName(billData, name): return billData.SetName1(name)  
 | 
def GetArenaBillJob(billData): return billData.GetType2()  
 | 
def GetArenaBillRealmLV(billData): return billData.GetValue1()  
 | 
def SetArenaBillRealmLV(billData, realmLV): return billData.SetValue1(realmLV)  
 | 
def GetArenaBillLV(billData): return billData.GetValue2()  
 | 
def SetArenaBillLV(billData, lv): billData.SetValue2(lv)  
 | 
def GetArenaBillScore(billData): return billData.GetCmpValue()  
 | 
def SetArenaBillScore(billData, score): return billData.SetCmpValue(score)  
 | 
def GetArenaBillFightPower(billData): return billData.GetCmpValue2() * ShareDefine.Def_PerPointValue + billData.GetCmpValue3()  
 | 
def SetArenaBillFightPower(billData, fightPower):  
 | 
    billData.SetCmpValue2(fightPower / ShareDefine.Def_PerPointValue)  
 | 
    billData.SetCmpValue3(fightPower % ShareDefine.Def_PerPointValue)  
 | 
    return  
 | 
  
 | 
def RepairArenaBillboardFightPower():  
 | 
    ## ÐÞÕý¾º¼¼³¡°ñµ¥µÄÕ½Á¦Êý¾Ý£¬Ö§³Ö20ÒÚ£¬bt3_1.100.1 ÏÂ´Î´ó°æ±¾¸üкó¿Éɾ³ý  
 | 
      
 | 
    repairStateKey = "RepairArenaBillboardFightPower"  
 | 
    repairState = PlayerDBGSEvent.GetDBGSTrig_ByKey(repairStateKey)  
 | 
    if repairState:  
 | 
        GameWorld.DebugLog("=== ÒѾÐÞÕý¾º¼¼³¡°ñµ¥Êý¾Ý  ===")  
 | 
        return  
 | 
      
 | 
    GameWorld.Log("=== ÐÞÕý¾º¼¼³¡°ñµ¥Êý¾Ý Start ===")  
 | 
      
 | 
    worldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)  
 | 
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaWorldLV, worldLV)  
 | 
    GameWorld.Log("    SetDBGSTrig_ByKey %s=%s" % (PlayerDBGSEvent.Def_ArenaWorldLV, worldLV))  
 | 
      
 | 
    robotMaxCount = IpyGameDataPY.GetFuncCfg("ArenaRobot", 1)  
 | 
    __RandRobotLVList(robotMaxCount)  
 | 
    GameWorld.Log("    PyGameData.g_arenaRobotLVList len=%s, %s" % (len(PyGameData.g_arenaRobotLVList), PyGameData.g_arenaRobotLVList))  
 | 
      
 | 
    billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_Arena)  
 | 
    if not billBoard:  
 | 
        return  
 | 
      
 | 
    for index in xrange(billBoard.GetCount()):  
 | 
          
 | 
        order = index + 1  
 | 
        billBoardData = billBoard.At(index)  
 | 
        if not billBoardData:  
 | 
            continue  
 | 
          
 | 
        playerID = billBoardData.GetID()  
 | 
        fightPower = billBoardData.GetCmpValue2() # ¾ÉÕ½Á¦Ö»´æÔڱȽÏÖµ2  
 | 
          
 | 
        if playerID <= MaxRobotID:  
 | 
            curLV = GetArenaBillLV(billBoardData)  
 | 
            updLV = curLV  
 | 
            if index < len(PyGameData.g_arenaRobotLVList):  
 | 
                updLV = PyGameData.g_arenaRobotLVList[index]  
 | 
            GameWorld.Log("    ÐÞÕý»úÆ÷È˵ȼ¶: order=%s,playerID=%s,curLV=%s,updLV=%s"   
 | 
                          % (order, playerID, curLV, updLV))  
 | 
            SetArenaBillLV(billBoardData, updLV)  
 | 
            SetArenaBillFightPower(billBoardData, 0)  
 | 
            continue  
 | 
          
 | 
        curCache = PlayerViewCache.FindViewCache(playerID)  
 | 
        if curCache:  
 | 
            cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)  
 | 
            fightPower = cacheDict["FightPower"]  
 | 
              
 | 
        SetArenaBillFightPower(billBoardData, fightPower)  
 | 
        GameWorld.Log("    ÐÞÕýÕæÍæ¼ÒÕ½Á¦: order=%s,playerID=%s,fightPower=%s,cmpValue2=%s,cmpValue3=%s"   
 | 
                      % (order, playerID, fightPower, billBoardData.GetCmpValue2(), billBoardData.GetCmpValue3()))  
 | 
          
 | 
    billBoard.Sort()  
 | 
    PlayerDBGSEvent.SetDBGSTrig_ByKey(repairStateKey, 1)  
 | 
    GameWorld.Log("=== ÐÞÕý¾º¼¼³¡°ñµ¥µÄÕ½Á¦Êý¾Ý OK ===")  
 | 
    return  
 | 
  
 | 
def OnServerStart():  
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    recDataList = universalRecMgr.GetTypeList(Def_RecType_ArenaBattleRecord)  
 | 
    GameWorld.Log("¿ª·þ¼ÓÔØ±¾·þ¾º¼¼³¡¶ÔÕ½¼Ç¼! %s" % recDataList.Count())  
 | 
    for index in xrange(recDataList.Count()):  
 | 
        recData = recDataList.At(index)  
 | 
        playerID = recData.GetValue1()  
 | 
          
 | 
        battleRec = ArenaBattleRec(playerID)  
 | 
        battleRec.battleTime = recData.GetTime()  
 | 
        battleRec.tagPlayerID = recData.GetValue2()  
 | 
        battleRec.tagLV = recData.GetValue3() / 10  
 | 
        battleRec.tagJob = recData.GetValue3() % 10  
 | 
        battleRec.tagScore = recData.GetValue4()  
 | 
          
 | 
        strValue1 = recData.GetStrValue1()  
 | 
        resultInfo = strValue1.split(",") if strValue1 else []  
 | 
        battleRec.isWin = int(resultInfo[0] if len(resultInfo) > 0 else 0)  
 | 
        battleRec.addScore = int(resultInfo[1] if len(resultInfo) > 1 else 0)  
 | 
          
 | 
        strValue2 = recData.GetStrValue2()  
 | 
        updInfo = strValue2.split(",") if strValue2 else []  
 | 
        battleRec.isDispose = int(updInfo[0] if len(updInfo) > 0 else 0)  
 | 
        battleRec.updScore = int(updInfo[1] if len(updInfo) > 1 else 0)  
 | 
          
 | 
        battleRecList = GetPlayerArenaBattleRecList(playerID)  
 | 
        battleRecList.append(battleRec)  
 | 
          
 | 
        GameWorld.DebugLog("    ¼ÓÔØÍæ¼Ò¶ÔÕ½¼Ç¼: playerID=%s, |%s| %s" % (playerID, strValue1, json.dumps(battleRec , default=lambda obj:obj.__dict__)))  
 | 
          
 | 
          
 | 
    OSSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState)  
 | 
    if not OSSeasonState and __DoArenaSeasonReset("OnServerStart"):  
 | 
        pass  
 | 
      
 | 
    # Ã»ÓÐÖØÖà»ò ÖØÖÃʧ°Ü ²Å´¦ÀíÒÔÏÂÄÚÈÝ  
 | 
    else:  
 | 
        billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_Arena)  
 | 
        if billBoard:  
 | 
            # ÓÐÊý¾ÝµÄ»°ÉèÖñ¾¹¦ÄÜÅäÖõÄ×î´ó°ñµ¥Êý  
 | 
            if billBoard.GetCount() > 0:  
 | 
                robotMaxCount = IpyGameDataPY.GetFuncCfg("ArenaRobot", 1)  
 | 
                PlayerBillboard.UpdateBillboardMaxCount(ShareDefine.Def_BT_Arena, robotMaxCount)  
 | 
                __RandRobotLVList(robotMaxCount)  
 | 
            else:  
 | 
                __ResetArenaRobotBillboard()  
 | 
                  
 | 
    RepairArenaBillboardFightPower()  
 | 
    return  
 | 
  
 | 
def OnServerClose():  
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    universalRecMgr.Delete(Def_RecType_ArenaBattleRecord)  
 | 
      
 | 
    GameWorld.Log("¹Ø·þ±£´æ±¾·þ¾º¼¼³¡¼Ç¼! %s" % len(PyGameData.g_arenaPlayerBattleRecDict))  
 | 
    recDataList = universalRecMgr.GetTypeList(Def_RecType_ArenaBattleRecord)  
 | 
    for battleRecList in PyGameData.g_arenaPlayerBattleRecDict.values():  
 | 
        for battleRec in battleRecList:  
 | 
            recData = recDataList.AddRec()  
 | 
            recData.SetTime(battleRec.battleTime)  
 | 
              
 | 
            recData.SetValue1(battleRec.playerID)  
 | 
            recData.SetValue2(battleRec.tagPlayerID)  
 | 
            recData.SetValue3(battleRec.tagLV * 10 + battleRec.tagJob)  
 | 
            recData.SetValue4(battleRec.tagScore)  
 | 
              
 | 
            recData.SetStrValue1("%s,%s" % (int(battleRec.isWin), battleRec.addScore))  
 | 
            recData.SetStrValue2("%s,%s" % (int(battleRec.isDispose), battleRec.updScore))  
 | 
              
 | 
    return  
 | 
  
 | 
def GetPlayerArenaBattleRecList(playerID):  
 | 
    ## »ñÈ¡Íæ¼Ò¶ÔÕ½¼Ç¼ÁÐ±í  
 | 
    if playerID not in PyGameData.g_arenaPlayerBattleRecDict:  
 | 
        PyGameData.g_arenaPlayerBattleRecDict[playerID] = []  
 | 
    return PyGameData.g_arenaPlayerBattleRecDict[playerID]  
 | 
  
 | 
def IsArenaBattlePlayer(playerID): return playerID in PyGameData.g_arenaPlayerBattleRecDict  
 | 
  
 | 
def SendMapServerArenaInfo():  
 | 
    ## Í¨ÖªµØÍ¼ÐÅÏ¢  
 | 
      
 | 
    return  
 | 
  
 | 
def OnPlayerLogin(curPlayer):  
 | 
    ## Íæ¼ÒµÇ¼  
 | 
      
 | 
    if PlayerControl.GetIsTJG(curPlayer):  
 | 
        return  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    curBattleRecList = GetPlayerArenaBattleRecList(playerID)  
 | 
      
 | 
    updScore = None  
 | 
    # µ¹Ðò±éÀú  
 | 
    for battleRec in curBattleRecList[::-1]:  
 | 
        if battleRec.isDispose:  
 | 
            continue  
 | 
        battleRec.isDispose = 1  
 | 
          
 | 
        if updScore == None:  
 | 
            updScore = battleRec.updScore # Ö»¸üÐÂÒ»´Î£¬¼´×îºóÒ»Ìõ¼Ç¼  
 | 
              
 | 
    if updScore != None:  
 | 
        __SyncPlayerBechallengedUpdScore(curPlayer, updScore)  
 | 
          
 | 
    return  
 | 
  
 | 
def OnDayEx():  
 | 
      
 | 
    # ÏÈ´¦ÀíÿÈÕ½áËã  
 | 
    __DoGiveBillboardAward("Day")  
 | 
      
 | 
    customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1)  
 | 
    openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1      
 | 
    if openServerDay <= customMaxServerDay:  
 | 
        GameWorld.Log("OnDayExʱ¾º¼¼³¡¿ª·þ¶¨ÖÆÈü¼¾½øÐÐÖУ¬²»´¦Àí! openServerDay=%s <= %s" % (openServerDay, customMaxServerDay))  
 | 
        return  
 | 
      
 | 
    # ¾º¼¼³¡¿ª·þǰ¶¨ÖÆXÌìÈü¼¾×´Ì¬  0-δ±ÈÈü¹ý£¬1-½øÐÐÖУ¬>1½áËãʱµÄ¿ª·þÌì  
 | 
    OSSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState)  
 | 
    if OSSeasonState > 1:  
 | 
        GameWorld.Log("OnDayExʱ¾º¼¼³¡¿ª·þ¶¨ÖÆÈü¼¾ÒѽáËã¹ý£¬²»´¦Àí! OSSeasonState=%s" % (OSSeasonState))  
 | 
        return  
 | 
      
 | 
    __DoArenaSeasonReset("OpenServerSeason")  
 | 
    return  
 | 
  
 | 
def OnWeekEx():  
 | 
    customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1)  
 | 
    openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1  
 | 
    if openServerDay <= customMaxServerDay:  
 | 
        GameWorld.Log("OnWeekExʱÔÚ¿ª·þ¶¨ÖÆÌìÄÚ£¬²»´¦Àí¾º¼¼³¡Èü¼¾ÖØÖÃ! openServerDay=%s <= %s" % (openServerDay, customMaxServerDay))  
 | 
        return  
 | 
      
 | 
    OSSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState)  
 | 
    if not OSSeasonState or OSSeasonState == 1 or OSSeasonState == openServerDay:  
 | 
        GameWorld.Log("OnWeekExʱ¾º¼¼³¡¿ª·þ¶¨ÖÆÈü¼¾½øÐÐÖлòͬһÌì½áË㣬²»´¦ÀíÖØÖÃ! openServerDay=%s,OSSeasonState=%s" % (openServerDay, OSSeasonState))          
 | 
        return  
 | 
      
 | 
    __DoArenaSeasonReset("OnWeekExSeason")  
 | 
    return  
 | 
  
 | 
def __DoArenaSeasonReset(resetName):  
 | 
    ''' Èü¼¾ÖØÖÃ  
 | 
           Èü¼¾¹æÔò£ºÇ°¶¨ÖÆÔËÓª×î´ó¿ª·þÌìΪһ¸öÈü¼¾£¬ºóÐø°´ OnWeekEx ÖØÖà  
 | 
    '''  
 | 
      
 | 
    openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1  
 | 
    OSSeasonState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState)  
 | 
    worldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)  
 | 
    GameWorld.Log("ÖØÖþº¼¼³¡! resetName=%s,openServerDay=%s,OSSeasonState=%s,worldLV=%s"   
 | 
                  % (resetName, openServerDay, OSSeasonState, worldLV))  
 | 
      
 | 
    customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1)  
 | 
    if openServerDay <= customMaxServerDay and OSSeasonState != 0:  
 | 
        GameWorld.Log("¿ª·þ¶¨ÖÆÌìÄÚ²»ÄÜÖØÖã¡")  
 | 
        return  
 | 
      
 | 
    # ½áËãÉÏÈü¼¾ÅÅÐн±Àø  
 | 
    __DoGiveBillboardAward("Week")  
 | 
      
 | 
    # ÖØÖÃÅÅÐаñ  
 | 
    __ResetArenaRobotBillboard()  
 | 
      
 | 
    # É¾³ý¶ÔÕ½¼Ç¼  
 | 
    GameWorld.GetUniversalRecMgr().Delete(Def_RecType_ArenaBattleRecord)  
 | 
    PyGameData.g_arenaPlayerBattleRecDict = {}  
 | 
    PyGameData.g_arenaPlayerMatchDict = {}  
 | 
      
 | 
    # ¸üÐÂÐÂÈü¼¾ÐÅÏ¢  
 | 
    if openServerDay <= customMaxServerDay and OSSeasonState == 0:  
 | 
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState, 1)  
 | 
    else:  
 | 
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaOSSeasonState, customMaxServerDay + 1)  
 | 
          
 | 
    # ×îºó֪ͨµØÍ¼ÐÂÈü¼¾ÐÅÏ¢  
 | 
    SendMapServerArenaInfo()  
 | 
    GameWorld.Log("=============== ÖØÖþº¼¼³¡OK ===============")  
 | 
    return True  
 | 
  
 | 
def __ResetArenaRobotBillboard():  
 | 
    ## ÖØÖþº¼¼³¡»úÆ÷ÈËÅÅÐаñ£¬Èü¼¾ÖØÖÃʱ  »ò  Æô¶¯·þÎñÆ÷ʱ°ñµ¥Êý¾ÝΪ¿Õ£¨ºÏ·þÊ×´ÎÆô¶¯£©  
 | 
      
 | 
    # Çå³ý°ñµ¥  
 | 
    billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_Arena)  
 | 
    if not billBoard:  
 | 
        return  
 | 
    billBoard.Clear()  
 | 
    robotMaxCount = IpyGameDataPY.GetFuncCfg("ArenaRobot", 1)  
 | 
    GameWorld.Log("    ÖØÖóõʼ»¯¾º¼¼³¡»úÆ÷È˰ñµ¥! robotMaxCount=%s" % robotMaxCount)  
 | 
    PlayerBillboard.UpdateBillboardMaxCount(ShareDefine.Def_BT_Arena, robotMaxCount)  
 | 
      
 | 
    PyGameData.g_arenaRobotLVList = []  
 | 
    worldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)  
 | 
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaWorldLV, worldLV)  
 | 
    GameWorld.Log("    worldLV=%s" % worldLV)  
 | 
      
 | 
    # »ñÈ¡»úÆ÷ÈËËæ»úµÈ¼¶¡¢»ý·ÖÁÐ±í  
 | 
    robotLVList = __RandRobotLVList(robotMaxCount)  
 | 
    robotScoreList = __RandRobotScoreList(robotMaxCount)  
 | 
      
 | 
    GameWorld.Log("    robotLVList: %s, %s" % (len(robotLVList), robotLVList))  
 | 
    GameWorld.Log("    robotScoreList: %s, %s" % (len(robotScoreList), robotScoreList))  
 | 
      
 | 
    openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1)  
 | 
    # »úÆ÷È˲åÈë°ñµ¥£¬µ¹Ðò²åÈ룬²»ÓÃÅÅÐò  
 | 
    robotID = 0  
 | 
    for i in xrange(robotMaxCount - 1, -1, -1):  
 | 
        robotLV = robotLVList[i]  
 | 
        robotScore = robotScoreList[i]  
 | 
        robotID += 1  
 | 
        robotName = "" # ¹Ì¶¨£¬Ç°¶Ë×ÔÐÐÏÔʾ  
 | 
        opInfo = ""  
 | 
        robotJob = random.choice(openJobList) # Ëæ»ú¿ª·ÅµÄÖ°Òµ  
 | 
        robotRealmLV = 0 # Ç°¶Ë ¶Á¾³½ç±íÈ¡µÈ¼¶¶ÔÓ¦¾³½ç  
 | 
        robotFightPower = 0 # Ç°¶Ë ¶ÁµÈ¼¶±íÈ¡µÈ¼¶¶ÔÓ¦Õ½Á¦  
 | 
          
 | 
        type2 = robotJob  
 | 
        value1 = robotRealmLV  
 | 
        value2 = robotLV  
 | 
        cmpValue = robotScore  
 | 
        cmpValue2 = robotFightPower / ShareDefine.Def_PerPointValue  
 | 
        cmpValue3 = robotFightPower % ShareDefine.Def_PerPointValue  
 | 
        PlayerBillboard.UpdatePlayerBillboard(robotID, robotName, opInfo, ShareDefine.Def_BT_Arena, type2, value1, value2, cmpValue, autoSort=False, cmpValue2=cmpValue2, cmpValue3=cmpValue3)  
 | 
          
 | 
    billBoard.Sort()  
 | 
    return  
 | 
  
 | 
def __RandRobotLVList(robotMaxCount):  
 | 
    ''' Ëæ»ú»úÆ÷È˵ȼ¶  
 | 
    @param robotMaxCount: »úÆ÷ÈËÊýÁ¿  
 | 
    @return: ÉýÐòÅźõĻúÆ÷È˵ȼ¶ÁÐ±í  
 | 
    '''  
 | 
      
 | 
    robotMinLV, robotMaxLV = __GetRobotLVRange()  
 | 
      
 | 
    # ÄѶȵȼ¶²½³¤£¬ÎªÁËÄѶȵÝÔöʱ£¬µÈ¼¶¿´ÆðÀ´ÂÒÒ»µã£¬ÓÖÄÜÈ·±£ÄѶȵÝÔö£¬ËùÒÔ¼ÓÈë´Ë¸ÅÄî  
 | 
    difficultLVStep = IpyGameDataPY.GetFuncCfg("ArenaRobot", 4)  
 | 
      
 | 
    lvList = []  
 | 
    lvCount = robotMaxLV - robotMinLV + 1 # µÈ¼¶²îÖµÊýÁ¿  
 | 
    lvAvg = lvCount / float(robotMaxCount) # È˾ùµÈ¼¶  
 | 
    oneLVRobotCount = 1 / lvAvg # 1¸öµÈ¼¶ÀíÂÛÉÏÓм¸¸ö»úÆ÷ÈË  
 | 
      
 | 
    minLV = 0  
 | 
    difficultRobotCountEx = 0  
 | 
    for lv in xrange(robotMinLV, robotMaxLV + difficultLVStep, difficultLVStep):  
 | 
        if lv >= robotMaxLV:  
 | 
            break  
 | 
        if minLV == 0:  
 | 
            minLV = lv  
 | 
        maxLV = lv + difficultLVStep - 1  
 | 
          
 | 
        difficultRobotCount = oneLVRobotCount * difficultLVStep + difficultRobotCountEx # Í¬¸öÄѶȵȼ¶»úÆ÷ÈË×ÜÊý  
 | 
        difficultRobotCountEx = difficultRobotCount % 1  
 | 
          
 | 
        if difficultRobotCount < 1:  
 | 
            continue  
 | 
          
 | 
        for _ in xrange(int(difficultRobotCount)):  
 | 
            lvList.append(random.randint(minLV, maxLV))  
 | 
              
 | 
        minLV = 0  
 | 
          
 | 
    if len(lvList) > robotMaxCount:  
 | 
        lvList = lvList[:robotMaxCount]  
 | 
    else:  
 | 
        # Èç¹û»¹²»¹»£¬Ö±½ÓÓÃ×îºóÒ»¸öÄѶȲ¹×ãÈËÊý  
 | 
        while len(lvList) < robotMaxCount:  
 | 
            lvList.append(random.randint(robotMaxLV - difficultLVStep, robotMaxLV))  
 | 
              
 | 
    lvList[0] = robotMinLV  
 | 
    lvList[-1] = robotMaxLV  
 | 
    PyGameData.g_arenaRobotLVList = sorted(lvList, reverse=True)  
 | 
    return lvList  
 | 
  
 | 
def __GetRobotLVRange():  
 | 
    ## »ñÈ¡Èü¼¾»úÆ÷È˵ȼ¶·¶Î§  
 | 
    worldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ArenaWorldLV)  
 | 
    worldLV = max(1, worldLV)  
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
    maxCnt = ipyDataMgr.GetWorldLVCount()  
 | 
    worldLVTime = 0  
 | 
    if worldLV <= maxCnt:  
 | 
        worldLVIpyData = ipyDataMgr.GetWorldLVByIndex(worldLV - 1)  
 | 
        worldLVTime = worldLVIpyData.GetOpenServerSecond()  
 | 
          
 | 
    minLV, maxLV = IpyGameDataPY.GetFuncEvalCfg("ArenaRobot", 2) # »úÆ÷ÈË×îС¡¢×î´óµÈ¼¶  
 | 
      
 | 
    robotMaxLV = minLV  
 | 
    maxWorldLVTime = eval(IpyGameDataPY.GetFuncCfg("ArenaRobot", 3))  
 | 
    for i in xrange(worldLV - 1, maxCnt):  
 | 
        ipyData = ipyDataMgr.GetWorldLVByIndex(i)  
 | 
        if i == maxCnt - 1:  
 | 
            robotMaxLV = ipyData.GetWorldLV()  
 | 
        else:  
 | 
            nextIpyData = IpyGameDataPY.IPY_Data().GetWorldLVByIndex(i + 1)  
 | 
            if ipyData.GetOpenServerSecond() <= maxWorldLVTime < nextIpyData.GetOpenServerSecond():  
 | 
                robotMaxLV = ipyData.GetWorldLV()  
 | 
                break  
 | 
              
 | 
    robotMaxLV = max(minLV, min(maxLV, robotMaxLV))  
 | 
    GameWorld.Log("    »úÆ÷È˵ȼ¶·¶Î§: worldLV=%s,worldLVTime=%s,maxWorldLVTime=%s,minLV=%s,robotMaxLV=%s"   
 | 
                  % (worldLV, worldLVTime, maxWorldLVTime, minLV, robotMaxLV))  
 | 
    return minLV, robotMaxLV  
 | 
  
 | 
def __RandRobotScoreList(robotMaxCount):  
 | 
    ''' Ëæ»ú»úÆ÷ÈË»ý·Ö  
 | 
    @param minScore: »úÆ÷ÈË×îС»ý·Ö  
 | 
    @param maxScore: »úÆ÷ÈË×î´ó»ý·Ö  
 | 
    @param robotMaxCount: »úÆ÷ÈËÊýÁ¿  
 | 
    @return: ÉýÐòÅźõĻúÆ÷ÈË»ý·ÖÁÐ±í  
 | 
    '''  
 | 
      
 | 
    minScore, maxScore = IpyGameDataPY.GetFuncEvalCfg("ArenaSet", 1)  
 | 
      
 | 
    scoreCount = maxScore - minScore + 1 # »ý·Ö²îÖµÊýÁ¿  
 | 
    scoreAvg = scoreCount / float(robotMaxCount) # È˾ù»ý·Ö  
 | 
      
 | 
    oneScoreRobotCount = 1 / scoreAvg # 1¸ö»ý·ÖÀíÂÛÉÏÓм¸¸ö»úÆ÷ÈË  
 | 
          
 | 
    scoreList = []  
 | 
    minS = 0  
 | 
    robotCountEx = 0  
 | 
    for score in xrange(minScore, maxScore + 1):  
 | 
        if minS == 0:  
 | 
            minS = score  
 | 
              
 | 
        robotCount = oneScoreRobotCount * 1 + robotCountEx  
 | 
        robotCountEx = robotCount % 1  
 | 
          
 | 
        if robotCount < 1:  
 | 
            continue  
 | 
          
 | 
        for _ in xrange(int(robotCount)):  
 | 
            if minS == score:  
 | 
                scoreList.append(score)  
 | 
            else:  
 | 
                scoreList.append(random.randint(minS, score))  
 | 
        minS = 0  
 | 
      
 | 
    if len(scoreList) > robotMaxCount:  
 | 
        scoreList = scoreList[:robotMaxCount]  
 | 
    else:  
 | 
        # Èç¹û»¹²»¹»£¬Ö±½ÓÓÃ×îºóÒ»¸öÄѶȲ¹×ãÈËÊý  
 | 
        while len(scoreList) < robotMaxCount:  
 | 
            scoreList.append(maxScore)  
 | 
              
 | 
    scoreList[0] = minScore  
 | 
    scoreList[-1] = maxScore  
 | 
    scoreList.sort()  
 | 
    return scoreList  
 | 
  
 | 
def __DoGiveBillboardAward(awardType):  
 | 
    ## ¾º¼¼³¡½áËãÅÅÐн±Àø£¬ Ã¿ÈÕ¡¢Èü¼¾Í¨Óà  
 | 
      
 | 
    GameWorld.Log("=== ¾º¼¼³¡½áËãÅÅÐн±Àø! === %s" % awardType)  
 | 
      
 | 
    billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_Arena)  
 | 
    if not billBoard:  
 | 
        return  
 | 
      
 | 
    if awardType == "Day":  
 | 
        billboradAwardDict = IpyGameDataPY.GetFuncEvalCfg("ArenaBillboradAward", 1, {})  
 | 
        floorAwardList = IpyGameDataPY.GetFuncEvalCfg("ArenaBillboradAward", 2)  
 | 
    elif awardType == "Week":  
 | 
        billboradAwardDict = IpyGameDataPY.GetFuncEvalCfg("ArenaBillboradAward", 3, {})  
 | 
        floorAwardList = IpyGameDataPY.GetFuncEvalCfg("ArenaBillboradAward", 4)  
 | 
    else:  
 | 
        return  
 | 
      
 | 
    orderList = []  
 | 
    for orderStr in billboradAwardDict.keys():  
 | 
        orderList.append(int(orderStr))  
 | 
    orderList.sort()  
 | 
    GameWorld.Log("    ½±ÀøÃû´ÎÁбí: %s" % orderList)  
 | 
      
 | 
    awardOrder = orderList[0]  
 | 
    orderPlayerIDDict = {}  
 | 
    billboardCount, billboardMaxCount = billBoard.GetCount(), billBoard.GetMaxCount()  
 | 
    GameWorld.Log("    °ñµ¥Êý¾ÝÊý! billboardCount=%s,billboardMaxCount=%s" % (billboardCount, billboardMaxCount))  
 | 
    for index in xrange(billboardCount):  
 | 
        billBoardData = billBoard.At(index)  
 | 
        if not billBoardData:  
 | 
            continue  
 | 
        order = index + 1  
 | 
          
 | 
        if order > awardOrder:  
 | 
            nextOrderIndex = orderList.index(awardOrder) + 1  
 | 
            if nextOrderIndex >= len(orderList):  
 | 
                break  
 | 
            awardOrder = orderList[nextOrderIndex]  
 | 
              
 | 
        playerID = billBoardData.GetID()  
 | 
        if playerID <= MaxRobotID:  
 | 
            # »úÆ÷È˲»´¦Àí  
 | 
            continue  
 | 
          
 | 
        #playerName = billBoardData.GetName1()  
 | 
        orderPlayerIDDict[playerID] = [order, awardOrder]  
 | 
          
 | 
        awardList = billboradAwardDict[str(awardOrder)]  
 | 
        PlayerCompensation.SendMailByKey("ArenaBillboardAward%s" % awardType, [playerID], awardList, [order])  
 | 
          
 | 
    GameWorld.Log("    ½±ÀøÍæ¼ÒÃû´ÎÐÅÏ¢: %s" % orderPlayerIDDict)  
 | 
      
 | 
    # ÆäËûµÄ»ñµÃ±£µ×½±Àø  
 | 
    orderPlayerIDList = orderPlayerIDDict.keys()  
 | 
    floorPlayerIDList = []  
 | 
    for playerID, battleRecList in PyGameData.g_arenaPlayerBattleRecDict.items():  
 | 
        if playerID in orderPlayerIDList:  
 | 
            continue  
 | 
        if not battleRecList:  
 | 
            #GameWorld.DebugLog("ûÓжÔÕ½¼Ç¼µÄ²»·¢! ", playerID)  
 | 
            continue  
 | 
        floorPlayerIDList.append(playerID)  
 | 
        PlayerCompensation.SendMailByKey("ArenaFloorAward%s" % awardType, [playerID], floorAwardList)  
 | 
          
 | 
    GameWorld.Log("    ½±Àø±£µ×Íæ¼ÒÐÅÏ¢: %s" % floorPlayerIDList)  
 | 
    return  
 | 
  
 | 
def MapServer_Arena(curPlayer, msgList):  
 | 
    GameWorld.DebugLog("MapServer_Arena %s" % str(msgList), curPlayer.GetPlayerID())  
 | 
    if not msgList:  
 | 
        return  
 | 
      
 | 
    cmd = msgList[0]  
 | 
    cmdDict = msgList[1] if len(msgList) > 1 else {}  
 | 
    retDict = {}  
 | 
      
 | 
    # Æ¥ÅäˢР 
 | 
    if cmd == "MatchRefresh":  
 | 
        __DoArenaMatchRefresh(curPlayer, cmdDict["isRefresh"], cmdDict["playerLV"], cmdDict["playerScore"], cmdDict.get("gmMatchIDList"))  
 | 
          
 | 
    # ¶ÔÕ½½áËã  
 | 
    elif cmd == "BattleResult":  
 | 
        retDict = __DoArenaBattleResult(curPlayer, cmdDict)  
 | 
          
 | 
    return msgList + [retDict]  
 | 
  
 | 
def __DoArenaMatchRefresh(curPlayer, isRefresh, playerLV, playerScore, gmMatchIDList=None):  
 | 
    ## Íæ¼ÒË¢ÐÂÆ¥Åä¶ÔÊÖ  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    higherOrderPerList = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 1)  
 | 
    lowerOrderPerList = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 2)  
 | 
      
 | 
    GameWorld.DebugLog("¾º¼¼³¡Íæ¼ÒË¢ÐÂÆ¥ÅäÁбí: isRefresh=%s,playerLV=%s,playerScore=%s" % (isRefresh, playerLV, playerScore), playerID)  
 | 
    GameWorld.DebugLog("    higherOrderPerList=%s,lowerOrderPerList=%s" % (higherOrderPerList, lowerOrderPerList), playerID)  
 | 
      
 | 
    # Æ¥Åä¶ÔÏó»º´æ  
 | 
    needMatchCount = len(higherOrderPerList) + len(lowerOrderPerList)  
 | 
    #GameWorld.DebugLog("    Æ¥Å仺´æ: %s" % PyGameData.g_arenaPlayerMatchDict, playerID)  
 | 
    if playerID not in PyGameData.g_arenaPlayerMatchDict:  
 | 
        PyGameData.g_arenaPlayerMatchDict[playerID] = []  
 | 
    matchList = PyGameData.g_arenaPlayerMatchDict[playerID]  
 | 
    if len(matchList) > needMatchCount:  
 | 
        matchList = matchList[:needMatchCount] # É¾³ý¶àÓàµÄ¸öÊý£¬Ò»°ã¶¼ÊÇÏàͬµÄ£¬³ý·ÇÐÞ¸ÄÆ¥ÅäÊýÖØ¶ÁÅäÖà  
 | 
    if not isRefresh and len(matchList) == needMatchCount:  
 | 
        # ·ÇˢеIJ¢ÇÒÒѾÓмǼµÄÖ±½Óͬ²½  
 | 
        GameWorld.DebugLog("    ·ÇË¢ÐÂÇÒÓÐÊý¾Ý£¬Ö±½Óͬ²½£¡", playerID)  
 | 
        __SyncMatchList(curPlayer, matchList)  
 | 
        return  
 | 
      
 | 
    #maxOrder = IpyGameDataPY.GetFuncCfg("ArenaRobot", 1) # ÕâÀï²»¶ÁÅäÖã¬Ö±½ÓʹÓðñµ¥Êý  
 | 
    billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_Arena)  
 | 
    if not billBoard:  
 | 
        return  
 | 
    playerOrder = billBoard.IndexOfByID(playerID) + 1  # Íæ¼ÒÔÚÅÅÐаñÖеÄÃû´Î£¬Ã»ÓÐÃû´ÎΪ-1  
 | 
    maxOrder = billBoard.GetCount()  
 | 
    if playerOrder <= 0:  
 | 
        playerOrder = maxOrder + 1  
 | 
          
 | 
    GameWorld.DebugLog("    maxOrder=%s,playerOrder=%s" % (maxOrder, playerOrder), playerID)  
 | 
    highRandOrder, lowRandOrder = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 5) # Ç°XÃûÆ¥Åä±È×Ô¼º¸ßÃû´Îʱֱ½ÓËæ»ú  
 | 
    matchOrderList = [] # Æ¥Åäµ½µÄÃû´Î  
 | 
    # ·ÇµÚÒ»ÃûµÄÆ¥Åä±È×ÔÉíÃû´Î¸ßµÄ  
 | 
    if playerOrder > 1 and higherOrderPerList:  
 | 
        higherOrderCount = playerOrder - 1 # ±ÈÍæ¼Ò¸ßµÄÃû´ÎµÄ¸öÊý  
 | 
        # Ð¡ÓÚ10¸öµÄÖ±½Ó´¿Ëæ»ú  
 | 
        if 0 < higherOrderCount < highRandOrder:  
 | 
            randOrderList = range(1, playerOrder)  
 | 
            random.shuffle(randOrderList)  
 | 
            matchOrderList.extend(randOrderList[:len(higherOrderPerList)])  
 | 
            GameWorld.DebugLog("    Ö±½ÓËæ»ú½Ï¸ßÃû´Î! higherOrderCount=%s,randOrderList=%s,matchOrderList=%s"   
 | 
                               % (higherOrderCount, randOrderList, matchOrderList), playerID)  
 | 
              
 | 
        # °´±ÈÀý»®·Ö  
 | 
        elif higherOrderCount >= highRandOrder:  
 | 
            randMaxOrder = playerOrder - 1  
 | 
            for per in higherOrderPerList:  
 | 
                per = min(per, 100) # ×î¶àµ½100  
 | 
                tagOrder = int(playerOrder - higherOrderCount * per / 100.0)  
 | 
                if tagOrder <= 0 or randMaxOrder <= 0 or tagOrder > randMaxOrder:  
 | 
                    GameWorld.ErrLog("¾º¼¼³¡Æ¥Åä¸ßÃû´ÎÍæ¼Ò±ÈÀý·¶Î§ÅäÖôíÎó! playerOrder(%s) - higherOrderCount(%s)*per(%s) = tagOrder(%s) <= 0 or randMaxOrder(%s)<=0 or tagOrder > randMaxOrder higherOrderPerList=%s"   
 | 
                                     % (playerOrder, higherOrderCount, per, tagOrder, randMaxOrder, higherOrderPerList))  
 | 
                    break  
 | 
                randOrder = random.randint(tagOrder, randMaxOrder)  
 | 
                if randOrder != playerOrder and randOrder not in matchOrderList:  
 | 
                    matchOrderList.append(randOrder)  
 | 
                GameWorld.DebugLog("    ¸ù¾Ý±ÈÀýËæ»ú½Ï¸ßÃû´Î! higherOrderCount=%s,per=%s,randOrder=(%s~%s)%s,matchOrderList=%s"   
 | 
                                   % (higherOrderCount, per, tagOrder, randMaxOrder, randOrder, matchOrderList), playerID)  
 | 
                randMaxOrder = tagOrder - 1  
 | 
                  
 | 
    # ¸ßÃû´Î²»×ãµÄ£¬ÓõÍÃû´Î²¹×㣬һ°ãÊÇǰ¼¸Ãû²Å»áÓÐÕâ¸öÐèÇó  
 | 
    higherLackCount = max(0, len(higherOrderPerList) - len(matchOrderList))  
 | 
      
 | 
    # ·Ç×îºóÒ»ÃûµÄÆ¥Åä±È×ÔÉíÃû´ÎµÍµÄ  
 | 
    if 1 <= playerOrder < maxOrder and lowerOrderPerList:  
 | 
        lowerOrderCount = maxOrder - playerOrder # ±ÈÍæ¼ÒµÍµÄÃû´ÎµÄ¸öÊý  
 | 
        # Ð¡ÓÚ10¸öµÄÖ±½Ó´¿Ëæ»ú  
 | 
        if 0 < lowerOrderCount < lowRandOrder:  
 | 
            randOrderList = range(playerOrder + 1, maxOrder + 1)  
 | 
            random.shuffle(randOrderList)  
 | 
            matchOrderList.extend(randOrderList[:len(lowerOrderPerList)])  
 | 
            GameWorld.DebugLog("    Ö±½ÓËæ»ú½ÏµÍÃû´Î! lowerOrderCount=%s,randOrderList=%s,matchOrderList=%s"   
 | 
                               % (lowerOrderCount, randOrderList, matchOrderList), playerID)  
 | 
              
 | 
        # °´±ÈÀý»®·Ö  
 | 
        elif lowerOrderCount >= lowRandOrder:  
 | 
            randMinOrder = playerOrder + 1  
 | 
            for per in lowerOrderPerList:  
 | 
                per = min(per, 100) # ×î¶àµ½100  
 | 
                tagOrder = int(playerOrder + lowerOrderCount * per / 100.0)  
 | 
                if tagOrder > maxOrder or randMinOrder > maxOrder or randMinOrder > tagOrder:  
 | 
                    GameWorld.ErrLog("¾º¼¼³¡Æ¥ÅäµÍÃû´ÎÍæ¼Ò±ÈÀý·¶Î§ÅäÖôíÎó! playerOrder(%s) - lowerOrderCount(%s)*per(%s) = tagOrder(%s) > maxOrder(%s) or randMinOrder(%s)>maxOrder or randMinOrder > tagOrder lowerOrderPerList=%s"   
 | 
                                     % (playerOrder, lowerOrderCount, per, tagOrder, maxOrder, randMinOrder, lowerOrderPerList))  
 | 
                    break  
 | 
                randOrder = random.randint(randMinOrder, tagOrder)  
 | 
                if randOrder != playerOrder and randOrder not in matchOrderList:  
 | 
                    matchOrderList.append(randOrder)  
 | 
                GameWorld.DebugLog("    ¸ù¾Ý±ÈÀýËæ»ú½ÏµÍÃû´Î! lowerOrderCount=%s,per=%s,randOrder=(%s~%s)%s,matchOrderList=%s"   
 | 
                                   % (lowerOrderCount, per, randMinOrder, tagOrder, randOrder, matchOrderList), playerID)  
 | 
                randMinOrder = tagOrder + 1  
 | 
                  
 | 
            # ¸ßÃû´Î²»×㻹ÐèÒª¶îÍâ²¹µÄ£¬Ö±½Ó´ÓÍæ¼ÒÃû´Î+1 ~ ×îºóÒ»¸öµÍ°Ù·Ö±ÈÃû´Î ¼äËæ»ú  
 | 
            doCount = 50  
 | 
            while higherLackCount > 0 and doCount > 0:  
 | 
                doCount -= 1  
 | 
                randOrderMin = playerOrder + 1  
 | 
                randOrderMax = min(tagOrder, maxOrder)  
 | 
                randOrder = random.randint(randOrderMin, randOrderMax)  
 | 
                if randOrder != playerOrder and randOrder not in matchOrderList:  
 | 
                    matchOrderList.append(randOrder)  
 | 
                    higherLackCount -= 1  
 | 
                    GameWorld.DebugLog("    ¸ßÃû´Î²»×㣬ʹÓýϵÍÃû´Î²¹³ä! higherLackCount=%s,randOrder=(%s~%s)%s,matchOrderList=%s"   
 | 
                                       % (higherLackCount, randOrderMin, randOrderMax, randOrder, matchOrderList), playerID)  
 | 
                      
 | 
    matchOrderList.sort()  
 | 
    # GMÖ¸¶¨Æ¥Åä²âÊÔ  
 | 
    if gmMatchIDList != None and curPlayer.GetGMLevel():  
 | 
        gmMatchOrderList = []  
 | 
        for gmMatchID in gmMatchIDList:  
 | 
            if gmMatchID == playerID:  
 | 
                GameWorld.DebugAnswer(curPlayer, "Ä¿±êID²»ÄÜÊÇ×Ô¼º!ÎÞ·¨Æ¥Åä!%s" % gmMatchID)  
 | 
                continue  
 | 
            gmMatchOrder = billBoard.IndexOfByID(gmMatchID) + 1  
 | 
            if gmMatchOrder <= 0:  
 | 
                GameWorld.DebugAnswer(curPlayer, "Ä¿±êID²»ÔÚ°ñµ¥ÉÏ!ÎÞ·¨Æ¥Åä!%s" % gmMatchID)  
 | 
                continue  
 | 
            if gmMatchOrder in matchOrderList:  
 | 
                continue  
 | 
            gmMatchOrderList.append(gmMatchOrder)  
 | 
            GameWorld.DebugAnswer(curPlayer, "Ö¸¶¨Æ¥ÅäID(%s),order(%s)" % (gmMatchID, gmMatchOrder))  
 | 
              
 | 
        GameWorld.DebugLog("matchOrderList=%s,needMatchCount=%s" % (str(matchOrderList), needMatchCount))  
 | 
        if matchOrderList:  
 | 
            matchOrderList = matchOrderList[:needMatchCount - len(gmMatchOrderList)]  
 | 
        matchOrderList += gmMatchOrderList  
 | 
        matchOrderList.sort()  
 | 
              
 | 
    matchRobotRate = IpyGameDataPY.GetFuncCfg("ArenaMatch", 4) # Ã¿´Î¿ÉÖ±½ÓÆ¥ÅäÒ»¸ö»úÆ÷È˸ÅÂÊ  
 | 
    if matchRobotRate and matchOrderList and len(matchOrderList) >= needMatchCount and GameWorld.CanHappen(matchRobotRate, 100):  
 | 
        popOrder = matchOrderList.pop(-1) # È¥µô×îºóÒ»¸ö  
 | 
        GameWorld.DebugLog("    ¸ÅÂÊÆ¥Åäµ½Ò»¸ö»úÆ÷ÈË£¬È¥µô×îºóÒ»¸ö! matchRobotRate=%s,popOrder=%s" % (matchRobotRate, popOrder), playerID)  
 | 
          
 | 
    GameWorld.DebugLog("    ×îÖÕÆ¥Åäµ½µÄÃû´ÎÁбí: matchOrderList=%s" % matchOrderList, playerID)  
 | 
      
 | 
    # Ëæ»ú»úÆ÷È˱¸ÓÃÐÅÏ¢  
 | 
    openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1)      
 | 
      
 | 
    minLV, _ = IpyGameDataPY.GetFuncEvalCfg("ArenaRobot", 2) # »úÆ÷ÈË×îС¡¢×î´óµÈ¼¶  
 | 
    randMinLV, randMaxLV = minLV - 10, minLV  
 | 
    #randMinLV = min(minLV, int(playerLV * randRobotLVPerRange[0] / 100.0))  
 | 
    #randMaxLV = min(maxLV, int(playerLV * randRobotLVPerRange[1] / 100.0))  
 | 
      
 | 
    randRobotScorePerRange = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 3)  
 | 
    randMinScore = int(playerScore * randRobotScorePerRange[0] / 100.0)  
 | 
    randMaxScore = int(playerScore * randRobotScorePerRange[1] / 100.0)  
 | 
      
 | 
    # ÕÒ³ö¶ÔÕ½ÁбíÖÐ×îеÄÒ»ÌõËæ»ú»úÆ÷ÈËID£¬ÓÃÓÚºóÃæÉú³ÉеÄËæ»ú»úÆ÷ÈËIDÓã¬È·±£²»Öظ´  
 | 
    lastRandRobotID = RandRobotID  
 | 
    curBattleRecList = GetPlayerArenaBattleRecList(playerID)  
 | 
    for battleRec in curBattleRecList[::-1]:  
 | 
        if battleRec.tagPlayerID >= RandRobotID and battleRec.tagPlayerID <= MaxRobotID:  
 | 
            lastRandRobotID = battleRec.tagPlayerID  
 | 
            break  
 | 
          
 | 
    GameWorld.DebugLog("    Ëæ»ú»úÆ÷È˱¸ÓÃÐÅÏ¢: lastRandRobotID=%s,LV(%s ~ %s),score(%s ~ %s)"   
 | 
                       % (lastRandRobotID, randMinLV, randMaxLV, randMinScore, randMaxScore), playerID)  
 | 
      
 | 
    for i in xrange(needMatchCount):  
 | 
        if len(matchList) > i:  
 | 
            matchPlayer = matchList[i]  
 | 
        else:  
 | 
            matchPlayer = ArenaMatchPlayer()  
 | 
            matchList.append(matchPlayer)  
 | 
        matchPlayer.ResetData()  
 | 
          
 | 
        if matchOrderList:  
 | 
            matchOrder = matchOrderList.pop(0)  
 | 
            matchIndex = matchOrder - 1  
 | 
            # ÔÚ°ñµ¥ÉϵÄÖ±½ÓÈ¡°ñµ¥Êý¾Ý  
 | 
            if billBoard and 0 <= matchIndex < billBoard.GetCount():  
 | 
                billData = billBoard.At(matchIndex)  
 | 
                matchPlayer.tagPlayerID = GetArenaBillID(billData)  
 | 
                  
 | 
                # ±»Æ¥ÅäµÄʱºò±»¶¯¸üаñµ¥ÖеÄÍæ¼ÒÊý¾Ý£¬²»ÅÅÐò£¬Ö»¸üÐÂÊýÖµ£¬ÕâЩÊýÖµ²»Ó°ÏìÅÅÐò£¬Õ½¶·Á¦Îª¶þ¼¶ÅÅÐò£¬¿ÉºöÂÔ  
 | 
                if matchPlayer.tagPlayerID > MaxRobotID:  
 | 
                    curCache = PlayerViewCache.FindViewCache(matchPlayer.tagPlayerID)  
 | 
                    if curCache:  
 | 
                        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)  
 | 
                        SetArenaBillName(billData, cacheDict["Name"])  
 | 
                        SetArenaBillRealmLV(billData, cacheDict["RealmLV"])  
 | 
                        SetArenaBillLV(billData, cacheDict["LV"])  
 | 
                        SetArenaBillFightPower(billData, cacheDict["FightPower"])  
 | 
                else:  
 | 
                    if matchIndex < len(PyGameData.g_arenaRobotLVList):  
 | 
                        robotLV = PyGameData.g_arenaRobotLVList[matchIndex] # Í¬²½¸üлúÆ÷È˰ñµ¥±ä»¯µÈ¼¶  
 | 
                        SetArenaBillLV(billData, robotLV)  
 | 
                          
 | 
                matchPlayer.tagLV = GetArenaBillLV(billData)  
 | 
                matchPlayer.tagJob = GetArenaBillJob(billData)  
 | 
                matchPlayer.tagScore = GetArenaBillScore(billData)  
 | 
                  
 | 
                GameWorld.DebugLog("    %s Æ¥ÅäÔÚ°ñµ¥ÉϵÄ: tagPlayerID=%s,tagLV=%s,tagScore=%s,matchOrder=%s"   
 | 
                                   % (i + 1, matchPlayer.tagPlayerID, matchPlayer.tagLV, matchPlayer.tagScore, matchOrder), playerID)  
 | 
                continue  
 | 
              
 | 
        # Ê£ÏµÄËæ»úÉú³É²»ÔÚ°ñµ¥ÉϵĻúÆ÷ÈË  
 | 
        lastRandRobotID += 1  
 | 
        if lastRandRobotID > MaxRobotID:  
 | 
            lastRandRobotID = RandRobotID  
 | 
        matchPlayer.tagPlayerID = lastRandRobotID  
 | 
        matchPlayer.tagJob = random.choice(openJobList)  
 | 
        matchPlayer.tagLV = random.randint(randMinLV, randMaxLV)  
 | 
        matchPlayer.tagScore = random.randint(randMinScore, randMaxScore)  
 | 
        GameWorld.DebugLog("    %s Æ¥Åä·Ç°ñµ¥ÉϵÄ: tagPlayerID=%s,tagLV=%s,tagScore=%s"   
 | 
                           % (i + 1,matchPlayer.tagPlayerID, matchPlayer.tagLV, matchPlayer.tagScore), playerID)  
 | 
          
 | 
    PyGameData.g_arenaPlayerMatchDict[playerID] = matchList  
 | 
    #GameWorld.DebugLog("    ¸üÐÂÆ¥Å仺´æ: %s" % PyGameData.g_arenaPlayerMatchDict, playerID)  
 | 
    __SyncMatchList(curPlayer, matchList)  
 | 
    return  
 | 
  
 | 
def __SyncMatchList(curPlayer, matchList):  
 | 
    ## Í¬²½Æ¥ÅäÁÐ±í  
 | 
    clientPack = ChPyNetSendPack.tagGCArenaMatchList()  
 | 
    clientPack.MatchList = []  
 | 
    for matchPlayer in matchList:  
 | 
        matchInfo = ChPyNetSendPack.tagGCArenaMatchInfo()  
 | 
        matchInfo.PlayerID = matchPlayer.tagPlayerID  
 | 
        matchInfo.Job = matchPlayer.tagJob  
 | 
        matchInfo.LV = matchPlayer.tagLV  
 | 
        matchInfo.Score = matchPlayer.tagScore  
 | 
          
 | 
        # Íæ¼Ò¶ÁÈ¡¶îÍâÐÅÏ¢£¬ »úÆ÷ÈËÆäËûÐÅÏ¢²»´¦Àí£¬ÕâÀïÖ±½Ó¶Á×îеIJ鿴»º´æ£¬·Àֹˢв»¼°Ê±£¨²¢²»ÊÇʵʱÊý¾Ý£¬Ö»ÊÇÏà¶Ôʵʱ£¬Ç°¶Ë¿É×ÔÐпØÖÆË¢ÐÂÆµÂÊ£©  
 | 
        if matchInfo.PlayerID > MaxRobotID:  
 | 
            curCache = PlayerViewCache.FindViewCache(matchInfo.PlayerID)  
 | 
            if curCache:  
 | 
                cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)  
 | 
                fightPower = cacheDict["FightPower"]  
 | 
                matchInfo.LV = cacheDict["LV"]  
 | 
                matchInfo.PlayerName = cacheDict["Name"]  
 | 
                matchInfo.RealmLV = cacheDict["RealmLV"]  
 | 
                matchInfo.FightPower = fightPower % ShareDefine.Def_PerPointValue  
 | 
                matchInfo.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue  
 | 
        else:  
 | 
            # ´Ë´¦»úÆ÷È˵ÄÔݺöÂԵȼ¶±ä»¯µÄͬ²½£¬½öÔÚˢС¢¸üлý·Öʱͬ²½£¬´Ë´¦Ê¡ÂÔ²éѯ»úÆ÷ÈËËùÊô°ñµ¥ÅÅÃû  
 | 
            pass  
 | 
          
 | 
        clientPack.MatchList.append(matchInfo)  
 | 
    clientPack.MatchCount = len(clientPack.MatchList)  
 | 
    NetPackCommon.SendFakePack(curPlayer, clientPack)  
 | 
    return  
 | 
  
 | 
def __DoArenaBattleResult(curPlayer, cmdDict):  
 | 
    ## µØÍ¼Íæ¼Òͬ²½Õ½¶·½á¹û  
 | 
      
 | 
    retDict = {}  
 | 
    retDict.update(cmdDict)  
 | 
      
 | 
    accID = curPlayer.GetAccID()  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    GameWorld.DebugLog("¾º¼¼³¡Íæ¼ÒÕ½¶·½á¹û: %s" % str(cmdDict), playerID)  
 | 
      
 | 
    tagPlayerID = cmdDict["tagPlayerID"]  
 | 
    isWin = cmdDict["isWin"]  
 | 
    playerLV = cmdDict["playerLV"]  
 | 
    playerScore = cmdDict["playerScore"]  
 | 
      
 | 
    if not tagPlayerID:  
 | 
        return retDict  
 | 
      
 | 
    ''' ¹ØÓÚ¶ÔÊÖ  
 | 
        À´Ô´£º   
 | 
        1. Æ¥ÅäÁбíÖÐ  
 | 
        2. ¶ÔÕ½¼Ç¼ÖÐÖ±½Ó·¢ÆðµÄÌôÕ½  
 | 
        ËµÃ÷£º  
 | 
    1. ¿ÉÄÜÊÇ»úÆ÷ÈË£¬ÇÒ»úÆ÷ÈË»ý·Ö²»»á±ä»¯  
 | 
    2. ²»Ò»¶¨ÔÚ°ñÉÏ£¬ÒòΪ¿ÉÄÜÔÚ°ñÉϵÄʱºò±»Æ¥Åä×ßÁË£¬µ«ÊǺóÀ´±»¼·³ö°ñµ¥£¬È»ºóÊܵ½Íæ¼ÒÌôÕ½  
 | 
    3. Èç¹ûÊÇÍæ¼Ò£¬ÀíÂÛÉ϶¼ÓжÔÕ½¼Ç¼£¬ÒòΪÔÚ°ñÉϵÄÍæ¼Ò²Å»á±»Æ¥Åä×ߣ¬¶øÖ»ÓÐÖ÷¶¯¶ÔÕ½¹ý²ÅÓпÉÄÜÉϰñ  
 | 
    '''  
 | 
     
 | 
    curScore = playerScore  
 | 
    isFindTag = False  
 | 
    tagLV, tagJob, tagScore = 0, 0, 0  
 | 
    tagRealmLV, tagFightPower, tagAccID = 0, 0, "" # »úÆ÷ÈËÎÞÖµ  
 | 
      
 | 
    # ÏÈÕÒÆ¥ÅäÁÐ±í  
 | 
    matchList = PyGameData.g_arenaPlayerMatchDict.get(playerID, [])  
 | 
    for matchPlayer in matchList:  
 | 
        if matchPlayer.tagPlayerID == tagPlayerID:  
 | 
            isFindTag = True  
 | 
            tagLV, tagJob, tagScore = matchPlayer.tagLV, matchPlayer.tagJob, matchPlayer.tagScore  
 | 
            GameWorld.DebugLog("    ¶ÔÊÖÔÚÆ¥ÅäÁбíÖÐ! tagLV=%s, tagJob=%s, tagScore=%s" % (tagLV, tagJob, tagScore), playerID)  
 | 
            break  
 | 
          
 | 
    # ÔÚÕÒ¶ÔÕ½¼Ç¼ÁÐ±í  
 | 
    curBattleRecList = GetPlayerArenaBattleRecList(playerID)  
 | 
    if not isFindTag:  
 | 
        for battleRec in curBattleRecList:  
 | 
            if battleRec.tagPlayerID == tagPlayerID:  
 | 
                isFindTag = True  
 | 
                tagLV, tagJob, tagScore = battleRec.tagLV, battleRec.tagJob, battleRec.tagScore  
 | 
                GameWorld.DebugLog("    ¶ÔÊÖÔÚ¶ÔÕ½¼Ç¼ÖÐ! tagLV=%s, tagJob=%s, tagScore=%s" % (tagLV, tagJob, tagScore), playerID)  
 | 
                break  
 | 
              
 | 
    if not isFindTag:  
 | 
        GameWorld.ErrLog("ÕÒ²»µ½¶ÔÕ½¶ÔÊÖ£¬²»ÔÚÆ¥ÅäÁбí»ò¶ÔÕ½¼Ç¼À²»´¦Àí½áË㣡tagPlayerID=%s" % tagPlayerID, playerID)  
 | 
        return retDict  
 | 
      
 | 
    billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_Arena)  
 | 
    if not billBoard:  
 | 
        return retDict  
 | 
      
 | 
    if tagPlayerID > MaxRobotID:  
 | 
        tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID)  
 | 
        tagOnline = 1 if (tagPlayer and not PlayerControl.GetIsTJG(tagPlayer)) else 0 # Ä¿±êÍæ¼ÒÊÇ·ñÔÚÏß  
 | 
          
 | 
        tagBattleRecList = GetPlayerArenaBattleRecList(tagPlayerID)  
 | 
        # Ëä˵ÀíÂÛÉ϶¼ÓмǼ£¬µ«ÊÇ´úÂë²ãÃæ»¹ÊÇ×öºÃΪNoneʱµÄ·À·¶  
 | 
        tagBattleRec = tagBattleRecList[-1] if len(tagBattleRecList) > 0 else None  
 | 
        if tagBattleRec:  
 | 
            tagScore = tagBattleRec.updScore  
 | 
            GameWorld.DebugLog("    ¶ÔÊÖÊÇÍæ¼Ò£¬´Ó¶ÔÊÖ×îжÔÕ½¼Ç¼ÖлñµÃ¶ÔÊÖ×îлý·Ö! tagScore=%s" % tagScore, playerID)              
 | 
      
 | 
    playerJob = curPlayer.GetJob()  
 | 
    playerName = curPlayer.GetName()  
 | 
    realmLV = cmdDict["realmLV"]  
 | 
    fightPower = cmdDict["fightPower"]  
 | 
      
 | 
    opInfo = ""  
 | 
    # ½áËã×Ô¼º  
 | 
    addScore = __CalcBattleAddScore(playerID, curScore, tagScore, isWin)  
 | 
    updScore = max(0, playerScore + addScore)  
 | 
      
 | 
    curOrder = billBoard.IndexOfByID(playerID) + 1  # ¸üÐÂǰ»ñÈ¡Ãû´Î  
 | 
    cmpValue2 = fightPower / ShareDefine.Def_PerPointValue  
 | 
    cmpValue3 = fightPower % ShareDefine.Def_PerPointValue  
 | 
    PlayerBillboard.UpdatePlayerBillboard(playerID, playerName, opInfo, ShareDefine.Def_BT_Arena, playerJob,  
 | 
                                          realmLV, playerLV, updScore, autoSort=False, cmpValue2=cmpValue2, cmpValue3=cmpValue3)  
 | 
      
 | 
    awardItemList = []  
 | 
    if isWin:  
 | 
        randItemList = IpyGameDataPY.GetFuncEvalCfg("ArenaBattleAward", 3)  
 | 
        awardItemInfo = GameWorld.GetResultByRandomList(randItemList)  
 | 
        if awardItemInfo:  
 | 
            awardItemList.append(awardItemInfo[:3])  
 | 
            isWorldNotify = awardItemInfo[3] if len(awardItemInfo) > 3 else 0  
 | 
            if isWorldNotify:  
 | 
                PlayerControl.WorldNotify(0, "ArenaWinerItem", [curPlayer.GetName(), awardItemInfo[0], "", awardItemInfo[1]])  
 | 
                  
 | 
    tagAddScore = __CalcBattleAddScore(tagPlayerID, tagScore, curScore, not isWin)  
 | 
    updTagScore = max(0, tagScore + tagAddScore)  
 | 
    # ½áËã¶ÔÊÖ£¬½öÍæ¼Òʱ½áË㣬»úÆ÷È˲»´¦Àí  
 | 
    if tagPlayerID > MaxRobotID:  
 | 
        tagCache = PlayerViewCache.FindViewCache(tagPlayerID)  
 | 
        if tagCache:  
 | 
            cacheDict = PlayerViewCache.GetCachePropDataDict(tagCache)  
 | 
            tagOpInfo = ""  
 | 
            tagLV = cacheDict["LV"]  
 | 
            tagPlayerName = cacheDict["Name"]  
 | 
            tagRealmLV = cacheDict["RealmLV"]  
 | 
            tagFightPower = cacheDict["FightPower"]  
 | 
            tagAccID = cacheDict["AccID"]  
 | 
            tagCmpValue2 = tagFightPower / ShareDefine.Def_PerPointValue  
 | 
            tagCmpValue3 = tagFightPower % ShareDefine.Def_PerPointValue  
 | 
            PlayerBillboard.UpdatePlayerBillboard(tagPlayerID, tagPlayerName, tagOpInfo, ShareDefine.Def_BT_Arena, tagJob,  
 | 
                                                  tagRealmLV, tagLV, updTagScore, autoSort=False, cmpValue2=tagCmpValue2, cmpValue3=tagCmpValue3)  
 | 
    else:  
 | 
        robotBillboardData = billBoard.FindByID(tagPlayerID)  
 | 
        if robotBillboardData:  
 | 
            SetArenaBillScore(robotBillboardData, updTagScore)  
 | 
              
 | 
    # ¶¼¸üÐÂÍêºóÅÅÐòÒ»´Î  
 | 
    billBoard.Sort()  
 | 
    updOrder = billBoard.IndexOfByID(playerID) + 1 # È¡×îÐÂÃû´Î  
 | 
    GameWorld.DebugLog("    ¸üÐÂ×ÔÉí»ý·Ö: addScore=%s,updScore=%s,curOrder=%s,updOrder=%s" % (addScore, updScore, curOrder, updOrder), playerID)  
 | 
    GameWorld.DebugLog("    ¸üжÔÊÖ»ý·Ö: tagPlayerID=%s,tagAddScore=%s,updTagScore=%s" % (tagPlayerID, tagAddScore, updTagScore), playerID)  
 | 
    retDict.update({"addScore":addScore, "updScore":updScore, "curOrder":curOrder, "updOrder":updOrder,  
 | 
                    "awardItemList":awardItemList, "isOK":True})  
 | 
      
 | 
    if tagPlayerID <= MaxRobotID:  
 | 
        tagUpdOrder = billBoard.IndexOfByID(tagPlayerID) + 1 # È¡×îÐÂÃû´Î  
 | 
        tagOrderIndex = tagUpdOrder - 1  
 | 
        if tagUpdOrder >= 1 and tagOrderIndex < len(PyGameData.g_arenaRobotLVList) and tagOrderIndex < billBoard.GetCount():  
 | 
            GameWorld.DebugLog("    PyGameData.g_arenaRobotLVList=%s" % PyGameData.g_arenaRobotLVList, playerID)  
 | 
            updRobotLV = PyGameData.g_arenaRobotLVList[tagOrderIndex]  
 | 
            robotBillboardData = billBoard.At(tagOrderIndex)  
 | 
            SetArenaBillLV(robotBillboardData, updRobotLV)  
 | 
            GameWorld.DebugLog("    »úÆ÷ÈËÔÚ°ñÉÏ£¬¸üеȼ¶ÐÅÏ¢! tagPlayerID=%s,tagUpdOrder=%s,updRobotLV=%s" % (tagPlayerID, tagUpdOrder, updRobotLV), playerID)  
 | 
        else:  
 | 
            GameWorld.DebugLog("    »úÆ÷È˲»ÔÚ°ñÉÏ£¬²»¸üеȼ¶ÐÅÏ¢! tagPlayerID=%s" % tagPlayerID, playerID)  
 | 
              
 | 
    battleRecMaxCount = min(MaxBattleRecCount, IpyGameDataPY.GetFuncCfg("ArenaSet", 4))  
 | 
      
 | 
    # ²åÈë¶ÔÕ½¼Ç¼  
 | 
    battleTime = int(time.time())  
 | 
    battleRec = ArenaBattleRec(playerID)  
 | 
    battleRec.battleTime = battleTime  
 | 
    battleRec.tagPlayerID = tagPlayerID  
 | 
    battleRec.tagLV = tagLV  
 | 
    battleRec.tagJob = tagJob  
 | 
    battleRec.tagScore = updTagScore  
 | 
    battleRec.isWin = int(isWin)  
 | 
    battleRec.addScore = addScore  
 | 
    battleRec.isDispose = 1  
 | 
    battleRec.updScore = updScore  
 | 
    curBattleRecList.append(battleRec)  
 | 
    if len(curBattleRecList) > battleRecMaxCount:  
 | 
        curBattleRecList = curBattleRecList[len(curBattleRecList) - battleRecMaxCount:]  
 | 
        PyGameData.g_arenaPlayerBattleRecDict[playerID] = curBattleRecList  
 | 
    __SyncArenaBattleRecord(curPlayer, [battleRec])  
 | 
      
 | 
    if tagPlayerID > MaxRobotID:  
 | 
        # ¶ÔÊÖÍæ¼Ò·´ÏòÔö¼Ó¶ÔÕ½¼Ç¼  
 | 
        tagBattleRec = ArenaBattleRec(tagPlayerID)  
 | 
        tagBattleRec.battleTime = battleTime  
 | 
        tagBattleRec.tagPlayerID = playerID  
 | 
        tagBattleRec.tagLV = playerLV  
 | 
        tagBattleRec.tagJob = playerJob  
 | 
        tagBattleRec.tagScore = updScore  
 | 
        tagBattleRec.isWin = int(not isWin)  
 | 
        tagBattleRec.addScore = tagAddScore  
 | 
        tagBattleRec.isDispose = 1 if tagOnline else 0  
 | 
        tagBattleRec.updScore = updTagScore  
 | 
        tagBattleRecList.append(tagBattleRec)  
 | 
        if len(tagBattleRecList) > battleRecMaxCount:  
 | 
            tagBattleRecList = tagBattleRecList[len(tagBattleRecList) - battleRecMaxCount:]  
 | 
            PyGameData.g_arenaPlayerBattleRecDict[tagPlayerID] = tagBattleRecList  
 | 
        if tagOnline:  
 | 
            __SyncArenaBattleRecord(tagPlayer, [tagBattleRec])  
 | 
            __SyncPlayerBechallengedUpdScore(tagPlayer, updTagScore)  
 | 
              
 | 
    GameWorld.DebugLog("    ×îÐÂËùÓжÔÕ½¼Ç¼»º´æ! %s" % PyGameData.g_arenaPlayerBattleRecDict)  
 | 
    GameWorld.DebugLog("    retDict=%s" % retDict, playerID)  
 | 
      
 | 
    # ¶ÔÕ½½áÊø£¬×îºóÃâ·ÑË¢ÐÂÒ»´ÎÆ¥ÅäÁÐ±í  
 | 
    __DoArenaMatchRefresh(curPlayer, True, playerLV, updScore)  
 | 
      
 | 
    drDict = {"AccID":accID, "PlayerID":playerID, "playerLV":playerLV, "realmLV":realmLV, "fightPower":fightPower, "curScore":[curScore, addScore, updScore],   
 | 
              "TagAccID":tagAccID, "TagPlayerID":tagPlayerID, "tagLV":tagLV, "tagRealmLV":tagRealmLV, "tagFightPower":tagFightPower,   
 | 
              "tagScore":[tagScore, tagAddScore, updTagScore], "isWin":isWin}  
 | 
    DataRecordPack.SendEventPack("ArenaBattleResult", drDict)  
 | 
    return retDict  
 | 
  
 | 
def __SyncPlayerBechallengedUpdScore(curPlayer, updScore):  
 | 
    ## Í¨ÖªµØÍ¼Íæ¼Ò±»ÌôÕ½¸üлý·Ö£¬ÔÚÏß±»ÌôÕ½ »ò ÀëÏß/ÍÑ»ú±»ÌôÕ½ÉÏÏߺóͬ²½  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    tagMapID = curPlayer.GetRealMapID()  
 | 
    cmdStr = str(["UpdScore", {"updScore":updScore}])  
 | 
    GameWorld.GetPlayerManager().MapServer_QueryPlayer(0, 0, playerID, tagMapID, "Arena",  
 | 
                                                       cmdStr, len(cmdStr), curPlayer.GetRouteServerIndex())  
 | 
    return  
 | 
  
 | 
def __CalcBattleAddScore(playerID, curScore, tagScore, isWin):  
 | 
    ## ¼ÆËã¶ÔÕ½Ôö¼Ó»ý·Ö  
 | 
    diffScore = curScore - tagScore # »ý·Ö²î£¬ÓÐÕý¸º  
 | 
    calcScoreFormatDict = IpyGameDataPY.GetFuncEvalCfg("ArenaBattleAward", 1) if isWin else IpyGameDataPY.GetFuncEvalCfg("ArenaBattleAward", 2)  
 | 
    scoreKeyList = calcScoreFormatDict.keys()  
 | 
    scoreKeyList.sort()  
 | 
    calcKey = None  
 | 
    for scoreKey in scoreKeyList:  
 | 
        if diffScore <= scoreKey:  
 | 
            calcKey = scoreKey  
 | 
            break  
 | 
          
 | 
    if calcKey == None:  
 | 
        GameWorld.ErrLog("    ¼ÆËãµÃ·Ö¹«Ê½: playerID=%s,diffScore=%s,scoreKeyList=%s,isWin=%s ÕÒ²»µ½¶ÔÓ¦key¹«Ê½"   
 | 
                           % (playerID, diffScore, scoreKeyList, isWin))  
 | 
        return 0  
 | 
      
 | 
    compileKey = "ArenaBattleScore_%s_%s" % (int(isWin), str(calcKey))  
 | 
    formatStr = calcScoreFormatDict[calcKey]  
 | 
    addScore = eval(FormulaControl.GetCompileFormula(compileKey, formatStr))  
 | 
    GameWorld.DebugLog("    ¼ÆËãµÃ·Ö¹«Ê½: playerID=%s,diffScore=%s,scoreKeyList=%s,isWin=%s,compileKey=%s,formatStr=%s,addScore=%s"   
 | 
                       % (playerID, diffScore, scoreKeyList, isWin, compileKey, formatStr, addScore))  
 | 
    return addScore  
 | 
  
 | 
#// A9 A8 ²é¿´¾º¼¼³¡¶ÔÕ½¼Ç¼ #tagCGQueryArenaBattleRecord  
 | 
#  
 | 
#struct    tagCGQueryArenaBattleRecord  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#};  
 | 
def OnQueryArenaBattleRecord(index, clientData, tick):  
 | 
      
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    if not curPlayer:  
 | 
        return  
 | 
    __SyncArenaBattleRecord(curPlayer, [])  
 | 
    return  
 | 
  
 | 
def __SyncArenaBattleRecord(curPlayer, battleRecList):  
 | 
    ## Í¬²½¶ÔÕ½¼Ç¼  
 | 
    if not battleRecList:  
 | 
        playerID = curPlayer.GetPlayerID()  
 | 
        battleRecList = GetPlayerArenaBattleRecList(playerID)  
 | 
          
 | 
    clientPack = ChPyNetSendPack.tagGCArenaBattleRecordList()  
 | 
    clientPack.BattleRecordList = []  
 | 
    for battleRec in battleRecList:  
 | 
        recInfo = ChPyNetSendPack.tagGCArenaBattleRecord()  
 | 
        recInfo.PlayerID = battleRec.tagPlayerID  
 | 
        recInfo.Job = battleRec.tagJob  
 | 
        recInfo.LV = battleRec.tagLV  
 | 
        recInfo.Score = battleRec.tagScore  
 | 
        recInfo.AddScore = str(battleRec.addScore)  
 | 
        recInfo.AddScoreLen = len(recInfo.AddScore)  
 | 
        recInfo.IsWin = battleRec.isWin  
 | 
        recInfo.Time = battleRec.battleTime  
 | 
          
 | 
        if recInfo.PlayerID > MaxRobotID:  
 | 
            curCache = PlayerViewCache.FindViewCache(recInfo.PlayerID)  
 | 
            if curCache:  
 | 
                cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)  
 | 
                fightPower = cacheDict["FightPower"]  
 | 
                recInfo.LV = cacheDict["LV"]  
 | 
                recInfo.PlayerName = cacheDict["Name"]  
 | 
                recInfo.RealmLV = cacheDict["RealmLV"]  
 | 
                recInfo.FightPower = fightPower % ShareDefine.Def_PerPointValue  
 | 
                recInfo.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue  
 | 
                  
 | 
        clientPack.BattleRecordList.append(recInfo)  
 | 
          
 | 
    clientPack.RecordCount = len(clientPack.BattleRecordList)  
 | 
    NetPackCommon.SendFakePack(curPlayer, clientPack)  
 | 
    return  
 | 
  
 | 
#// A9 A5 ²é¿´¾º¼¼³¡¶ÔÕ½Íæ¼Ò×îÐÂÐÅÏ¢ #tagCGQueryArenaBattlePlayer  
 | 
#  
 | 
#struct    tagCGQueryArenaBattlePlayer  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    DWORD        PlayerID;        //Ä¿±êÍæ¼ÒID£¬½öÖ§³Ö²éÕæÊµÍæ¼Ò  
 | 
#};  
 | 
def OnQueryArenaBattlePlayer(index, clientData, tick):  
 | 
      
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    if not curPlayer:  
 | 
        return  
 | 
      
 | 
    tagPlayerID = clientData.PlayerID  
 | 
    tagBattleRecList = GetPlayerArenaBattleRecList(tagPlayerID)  
 | 
    if not tagBattleRecList:  
 | 
        GameWorld.ErrLog("¾º¼¼³¡Íæ¼ÒÎÞ¶ÔÕ½¼Ç¼£¬ÎÞ·¨²éѯ×îÐÂÊý¾Ý! tagPlayerID=%s" % tagPlayerID, curPlayer.GetPlayerID())  
 | 
        return  
 | 
    tagBattleRec = tagBattleRecList[-1] # È¡×îºóÒ»ÌõΪ×îÐÂÊý¾Ý  
 | 
    tagScore = tagBattleRec.updScore  
 | 
      
 | 
    clientPack = ChPyNetSendPack.tagGCArenaBattlePlayerInfo()  
 | 
    clientPack.PlayerID = tagPlayerID  
 | 
    clientPack.Score = tagScore  
 | 
      
 | 
    curCache = PlayerViewCache.FindViewCache(tagPlayerID)  
 | 
    if curCache:  
 | 
        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)  
 | 
        fightPower = cacheDict["FightPower"]  
 | 
        clientPack.LV = cacheDict["LV"]  
 | 
        clientPack.Job = cacheDict["Job"]  
 | 
        clientPack.PlayerName = cacheDict["Name"]  
 | 
        clientPack.RealmLV = cacheDict["RealmLV"]  
 | 
        clientPack.FightPower = fightPower % ShareDefine.Def_PerPointValue  
 | 
        clientPack.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue  
 | 
          
 | 
    NetPackCommon.SendFakePack(curPlayer, clientPack)  
 | 
    return  
 |