From b4fb7260236577f618304faf49cb88eb9ef0a1cc Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 24 十二月 2025 13:49:51 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(刘备所有技能;增加触发方式54-不死时,支持不死逻辑;增加效果6032;5022效果增加计算规则102;5507效果支持复活触发来源友军;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6032.py |   31 ++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5022.py |   12 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py                     |   17 +++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5507.py |   31 +++++----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py                      |   32 ++++++++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                             |    4 +
 6 files changed, 102 insertions(+), 25 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 061f81e..d7b8c8e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -33,6 +33,7 @@
         self._batObj = batObj
         self._objID = batObj.GetID() if batObj else 0
         self._skillIDList = [] # 已有技能ID列表,获取被动中快速判断已学技能用
+        self.noDeadSkill = None # 不死技能效果,暂时只支持最多1个这种技能
         
         # 技能
         self._AffectSkillDict = {} # 被动技能 {(触发方式, 有效来源):{技能ID:[effID, ...], ...}, ...}
@@ -189,6 +190,11 @@
         effDict[skillID].append(effectID)
         if triggerWay not in self._skillTriggerWayList:
             self._skillTriggerWayList.append(triggerWay)
+            
+        # 加载不死技能效果
+        if triggerWay == ChConfig.TriggerWay_NoDead:
+            self.noDeadSkill = curSkill
+            
         return
         
     def RefreshBuffPassiveEffect(self):
@@ -1087,6 +1093,17 @@
             return False
         return True
     
+    def CanNoDead(self):
+        '''是否还可触发不死效果
+        暂定单个武将最多只支持配置1个不死效果,且单场战斗最多触发x次,即按技能cd判断即可
+        '''
+        noDeadSkill = self._passiveEffMgr.noDeadSkill # 固定有被动触发
+        if not noDeadSkill:
+            return
+        if noDeadSkill.GetRemainTime():
+            return
+        return True
+    
     def GetSneerTagObj(self):
         ## 获取被嘲讽的目标,如果存在则一定是活着的目标
         buffIDList = self._buffMgr.GetStateBuffIDList(ChConfig.BatObjState_Sneer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 5dbb581..8768a14 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4030,7 +4030,8 @@
 TriggerWay_FriendAttackOverDirectOneNoSelf, # 友方使用技能后(多目标仅触发一次,不含自己) 51
 TriggerWay_DOTHurt, # 造成持续伤害时 52
 TriggerWay_FriendDotHurt, # 友方造成持续伤害时(多目标仅触发一次,包含自己) 53
-) = range(1, 1 + 53)
+TriggerWay_NoDead, # 不时死(有配置该触发方式的视为有不死,触发死亡时不死保留1点血量) 54
+) = range(1, 1 + 54)
 
 # 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
 TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
@@ -4075,6 +4076,7 @@
 PassiveEff_AddBatDamPerByLayer = 6029 # 提升技能战斗伤害(根据身上buff状态层数)
 PassiveEff_LostHPProtect = 6030 # 掉血上限保护
 PassiveEff_ImmuneControlDepBuff = 6031 # 某种buff状态层达到x时免疫减益控制效果
