From ffb198b68f7e75f4fb2046189f1e7b2992d2ebac Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 15 九月 2025 14:41:24 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(于禁技能,支持格挡印记;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py    |   47 ++++++++++++++++++++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py  |   22 +++++++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py |    2 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py   |   13 +++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py          |    4 +
 5 files changed, 72 insertions(+), 16 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
index 483b08e..8b7a961 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -226,6 +226,7 @@
     def GetEffectID(self): return self._effID
     def GetEffectValue(self, index): return self._values[index] if len(self._values) > index else 0
     def GetEffectValueCount(self): return len(self._values)
+    def GetEffectValues(self): return self._values # 直接返回整个效果values
     def GetTriggerWay(self): return self._triggerWay
     def GetTriggerSrc(self): return self._triggerSrc
     #def GetTriggerParams(self, index): return self._triggerParams[index] if len(self._triggerParams) > index else 0
@@ -401,13 +402,13 @@
         return
     
     def GetBuff(self, buffID): return self._buffIDDict.get(buffID, None)
-    def FindBuffBySkillID(self, skillID):
+    def FindBuffListBySkillID(self, skillID):
         ## 返回该技能ID的所有buff列表
         skillData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
         if not skillData:
             return []
-        return self.FindBuffBySkillTypeID(skillData.GetSkillTypeID())
-    def FindBuffBySkillTypeID(self, skillTypeID):
+        return self.FindBuffListBySkillTypeID(skillData.GetSkillTypeID())
+    def FindBuffListBySkillTypeID(self, skillTypeID):
         ## 返回该技能TypeID的所有buff列表
         if skillTypeID not in self._skillTypeIDBuffIDs:
             return []
@@ -417,6 +418,13 @@
                 continue
             buffs.append(self._buffIDDict[buffID])
         return buffs
+    def FindBuffByState(self, state):
+        ## 查找某种buff状态的buff
+        buffIDList = self._buffStateDict.get(state, [])
+        if not buffIDList:
+            return
+        buffID = buffIDList[0]
+        return self._buffIDDict.get(buffID, None)
     
     def AddBuffState(self, state, buffID):
         ## 添加buff影响的状态,ChConfig.BatObjStateList
@@ -640,6 +648,10 @@
         TurnPassive.RefreshPassive(self)
         return
     
+    def TurnReset(self):
+        ## 回合重置
+        self._skillTurnUseCntDict = {}
+        
     def UpdInitBatAttr(self, initAttrDict, skillIDList):
         ## 更新战斗属性,一般只有主阵容需要更新,战斗中养成、装备变化等引起的主阵容属性变更时需要实时更新
         self._initAttrDict = initAttrDict
@@ -803,10 +815,6 @@
         ## 统计治疗
         self.cureStat += cureValue
         return self.cureStat
-    
-    def TurnReset(self):
-        ## 回合重置
-        self._skillTurnUseCntDict = {}
     
 class BattleObjMgr():
     ## 战斗对象管理器
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
index ee92f50..2a01244 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -814,6 +814,8 @@
             continue
         GameWorld.DebugLog("    重置武将: %s, HP:%s/%s, XP:%s" % (objName, batObj.GetHP(), batObj.GetMaxHP(), batObj.GetXP()))
         
+        batObj.TurnReset()
+        
         # 清除buff
         buffMgr = batObj.GetBuffManager()
         buffMgr.ClearBuff()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index ad78879..fc0c34a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3140,7 +3140,9 @@
     BatObjState_LimitSkill, # 沉默 10
     BatObjState_LimitAddHP, # 禁疗 11
     BatObjState_Stone, # 石化 12
-) = range(13)
+    BatObjState_Disarm, # 缴械 13
+    BatObjState_ParryYJ, # 格挡印记 14
+) = range(15)
 
 # 被控制的状态列表,无法行动,处于某些控制类buff影响状态下,如晕眩,冰冻,石化
 InControlledStateList = [BatObjState_Frozen, BatObjState_Stun, BatObjState_Stone]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
index 9b80ade..4d70727 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -62,6 +62,11 @@
     
     skillTypeID = buffSkill.GetSkillTypeID()
     buffRepeat = buffSkill.GetBuffRepeat()
+    addLayerCnt = buffSkill.GetLayerCnt()
+    addLayerEff = buffSkill.GetEffectByID(6001)
+    if addLayerEff:
+        addLayerCnt = GameWorld.GetResultByWeightList(addLayerEff.GetEffectValues(), addLayerCnt)
+        
     #buff重复获得时的叠加规则
     #以下规则默认针对的是相同施法者,即相同来源的处理
     #如果有针对不同施法者的规则会说明
@@ -86,30 +91,45 @@
             # 删除相同状态的buff
             DoBuffDel(turnFight, batObj, buff, bySkill, afterLogic, buffOwner)
     else:
-        buffList = buffMgr.FindBuffBySkillTypeID(skillTypeID)
+        buffList = buffMgr.FindBuffListBySkillTypeID(skillTypeID)
         if buffList:
             for buff in buffList:
                 if not buff:
                     continue
                 if buff.GetOwnerID() != ownerID:
                     continue
