From adbac922fdce017605381c4040d4bedbc24dcd1a Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 31 十二月 2025 19:50:37 +0800
Subject: [PATCH] 358 【内政】红颜系统-服务端(红颜效果支持多个相同效果叠加;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py |  213 ++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 177 insertions(+), 36 deletions(-)

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 dadceb8..46d36ce 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -86,7 +86,7 @@
             GameWorld.DebugLogEx("技能使用处于buff状态限制中! skillID=%s,buffStateGroups=%s,limitState=%s", skillID, buffStateGroups, limitState)
             return
         
-    if CheckSkillUseCntLimit(curBatObj, useSkill):
+    if CheckSkillUseCntLimit(turnFight, curBatObj, useSkill):
         return
     
     #没有指定目标,则按技能自身的目标逻辑
@@ -185,7 +185,7 @@
     if SkillCommon.IsBuff(useSkill):
         __doAddBuff(turnFight, curBatObj, useSkill, **kwargs)
     else:
-        __doUseSkill(turnFight, curBatObj, useSkill)
+        __doUseSkill(turnFight, curBatObj, useSkill, **kwargs)
         
     DoAttackResult(turnFight, curBatObj, useSkill, **kwargs)
     
@@ -201,7 +201,7 @@
     useSkill.ResetUseRec()
     return True
 
-def CheckSkillUseCntLimit(batObj, useSkill):
+def CheckSkillUseCntLimit(turnFight, batObj, useSkill):
     ## 检查技能使用次数是否受限
     # @return: 是否受限,None-没有受限效果,False-不受限,True-受限了
     if not hasattr(useSkill, "GetEffectByID"):
@@ -214,12 +214,14 @@
     
     skillID = useSkill.GetSkillID()
     if useCntLimit:
+        useCntLimit += TurnPassive.GetTriggerEffectValue(turnFight, batObj, None, ChConfig.PassiveEff_AddSkillUseCntLimit, useSkill, LimitByTurnAll=1)
         useCnt = batObj.GetSkillUseCnt(skillID)
         if useCnt >= useCntLimit:
             GameWorld.DebugLogEx("技能每场战斗使用次数受限! skillID=%s,useCnt=%s >= %s", skillID, useCnt, useCntLimit)
             return True
         
     if turnUseCntLimit:
+        turnUseCntLimit += TurnPassive.GetTriggerEffectValue(turnFight, batObj, None, ChConfig.PassiveEff_AddSkillUseCntLimit, useSkill, LimitByTurnPer=1)
         turnUseCnt = batObj.GetSkillTurnUseCnt(skillID)
         if turnUseCnt >= turnUseCntLimit:
             GameWorld.DebugLogEx("技能每大回合使用次数受限! skillID=%s,turnUseCnt=%s >= %s", skillID, turnUseCnt, turnUseCntLimit)
@@ -426,6 +428,11 @@
         aimObjList.sort(key=lambda o:(o.GetHP()), reverse=False)
         #GameWorld.DebugLogEx("血量最低排序: %s", [[o.GetID(), o.GetHP(), o.GetMaxHP()] for o in aimObjList])
         
+    # 血量百分比最低
+    elif tagAffect == ChConfig.SkillTagAffect_HPPerLowest:
+        aimObjList.sort(key=lambda o:(o.GetHP() / float(o.GetMaxHP())), reverse=False)
+        #GameWorld.DebugLogEx("血量百分比最低排序: %s", [[o.GetID(), o.GetHP(), o.GetMaxHP(), o.GetHP() / float(o.GetMaxHP())] for o in aimObjList])
+        
     # 血量最高
     elif tagAffect == ChConfig.SkillTagAffect_HPHighest:
         aimObjList.sort(key=lambda o:(o.GetHP()), reverse=True)
@@ -586,6 +593,64 @@
         
     return aimObjList
 
+def __getSameRowObjList(tagObj):
+    ## 获取目标对应的同排对象列表,只算活着的
+    
+    posNum = tagObj.GetPosNum()
+    inRowNum = ChConfig.GetInRowNum(posNum)
+    inColNum = ChConfig.GetInColNum(posNum)
+    # 优先目标所在纵,为主目标
+    colNumList = range(1, 1 + ChConfig.TurnFightCols)
+    if inColNum in colNumList:
+        colNumList.remove(inColNum)
+        colNumList.insert(0, inColNum)
+        
+    row = inRowNum # 目标玩家所在横排
+    
+    batObjMgr = BattleObj.GetBatObjMgr()
+    batLineup = tagObj.GetBatLineup()
+    aimObjList = []
+    for col in colNumList:
+        pNum = (row - 1) * ChConfig.TurnFightCols + col
+        if pNum not in batLineup.posObjIDDict:
+            continue
+        tagObjID = batLineup.posObjIDDict[pNum]
+        tagBatObj = batObjMgr.getBatObj(tagObjID)
+        if not tagBatObj.IsAlive():
+            continue
+        aimObjList.append(tagBatObj)
+        
+    return aimObjList
+
+def __getSameColObjList(tagObj):
+    ## 获取目标对应的同列对象列表,只算活着的
+    
+    posNum = tagObj.GetPosNum()
+    inRowNum = ChConfig.GetInRowNum(posNum)
+    inColNum = ChConfig.GetInColNum(posNum)
+    
+    rowNumList = range(1, 1 + ChConfig.TurnFightRows)
+    if inRowNum in rowNumList:
+        rowNumList.remove(inRowNum)
+        rowNumList.insert(0, inRowNum)
+        
+    col = inColNum # 目标玩家所在纵排
+    
+    batObjMgr = BattleObj.GetBatObjMgr()
+    batLineup = tagObj.GetBatLineup()
+    aimObjList = []
+    for row in range(1, 1 + ChConfig.TurnFightRows):
+        pNum = (row - 1) * ChConfig.TurnFightCols + col
+        if pNum not in batLineup.posObjIDDict:
+            continue
+        tagObjID = batLineup.posObjIDDict[pNum]
+        tagBatObj = batObjMgr.getBatObj(tagObjID)
+        if not tagBatObj.IsAlive():
+            continue
+        aimObjList.append(tagBatObj)
+        
+    return aimObjList
+
 def GetRelativeObj(turnFight, curBatObj):
     '''获取对位目标,仅用于非技能目标的对位逻辑,如连击、弱疗等相对属性的判断,技能目标统一使用 GetSkillTags
     '''
@@ -679,7 +744,7 @@
         
     return
 
-def __doUseSkill(turnFight, curBatObj, useSkill):
+def __doUseSkill(turnFight, curBatObj, useSkill, **kwargs):
     
     atkType = useSkill.GetAtkType()
     GameWorld.DebugLogEx("__doUseSkill: curID=%s,skillID=%s,atkType=%s", curBatObj.GetID(), useSkill.GetSkillID(), atkType)
@@ -689,7 +754,7 @@
     
     # 通用攻击
     if atkType == 1:
-        SkillModule_1(turnFight, curBatObj, useSkill)
+        SkillModule_1(turnFight, curBatObj, useSkill, **kwargs)
     # 治疗
     if atkType == 2:
         SkillModule_2(turnFight, curBatObj, useSkill)
@@ -784,7 +849,7 @@
     Sync_PropertyRefreshView(turnFight, curBatObj, ChConfig.AttrID_HP, updHP, diffValue, diffType, skillID, relatedSkillID, hurtTypes)
     return
 
-def SkillModule_1(turnFight, curBatObj, useSkill):
+def SkillModule_1(turnFight, curBatObj, useSkill, **kwargs):
     ## 通用攻击,单攻、群攻
     
     addPer = 0
@@ -800,7 +865,10 @@
             addPer = addPerMax
         GameWorld.DebugLogEx("司马懿特殊潜能技能额外增加比例: frozenCnt=%s,addPer=%s" % (frozenCnt, addPer))
         
-    addBatDamPer = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddBatDamPerByLayer, useSkill)
+    addBatDamPer = 0
+    if "addBatDamPer" in kwargs:
+        addBatDamPer += kwargs.pop("addBatDamPer", 0)
+    addBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddBatDamPerByLayer, useSkill)
     
     # 计算伤害
     calcHurtResults = []
