From 95e5cc37cc097f506004f31cdfff1118953296f6 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 16 十二月 2025 15:58:24 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(董白全部技能; 增加效果5024 5504;buff持续规则字段支持配置每大回合-1层;动态属性ID变化增加计算方式11-根据自己已损失血量百分比;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5024.py |   42 ++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py                       |   15 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5504.py |   45 +++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py                     |   21 ++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py                    |   11 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                    |   30 +++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py                      |   32 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                             |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py |    9 ++
 9 files changed, 192 insertions(+), 15 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 f2a0f36..a65e3e0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -579,16 +579,25 @@
             if buff.GetOwnerID() == ownerID:
                 return buff
         return
-    def FindBuffByState(self, state):
+    def FindBuffByState(self, state, ownerID=0):
         ## 查找某种buff状态的buff
+        # @param ownerID: 可指定获取归属于某个对象ID的buff
         if state not in self._buffStateDict:
             return
         buffIDList = self._buffStateDict[state]
         if not buffIDList:
             return
-        buffID = buffIDList[0]
-        if buffID in self._buffIDDict:
-            return self._buffIDDict[buffID]
+        if ownerID:
+            for buffID in buffIDList:
+                if buffID not in self._buffIDDict:
+                    continue
+                buff = self._buffIDDict[buffID]
+                if buff.GetOwnerID() == ownerID:
+                    return buff
+        else:
+            buffID = buffIDList[0]
+            if buffID in self._buffIDDict:
+                return self._buffIDDict[buffID]
     def FindBuffListByState(self, state):
         ## 查找某种buff状态的buff列表
         if state not in self._buffStateDict:
@@ -646,6 +655,7 @@
         self._hurtListEx = [] # 额外伤血列表,如平摊、溅射 [HurtObj, ...]
         self._bySkill = None # 由哪个技能触发的
         self._byBuff = None # 由哪个buff触发的
+        self._byTriggerWay = 0 # 由哪个被动方式触发的
         self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
         self._energy = 0 # 技能能量,一般用于累计能量达到某种条件后做逻辑
         
@@ -671,6 +681,7 @@
         self._effIgnoreObjIDList = []
         self._bySkill = None
         self._byBuff = None
+        self._byTriggerWay = 0
         self._afterLogicList = []
         self.ClearHurtObj()
         return
@@ -722,6 +733,8 @@
     def SetBySkill(self, bySkill): self._bySkill = bySkill
     def GetByBuff(self): return self._byBuff
     def SetByBuff(self, byBuff): self._byBuff = byBuff
+    def GetByTriggerWay(self): return self._byTriggerWay
+    def SetByTriggerWay(self, byTriggerWay): self._byTriggerWay = byTriggerWay
     def GetTagObjList(self): return self._tagObjList # 技能主要目标列表
     def SetTagObjList(self, tagObjList): self._tagObjList = tagObjList
     def GetTagObjListEx(self): return self._tagObjListEx # 技能额外目标列表
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 80c54ba..61cdeb7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -1816,20 +1816,36 @@
         buffID = buff.GetBuffID()
         skillID = buff.GetSkillID()
         skillData = buff.GetSkillData()
-        if skillData.GetLastTimeType() != ChConfig.BuffLastTimeType_BigTurn:
+        lastType = skillData.GetLastTimeType()
+        
+        if lastType not in [ChConfig.BuffLastTimeType_BigTurn, ChConfig.BuffLastTimeType_BigTurnLayer]:
             continue
+        
         if skillData.GetSkillType() in ChConfig.Def_LstBuff_List:
             #GameWorld.DebugLogEx("    持续类buff由触发时机决定剩余时间! curID=%s,index=%s,skillID=%s,buffID=%s", curID, index, skillID, buffID)
             continue
         if skillData.GetSkillType() == ChConfig.Def_SkillType_Halo and buff.GetOwnerID() != curID:
             GameWorld.DebugLogEx("    光环buff非光源不处理! curID=%s,index=%s,skillID=%s,buffID=%s", curID, index, skillID, buffID)
             continue
-        remainTime = buff.GetRemainTime()
-        if remainTime <= 0:
-            continue
-        remainTime -= 1
-        GameWorld.DebugLogEx("    更新buff回合: curID=%s,buffID=%s,skillID=%s,remainTime=%s", curID, buffID, skillID, remainTime)
-        TurnBuff.SetBuffRemainTime(turnFight, batObj, buff, remainTime)
+        
+        # 每大回合固定减1回合
+        if lastType == ChConfig.BuffLastTimeType_BigTurn:
+            remainTime = buff.GetRemainTime()
+            if remainTime <= 0:
+                continue
+            remainTime -= 1
+            GameWorld.DebugLogEx("    更新buff回合: curID=%s,buffID=%s,skillID=%s,remainTime=%s", curID, buffID, skillID, remainTime)
+            TurnBuff.SetBuffRemainTime(turnFight, batObj, buff, remainTime)
+            
+        # 每大回合固定减1层
+        elif skillData.GetLastTimeType() == ChConfig.BuffLastTimeType_BigTurnLayer:
+            curLayer = buff.GetLayer()
+            if curLayer <= 0:
+                continue
+            updLayer = curLayer - 1
+            GameWorld.DebugLogEx("    更新buff层级: curID=%s,buffID=%s,skillID=%s,updLayer=%s", curID, buffID, skillID, updLayer)
+            TurnBuff.DoBuffLayerChange(turnFight, batObj, buff, updLayer)
+            
     return
 
 def RefreshObjBuffTime(turnFight, batObj):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index b789cf7..9a1db09 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1546,6 +1546,7 @@
 #【注】光环类buff默认与光源(施法者)同步,其他受光环影响的目标同步该buff持续时间,持续时间及效果由施法者决定
 BuffLastTimeType_Default = 0 # 默认以获得buff时自身回合前后判断
 BuffLastTimeType_BigTurn = 1 # 大回合buff,每大回合开始固定减1回合
+BuffLastTimeType_BigTurnLayer = 2 # 大回合buff,每大回合开始固定减1层
 
 #动作类区分标识
 (
@@ -4757,6 +4758,7 @@
 
 # 部分技能ID
 SkillID_SmyFanzhao = 1012050 # 返照
+SkillID_DongbaiRevive = 4009240 # 董白 - 复活
 
 # 经验倍率限制类型
 (
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5024.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5024.py
new file mode 100644
index 0000000..97151c3
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5024.py
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_5024
+#
+# @todo:额外增加/减少buff效果ID/属性ID值(根据buff层级)
+# @author hxp
+# @date 2025-12-16
+# @version 1.0
+#
+# 详细描述: 额外增加/减少buff效果ID/属性ID值(根据buff层级)
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-12-16 16:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
+    buffState = curEffect.GetEffectValue(0)
+    effEx = curEffect.GetEffectValue(1) # 支持多个属性
+    sameCountryExValue = curEffect.GetEffectValue(2)
+    
+    if not isinstance(effEx, list) or len(effEx) != 3:
+        return
+    
+    curBuff = batObj.GetBuffManager().FindBuffByState(buffState)
+    if not curBuff:
+        return
+    buffLayers = max(1, curBuff.GetLayer())
+    
+    attrID, attrValue, calcType = effEx
+    totalValue = attrValue * buffLayers
+    GameWorld.DebugLogEx("额外buff效果ID/属性ID值根据buff层级: attrID=%s,attrValue=%s,calcType=%s,buffState=%s,layers=%s,totalValue=%s", 
+                         attrID, attrValue, calcType, buffState, buffLayers, totalValue)
+    if sameCountryExValue and batObj.GetCountry() == tagObj.GetCountry():
+        totalValue += (sameCountryExValue * buffLayers)
+        GameWorld.DebugLogEx("    相同国家每层额外增加值: %s,totalValue=%s", sameCountryExValue, totalValue)
+        
+    connBuff.AddEffectValueEx(attrID, totalValue, calcType)
+    return True
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5504.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5504.py
new file mode 100644
index 0000000..33dede7
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5504.py
@@ -0,0 +1,45 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_5504
+#
+# @todo:触发释放技能(验证目标状态)
+# @author hxp
+# @date 2025-12-16
+# @version 1.0
+#
+# 详细描述: 触发释放技能(验证目标状态)
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-12-16 16:00"""
+#-------------------------------------------------------------------------------
+
+import TurnSkill
+import IpyGameDataPY
+import GameWorld
+
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
+    skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
+    checkState = curEffect.GetEffectValue(1) # 可附加验证目标处于xx状态
+    checkOwner = curEffect.GetEffectValue(2) # 是否只限归属自己的状态buff
+    
+    if checkState:
+        ownerID = batObj.GetID() if checkOwner else 0
+        if not tagObj.GetBuffManager().FindBuffByState(checkState, ownerID):
+            GameWorld.DebugLogEx("目标不在状态下不触发: tagID=%s,checkState=%s,ownerID=%s", tagObj.GetID(), checkState, ownerID)
+            return
+        
+    if not skillID:
+        passiveSkill = effSkill
+    else:
+        passiveSkill = IpyGameDataPY.GetIpyGameData("Skill", skillID)
+    if not passiveSkill:
+        return
+    effectID = curEffect.GetEffectID()
+    effSkillID = effSkill.GetSkillID()
+    return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID, connBuff, **kwargs)
+
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
+    effSkill = effBuff.GetSkillData().GetIpyData()
+    return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py
index 44cf30a..ceaae8d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py
@@ -36,6 +36,15 @@
             attrValue = maxValue
         GameWorld.DebugLog("按对方buff层级增加属性: attrID=%s,attrValue=%s,buffStateList=%s,layerTotal=%s,maxValue=%s" 
                            % (attrID, attrValue, buffStateList, layerTotal, maxValue))
+    # 11-根据自己已损失血量百分比
+    elif calcType == 11:
+        curHP = attacker.GetHP()
+        maxHP = attacker.GetMaxHP()
+        lostPer = int((maxHP - curHP) / float(maxHP) * 100) # 只算取整
+        attrValue = lostPer * attrValue
+        GameWorld.DebugLog("按自身已损失生命百分比增加属性: attrID=%s,attrValue=%s,curHP=%s/%s,lostPer=%s" 
+                           % (attrID, attrValue, curHP, maxHP, lostPer))
+        
     else:
         checkInStateList = curEffect.GetEffectValue(2)
         if checkInStateList:
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 c41b9f9..5430e6d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -268,8 +268,16 @@
             isRefreshAttr = True
             
     if refreshType and buffSkill and buffOwner:
-        TurnPassive.OnTriggerPassiveEffect(turnFight, buffOwner, ChConfig.TriggerWay_BuffAddByOwner, connSkill=buffSkill, connBuff=curBuff)
-        
+        TurnPassive.OnTriggerPassiveEffect(turnFight, buffOwner, ChConfig.TriggerWay_BuffAddByOwner, tagObj=batObj, connSkill=buffSkill, connBuff=curBuff)
+        # 判断是否有额外属性的
+        if not isRefreshAttr:
+            effExDict = curBuff.GetEffectExDict()
+            for effCalcInfo in effExDict.keys():
+                effID = effCalcInfo[0]
+                if effID in ChConfig.AttrIDList:
+                    isRefreshAttr = True
+                    break
+                
     if isRefreshAttr:
         RefreshBuffAttr(batObj)
         
@@ -558,6 +566,9 @@
             effID = effect.GetEffectID()
             if effID not in ChConfig.AttrIDList:
                 continue
+            if effect.GetTriggerWay():
+                # 需要触发才有效的不算
+                continue
             if effect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill]:
                 # 技能属性仅技能时有效
                 continue
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
index 02af5af..2aa5c13 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
@@ -37,8 +37,17 @@
     ''' 触发被动效果,可能触发技能、buff,需根据优先级触发
     '''
     if not batObj.IsAlive():
-        if triggerWay in ChConfig.DeadCanTriggerWayList or (connSkill and connSkill.GetBatType() == ChConfig.TurnBattleType_Enhance):
+        if triggerWay in ChConfig.DeadCanTriggerWayList:
             pass # 死亡状态下可触发的被动
+        elif connSkill:
+            if connSkill.GetBatType() == ChConfig.TurnBattleType_Enhance:
+                pass # 子技能不限制死亡触发,由主技能决定,主技能能触发了,才会执行到子技能,那么子技能也一定能触发
+            elif connSkill.GetByTriggerWay() in ChConfig.DeadCanTriggerWayList:
+                pass
+                #GameWorld.DebugLogEx("关联技能是由死亡状态下可触发的方式触发的,则也可触发! triggerWay=%s,connSkillID=%s,byTriggerWay=%s", 
+                #                     triggerWay, connSkill.GetSkillID(), connSkill.GetByTriggerWay())
+            else:
+                return
         else:
             return
     passiveEffMgr = batObj.GetPassiveEffManager()
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 38f8ede..c77146a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -59,11 +59,11 @@
     if not skillID:
         return
     
+    triggerWay = kwargs["triggerWay"] if "triggerWay" in kwargs else 0
     if not curBatObj.IsAlive():
         if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive and useSkill.GetTagAim() == ChConfig.SkillTagAim_Self:
             GameWorld.DebugLogEx("死亡时使用复活自己的技能! skillID=%s", skillID)
         else:
-            triggerWay = kwargs.get("triggerWay", 0)
             if triggerWay in ChConfig.DeadCanTriggerWayList:
                 GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,triggerWay=%s", skillID, triggerWay)
             elif batType == ChConfig.TurnBattleType_Enhance:
@@ -150,6 +150,7 @@
     useSkill.SetBatType(batType)
     useSkill.SetBySkill(bySkill)
     useSkill.SetByBuff(byBuff)
+    useSkill.SetByTriggerWay(triggerWay)
     
     isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
     if isTurnNormalSkill:
@@ -1417,6 +1418,7 @@
     if dieObjList:
         for dieObj in dieObjList:
             TurnPassive.OnTriggerPassiveEffect(turnFight, dieObj, ChConfig.TriggerWay_WhenDie, curObj, connSkill=useSkill)
+            __dongbaiRevive(turnFight, dieObj, useSkill) # 写死特殊处理董白复活
             
         for faction in [ChConfig.Def_FactionA, ChConfig.Def_FactionB]:
             batFaction = turnFight.getBatFaction(faction)
@@ -1522,6 +1524,33 @@
     if dieObjList:
         turnFight.checkOverByKilled()
         
+    return
+
+def __dongbaiRevive(turnFight, batObj, useSkill):
+    '''特殊处理董白复活: 董白死亡之后的时间,若有敌方单位阵亡,董白以50%血量复活
+    '''
+    faction = batObj.GetFaction()
+    batFaction = turnFight.getBatFaction(ChConfig.Def_FactionA if faction == ChConfig.Def_FactionB else ChConfig.Def_FactionB)
+    if not batFaction:
+        return
+    batLineup = batFaction.getBatlineup(1)
+    if ChConfig.HeroID_Dongbai not in batLineup.heroObjIDDict:
+        return
+    dongbaiObj = BattleObj.GetBatObjMgr().getBatObj(batLineup.heroObjIDDict[ChConfig.HeroID_Dongbai])
+    if not dongbaiObj or dongbaiObj.IsAlive():
+        return
+    skill = dongbaiObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_DongbaiRevive)
+    if not skill:
+        GameWorld.DebugLogEx("董白还还未学习特殊复活技能! %s", ChConfig.SkillID_DongbaiRevive)
+        return
+    enemyDeadCnt = dongbaiObj.GetDictByKey("EnemyDeadCnt") + 1
+    dongbaiObj.SetDict("EnemyDeadCnt", enemyDeadCnt)
+    GameWorld.DebugLogEx("董白记录自身死亡后的敌方阵亡单位数: %s" % enemyDeadCnt)
+    needDeadCnt = skill.GetEffect(0).GetEffectValue(0) # 固定配置在效果1值
+    if enemyDeadCnt < needDeadCnt:
+        return
+    dongbaiObj.SetDict("EnemyDeadCnt", 0)
+    OnUseSkill(turnFight, dongbaiObj, skill, batType=ChConfig.TurnBattleType_Passive, bySkill=useSkill)
     return
 
 def __doCostZhanchui(turnFight, curBatObj, useSkill):
@@ -1894,6 +1923,7 @@
     dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤
     
     aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddFinalDamPer, curSkill)
+    aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_FinalDamPer, curSkill)
     
     aNormalSkillPer, dNormalSkillPerDef = 0, 0
     if isTurnNormalSkill:

--
Gitblit v1.8.0