#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerArena
|
#
|
# @todo:ÑÝÎ䳡
|
# @author hxp
|
# @date 2025-09-12
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ÑÝÎ䳡
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2025-09-12 10:30"""
|
#-------------------------------------------------------------------------------
|
|
import DBDataMgr
|
import PlayerMail
|
import ShareDefine
|
import GameFuncComm
|
import PlayerControl
|
import IpyGameDataPY
|
import ChPyNetSendPack
|
import PlayerViewCache
|
import NetPackCommon
|
import PyGameData
|
import GameWorld
|
import ChConfig
|
import random
|
|
# ¼Ç¼¹¥»÷ÀàÐÍ
|
RecAtkType_Atk = 1 # ·¢Æð¹¥»÷
|
RecAtkType_Def = 2 # ±»¹¥»÷µÄ
|
|
def GetRecUpdScore(recData): return recData.GetValue1() # ¸üлý·Ö
|
def SetRecUpdScore(recData, score): return recData.SetValue1(score)
|
def GetRecAtkType(recData): return recData.GetValue2() # ¹¥»÷ÀàÐÍ 1-·¢Æð¹¥»÷µÄ£¬2-±»¹¥»÷µÄ
|
def SetRecAtkType(recData, atkType): return recData.SetValue2(atkType)
|
def GetRecTagPlayerID(recData): return recData.GetValue3() # Ïà¶Ô¹¥»÷ÀàÐ͵ÄÄ¿±êÍæ¼ÒID
|
def SetRecTagPlayerID(recData, tagPlayerID): return recData.SetValue3(tagPlayerID)
|
def GetRecIsWin(recData): return recData.GetValue4() # ÊÇ·ñ»ñʤ 1-»ñʤ£»2-ʧ°Ü
|
def SetRecIsWin(recData, isWin): return recData.SetValue4(1 if isWin else 0)
|
def GetRecFace(recData): return recData.GetValue5() # Ä¿±êÍ·Ïñ
|
def SetRecFace(recData, face): return recData.SetValue5(face)
|
def GetRecFacePic(recData): return recData.GetValue6()
|
def SetRecFacePic(recData, facePic): return recData.SetValue6(facePic)
|
def GetRecRealmLV(recData): return recData.GetValue7()
|
def SetRecRealmLV(recData, realmLV): return recData.SetValue7(realmLV)
|
def GetRecLV(recData): return recData.GetValue8()
|
def SetRecLV(recData, tagLV): return recData.SetValue8(tagLV)
|
#SetUserData Ãû×Ö¡¢±ä¸ü»ý·Ö +-¡¢Õ½Á¦
|
|
def OnWeek():
|
DoArenaReset()
|
return
|
|
def OnDay():
|
__DoGiveBillboardAward("Day")
|
return
|
|
def DoArenaReset():
|
''' Èü¼¾ÖØÖÃ
|
'''
|
GameWorld.Log("=============== ÖØÖþº¼¼³¡ ===============")
|
|
PyGameData.g_arenaPlayerMatchDict = {}
|
|
# ½áËãÉÏÈü¼¾ÅÅÐн±Àø
|
__DoGiveBillboardAward("Week")
|
|
# ÖØÖÃÅÅÐаñ
|
DBDataMgr.GetBillboardMgr().RemoveBillboard(ShareDefine.Def_BT_Arena)
|
# ÖØÖüǼ
|
#DBDataMgr.GetGameRecMgr().DelDataByType(ShareDefine.Def_GameRecType_ArenaRecord) # ÌôÕ½¼Ç¼²»ÖØÖÃ
|
|
GameWorld.Log("==========================================")
|
return True
|
|
def __DoGiveBillboardAward(awardType):
|
## ¾º¼¼³¡½áËãÅÅÐн±Àø£¬ ÿÈÕ¡¢Èü¼¾Í¨ÓÃ
|
|
GameWorld.Log("=== ¾º¼¼³¡½áËãÅÅÐн±Àø! === %s" % awardType)
|
|
billboardMgr = DBDataMgr.GetBillboardMgr()
|
billBoard = billboardMgr.GetBillboard(ShareDefine.Def_BT_Arena)
|
if not billBoard:
|
return
|
|
if awardType == "Day":
|
billboradAwardDict = IpyGameDataPY.GetFuncEvalCfg("ArenaBillboradAward", 1, {})
|
elif awardType == "Week":
|
billboradAwardDict = IpyGameDataPY.GetFuncEvalCfg("ArenaBillboradAward", 2, {})
|
else:
|
return
|
|
orderList = [int(orderStr) for orderStr in billboradAwardDict.keys()]
|
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 < ShareDefine.RealPlayerIDStart:
|
# ·ÇÕæÈ˲»´¦Àí
|
continue
|
|
orderPlayerIDDict[playerID] = [order, awardOrder]
|
|
paramList = [order]
|
awardList = billboradAwardDict[str(awardOrder)]
|
PlayerMail.SendMailByKey("ArenaBillboardAward%s" % awardType, playerID, awardList, paramList)
|
|
GameWorld.Log(" ½±ÀøÍæ¼ÒÃû´ÎÐÅÏ¢: %s" % orderPlayerIDDict)
|
return
|
|
def OnLogin(curPlayer):
|
if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena):
|
return
|
__loginUpdPlayerScore(curPlayer)
|
Sync_ArenaInfo(curPlayer)
|
return
|
|
def __loginUpdPlayerScore(curPlayer):
|
playerID = curPlayer.GetPlayerID()
|
recMgr = DBDataMgr.GetGameRecMgr()
|
recIDMgr = recMgr.GetRecTypeIDMgr(ShareDefine.Def_GameRecType_ArenaRecord, playerID)
|
if not recIDMgr.GetCount():
|
return
|
finalRecData = recIDMgr.At(recIDMgr.GetCount() - 1)
|
recTime = finalRecData.GetTime()
|
if not GameWorld.CheckTimeIsSameWeek(recTime):
|
GameWorld.Log("Íæ¼ÒÉÏÏßÑÝÎ䳡¼Ç¼»ý·Ö·Ç±¾Öܲ»¸üÐÂ! recTime=%s" % GameWorld.ChangeTimeNumToStr(recTime), playerID)
|
return
|
updScore = GetRecUpdScore(finalRecData)
|
befScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, updScore)
|
GameWorld.Log("Íæ¼ÒÉÏÏ߸üÐÂÑÝÎ䳡»ý·Ö: befScore=%s,updScore=%s,recTime=%s" % (befScore, updScore, GameWorld.ChangeTimeNumToStr(recTime)), playerID)
|
return
|
|
def OnDayEx(curPlayer):
|
if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena):
|
return
|
Sync_ArenaInfo(curPlayer)
|
return
|
|
def OnWeekEx(curPlayer):
|
if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena):
|
return
|
__DoArenaSeasonReset(curPlayer)
|
return
|
|
def DoArenaOpen(curPlayer):
|
__DoArenaSeasonReset(curPlayer)
|
return
|
|
def __DoArenaSeasonReset(curPlayer):
|
## Íæ¼ÒÖØÖþº¼¼³¡
|
initScore = IpyGameDataPY.GetFuncCfg("ArenaSet", 1)
|
GameWorld.DebugLog("¾º¼¼³¡Èü¼¾ÖØÖã¡initScore=%s" % (initScore))
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, initScore)
|
Sync_ArenaInfo(curPlayer)
|
return
|
|
def GetArenaTicketStoreMax(curPlayer):
|
## »ñÈ¡Ìôսȯ´æ´¢ÉÏÏÞ
|
baseCnt = IpyGameDataPY.GetFuncCfg("ArenaSet", 3)
|
|
# ÆäËûÌØÈ¨ÌáÉýÉÏÏÞ
|
|
storeMax = baseCnt
|
return storeMax
|
|
#// B2 09 ÑÝÎ䳡ƥÅäÍæ¼Ò #tagCSArenaMatch
|
#
|
#struct tagCSArenaMatch
|
#{
|
# tagHead Head;
|
# BYTE IsRefresh; // 0-´ò¿ª½çÃæÎÞÆ¥ÅäÊý¾Ýʱ²éѯ£¬1-Ç¿ÖÆË¢ÐÂÆ¥ÅäÁбí
|
#};
|
def OnArenaMatch(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
isRefresh = clientData.IsRefresh
|
DoArenaMatchRefresh(curPlayer, isRefresh)
|
return
|
|
def GMArenaMatch(curPlayer, gmMatchIDList):
|
## GMÖ±½ÓÆ¥Åä
|
isRefresh = True
|
DoArenaMatchRefresh(curPlayer, isRefresh, gmMatchIDList)
|
return
|
|
def DoArenaMatchRefresh(curPlayer, isRefresh, gmMatchIDList=None, isSys=False):
|
## Íæ¼ÒË¢ÐÂÆ¥Åä¶ÔÊÖ
|
|
playerID = curPlayer.GetPlayerID()
|
playerScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore)
|
matchScoreList = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 1)
|
|
GameWorld.DebugLog("¾º¼¼³¡Íæ¼ÒË¢ÐÂÆ¥ÅäÁбí: isRefresh=%s,playerScore=%s,gmMatchIDList=%s,isSys=%s" % (isRefresh, playerScore, gmMatchIDList, isSys), playerID)
|
GameWorld.DebugLog(" matchScoreList=%s" % (matchScoreList), playerID)
|
|
# Æ¥Åä¶ÔÏ󻺴æ
|
needMatchCount = len(matchScoreList)
|
if playerID not in PyGameData.g_arenaPlayerMatchDict:
|
PyGameData.g_arenaPlayerMatchDict[playerID] = []
|
matchIDList = PyGameData.g_arenaPlayerMatchDict[playerID]
|
if len(matchIDList) > needMatchCount:
|
matchIDList = matchIDList[:needMatchCount] # ɾ³ý¶àÓàµÄ¸öÊý£¬Ò»°ã¶¼ÊÇÏàͬµÄ£¬³ý·ÇÐÞ¸ÄÆ¥ÅäÊýÖØ¶ÁÅäÖÃ
|
if not isRefresh and len(matchIDList) == needMatchCount:
|
# ·ÇˢеIJ¢ÇÒÒѾÓмǼµÄÖ±½Óͬ²½
|
GameWorld.DebugLog(" ·ÇË¢ÐÂÇÒÓÐÊý¾Ý£¬Ö±½Óͬ²½£¡", playerID)
|
__SyncMatchList(curPlayer, matchIDList)
|
return
|
if isRefresh and not gmMatchIDList and not isSys:
|
costMoney, moneyValue = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 4)
|
if not costMoney or not moneyValue or not PlayerControl.PayMoney(curPlayer, costMoney, moneyValue, "Arena"):
|
return
|
|
billboardMgr = DBDataMgr.GetBillboardMgr()
|
billBoard = billboardMgr.GetBillboard(ShareDefine.Def_BT_Arena)
|
if not billBoard:
|
return
|
maxOrder = billBoard.GetCount()
|
playerOrder = billBoard.IndexOfByID(playerID) + 1 # Íæ¼ÒÔÚÅÅÐаñÖеÄÃû´Î£¬Ã»ÓÐÃû´ÎΪ-1
|
|
matchRobotCntDict = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 3)
|
if playerOrder > 0:
|
matchRobotRange = GameWorld.GetOrderValueByDict(matchRobotCntDict, playerOrder)
|
matchRobotCnt = random.randint(matchRobotRange[0], matchRobotRange[1])
|
else:
|
matchRobotCnt = needMatchCount
|
matchPlayerCnt = needMatchCount - matchRobotCnt
|
GameWorld.DebugLog(" maxOrder=%s,playerOrder=%s,matchRobotCnt=%s,matchPlayerCnt=%s" % (maxOrder, playerOrder, matchRobotCnt, matchPlayerCnt), playerID)
|
|
fromLowerCnt, matchPerRank = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 2)
|
toOrder = playerOrder + fromLowerCnt * matchPerRank # ´ÓµÍÃû´ÎÍù¸ßÃû´ÎÆ¥Åä
|
GameWorld.DebugLog(" fromLowerCnt=%s,matchPerRank=%s,toOrder=%s" % (fromLowerCnt, matchPerRank, toOrder), playerID)
|
matchOrderList = [] # Æ¥Åäµ½µÄÃû´Î
|
for _ in range(matchPlayerCnt):
|
fromOrder = max(1, toOrder - matchPerRank)
|
if toOrder <= fromOrder:
|
break
|
orderList = range(fromOrder, toOrder)
|
random.shuffle(orderList)
|
if playerOrder in orderList:
|
orderList.remove(playerOrder) # ²»°üº¬×Ô¼º
|
if not orderList:
|
break
|
|
if fromOrder == 1:
|
for order in orderList:
|
if order > maxOrder:
|
continue
|
matchOrderList.append(order)
|
if len(matchOrderList) >= matchPlayerCnt:
|
break
|
else:
|
order = orderList[0]
|
if order <= maxOrder:
|
matchOrderList.append(order)
|
|
GameWorld.DebugLog(" Æ¥ÅäÍæ¼Ò: fromOrder=%s,toOrder=%s,matchOrderList=%s" % (fromOrder, toOrder, matchOrderList), playerID)
|
toOrder = fromOrder - 1
|
|
# GMÖ¸¶¨Æ¥Åä²âÊÔ
|
if gmMatchIDList != None and curPlayer.GetGMLevel():
|
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
|
GameWorld.DebugAnswer(curPlayer, "Ö¸¶¨Æ¥ÅäID(%s),order(%s)" % (gmMatchID, gmMatchOrder))
|
if gmMatchID not in matchOrderList:
|
matchOrderList.insert(0, gmMatchOrder)
|
matchOrderList = matchOrderList[:needMatchCount]
|
|
matchOrderList.sort()
|
matchIDList = [] # ×îÖÕÆ¥ÅäµÄÍæ¼ÒIDÁбí
|
for matchOrder in matchOrderList:
|
if matchOrder > maxOrder or matchOrder <= 0:
|
break
|
billData = billBoard.At(matchOrder - 1)
|
matchIDList.append(billData.GetID())
|
|
needRobotCnt = needMatchCount - len(matchIDList)
|
GameWorld.DebugLog(" Æ¥Åä°ñµ¥½á¹û: matchIDList=%s,matchOrderList=%s,needRobotCnt=%s" % (matchIDList, matchOrderList, needRobotCnt), playerID)
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
robotMax = ipyDataMgr.GetRobotCount()
|
doCnt = 100
|
while doCnt > 0 and needRobotCnt > 0 and robotMax:
|
doCnt -= 1
|
robotIndex = random.randint(0, robotMax - 1)
|
robotIpyData = ipyDataMgr.GetRobotByIndex(robotIndex)
|
robotID = robotIpyData.GetID()
|
if robotID not in matchIDList:
|
matchIDList.append(robotID)
|
needRobotCnt -= 1
|
GameWorld.DebugLog(" ×îÖÕÆ¥Åä½á¹û: matchIDList=%s" % matchIDList, playerID)
|
|
PyGameData.g_arenaPlayerMatchDict[playerID] = matchIDList
|
__SyncMatchList(curPlayer, matchIDList)
|
return
|
|
def __SyncMatchList(curPlayer, matchIDList):
|
## ͬ²½Æ¥ÅäÁбí
|
clientPack = ChPyNetSendPack.tagSCArenaMatchList()
|
clientPack.MatchList = []
|
for matchID in matchIDList:
|
viewCache = PlayerViewCache.FindViewCache(matchID)
|
matchInfo = ChPyNetSendPack.tagSCArenaMatchInfo()
|
matchInfo.PlayerID = matchID
|
if viewCache:
|
matchInfo.PlayerName = viewCache.GetPlayerName()
|
matchInfo.RealmLV = viewCache.GetRealmLV()
|
matchInfo.Face = viewCache.GetFace()
|
matchInfo.FacePic = viewCache.GetFacePic()
|
matchInfo.FightPower = viewCache.GetFightPower()
|
matchInfo.FightPowerEx = viewCache.GetFightPowerEx()
|
else:
|
matchInfo.PlayerName = "p%s" % matchID
|
clientPack.MatchList.append(matchInfo)
|
clientPack.MatchCount = len(clientPack.MatchList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
def Sync_ArenaInfo(curPlayer):
|
clientPack = ChPyNetSendPack.tagSCArenaPlayerInfo()
|
clientPack.Score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|