+PassiveEff_AddCureMultiBySkillType = 6032 # 提升治疗技能最终治疗效果(根据目标buff类型层数)
 
 # 被动效果ID有触发值时就返回的
 PassiveEffHappenValueList = [PassiveEff_ChangeHurtType, PassiveEff_ImmuneControlBuff, PassiveEff_MustSuperHit, PassiveEff_SkillInvalid, 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5022.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5022.py
index e196c5b..c5a57de 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5022.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5022.py
@@ -23,6 +23,7 @@
     effEx2 = curEffect.GetEffectValue(1) # 支持多个属性
     calcRule = curEffect.GetEffectValue(2) # 附加计算规则,没配置默认增加固定值
     
+    effExAdd = [0, 0, 0] # 某种条件下再额外效果值组 [buff效果ID/属性ID, 值, 计算方式]
     calcLayer = 1 # 没配置的默认1层,相当于固定值
     if calcRule:
         ruleType = calcRule[0]
@@ -50,14 +51,21 @@
             if tagObj.GetSex() != onlySex:
                 GameWorld.DebugLogEx("5022额外buff对该性别无效: ruleType=%s,onlySex=%s,tagSex=%s,tagID=%s", ruleType, onlySex, tagObj.GetSex(), tagObj.GetID())
                 return
-            
+        # 102 - 同国武将额外提升 参数1:额外提升值
+        elif ruleType == 102:
+            if batObj.GetCountry() == tagObj.GetCountry() and len(calcRule) == 4:
+                effExAdd = calcRule[1:]
+                GameWorld.DebugLogEx("同国武将再额外buff属性: ruleType=%s,country=%s,effExAdd=%s", ruleType, tagObj.GetCountry(), effExAdd)
+                
     if calcLayer <= 0:
         return
     
-    for effEX in [effEx1, effEx2]:
+    for effEX in [effEx1, effEx2, effExAdd]:
         if not isinstance(effEX, list) or len(effEX) != 3:
             continue
         attrID, attrValue, calcType = effEX
+        if not attrID or not attrValue:
+            continue
         if calcLayer > 1:
             attrValue = int(attrValue * calcLayer)
         GameWorld.DebugLogEx("额外buff效果ID/属性ID值: attrID=%s,attrValue=%s,calcType=%s", attrID, attrValue, calcType)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5507.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5507.py
index 85a4eff..1099427 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5507.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5507.py
@@ -22,24 +22,25 @@
 def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
     
     passiveSkillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
-    effHeroID = curEffect.GetEffectValue(1) # 指定目标武将ID
+    effHeroID = curEffect.GetEffectValue(1) # 指定目标武将ID,0时为来源友军目标
     costHPPer = curEffect.GetEffectValue(2) # 可附加消耗自身血量百分比,配0不消耗,大于0血量不足时不释放
     searchFrom = curEffect.GetEffectValue(3) # 目标武将ID是否从阵容中搜索
     
     tagHero = tagObj
-    if searchFrom:
-        batLineup = batObj.GetBatLineup()
-        tagHero = batLineup.getHeroObj(effHeroID)
+    if effHeroID:
+        if searchFrom:
+            batLineup = batObj.GetBatLineup()
+            tagHero = batLineup.getHeroObj(effHeroID)
+            
+        if not tagHero:
+            return
         
-    if not effHeroID or not tagHero:
-        return
-    
+        tagHeroID = tagHero.GetHeroID()
+        if tagHeroID != effHeroID:
+            GameWorld.DebugLogEx("5507非目标武将死亡不处理! tagHeroID=%s,effHeroID=%s", tagHeroID, effHeroID)
+            return
+        
     if tagHero.IsAlive():
-        return
-    
-    tagHeroID = tagHero.GetHeroID()
-    if tagHeroID != effHeroID:
-        #GameWorld.DebugLogEx("5507非目标武将死亡不处理! tagHeroID=%s,effHeroID=%s", tagHeroID, effHeroID)
         return
     
     if not passiveSkillID:
@@ -51,6 +52,7 @@
         GameWorld.DebugLogEx("5507目标被禁止复活不处理! tagHeroID=%s", tagHeroID)
         return
     
+    tagHeroID = tagHero.GetHeroID()
     tagID = tagHero.GetID()
     if costHPPer:
         curHP = batObj.GetHP()
@@ -59,8 +61,9 @@
         if curHP < costHP:
             GameWorld.DebugLogEx("5507自身血量不足,无法复活对方! curHP=%s/%s,costHPPer=%s,costHP=%s", curHP, maxHP, costHPPer, costHP)
             return
-        GameWorld.DebugLogEx("5507扣血复活指定目标! curHP=%s/%s,costHPPer=%s,costHP=%s,tagHeroID=%s,tagID=%s", curHP, maxHP, costHPPer, costHP, tagHeroID, tagID)
-        batObj.SetHP(max(1, curHP - costHP), True) # 直接扣除
+        updHP = curHP - costHP
+        GameWorld.DebugLogEx("5507扣血复活指定目标! curHP=%s/%s,costHPPer=%s,costHP=%s,updHP=%s,tagHeroID=%s,tagID=%s", curHP, maxHP, costHPPer, costHP, updHP, tagHeroID, tagID)
+        batObj.SetHP(updHP, True) # 直接扣除
     else:
         GameWorld.DebugLogEx("5507直接复活指定目标! tagHeroID=%s,tagID=%s,searchFrom=%s", tagHeroID, tagID, searchFrom)
         
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6032.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6032.py
new file mode 100644
index 0000000..fc73025
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6032.py
@@ -0,0 +1,31 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_6032
+#
+# @todo:提升治疗技能最终治疗效果(根据目标buff类型层数)
+# @author hxp
+# @date 2025-12-24
+# @version 1.0
+#
+# 详细描述: 提升治疗技能最终治疗效果(根据目标buff类型层数)
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-12-24 13:50"""
+#-------------------------------------------------------------------------------
+
+def GetHappenValue(attacker, defender, curEffect, effSkill, effBuff, connSkill, **skillkwargs):
+    addPerLayer = curEffect.GetEffectValue(0) # 每层提升百分比
+    skillTypeList = curEffect.GetEffectValue(1) # 目标buff类型[类型1, 2, ...]
+    
+    layerTotal = 0
+    buffMgr = defender.GetBuffManager()
+    for index in range(buffMgr.GetBuffCount()):
+        buff = buffMgr.GetBuffByIndex(index)
+        skillData = buff.GetSkillData()
+        if skillData.GetSkillType() not in skillTypeList:
+            continue
+        layerTotal += max(1, buff.GetLayer())
+        
+    return layerTotal * addPerLayer
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 8dd6efe..2670102 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -1348,16 +1348,21 @@
     # 统计击杀
     killObjList = [] # 击杀其他阵营目标列表
     dieObjList = [] # 死亡的单位列表,包含友方单位或自己
+    nodeadObjList = [] # 不死的单位列表
     tagObjList = useSkill.GetTagObjList() # 主要目标列表
     tagObjListEx = useSkill.GetTagObjListEx() # 额外目标列表
     tagObjListAll = tagObjList + tagObjListEx
     for tagObj in tagObjListAll:
         tagID = tagObj.GetID()
         if tagObj.IsAlive() and tagObj.GetHP() <= 0:
-            dieObjList.append(tagObj)
-            if tagObj.GetFaction() != curObj.GetFaction():
-                killObjList.append(tagObj)
-            TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
+            if tagObj.CanNoDead():
+                tagObj.SetHP(1, True) # 触发不死,保留1点血量
+                nodeadObjList.append(tagObj)
+            else:
+                dieObjList.append(tagObj)
+                if tagObj.GetFaction() != curObj.GetFaction():
+                    killObjList.append(tagObj)
+                TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
     useSkill.SetKillObjList(killObjList)
     
     # 统计伤血,可能单个技能对同一目标造成多次伤害
@@ -1425,9 +1430,13 @@
             
     # 判断自己死亡,因为反弹、平摊伤害的原因,有可能自己干死自己
     if curObj.IsAlive() and curObj.GetHP() <= 0:
-        dieObjList.append(curObj)
-        killer = bounceObjList[0] if bounceObjList else None
-        TurnAttack.SetObjKilled(turnFight, curObj, killer)
+        if curObj.CanNoDead():
+            curObj.SetHP(1, True) # 触发不死,保留1点血量
+            nodeadObjList.append(curObj)
+        else:
+            dieObjList.append(curObj)
+            killer = bounceObjList[0] if bounceObjList else None
+            TurnAttack.SetObjKilled(turnFight, curObj, killer)
         
     # 记录最后一次总伤害,有伤害目标才记录
     if totalHurtValue:
@@ -1488,7 +1497,11 @@
                         # 己方单位死亡时
                         else:
                             TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill, byFriendObj=dieObj)
-                 
+    
+    # 触发不死
+    for tagObj in nodeadObjList:
+        TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_NoDead, curObj, connSkill=useSkill)
+        
     # 复活时
     for tagObj in reviveObjList:
         # 同步最新的怒气及buff,血量已经在技能中通知了
@@ -2796,6 +2809,9 @@
         cureHP += cureHPEx
         GameWorld.DebugLogEx("    额外治疗值(%s): cureType=%s,baseValue=%s,skillPer=%s,cureHP=%s", cureHPEx, cureType, baseValue, skillPer, cureHP)
         
+    addCureMulti = TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddCureMultiBySkillType, curSkill)
+    if addCureMulti:
+        multiValue += addCureMulti / 100.0
     if multiValue and multiValue != 1:
         cureHP = int(cureHP * multiValue)
         GameWorld.DebugLogEx("    治疗倍值: cureHP=%s,multiValue=%s", cureHP, multiValue)

--
Gitblit v1.8.0