@@ -832,7 +900,7 @@
         tagID = tagObj.GetID()
         if tagID == ChConfig.HeroID_Caoren:
             continue
-        if tagObj.CheckInState(ChConfig.BatObjState_Wudi):
+        if tagObj.CheckInState(ChConfig.ImmuneHurtStateList):
             continue
         if not caorenProtectObj or tagObj.GetHP() < caorenProtectObj.GetHP():
             caorenProtectObj = tagObj
@@ -910,7 +978,7 @@
             continue
         if tagID == ChConfig.HeroID_Caoren:
             continue
-        if tagObj.CheckInState(ChConfig.BatObjState_Wudi):
+        if tagObj.CheckInState(ChConfig.ImmuneHurtStateList):
             continue
         if not caorenProtectObj or tagObj.GetHP() < caorenProtectObj.GetHP():
             caorenProtectObj = tagObj
@@ -1348,26 +1416,32 @@
     # 统计击杀
     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)
     
     # 统计伤血,可能单个技能对同一目标造成多次伤害
     totalHurtValue = 0
-    isSuckHP = False
+    suckObjIDList = [] # 吸血的对象ID列表
     missObjIDList, immuneObjIDList = [], [] # 闪避、免疫对象ID列表
     stunObjIDList, superHitObjIDList, parryObjIDList = [], [], []
     beHurtObjIDList = [] # 受伤的对象ID列表
     reviveObjList = [] # 复活的对象列表
     bounceObjList = [] # 有反弹的对象列表