-                GameWorld.DebugLog("    已经存在该buff,默认覆盖: buffID=%s,skillTypeID=%s,ownerID=%s" % (buff.GetBuffID(), skillTypeID, ownerID))
+                buffID = buff.GetBuffID()
+                GameWorld.DebugLog("    已经存在该buff: buffID=%s,skillTypeID=%s,ownerID=%s,buffRepeat=%s" % (buffID, skillTypeID, ownerID, buffRepeat))
+                
+                updLayerCnt = addLayerCnt
+                if buffRepeat == 3: # 叠加层级
+                    nowLayerCnt = buff.GetLayer()
+                    maxLayerCnt = buffSkill.GetLayerMax()
+                    updLayerCnt = nowLayerCnt + addLayerCnt
+                    if maxLayerCnt and updLayerCnt > maxLayerCnt:
+                        updLayerCnt = maxLayerCnt
+                    GameWorld.DebugLog("        叠加层级: nowLayerCnt=%s,addLayerCnt=%s,updLayerCnt=%s" % (nowLayerCnt, addLayerCnt, updLayerCnt))
+                else:
+                    GameWorld.DebugLog("        默认覆盖")
+                    
                 # 重置回合、CD、值等
                 buff.SetCalcTime(turnFight.getTimeline())
                 buff.SetRemainTime(buffSkill.GetLastTime())
-                buff.SetLayer(buffSkill.GetLayerCnt())
+                buff.SetLayer(updLayerCnt)
                 buff.SetBuffValueList(buffValueList)
                 if afterLogic and bySkill:
                     bySkill.AddAfterLogic(ChConfig.AfterLogic_AddBuff, [batObj, buff, buffOwner])
                 else:
                     SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID, isNewAdd=True)
                     
+                break
+            
             return True
         
-    __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill, afterLogic)
+    __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill, afterLogic, setLayerCnt=addLayerCnt)
     return True
 
-def __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill=None, afterLogic=False):
+def __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill=None, afterLogic=False, setLayerCnt=0):
     curID = batObj.GetID()
     skillID = buffSkill.GetSkillID()
     buff = buffMgr.AddBuff(skillID)
@@ -125,7 +145,7 @@
     buff.SetOwnerID(ownerID)
     buff.SetCalcTime(turnFight.getTimeline())
     buff.SetRemainTime(buffSkill.GetLastTime())
-    buff.SetLayer(buffSkill.GetLayerCnt())
+    buff.SetLayer(setLayerCnt)
     buff.SetBuffValueList(buffValueList)
     curBuffState = buffSkill.GetCurBuffState()
     if curBuffState:
@@ -175,6 +195,21 @@
         
     return
 
+def DecBuffLayer(turnFight, batObj, curBuff, decLayer=1, relatedSkillID=0):
+    ## 减少buff层级
+    curLayer = curBuff.GetLayer()
+    if not curLayer:
+        return
+    updLayer = max(0, curLayer - decLayer)
+    curBuff.SetLayer(updLayer)
+    if updLayer > 0:
+        SyncBuffRefresh(turnFight, batObj, curBuff, relatedSkillID)
+        return
+    objID = batObj.GetID()
+    buffID = curBuff.GetBuffID()
+    SyncBuffDel(turnFight, objID, buffID, relatedSkillID)
+    return
+
 def DoBuffDel(turnFight, batObj, curBuff, relatedSkill=None, afterLogic=False, tagObj=None):
     '''删除buff
     @param relatedSkill: 关联的技能
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
index c670c0e..3231fc0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -1065,7 +1065,7 @@
     aSuperDamPer, dSuperDamPerDef = 0, 0
     if not isDot:
         isSuperHit = CanSuperHit(atkObj, defObj) # 是否暴击
-        isParry = (isTurnNormalSkill and CanParry(atkObj, defObj)) # 是否格挡,仅针对普攻
+        isParry = (isTurnNormalSkill and CanParry(turnFight, atkObj, defObj, curSkill)) # 是否格挡,仅针对普攻
         isStun = CanStun(turnFight, atkObj, defObj, curSkill) # 是否击晕
         
     if isSuperHit:
@@ -1169,10 +1169,19 @@
     TurnBuff.DoAddBuffBySkillID(turnFight, defObj, stunSkillID, atkObj, curSkill, afterLogic=True)
     return True
 
-def CanParry(atkObj, defObj):
+def CanParry(turnFight, atkObj, defObj, curSkill):
     if defObj.IsInControlled():
         #被控制无法格挡
         return False
+    
+    # 格挡印记
+    buffMgr = defObj.GetBuffManager()
+    parryYJBuff = buffMgr.FindBuffByState(ChConfig.BatObjState_ParryYJ)
+    if parryYJBuff and parryYJBuff.GetLayer():
+        GameWorld.DebugLog("格挡印记格挡了: buffID=%s,buffLayer=%s" % (parryYJBuff.GetBuffID(), parryYJBuff.GetLayer()))
+        TurnBuff.DecBuffLayer(turnFight, defObj, parryYJBuff, 1, curSkill.GetSkillID())
+        return True
+    
     aParryRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ParryRateDef)
     dParryRate = defObj.GetBatAttrValue(ChConfig.AttrID_ParryRate)
     parryNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnParryNum)

--
Gitblit v1.8.0