From 5ca218ac01201f10c196a07b61ef3b1fe59040e5 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 18 九月 2025 18:30:07 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(B427使用技能无伤血时默认发目标;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py |   64 ++++++++++++++++++++-----------
 1 files changed, 41 insertions(+), 23 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 73e7616..2f18462 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
@@ -23,6 +23,7 @@
 import PlayerControl
 import IpyGameDataPY
 import FormulaControl
+import PlayerPrestigeSys
 import PlayerHero
 import GameWorld
 import ChConfig
@@ -156,6 +157,8 @@
         
         # 主线战斗
         self.mainFight = TurnAttack.MainFight(playerID)
+        
+        self._lastBatBufferInfo = [] # 最后一场战斗临时回放 ["guid", "buffer"]
         return
     
     def OnClear(self):
@@ -246,6 +249,11 @@
                         
         GameWorld.DebugLog("武将物品养成更新索引: %s, 影响阵容:%s" % (itemIndexList, effLineupIDList), self.playerID)
         return effLineupIDList
+    
+    def GetLastBatBuffer(self): return self._lastBatBufferInfo
+    def SetLastBatBuffer(self, guid, batBuffer):
+        self._lastBatBufferInfo = [guid, batBuffer]
+        return
     
 class OnlineMgr():
     ## 准在线玩家管理
@@ -403,6 +411,7 @@
     CalcRoleBase(curPlayer)
     ChEquip.CalcRoleEquipAttr(curPlayer)
     PlayerHero.CalcHeroAddAttr(curPlayer)
+    PlayerPrestigeSys.CalcOfficialRankAttr(curPlayer)
     return
 
 def doRefreshLineupAttr(curPlayer, olPlayer, lineup):
@@ -468,10 +477,11 @@
         elif skinIDList:
             skinID = skinIDList[0]
             
+        starMax = PlayerHero.GetHeroStarMax(heroItem)
         InitAddPer += qualityIpyData.GetInitAddPer()
-        LVAddPer += qualityIpyData.GetLVAddPer() * heroLV
+        LVAddPer += qualityIpyData.GetLVAddPer() * max(0, heroLV - 1)
         BreakLVAddPer += qualityIpyData.GetBreakLVAddPer() * breakLV
-        StarAddPer += qualityIpyData.GetStarAddPer() * star
+        StarAddPer += qualityIpyData.GetStarAddPer() * min(star, starMax)
         
         lineupHero = lineup.GetLineupHero(posNum)
         #if False:
@@ -498,21 +508,6 @@
             selfAttrDict[int(k)] = v
         heroSelfAttrInfo[heroID] = selfAttrDict
         
-        # 星级天赋
-        starTalentAttrDict = {}
-        idCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID)
-        lvCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDLV)
-        for aIndex in range(min(idCount, lvCount)):
-            talentID = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentID, aIndex)
-            talentLV = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentIDLV, aIndex)
-            stIpyData = IpyGameDataPY.GetIpyGameData("HeroTalent", talentID)
-            if not stIpyData:
-                continue
-            attrID = stIpyData.GetAttrID()
-            attrValue = stIpyData.GetAttrValue() * talentLV
-            starTalentAttrDict[attrID] = starTalentAttrDict.get(attrID, 0) + attrValue
-        heroStarTalentInfo[heroID] = starTalentAttrDict
-        
         # 突破潜能
         breakAttrDict = {}
         breakIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroBreak", heroID)
@@ -532,12 +527,15 @@
         heroBreakAttrInfo[heroID] = breakAttrDict
         
         # 觉醒天赋
+        maxUnlockSlot = IpyGameDataPY.GetFuncCfg("HeroStarTalent", 1) # 常规天赋槽个数
         awakeTalentAttrDict = {}
-        awakeIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroAwake", heroID)
+        awakeIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("HeroAwake", heroID)
         if awakeIpyDataList:
             for awakeIpyData in awakeIpyDataList:
                 if awakeIpyData.GetAwakeLV() > awakeLV:
                     break
+                unlockTalentSlot = awakeIpyData.GetUnlockTalentSlot()
+                maxUnlockSlot = max(maxUnlockSlot, unlockTalentSlot)
                 attrIDList = awakeIpyData.GetAttrIDList()
                 attrValueList = awakeIpyData.GetAttrValueList()
                 for aIndex in range(min(len(attrIDList), len(attrValueList))):
@@ -548,6 +546,21 @@
                 if skillID:
                     lineupHero.heroSkillIDList.append(skillID)
         heroAwakeTalentInfo[heroID] = awakeTalentAttrDict
+        
+        # 星级天赋
+        starTalentAttrDict = {}
+        idCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID)
+        lvCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDLV)
+        for aIndex in range(min(idCount, lvCount, maxUnlockSlot)): # 重生导致已觉醒槽位失效时属性也无效
+            talentID = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentID, aIndex)
+            talentLV = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentIDLV, aIndex)
+            stIpyData = IpyGameDataPY.GetIpyGameData("HeroTalent", talentID)
+            if not stIpyData:
+                continue
+            attrID = stIpyData.GetAttrID()
+            attrValue = stIpyData.GetAttrValue() * talentLV
+            starTalentAttrDict[attrID] = starTalentAttrDict.get(attrID, 0) + attrValue
+        heroStarTalentInfo[heroID] = starTalentAttrDict
         
         # 羁绊统计
         for fetterID in heroIpyData.GetFetterIDList():