+    caorenProtectList = [] # 有被曹仁防护的对象列表
     for hurtObj in useSkill.GetHurtObjListAll():
         hurtObjID = hurtObj.GetObjID()
         tagObj = batObjMgr.getBatObj(hurtObjID)
@@ -1415,14 +1489,23 @@
             if hurtObjID not in stunObjIDList:
                 stunObjIDList.append(hurtObjID)
                 
-        if hurtObj.GetSuckHP() > 0:
-            isSuckHP = True
-            
+        if hurtObj.HaveHurtType(ChConfig.HurtAtkType_CaorenProtect):
+            if tagObj not in caorenProtectList:
+                caorenProtectList.append(tagObj)
+                
+        if hurtObj.GetSuckHP() > 0 and not hurtObj.HaveHurtType(ChConfig.HurtAtkType_PoisonCureSuck):
+            if hurtObjID not in suckObjIDList:
+                suckObjIDList.append(hurtObjID)
+                
     # 判断自己死亡,因为反弹、平摊伤害的原因,有可能自己干死自己
     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:
@@ -1433,7 +1516,7 @@
         DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuperHit, relatedSkillID)
     if stunObjIDList:
         DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_Stun, relatedSkillID)
-    if isSuckHP:
+    if suckObjIDList:
         DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuckHP, relatedSkillID)
         
     # 结算副本相关的攻击结果,仅主动发起玩家阵容武将触发
@@ -1483,7 +1566,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,血量已经在技能中通知了
@@ -1492,6 +1579,20 @@
         TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Revive, curObj, connSkill=useSkill)
         TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_InBattlefield, curObj, connSkill=useSkill)
         
+    # 曹仁防护触发,暂写死
+    for tagObj in caorenProtectList:
+        tagBatLineup = tagObj.GetBatLineup()
+        caorenObj = tagBatLineup.getHeroObj(ChConfig.HeroID_Caoren) # 获取被防护目标阵容的曹仁
+        if not caorenObj or not caorenObj.IsAlive():
+            continue
+        caoRenSkill = caorenObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_CaorenProtect)
+        if not caoRenSkill:
+            continue
+        passiveSkillID = caoRenSkill.GetEffect(0).GetEffectValue(0) # 防护成功后的触发技能ID,默认写在效果1的值
+        GameWorld.DebugLogEx("曹仁防护后触发技能: caorenID=%s,protectID=%s,passiveSkillID=%s", caorenObj.GetID(), tagObj.GetID(), passiveSkillID)
+        if passiveSkillID:
+            OnUsePassiveSkill(turnFight, caorenObj, curObj, passiveSkillID, connSkill=useSkill)
+            
     triggerOne = False
     batType = useSkill.GetBatType()
     isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
