#!/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 PlayerSuccess import PlayerActivity import PlayerBillboard import PlayerViewCache import PlayerZhanling import ItemControler import PlayerBeauty import PlayerArena import PlayerGubao import PyGameData import PlayerTask 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 PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_ArenaBattle) PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAArenaBattle, 1) return True, funcLineID def GetFBPlayerLineupID(curPlayer, mapID, funcLineID): ## »ñÈ¡Íæ¼ÒʹÓõĹ¥·ÀÕóÈÝID # @return: ¹¥»÷·½ÕóÈÝID, ·ÀÊØ·½ÕóÈÝID return ShareDefine.Lineup_ArenaAtk, ShareDefine.Lineup_ArenaDef def OnTurnFightAward(curPlayer, guid, mapID, funcLineID, winFaction, statMsg, dateStr, reqData, awardDict): ## »ØºÏÕ½¶·½áËã½±Àø if not curPlayer: return playerID = curPlayer.GetPlayerID() tagPlayerID = reqData[1] isWin = winFaction == ChConfig.Def_FactionA 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) # ÎÞÂÛʤ¸º£¬Ö»ÒªÌôÕ½¶¼¸ø¹Ì¶¨½±Àø awardItemList = [] awardItemList += IpyGameDataPY.GetFuncEvalCfg("ArenaSet", 4) exItemRate, exItemID = PlayerBeauty.GetBeautyEffInfo(curPlayer, PlayerBeauty.EffType_ArenaItemEx) # ¸ÅÂʶîÍâ»ñµÃ1¸öÎïÆ· if exItemRate and exItemID: if GameWorld.CanHappen(exItemRate): awardItemList.append([exItemID, 1]) GameWorld.DebugLog("ºìÑÕ¸ÅÂʶîÍâ»ñµÃ1¸öÎïÆ·: exItemRate=%s, exItemID=%s, awardItemList=%s" % (exItemRate, exItemID, awardItemList)) awardDict.update({"tagPlayerID":tagPlayerID, "atkAddScore":atkAddScore, "defDecScore":defDecScore, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList)}) GameWorld.DebugLog("¾º¼¼³¡½áËã½±Àø: tagPlayerID=%s,isWin=%s,atkAddScore=%s,defDecScore=%s,awardItemList=%s" % (tagPlayerID, isWin, atkAddScore, defDecScore, awardItemList)) if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_ArenaTicket, 1): return # ÎÞÂÛʤ¸º£¬Ö»ÒªÌôÕ½¶¼¸ø¹Ì¶¨½±Àø ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["Arena", False, {}], isNotifyAward=False) __updArenaBatRecord(curPlayer, tagPlayerID, isWin, atkAddScore, defDecScore) 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, 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) if isWin: winCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaWinCnt) updWinCnt = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaWinCnt, winCnt + 1) GameWorld.DebugLog("updWinCnt=%s" % (updWinCnt), playerID) tagViewCache = PlayerViewCache.FindViewCache(tagPlayerID) 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() if tagViewCache else 0) PlayerArena.SetRecFacePic(recData, tagViewCache.GetFacePic() if tagViewCache else 0) PlayerArena.SetRecRealmLV(recData, tagViewCache.GetRealmLV() if tagViewCache else 1) PlayerArena.SetRecLV(recData, tagViewCache.GetLV() if tagViewCache else 1) # Ãû×Ö¡¢±ä¸ü»ý·Ö +-¡¢Õ½Á¦ # Õ½Á¦Í³Ò»¼Ç¼·ÀÊØÕóÈÝ fightPower = TurnAttack.GetCacheLineupFightPower(tagViewCache, ShareDefine.Lineup_ArenaDef) if tagViewCache else 0 tagPlayerName = tagViewCache.GetPlayerName() if tagViewCache else "" recData.SetUserData({"Name":tagPlayerName, "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_ArenaAtk) recData.SetUserData({"Name":curPlayer.GetPlayerName(), "AddScore":-defDecScore, "FightPower":fightPower}) if defDecScore: # ·ÀÊØ·½½ö±ä¸üʱ¸üРPlayerBillboard.UpdateBillboardByID(tagPlayerID, ShareDefine.Def_BT_Arena, updScore) return