From eae877b5a46fd8ae4ba36c80010d93fb6fec4d32 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 25 八月 2025 20:14:14 +0800 Subject: [PATCH] 110 【主界面】仙树升级-服务端(增加每日免费减时支持;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py | 80 +++++++++++++++++++++++++++++++++++----- 1 files changed, 70 insertions(+), 10 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py index e51d59f..d9506f8 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py @@ -16,6 +16,7 @@ #"""Version = 2025-07-02 17:30""" #------------------------------------------------------------------------------- +import BattleObj import TurnAttack import PyGameData import ShareDefine @@ -30,7 +31,7 @@ import time class LineupHero(): - ## 阵容战斗武将,注意:同一个武将在不同阵容中可能属性不一样 + ## 阵容武将,注意:同一个武将在不同阵容中可能属性不一样 def __init__(self): self.Clear() @@ -39,6 +40,7 @@ def Clear(self): self.itemIndex = 0 self.heroID = 0 + self.skinID = 0 self.posNum = 0 self.heroBatAttrDict = {} # 武将的最终战斗属性字典, {attrID:value, ...} self.heroSkillIDList = [] # 武将拥有的技能ID列表 [skillID, ...] @@ -55,6 +57,7 @@ self.olPlayer = None self.shapeType = 0 self.heroItemDict = {} # 阵容武将背包索引信息 {itemIndex:posNum, ...} + self.lineupChange = False # 是否已变更阵容标记,在刷新属性后重置标记 self.__refreshState = 0 # 刷属性标记, 0-不需要刷新了,1-需要刷新 self.__freeLineupHeroObjs = [] # 释放的空闲对象[LineupHero, ...] @@ -68,6 +71,7 @@ @param shapeType: 阵型 @param refreshForce: 是否强制刷属性 ''' + self.lineupChange = True self.shapeType = shapeType self.heroItemDict = heroItemDict GameWorld.DebugLog("更新阵容: lineupID=%s,%s" % (self.lineupID, heroItemDict), self.playerID) @@ -128,6 +132,7 @@ if not self.__refreshState: return False doRefreshLineupAttr(self.olPlayer.curPlayer, self.olPlayer, self) + self.lineupChange = False self.__refreshState = 0 return True @@ -153,7 +158,7 @@ return def OnClear(self): - self.mainFight.clear() + self.mainFight.turnFight.exitFight() return def SetPlayer(self, curPlayer): @@ -453,7 +458,15 @@ star = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar) breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV) awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV) + skinIndex = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroSkin) + skinID = 0 + skinIDList = heroIpyData.GetSkinIDList() + if skinIndex < 0 or skinIndex >= len(skinIDList): + skinID = skinIDList[skinIndex] + elif skinIDList: + skinID = skinIDList[0] + InitAddPer += qualityIpyData.GetInitAddPer() LVAddPer += qualityIpyData.GetLVAddPer() * heroLV BreakLVAddPer += qualityIpyData.GetBreakLVAddPer() * breakLV @@ -465,6 +478,7 @@ lineupHero.itemIndex = itemIndex lineupHero.posNum = posNum lineupHero.heroID = heroID + lineupHero.skinID = skinID lineupHero.heroBatAttrDict = {} lineupHero.heroSkillIDList = [] lineupHero.fightPower = 0 @@ -600,6 +614,7 @@ baseAttrFormula = IpyGameDataPY.GetFuncCfg("HeroAttrFormula", 1) otherAttrFormula = IpyGameDataPY.GetFuncCfg("HeroAttrFormula", 2) fightPowerFormula = IpyGameDataPY.GetFuncCfg("HeroAttrFormula", 3) + skillFPFormula = IpyGameDataPY.GetFuncCfg("HeroAttrFormula", 4) lvAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_LV) equipAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_MainEquip) @@ -618,6 +633,12 @@ GameWorld.DebugLog(" 主公等级属性=%s" % lvAttrDict, playerID) GameWorld.DebugLog(" 主公装备属性=%s" % equipAttrDict, playerID) GameWorld.DebugLog(" 主公图鉴属性=%s" % bookAttrDict, playerID) + + PlayerLV = curPlayer.GetLV() + OfficialLV = curPlayer.GetOfficialRank() + GameWorld.DebugLog(" PlayerLV=%s,OfficialLV=%s" % (PlayerLV, OfficialLV), playerID) + + fpRatioIpyData = IpyGameDataPY.GetIpyGameData("FightPowerRatio", OfficialLV) lineupFightPower = 0 # 阵容总战力 InitAddPer, LVAddPer, BreakLVAddPer, StarAddPer = InitAddPer / 10000.0, LVAddPer / 10000.0, BreakLVAddPer / 10000.0, StarAddPer / 10000.0 @@ -651,8 +672,8 @@ inheritPer = 1 # 继承比例,默认100% if attrID in ChConfig.AttrInheritPerDict: attrInheritPerID = ChConfig.AttrInheritPerDict[attrID] # 继承ID - inheritPer = selfAttrDict.get(attrInheritPerID, 100) # 继承比例从武将自身属性中取 - inheritPer /= 100.0 + inheritPer = selfAttrDict.get(attrInheritPerID, 10000) # 继承比例从武将自身属性中取 + inheritPer /= 10000.0 lineupHaloValue, lineupHaloPer = lineupHaloAttrInfo.get(attrID, 0), 0 fetterValue, fetterPer = fetterAttrDict.get(attrID, 0), 0 @@ -684,18 +705,23 @@ attrIpyData = IpyGameDataPY.GetIpyGameData("PlayerAttr", attrID) attrName = attrIpyData.GetParameter() if attrIpyData else "%s" % attrID + attrRatioName = "%sRatio" % attrName + ratioValue = 0 + if attrValue and hasattr(fpRatioIpyData, "Get%s" % attrRatioName): + ratioValue = getattr(fpRatioIpyData, "Get%s" % attrRatioName)() fightPowerParamDict[attrName] = attrValue + fightPowerParamDict[attrRatioName] = ratioValue if attrValue: lineupHero.heroBatAttrDict[attrID] = attrValue logAttrDict["%s-%s" % (attrID, attrName)] = attrValue - + # 计算战力 fightPower = FormulaControl.Eval("fightPowerFormula", fightPowerFormula, fightPowerParamDict) - GameWorld.DebugLog(" fightPower=%s,heroSkillIDList=%s" % (fightPower, lineupHero.heroSkillIDList)) + GameWorld.DebugLog(" heroID=%s,fightPower=%s,heroSkillIDList=%s" % (heroID, fightPower, lineupHero.heroSkillIDList), playerID) skillTypeIDDict = {} for skillID in lineupHero.heroSkillIDList: - skillData = GameWorld.GetGameData().GetSkillBySkillID(skillID) + skillData = IpyGameDataPY.GetIpyGameData("Skill", skillID) if not skillData: continue skillTypeID = skillData.GetSkillTypeID() @@ -713,8 +739,10 @@ for skillData in skillTypeIDDict.values(): skillID = skillData.GetSkillID() lineupHero.heroSkillIDList.append(skillID) - skillFightPower += skillData.GetFightPower() - GameWorld.DebugLog(" skillFightPower=%s,heroSkillIDList=%s" % (skillFightPower, lineupHero.heroSkillIDList)) + paramDict = {"SkillPower":skillData.GetFightPower(), "PlayerLV":PlayerLV, "OfficialLV":OfficialLV} + sFightPower = FormulaControl.Eval("skillFPFormula", skillFPFormula, paramDict) + skillFightPower += sFightPower + GameWorld.DebugLog(" skillFightPower=%s,heroSkillIDList=%s" % (skillFightPower, lineupHero.heroSkillIDList), playerID) # 最终战力 fightPowerTotal = fightPower + skillFightPower @@ -728,10 +756,42 @@ lineup.fightPower = lineupFightPower GameWorld.DebugLog(" 阵容最终战力: lineupID=%s,lineupFightPower=%s" % (lineupID, lineupFightPower), playerID) - # 更新排行榜 + # 非主线阵容不处理以下内容 if lineupID != ShareDefine.Lineup_Main: return PlayerControl.SetFightPower(curPlayer, lineupFightPower) + mainFightMgr = TurnAttack.GetMainFightMgr(curPlayer) + mainTurnFight = mainFightMgr.turnFight + # 主线战斗如果有在战斗中,实时更新 + if mainTurnFight and mainTurnFight.isInFight(): + # 如果是阵容变化的,重新开始战斗 + if lineup.lineupChange: + GameWorld.DebugLog("主阵容变化,重新开始战斗", playerID) + if mainTurnFight.mapID == ChConfig.Def_FBMapID_Main: + TurnAttack.__doMainLevelWave(curPlayer, True) + elif mainTurnFight.mapID == ChConfig.Def_FBMapID_MainBoss: + TurnAttack.__doMainBossStart(curPlayer) + + # 否则只重新设置战斗属性 + else: + GameWorld.DebugLog("主阵容卡牌属性变更,更新战斗武将属性", playerID) + # lineup 为卡牌的阵容,仅有阵容属性相关,没有战斗对象 + # batLineup 为卡牌阵容体现到具体战斗的战斗阵容,有具体的战斗对象 + faction, num = ChConfig.Def_FactionA, 1 # 主线战斗玩家自己默认阵营A的第1个战斗阵容 + batLineup = mainTurnFight.getBatFaction(faction).getBatlineup(num) + batObjMgr = BattleObj.GetBatObjMgr() + for posNum, objID in batLineup.posObjIDDict.items(): + batObj = batObjMgr.getBatObj(objID) + if not batObj: + continue + lineupHero = lineup.GetLineupHero(posNum) + if lineupHero.heroBatAttrDict: + batObj.UpdInitBatAttr(lineupHero.heroBatAttrDict) + else: + GameWorld.DebugLog("主阵容没有在战斗中,不需要处理", playerID) + + # 更新排行榜 + return -- Gitblit v1.8.0