@@ -620,6 +633,7 @@
     lvAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_LV)
     equipAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_MainEquip)
     bookAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_HeroBook)
+    realmAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Realm)
 
     GameWorld.DebugLog("    国家武将统计=%s" % countryHeroInfo, playerID)
     GameWorld.DebugLog("    羁绊武将统计=%s" % fetterHeroInfo, playerID)
@@ -634,6 +648,7 @@
     GameWorld.DebugLog("    主公等级属性=%s" % lvAttrDict, playerID)
     GameWorld.DebugLog("    主公装备属性=%s" % equipAttrDict, playerID)
     GameWorld.DebugLog("    主公图鉴属性=%s" % bookAttrDict, playerID)
+    GameWorld.DebugLog("    主公官职属性=%s" % realmAttrDict, playerID)
     
     PlayerLV = curPlayer.GetLV()
     OfficialLV = curPlayer.GetOfficialRank()
@@ -665,6 +680,9 @@
             bookValue = bookAttrDict.get(attrID, 0)
             bookPer = bookAttrDict.get(attrPerID, 0) / 10000.0 if attrPerID else 0
             
+            realmValue = realmAttrDict.get(attrID, 0)
+            realmPer = realmAttrDict.get(attrPerID, 0) / 10000.0 if attrPerID else 0
+            
             lineupInitAddPer, lineupLVAddPer, lineupBreakLVAddPer, lineupStarAddPer = 0, 0, 0, 0
             if attrID in ChConfig.BaseAttrIDList:
                 lineupInitAddPer, lineupLVAddPer, lineupBreakLVAddPer, lineupStarAddPer = InitAddPer, LVAddPer, BreakLVAddPer, StarAddPer
@@ -690,7 +708,7 @@
                 awakeTalentPer = awakeTalentAttrDict.get(attrPerID, 0) / 10000.0
                 
             # 计算
-            attrParamDict = {"lvValue":lvValue, "equipValue":equipValue, "bookValue":bookValue, "bookPer":bookPer, 
+            attrParamDict = {"lvValue":lvValue, "equipValue":equipValue, "bookValue":bookValue, "bookPer":bookPer, "realmValue":realmValue, "realmPer":realmPer, 
                              "lineupInitAddPer":lineupInitAddPer, "lineupLVAddPer":lineupLVAddPer, "lineupBreakLVAddPer":lineupBreakLVAddPer, "lineupStarAddPer":lineupStarAddPer,
                              "heroSelfValue":heroSelfValue, "heroSelfPer":heroSelfPer, "inheritPer":inheritPer,
                              "lineupHaloValue":lineupHaloValue, "lineupHaloPer":lineupHaloPer, "fetterValue":fetterValue, "fetterPer":fetterPer,
@@ -699,9 +717,9 @@
                              }
             
             if attrID in ChConfig.BaseAttrIDList:
-                attrValue = FormulaControl.Eval("baseAttrFormula", baseAttrFormula, attrParamDict)
+                attrValue = FormulaControl.Eval("baseAttrFormula", baseAttrFormula, attrParamDict, toInt=False, ndigits=3)
             else:
-                attrValue = FormulaControl.Eval("otherAttrFormula", otherAttrFormula, attrParamDict)
+                attrValue = FormulaControl.Eval("otherAttrFormula", otherAttrFormula, attrParamDict, toInt=False, ndigits=3)
             #GameWorld.DebugLog("    attrID=%s,attrValue=%s,attrParamDict=%s" % (attrID, attrValue, attrParamDict))
             
             attrIpyData = IpyGameDataPY.GetIpyGameData("PlayerAttr", attrID)
@@ -717,7 +735,7 @@
                 logAttrDict["%s-%s" % (attrID, attrName)] = attrValue
             
         # 计算战力
-        fightPower = FormulaControl.Eval("fightPowerFormula", fightPowerFormula, fightPowerParamDict)
+        fightPower = FormulaControl.Eval("fightPowerFormula", fightPowerFormula, fightPowerParamDict, toInt=True)
         
         GameWorld.DebugLog("    heroID=%s,fightPower=%s,heroSkillIDList=%s" % (heroID, fightPower, lineupHero.heroSkillIDList), playerID)
         skillTypeIDDict = {}
@@ -741,7 +759,7 @@
             skillID = skillData.GetSkillID()
             lineupHero.heroSkillIDList.append(skillID)
             paramDict = {"SkillPower":skillData.GetFightPower(), "PlayerLV":PlayerLV, "OfficialLV":OfficialLV}
-            sFightPower = FormulaControl.Eval("skillFPFormula", skillFPFormula, paramDict)
+            sFightPower = FormulaControl.Eval("skillFPFormula", skillFPFormula, paramDict, toInt=True)
             skillFightPower += sFightPower
         GameWorld.DebugLog("    skillFightPower=%s,heroSkillIDList=%s" % (skillFightPower, lineupHero.heroSkillIDList), playerID)
         

--
Gitblit v1.8.0