#!/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
|