@@ -1504,6 +1605,10 @@
             TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeMiss, tagObj, connSkill=useSkill)
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill)
             
+        # 免疫
+        if tagID in immuneObjIDList:
+            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_ImmuneHurt, curObj, connSkill=useSkill)
+            
         if tagID in effIgnoreObjIDList:
             continue
         
@@ -1512,7 +1617,7 @@
         # 掉血时
         if tagID in beHurtObjIDList:
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeHurt, curObj, connSkill=useSkill)
-            #TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_HurtTag, tagObj, connSkill=useSkill) 暂时用不到先屏蔽
+            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_HurtTag, tagObj, connSkill=useSkill)
             
         #  受到任意效果时(除直接攻击外的任意效果,如buff、dot、治疗、额外怒技)
         if not isAttackDirect:
@@ -1557,6 +1662,12 @@
         if tagID in parryObjIDList:
             TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeParry, tagObj, connSkill=useSkill)
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill)
+            
+        # 吸血
+        if tagID in suckObjIDList:
+            if not triggerOne:
+                TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill)
+            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuckHP, curObj, connSkill=useSkill)
             
         # 连击
         if batType == ChConfig.TurnBattleType_Combo:
@@ -1796,6 +1907,10 @@
             GameWorld.DebugLogEx("有击杀目标时该技能无效! enhanceSkillID=%s", enhanceSkillID)
             return
         
+    if checkHeroSex:
+        if TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_IgnoreSex, connSkillTypeID=enhanceSkillData.GetSkillTypeID(), connSkillID=enhanceSkillID):
+            checkHeroSex = 0
+            
     # 继承主技能目标
     if enhanceSkillData.GetTagAim() == ChConfig.SkillTagAim_MainSkill:
         GameWorld.DebugLogEx("继承主技能目标! enhanceSkillID=%s", enhanceSkillID)
@@ -1862,7 +1977,7 @@
     OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
     return
 
