#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_Arena # # @todo:ÑÝÎ䳡 # @author hxp # @date 2025-09-12 # @version 1.0 # # ÏêϸÃèÊö: ÑÝÎ䳡 # #------------------------------------------------------------------------------- #"""Version = 2025-09-12 10:30""" #------------------------------------------------------------------------------- import DBDataMgr import GameWorld import TurnAttack import ShareDefine import PlayerControl import IpyGameDataPY import PlayerBillboard import ItemControler import PlayerArena import PyGameData import FBCommon import ChConfig def __checkCanAtkTagPlayer(curPlayer, tagPlayerID): '''¼ì²é¿É·ñ¹¥»÷Ä¿±ê @return: None - ²»¿É¹¥»÷ @return: >=0 - ÔÚÆ¥ÅäÁбíÀïµÄË÷Òý @return: -1 - ¿É·´»÷µÄ ''' playerID = curPlayer.GetPlayerID() matchIDList = PyGameData.g_arenaPlayerMatchDict.get(playerID, []) #if tagPlayerID in matchIDList: # return matchIDList.index(tagPlayerID) gameRecMgr = DBDataMgr.GetGameRecMgr() atkRecMgr = gameRecMgr.GetRecTypeIDMgr(ShareDefine.Def_GameRecType_ArenaRecord, playerID) for index in range(atkRecMgr.GetCount())[::-1]: recData = atkRecMgr.At(index) if PlayerArena.GetRecAtkType(recData) != PlayerArena.RecAtkType_Def: # ±»¹¥»÷µÄ²ÅÄÜ·´»÷ continue if tagPlayerID != PlayerArena.GetRecTagPlayerID(recData): continue if GameWorld.CheckTimeIsSameWeek(recData.GetTime()): return -1 break GameWorld.DebugLog("ÑÝÎ䳡²»¿É¹¥»÷²»ÔÚÆ¥ÅäÁбíÀï»ò¿É¸´³ðµÄÄ¿±ê! tagPlayerID=%s,matchIDList=%s" % (tagPlayerID, matchIDList), playerID) return def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList): ## »ØºÏÕ½¶·ÇëÇó if __checkCanAtkTagPlayer(curPlayer, tagID) == None: return if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_ArenaTicket, 1): return return True def GetFBPlayerLineupID(curPlayer, mapID, funcLineID): ## »ñÈ¡Íæ¼ÒʹÓõĹ¥·ÀÕóÈÝID # @return: ¹¥»÷·½ÕóÈÝID, ·ÀÊØ·½ÕóÈÝID return ShareDefine.Lineup_Arena, ShareDefine.Lineup_ArenaDef def OnTurnFightOver(curPlayer, turnFight, mapID, funcLineID, overMsg): ## »ØºÏÕ½¶·½áÊø if not curPlayer: return playerID = curPlayer.GetPlayerID() tagPlayerID = turnFight.tagPlayerID isWin = turnFight.isWin canAtkRet = __checkCanAtkTagPlayer(curPlayer, tagPlayerID) GameWorld.DebugLog("½áË㾺¼¼³¡! isWin=%s,tagPlayerID=%s,canAtkRet=%s" % (isWin, tagPlayerID, canAtkRet), playerID) if canAtkRet == None: return billboardMgr = DBDataMgr.GetBillboardMgr() billBoard = billboardMgr.GetBillboard(ShareDefine.Def_BT_Arena) atkAddScore, defDecScore = 0, 0 if isWin: winScoreList = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 1) scoreCnt = len(winScoreList) scoreIndex = scoreCnt - 1 # ĬÈÏ×îµÍ·Öµµ # Æ¥ÅäµÄ if canAtkRet >= 0: if canAtkRet < scoreCnt: scoreIndex = canAtkRet GameWorld.DebugLog("ÔÚÆ¥ÅäÖеÄ! scoreIndex=%s" % scoreIndex, playerID) # ¸´³ðµÄ else: # °´ÅÅÃû²î fromLowerCnt, matchPerRank = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 2) curPlayerRank = billBoard.IndexOfByID(playerID) + 1 tagPlayerRank = billBoard.IndexOfByID(tagPlayerID) + 1 if curPlayerRank >= 1 and tagPlayerRank >= 1: fromRank = curPlayerRank - (scoreCnt - fromLowerCnt) * matchPerRank for index in range(scoreCnt): toRank = fromRank + matchPerRank - 1 if fromRank <= tagPlayerRank <= toRank: scoreIndex = index break fromRank = toRank + 1 GameWorld.DebugLog("ÔÚ¸´³ðÖеÄ! curPlayerRank=%s,tagPlayerRank=%s,scoreIndex=%s" % (curPlayerRank, tagPlayerRank, scoreIndex), playerID) winScoreInfo = winScoreList[scoreIndex] if scoreIndex < scoreCnt else winScoreList[-1] atkAddScore, defDecScore = winScoreInfo GameWorld.DebugLog("scoreIndex=%s,winScoreInfo=%s" % (scoreIndex, winScoreInfo), playerID) if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_ArenaTicket, 1): return # ÎÞÂÛʤ¸º£¬Ö»ÒªÌôÕ½¶¼¸ø¹Ì¶¨½±Àø awardItemList = IpyGameDataPY.GetFuncEvalCfg("ArenaSet", 4) ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["Arena", False, {}], isNotifyAward=False) __updArenaBatRecord(curPlayer, turnFight, tagPlayerID, isWin, atkAddScore, defDecScore) overMsg.update({"tagPlayerID":tagPlayerID, "atkAddScore":atkAddScore, "defDecScore":defDecScore, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList)}) PlayerArena.Sync_ArenaInfo(curPlayer) # Õ½¶·½áÊøÏµÍ³Ç¿ÖÆË¢ÐÂÆ¥Åä PlayerArena.DoArenaMatchRefresh(curPlayer, True, isSys=True) return def __updArenaBatRecord(curPlayer, turnFight, tagPlayerID, isWin, atkAddScore, defDecScore): ## ¸üÐÂÕ½¶·Ïà¹ØÈÕÖ¾¡¢°ñµ¥µÈ playerID = curPlayer.GetPlayerID() maxCount = min(50, IpyGameDataPY.GetFuncCfg("ArenaSet", 2)) score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) updScore = max(0, score + atkAddScore) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, updScore) GameWorld.DebugLog("score=%s,atkAddScore=%s,updScore=%s" % (score, atkAddScore, updScore), playerID) tagViewCache = turnFight.tagViewCache gameRecMgr = DBDataMgr.GetGameRecMgr() atkRecMgr = gameRecMgr.GetRecTypeIDMgr(ShareDefine.Def_GameRecType_ArenaRecord, playerID) recData = atkRecMgr.AddRecData(maxCount) PlayerArena.SetRecUpdScore(recData, updScore) PlayerArena.SetRecAtkType(recData, PlayerArena.RecAtkType_Atk) PlayerArena.SetRecTagPlayerID(recData, tagPlayerID) PlayerArena.SetRecIsWin(recData, isWin) PlayerArena.SetRecFace(recData, tagViewCache.GetFace()) PlayerArena.SetRecFacePic(recData, tagViewCache.GetFacePic()) PlayerArena.SetRecRealmLV(recData, tagViewCache.GetRealmLV()) PlayerArena.SetRecLV(recData, tagViewCache.GetLV()) # Ãû×Ö¡¢±ä¸ü»ý·Ö +-¡¢Õ½Á¦ # Õ½Á¦Í³Ò»¼Ç¼·ÀÊØÕóÈÝ fightPower = TurnAttack.GetCacheLineupFightPower(tagViewCache, ShareDefine.Lineup_ArenaDef) recData.SetUserData({"Name":tagViewCache.GetPlayerName(), "AddScore":atkAddScore, "FightPower":fightPower}) # ¹¥»÷·½½öÔÚ»ý·Ö±ä¸ü»òÕß³õʼ»ý·Öʱ¸üаñµ¥ if atkAddScore or updScore == IpyGameDataPY.GetFuncCfg("ArenaSet", 1): PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_Arena, updScore) # ±»»÷·½ if tagPlayerID < ShareDefine.RealPlayerIDStart: GameWorld.DebugLog("Ä¿±ê·ÇÕæÊµÍæ¼Ò²»´¦Àí! tagPlayerID=%s" % tagPlayerID, playerID) return # ÒÔÕ½¶·¼Ç¼×÷Ϊ×îлý·ÖµÄ¸üмǼ£¬Ö§³ÖÀëÏßÍæ¼ÒÉÏÏߺó¸üÐÂ×îлý·Ö # ÓÉÓڷǰñµ¥ÉϵÄÍæ¼Ò²»»á±»Æ¥Åäµ½£¬ËùÒÔ±»Æ¥Åäµ½µÄ¿ÉÒÔÀí½âΪһ¶¨ÓÐÕ½¶·¼Ç¼£¬ÒòΪҪÉϰñ±ØÐëÕ½¶·¹ý defRecMgr = gameRecMgr.GetRecTypeIDMgr(ShareDefine.Def_GameRecType_ArenaRecord, tagPlayerID) if not defRecMgr.GetCount(): GameWorld.DebugLog("Ä¿±êûÓжÔÕ½¼Ç¼²»´¦Àí! tagPlayerID=%s" % tagPlayerID, playerID) return finalRecData = defRecMgr.At(defRecMgr.GetCount() - 1) if not GameWorld.CheckTimeIsSameWeek(finalRecData.GetTime()): GameWorld.DebugLog("Ä¿±ê±¾ÖÜûÓжÔÕ½¼Ç¼²»´¦Àí! tagPlayerID=%s" % tagPlayerID, playerID) return defScore = PlayerArena.GetRecUpdScore(finalRecData) updScore = max(0, defScore - defDecScore) GameWorld.DebugLog("defScore=%s,defDecScore=%s,updScore=%s" % (defScore, defDecScore, updScore), playerID) recData = defRecMgr.AddRecData(maxCount) PlayerArena.SetRecUpdScore(recData, updScore) PlayerArena.SetRecAtkType(recData, PlayerArena.RecAtkType_Def) PlayerArena.SetRecTagPlayerID(recData, playerID) PlayerArena.SetRecIsWin(recData, not isWin) PlayerArena.SetRecFace(recData, curPlayer.GetFace()) PlayerArena.SetRecFacePic(recData, curPlayer.GetFacePic()) PlayerArena.SetRecRealmLV(recData, curPlayer.GetOfficialRank()) PlayerArena.SetRecLV(recData, curPlayer.GetLV()) # Ãû×Ö¡¢±ä¸ü»ý·Ö +-¡¢Õ½Á¦ fightPower = TurnAttack.GetPlayerLineupFightPower(curPlayer, ShareDefine.Lineup_ArenaDef) recData.SetUserData({"Name":curPlayer.GetPlayerName(), "AddScore":-defDecScore, "FightPower":fightPower}) if defDecScore: # ·ÀÊØ·½½ö±ä¸üʱ¸üРPlayerBillboard.UpdateBillboardByID(tagPlayerID, ShareDefine.Def_BT_Arena, updScore) return