#!/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 self.tagFace = 0 self.tagFacePic = 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.tagFace = 0 self.tagFacePic = 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 strValue3 faceInfo face,facePic ''' ''' °ñµ¥Êý¾Ý ''' 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 GetArenaBillFace(billData): return billData.GetValue3() def SetArenaBillFace(billData, face): billData.SetValue3(face) def GetArenaBillFacePic(billData): return billData.GetValue4() def SetArenaBillFacePic(billData, facePic): billData.SetValue4(facePic) 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 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) strValue3 = recData.GetStrValue3() faceInfo = strValue3.split(",") if strValue3 else [] battleRec.tagFace = int(faceInfo[0] if len(faceInfo) > 0 else 0) battleRec.tagFacePic = int(faceInfo[1] if len(faceInfo) > 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() 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)) recData.SetStrValue3("%s,%s" % (battleRec.tagFace, battleRec.tagFacePic)) 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"]) SetArenaBillFace(billData, cacheDict.get("Face", 0)) SetArenaBillFacePic(billData, cacheDict.get("FacePic", 0)) 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) matchPlayer.tagFace = GetArenaBillFace(billData) matchPlayer.tagFacePic = GetArenaBillFacePic(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 matchInfo.Face = matchPlayer.tagFace matchInfo.FacePic = matchPlayer.tagFacePic # Íæ¼Ò¶ÁÈ¡¶îÍâÐÅÏ¢£¬ »úÆ÷ÈËÆäËûÐÅÏ¢²»´¦Àí£¬ÕâÀïÖ±½Ó¶Á×îе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 matchInfo.Face = cacheDict.get("Face", 0) matchInfo.FacePic = cacheDict.get("FacePic", 0) 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, tagFace, tagFacePic = 0, 0, 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, tagFace, tagFacePic = matchPlayer.tagLV, matchPlayer.tagJob, matchPlayer.tagScore, matchPlayer.tagFace, matchPlayer.tagFacePic 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, tagFace, tagFacePic = battleRec.tagLV, battleRec.tagJob, battleRec.tagScore, battleRec.tagFace, battleRec.tagFacePic 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 face = curPlayer.GetFace() facePic = curPlayer.GetFacePic() PlayerBillboard.UpdatePlayerBillboard(playerID, playerName, opInfo, ShareDefine.Def_BT_Arena, playerJob, realmLV, playerLV, updScore, autoSort=False, cmpValue2=cmpValue2, cmpValue3=cmpValue3, value3=face, value4=facePic) 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 tagFace = cacheDict.get("Face", 0) tagFacePic = cacheDict.get("FacePic", 0) PlayerBillboard.UpdatePlayerBillboard(tagPlayerID, tagPlayerName, tagOpInfo, ShareDefine.Def_BT_Arena, tagJob, tagRealmLV, tagLV, updTagScore, autoSort=False, cmpValue2=tagCmpValue2, cmpValue3=tagCmpValue3, value3=tagFace, value4=tagFacePic) 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 battleRec.tagFace = tagFace battleRec.tagFacePic = tagFacePic 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 tagBattleRec.tagFace = face tagBattleRec.tagFacePic = facePic 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 recInfo.Face = battleRec.tagFace recInfo.FacePic = battleRec.tagFacePic 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