-def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None, **kwargs):
+def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None, batType=ChConfig.TurnBattleType_Passive, **kwargs):
     '''被动触发使用技能
     @param passiveSkill: 释放的被动技能 或 技能ID
     @param connSkill: 由什么技能引起的
@@ -1912,12 +2027,12 @@
             GameWorld.DebugLogEx("    概率不触发: tagID=%s,happenRate=%s", tagID, happenRate)
             return
         passiveTagObjList = [tagObj]
-        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
     elif tagAim == ChConfig.SkillTagAim_MainSkillEx:
         if not connSkill:
             return
         passiveTagObjList = connSkill.GetTagObjList()
-        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
     elif tagAim == ChConfig.SkillTagAim_MainSkillFriend:
         if "byFriendObj" not in kwargs:
             return
@@ -1925,10 +2040,24 @@
         passiveTagObjList = [byFriendObj]
         GameWorld.DebugLogEx("被动触发技能,针对来源友军! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s,byFriendID=%s", 
                              effSkillID, effectID, passiveSkillID, bySkillID, byFriendObj.GetID())
-        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
+    # 继承主技能目标同横排 11
+    elif tagAim == ChConfig.SkillTagAim_MainSkillRow:
+        if not tagObj:
+            return
+        GameWorld.DebugLogEx("被动触发技能,针对目标同排对象! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
+        passiveTagObjList = __getSameRowObjList(tagObj)
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
+    # 继承主技能目标同纵排 12
+    elif tagAim == ChConfig.SkillTagAim_MainSkillCol:
+        if not tagObj:
+            return
+        GameWorld.DebugLogEx("被动触发技能,针对目标同纵对象! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
+        passiveTagObjList = __getSameColObjList(tagObj)
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
     else:
         GameWorld.DebugLogEx("被动触发技能,重新锁定目标! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
-        isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
         
     return isOK
 
@@ -2158,14 +2287,25 @@
         GameWorld.DebugLogEx("    伤害最高限制: hurtValue=%s,hurtAtkPerMax=%s,aAtk=%s", hurtValue, hurtAtkPerMax, aAtk)
         
     # 均摊
-    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
-    if hurtShareEff:
+    if HaveShareEff(atkObj, curSkill):
         tagCnt = max(1, len(curSkill.GetTagObjList()))
         hurtValue = hurtValue / tagCnt
         GameWorld.DebugLogEx("    目标均摊伤害: hurtValue=%s,tagCnt=%s", hurtValue, tagCnt)
         
     hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后
     return hurtValue, hurtTypes
+
+def HaveShareEff(atkObj, curSkill):
+    ## 玩家技能是否有分摊效果: 均摊伤害/治疗/承伤盾值
+    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
+    if not hurtShareEff:
+        return False
+    needLearnSkillID = hurtShareEff.GetEffectValue(0)
+    if needLearnSkillID:
+        if not atkObj.GetSkillManager().FindSkillByID(needLearnSkillID):
+            GameWorld.DebugLogEx("所需技能未学习,分摊效果不生效! skillID=%s,needLearnSkillID=%s", curSkill.GetSkillID(), needLearnSkillID)
+            return False
+    return True
 
 def GetAddSkillPer(turnFight, atkObj, defObj, curSkill):
     ## 获取额外增加的技能万分比
@@ -2180,7 +2320,6 @@
 
 def CanSuperHit(turnFight, atkObj, defObj, curSkill):
     if TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_MustSuperHit, curSkill):
-        GameWorld.DebugLogEx("目标血量低于百分x时必定暴击: defID=%s,hp:%s/%s", defObj.GetID(), defObj.GetHP(), defObj.GetMaxHP())
         return True
     
     aSuperHitRate = atkObj.GetBatAttrValue(ChConfig.AttrID_SuperHitRate)
@@ -2241,7 +2380,7 @@
         return hurtValue, hurtTypes, immuneHurt
     
     hurtValue = int(hurtValue)
-    if defObj.CheckInState(ChConfig.BatObjState_Wudi):
+    if defObj.CheckInState(ChConfig.ImmuneHurtStateList):
         hurtTypes |= pow(2, ChConfig.HurtAtkType_Immune) # 添加免疫
         immuneHurt = hurtValue
         hurtValue = 0
@@ -2412,7 +2551,7 @@
     # 曹仁的分担触发条件暂时程序内固定,有修改时程序同步修改
     # 曹仁: 我方英雄受到直接攻击时(受到群攻时选择血量最低的友方进行防护),曹仁有30%概率为其分担一半所受伤害,每成功分担一次,曹仁获得1层坚韧,使我方全体减伤提升5%,最多6层,曹仁死亡效果消失
     # 董白怒气    同命锁    对敌方攻击最高的1个目标造成攻击力450%物理伤害,并与其连接,使两人受到的任意伤害平摊(平摊伤害不会被再次平摊),持续2回合
-    caorenSkillID = 1015070
+    caorenSkillID = ChConfig.SkillID_CaorenProtect
     effHeroIDList = [ChConfig.HeroID_Zhenfu, ChConfig.HeroID_Caoren, ChConfig.HeroID_Dongbai] # 暂固定,有增加武将再同步修改
     
     isAve = False
@@ -2525,7 +2664,7 @@
             
             immuneHurt = immuneHurtDict.get(aveObjID)
             if immuneHurt == None:
-                if aveObj.CheckInState(ChConfig.BatObjState_Wudi):
+                if aveObj.CheckInState(ChConfig.ImmuneHurtStateList):
                     immuneHurt = 0
                 else:
                     immuneHurt = -1 # 标记没有无敌
@@ -2777,12 +2916,14 @@
         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)
         
-    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
-    if hurtShareEff:
+    if HaveShareEff(userObj, curSkill):
         tagCnt = max(1, len(curSkill.GetTagObjList()))
         cureHP = cureHP / tagCnt
         GameWorld.DebugLogEx("    目标均摊治疗: cureHP=%s,tagCnt=%s", cureHP, tagCnt)

--
Gitblit v1.8.0