#!/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 PlayerActivity import PlayerBillboard import PlayerZhanling import ItemControler import PlayerArena import PlayerGubao 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, funcLineID 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) PlayerZhanling.AddZhanlingValue(curPlayer, PlayerZhanling.ZhanlingType_ArenaCnt, 1) PlayerGubao.AddGubaoSpecEffLayer(curPlayer, PlayerGubao.GubaoEffType_Arena, 1) PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_Arena, 1) 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