| | |
| | | # 删除对战记录
|
| | | GameWorld.GetUniversalRecMgr().Delete(Def_RecType_ArenaBattleRecord)
|
| | | PyGameData.g_arenaPlayerBattleRecDict = {}
|
| | | PyGameData.g_arenaPlayerMatchDict = {}
|
| | |
|
| | | # 更新新赛季信息
|
| | | if openServerDay <= customMaxServerDay and OSSeasonState == 0:
|
| | |
| | |
|
| | | # 匹配刷新
|
| | | if cmd == "MatchRefresh":
|
| | | __DoArenaMatchRefresh(curPlayer, cmdDict["isRefresh"], cmdDict["playerLV"], cmdDict["playerScore"])
|
| | | __DoArenaMatchRefresh(curPlayer, cmdDict["isRefresh"], cmdDict["playerLV"], cmdDict["playerScore"], cmdDict.get("gmMatchIDList"))
|
| | |
|
| | | # 对战结算
|
| | | elif cmd == "BattleResult":
|
| | |
| | |
|
| | | return msgList + [retDict]
|
| | |
|
| | | def __DoArenaMatchRefresh(curPlayer, isRefresh, playerLV, playerScore):
|
| | | def __DoArenaMatchRefresh(curPlayer, isRefresh, playerLV, playerScore, gmMatchIDList=None):
|
| | | ## 玩家刷新匹配对手
|
| | |
|
| | | playerID = curPlayer.GetPlayerID()
|
| | |
| | | playerOrder = maxOrder + 1
|
| | |
|
| | | GameWorld.DebugLog(" maxOrder=%s,playerOrder=%s" % (maxOrder, playerOrder), playerID)
|
| | | |
| | | highRandOrder, lowRandOrder = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 5) # 前X名匹配比自己高名次时直接随机
|
| | | matchOrderList = [] # 匹配到的名次
|
| | | # 非第一名的匹配比自身名次高的
|
| | | if playerOrder > 1 and higherOrderPerList:
|
| | | higherOrderCount = playerOrder - 1 # 比玩家高的名次的个数
|
| | | # 小于10个的直接纯随机
|
| | | if 0 < higherOrderCount < 10:
|
| | | if 0 < higherOrderCount < highRandOrder:
|
| | | randOrderList = range(1, playerOrder)
|
| | | random.shuffle(randOrderList)
|
| | | matchOrderList.extend(randOrderList[:len(higherOrderPerList)])
|
| | |
| | | % (higherOrderCount, randOrderList, matchOrderList), playerID)
|
| | |
|
| | | # 按比例划分
|
| | | elif higherOrderCount >= 10:
|
| | | elif higherOrderCount >= highRandOrder:
|
| | | randMaxOrder = playerOrder - 1
|
| | | for per in higherOrderPerList:
|
| | | per = min(per, 100) # 最多到100
|
| | |
| | | if 1 <= playerOrder < maxOrder and lowerOrderPerList:
|
| | | lowerOrderCount = maxOrder - playerOrder # 比玩家低的名次的个数
|
| | | # 小于10个的直接纯随机
|
| | | if 0 < lowerOrderCount < 10:
|
| | | if 0 < lowerOrderCount < lowRandOrder:
|
| | | randOrderList = range(playerOrder + 1, maxOrder + 1)
|
| | | random.shuffle(randOrderList)
|
| | | matchOrderList.extend(randOrderList[:len(lowerOrderPerList)])
|
| | |
| | | % (lowerOrderCount, randOrderList, matchOrderList), playerID)
|
| | |
|
| | | # 按比例划分
|
| | | elif lowerOrderCount >= 10:
|
| | | elif lowerOrderCount >= lowRandOrder:
|
| | | randMinOrder = playerOrder + 1
|
| | | for per in lowerOrderPerList:
|
| | | per = min(per, 100) # 最多到100
|
| | |
| | | % (higherLackCount, randOrderMin, randOrderMax, randOrder, matchOrderList), playerID)
|
| | |
|
| | | matchOrderList.sort()
|
| | | # GM指定匹配测试
|
| | | if gmMatchIDList != None and curPlayer.GetGMLevel():
|
| | | gmMatchOrderList = []
|
| | | 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
|
| | | if gmMatchOrder in matchOrderList:
|
| | | continue
|
| | | gmMatchOrderList.append(gmMatchOrder)
|
| | | GameWorld.DebugAnswer(curPlayer, "指定匹配ID(%s),order(%s)" % (gmMatchID, gmMatchOrder))
|
| | | |
| | | GameWorld.DebugLog("matchOrderList=%s,needMatchCount=%s" % (str(matchOrderList), needMatchCount))
|
| | | if matchOrderList:
|
| | | matchOrderList = matchOrderList[:needMatchCount - len(gmMatchOrderList)]
|
| | | matchOrderList += gmMatchOrderList
|
| | | matchOrderList.sort()
|
| | | |
| | | matchRobotRate = IpyGameDataPY.GetFuncCfg("ArenaMatch", 4) # 每次可直接匹配一个机器人概率
|
| | | if matchRobotRate and matchOrderList and len(matchOrderList) >= needMatchCount and GameWorld.CanHappen(matchRobotRate, 100):
|
| | | popOrder = matchOrderList.pop(-1) # 去掉最后一个
|
| | | GameWorld.DebugLog(" 概率匹配到一个机器人,去掉最后一个! matchRobotRate=%s,popOrder=%s" % (matchRobotRate, popOrder), playerID)
|
| | | |
| | | GameWorld.DebugLog(" 最终匹配到的名次列表: matchOrderList=%s" % matchOrderList, playerID)
|
| | |
|
| | | # 随机机器人备用信息
|
| | | openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1)
|
| | | openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1) |
| | |
|
| | | randRobotLVPerRange = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 3)
|
| | | minLV, maxLV = IpyGameDataPY.GetFuncEvalCfg("ArenaRobot", 2) # 机器人最小、最大等级
|
| | | randMinLV = min(minLV, int(playerLV * randRobotLVPerRange[0] / 100.0))
|
| | | randMaxLV = min(maxLV, int(playerLV * randRobotLVPerRange[1] / 100.0))
|
| | | minLV, _ = IpyGameDataPY.GetFuncEvalCfg("ArenaRobot", 2) # 机器人最小、最大等级
|
| | | randMinLV, randMaxLV = minLV - 10, minLV
|
| | | #randMinLV = min(minLV, int(playerLV * randRobotLVPerRange[0] / 100.0))
|
| | | #randMaxLV = min(maxLV, int(playerLV * randRobotLVPerRange[1] / 100.0))
|
| | |
|
| | | randRobotScorePerRange = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 4)
|
| | | randRobotScorePerRange = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 3)
|
| | | randMinScore = int(playerScore * randRobotScorePerRange[0] / 100.0)
|
| | | randMaxScore = int(playerScore * randRobotScorePerRange[1] / 100.0)
|
| | |
|
| | |
| | |
|
| | | opInfo = ""
|
| | | # 结算自己
|
| | | addScore = __CalcBattleAddScore(curScore, tagScore, isWin)
|
| | | addScore = __CalcBattleAddScore(playerID, curScore, tagScore, isWin)
|
| | | updScore = max(0, playerScore + addScore)
|
| | | GameWorld.DebugLog(" 更新自身积分: addScore=%s,updScore=%s" % (addScore, updScore), playerID)
|
| | |
|
| | |
| | | randItemList = IpyGameDataPY.GetFuncEvalCfg("ArenaBattleAward", 3)
|
| | | awardItemInfo = GameWorld.GetResultByRandomList(randItemList)
|
| | | if awardItemInfo:
|
| | | awardItemList.append(awardItemInfo)
|
| | | |
| | | awardItemList.append(awardItemInfo[:3])
|
| | | isWorldNotify = awardItemInfo[3] if len(awardItemInfo) > 3 else 0
|
| | | if isWorldNotify:
|
| | | PlayerControl.WorldNotify(0, "ArenaWinerItem", [curPlayer.GetName(), awardItemInfo[0], "", awardItemInfo[1]])
|
| | | |
| | | # 结算对手,仅玩家时结算,机器人不处理
|
| | | if tagPlayerID > MaxRobotID:
|
| | | tagAddScore = __CalcBattleAddScore(tagScore, curScore, not isWin)
|
| | | tagAddScore = __CalcBattleAddScore(tagPlayerID, tagScore, curScore, not isWin)
|
| | | updTagScore = max(0, tagScore + tagAddScore)
|
| | | GameWorld.DebugLog(" 更新对手积分: tagAddScore=%s,updTagScore=%s" % (tagAddScore, updTagScore), playerID)
|
| | | tagCache = PlayerViewCache.FindViewCache(tagPlayerID)
|
| | |
| | | cmdStr, len(cmdStr), curPlayer.GetRouteServerIndex())
|
| | | return
|
| | |
|
| | | def __CalcBattleAddScore(curScore, tagScore, isWin):
|
| | | def __CalcBattleAddScore(playerID, curScore, tagScore, isWin):
|
| | | ## 计算对战增加积分
|
| | | diffScore = curScore - tagScore # 积分差,有正负
|
| | | calcScoreFormatDict = IpyGameDataPY.GetFuncEvalCfg("ArenaBattleAward", 1) if isWin else IpyGameDataPY.GetFuncEvalCfg("ArenaBattleAward", 2)
|
| | | scoreKeyList = calcScoreFormatDict.keys()
|
| | | scoreKeyList.sort()
|
| | | calcKey = ""
|
| | | calcKey = None
|
| | | for scoreKey in scoreKeyList:
|
| | | if diffScore <= scoreKey:
|
| | | calcKey = scoreKey
|
| | | break
|
| | |
|
| | | if not calcKey:
|
| | | if calcKey == None:
|
| | | GameWorld.ErrLog(" 计算得分公式: playerID=%s,diffScore=%s,scoreKeyList=%s,isWin=%s 找不到对应key公式" |
| | | % (playerID, diffScore, scoreKeyList, isWin))
|
| | | return 0
|
| | |
|
| | | compileKey = "ArenaBattleScore_%s_%s" % (int(isWin), str(calcKey))
|
| | | formatStr = calcScoreFormatDict[calcKey]
|
| | | addScore = eval(FormulaControl.GetCompileFormula(compileKey, formatStr))
|
| | | GameWorld.DebugLog(" 计算得分公式: diffScore=%s,isWin=%s,compileKey=%s,formatStr=%s,addScore=%s" |
| | | % (diffScore, isWin, compileKey, formatStr, addScore))
|
| | | GameWorld.DebugLog(" 计算得分公式: playerID=%s,diffScore=%s,scoreKeyList=%s,isWin=%s,compileKey=%s,formatStr=%s,addScore=%s" |
| | | % (playerID, diffScore, scoreKeyList, isWin, compileKey, formatStr, addScore))
|
| | | return addScore
|
| | |
|
| | | #// A9 A8 查看竞技场对战记录 #tagCGQueryArenaBattleRecord
|