From ecec2bde4584f578e822e614548e3ceec830cfef Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 23 十二月 2025 16:04:59 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(修复吕玲绮队友死亡触发怒技回合受限无效bug;7009效果支持纯被动效果技能;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py |  292 +++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 228 insertions(+), 64 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 e4f017d..dadceb8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -59,13 +59,16 @@
     if not skillID:
         return
     
+    skillType = useSkill.GetSkillType()
+    byTriggerWay = kwargs["byTriggerWay"] if "byTriggerWay" in kwargs else 0 # 不使用参数名 triggerWay, 防止传递过程中参数混乱
     if not curBatObj.IsAlive():
-        if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive and useSkill.GetTagAim() == ChConfig.SkillTagAim_Self:
-            GameWorld.DebugLogEx("死亡时使用复活自己的技能! skillID=%s", skillID)
+        if skillType == ChConfig.Def_SkillType_Revive:
+            GameWorld.DebugLogEx("死亡时使用复活技能! skillID=%s", skillID)
         else:
-            triggerWay = kwargs.get("triggerWay", 0)
-            if triggerWay in ChConfig.DeadCanTriggerWayList:
-                GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,triggerWay=%s", skillID, triggerWay)
+            if byTriggerWay in ChConfig.DeadCanTriggerWayList:
+                GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,byTriggerWay=%s", skillID, byTriggerWay)
+            elif batType == ChConfig.TurnBattleType_Enhance:
+                GameWorld.DebugLogEx("死亡状态额外技能不限制,主技能能放的话也就能放! skillID=%s", skillID)                
             else:
                 GameWorld.DebugLogEx("死亡状态下无法释放该技能! skillID=%s", skillID)
                 return
@@ -101,10 +104,16 @@
             if not tagObjList and isRemove:
                 return
             
+    if tagObjList and skillType == ChConfig.Def_SkillType_Revive:
+        for tagObj in tagObjList[::-1]:
+            if tagObj.CheckInState(ChConfig.BatObjState_RebornLimit):
+                GameWorld.DebugLogEx("    目标被禁止复活不处理! tagID=%s", tagObj.GetID())
+                tagObjList.remove(tagObj)
+                
     if not tagObjList:
         # 可扩展其他目标选择,如复活技能没有死亡单位时则使用另外的效果
         GameWorld.DebugLogEx("找不到技能目标! skillID=%s,mapID=%s,funcLineID=%s", skillID, turnFight.mapID, turnFight.funcLineID, turnFight.getReqPlayerID())
-        if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive:
+        if skillType == ChConfig.Def_SkillType_Revive and not isinstance(useSkill, IpyGameDataPY.IPY_Skill):
             otherEff = useSkill.GetEffectByID(ChConfig.SkillEff_ReviveNoUse)
             if otherEff:
                 otherSkillID = otherEff.GetEffectValue(0)
@@ -124,12 +133,13 @@
     
     # 子技能怒气溢出值也有效,所以子技能不处理
     curXP = curBatObj.GetXP()
-    if batType == ChConfig.TurnBattleType_Enhance:
-        pass
-    elif SkillCommon.isAngerSkill(useSkill):
+    if SkillCommon.isAngerSkill(useSkill):
         maxXP = IpyGameDataPY.GetFuncCfg("AngerXP", 2)
         angerOverflow = max(curXP - maxXP, 0)
         curBatObj.SetAngerOverflow(angerOverflow)
+        GameWorld.DebugLogEx("怒气溢出值: curXP=%s/%s,angerOverflow=%s", curXP, maxXP, angerOverflow)
+    elif batType == ChConfig.TurnBattleType_Enhance:
+        pass
     else:
         curBatObj.SetAngerOverflow(0)        
     angerOverflow = curBatObj.GetAngerOverflow()
@@ -148,6 +158,7 @@
     useSkill.SetBatType(batType)
     useSkill.SetBySkill(bySkill)
     useSkill.SetByBuff(byBuff)
+    useSkill.SetByTriggerWay(byTriggerWay)
     
     isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
     if isTurnNormalSkill:
@@ -176,7 +187,7 @@
     else:
         __doUseSkill(turnFight, curBatObj, useSkill)
         
-    DoAttackResult(turnFight, curBatObj, useSkill)
+    DoAttackResult(turnFight, curBatObj, useSkill, **kwargs)
     
     if useTag:
         Sync_TurnFightTag(turnFight, useTag, 1)
@@ -192,7 +203,7 @@
 
 def CheckSkillUseCntLimit(batObj, useSkill):
     ## 检查技能使用次数是否受限
-    # @return: 是否受限
+    # @return: 是否受限,None-没有受限效果,False-不受限,True-受限了
     if not hasattr(useSkill, "GetEffectByID"):
         return
     effect = useSkill.GetEffectByID(ChConfig.SkillEff_SkillUseCntLimit)
@@ -214,11 +225,12 @@
             GameWorld.DebugLogEx("技能每大回合使用次数受限! skillID=%s,turnUseCnt=%s >= %s", skillID, turnUseCnt, turnUseCntLimit)
             return True
         
-    return
+    return False
 
 def IsNeedSyncSkill(useSkill):
     ## 使用需要同步B427使用技能
-    if useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_Revive, ChConfig.Def_SkillType_CleanBuff]:
+    if useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_Revive, ChConfig.Def_SkillType_CleanBuff, 
+                                   ChConfig.Def_SkillType_AtkEx]:
         return True
     if useSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_TurnNormaSkill, ChConfig.Def_SkillFuncType_AngerSkill]:
         return True
@@ -399,6 +411,13 @@
                     tagBatObj = batObjMgr.getBatObj(tagObjID)
                     if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
                         continue
+                    
+                    if tagAim == ChConfig.SkillTagAim_Male:
+                        if tagBatObj.GetSex() != ChConfig.BatObjSex_Male:
+                            continue
+                    elif tagAim == ChConfig.SkillTagAim_Female:
+                        if tagBatObj.GetSex() != ChConfig.BatObjSex_Female:
+                            continue
                     aimObjList.append(tagBatObj)
                     
     # 目标细分
@@ -439,6 +458,14 @@
         for aimObj in aimObjList[::-1]:
             if not aimObj.CheckInState(ChConfig.BatObjState_PoisonCure):
                 aimObjList.remove(aimObj)
+        
+    # 仅流血目标
+    elif tagAffect == ChConfig.SkillTagAffect_Bleeding:
+        atkBackTagFrist = False
+        for aimObj in aimObjList[::-1]:
+            if not aimObj.CheckInState(ChConfig.BatObjState_Bleeding):
+                aimObjList.remove(aimObj)
+                
     else:
         # 范围目标超过个数,则随机取
         if tagCount and len(aimObjList) > tagCount:
@@ -729,9 +756,13 @@
         return
     harmPer = harmEff.GetEffectValue(0) # 自残百分比
     noEnoughDo = harmEff.GetEffectValue(1) # 不足时扣除方式 0-不扣;1-自杀;2-扣剩1点
+    calcType = harmEff.GetEffectValue(2) # 计算方式:0-按最大血量;1-按当前血量
     curHP = curBatObj.GetHP()
     maxHP = curBatObj.GetMaxHP()
-    harmHP = int(maxHP * harmPer / 100.0)
+    if calcType == 1:
+        harmHP = int(curHP * harmPer / 100.0)
+    else:
+        harmHP = int(maxHP * harmPer / 100.0)
     lostHP = harmHP
     if curHP <= harmHP:
         if noEnoughDo == 0:
@@ -741,8 +772,8 @@
             
     updHP = max(curHP - lostHP, 0)
     curBatObj.SetHP(updHP, False)
-    GameWorld.DebugLogEx("使用技能时自残: curHP=%s/%s,harmPer=%s,harmHP=%s,lostHP=%s,updHP=%s,noEnoughDo=%s", 
-                         curHP, maxHP, harmPer, harmHP, lostHP, updHP, noEnoughDo)
+    GameWorld.DebugLogEx("使用技能时自残: curHP=%s/%s,harmPer=%s,harmHP=%s,lostHP=%s,updHP=%s,noEnoughDo=%s,calcType=%s", 
+                         curHP, maxHP, harmPer, harmHP, lostHP, updHP, noEnoughDo, calcType)
     
     curBatObj.SetHarmSelfHP(harmHP) # 无视实际扣血量,直接更新
     
@@ -769,22 +800,24 @@
             addPer = addPerMax
         GameWorld.DebugLogEx("司马懿特殊潜能技能额外增加比例: frozenCnt=%s,addPer=%s" % (frozenCnt, addPer))
         
+    addBatDamPer = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddBatDamPerByLayer, useSkill)
+    
     # 计算伤害
     calcHurtResults = []
     for tagBatObj in useSkill.GetTagObjList():
-        hurtValue, hurtTypes, immuneHurt = __calcSkillHurt(turnFight, curBatObj, tagBatObj, useSkill, addPer)
+        hurtValue, hurtTypes, immuneHurt = __calcSkillHurt(turnFight, curBatObj, tagBatObj, useSkill, addPer, addBatDamPer)
         calcHurtResults.append([tagBatObj, hurtValue, hurtTypes, immuneHurt])
         
     DoSkillHurtHP(turnFight, curBatObj, useSkill, calcHurtResults)        
     return
 
-def __calcSkillHurt(turnFight, atkObj, defObj, curSkill, addPer=0):
+def __calcSkillHurt(turnFight, atkObj, defObj, curSkill, addPer=0, addBatDamPer=0):
     ## 计算技能伤害,只计算值,不做实际处理
     # @param addPer: 外部指定增加的比例
     # @return: hurtValue, hurtTypes, immuneHurt
     atkSkillPer = curSkill.GetSkillPer() + addPer
     atkSkillValue = curSkill.GetSkillValue()
-    hurtValue, hurtTypes = CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer)
+    hurtValue, hurtTypes = CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, addBatDamPer)
     hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
     return hurtValue, hurtTypes, immuneHurt
 
@@ -845,8 +878,13 @@
     
     calcCureResults = []
     relativeObj = GetRelativeObj(turnFight, curBatObj)
+    multiValue = 1
+    addCureMulti = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddCureMulti, useSkill)
+    if addCureMulti:
+        multiValue += addCureMulti / 100.0
+        
     for tagBatObj in useSkill.GetTagObjList():
-        cureHP = CalcCureHP(turnFight, curBatObj, tagBatObj, useSkill, relativeObj=relativeObj)
+        cureHP = CalcCureHP(turnFight, curBatObj, tagBatObj, useSkill, relativeObj=relativeObj, multiValue=multiValue)
         poisonCureOwner = GetPoisonCureOwner(tagBatObj)
         calcCureResults.append([tagBatObj, cureHP, poisonCureOwner])
         
@@ -1098,7 +1136,7 @@
         else:
             diffType = 1
             tagXP = tagBatObj.GetXP()
-            diffValue = GetEnhanceXP(tagBatObj, calcValue)
+            diffValue = GetEnhanceXP(tagBatObj, calcValue, useSkill)
             updValue = tagXP + diffValue
             tagBatObj.SetXP(updValue, False)
             GameWorld.DebugLogEx("    加怒气: tagID=%s,diffValue=%s,tagXP=%s,updXP=%s", tagID, diffValue, tagXP, updValue)
@@ -1115,7 +1153,7 @@
         
     return
 
-def DoAttackResult(turnFight, curBatObj, useSkill):
+def DoAttackResult(turnFight, curBatObj, useSkill, **kwargs):
     '''执行攻击结果
     @param curBatObj: 施法方或buff归属方
     '''
@@ -1132,13 +1170,21 @@
     if useSkill.GetCoolDownTime():
         useSkill.SetRemainTime(useSkill.GetCoolDownTime())
         
+    if "byEffSkill" in kwargs:
+        byEffSkill = kwargs["byEffSkill"]
+        cdTime = byEffSkill.GetCoolDownTime()
+        if cdTime:
+            if hasattr(byEffSkill, "GetRemainTime"):
+                byEffSkill.SetRemainTime(cdTime)
+                GameWorld.DebugLogEx("提前设置效果技能触发后CD,防止嵌套循环触发! effSkillID=%s,cdTime=%s", byEffSkill.GetSkillID(), cdTime)
+                
     __doCostZhanchui(turnFight, curBatObj, useSkill) # 先扣除再同步技能
     
     # 需先技能使用 - 前端按顺序优先表现技能释放内容,前端需要动作或有伤血则通知
     if IsNeedSyncSkill(useSkill):
         Sync_UseSkill(turnFight, curBatObj, useSkill)
         
-    __doSkillUserAnger(turnFight, curBatObj, useSkill)
+    __doSkillUserAnger(turnFight, curBatObj, useSkill, **kwargs)
     
     DoBeAttackResult(turnFight, curBatObj, useSkill)
     return
@@ -1265,13 +1311,14 @@
             return useSkill
     return
 
-def DoBeAttackResult(turnFight, curObj, useSkill, curBuff=None):
+def DoBeAttackResult(turnFight, curObj, useSkill, timeBuff=None):
     '''被攻击结果
     @param curObj: 施法方或buff归属方
+    @param timeBuff: 持续结算的buff,如持续攻击、持续治疗等
     '''
     
-    #curID = curObj.GetID()
-    isUseSkill = False if curBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
+    curID = curObj.GetID()
+    isUseSkill = False if timeBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
     isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
     isAngerSkill = SkillCommon.isAngerSkill(useSkill)
     
@@ -1279,16 +1326,14 @@
     
     # 优先处理afterLogic,可再预先汇总一些会触发被动的信息
     relatedSkillID = useSkill.GetSkillID()
-    shieldBrokenList = [] # 记录盾破
+    delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
     afterLogicList = useSkill.GetAfterLogicList()
     for logicType, logicData in afterLogicList:
         if logicType == ChConfig.AfterLogic_DelBuff:
-            buffObjID, buff, tagObjID = logicData
-            buffSkillData = buff.GetSkillData()
-            buffSkillTypeID = buffSkillData.GetSkillTypeID()
+            buffObjID, buff, tagObjID, afterTriggerData = logicData
             TurnBuff.DoBuffDelAfterLogicOver(turnFight, buffObjID, buff, useSkill)
-            if SkillCommon.isDamageShieldSkill(buffSkillData):
-                shieldBrokenList.append([buffObjID, tagObjID, buffSkillTypeID])
+            if afterTriggerData:
+                delBuffAfterEffList.append([buffObjID, buff, tagObjID, afterTriggerData])
                 
         elif logicType == ChConfig.AfterLogic_AddBuff:
             batObj = logicData[0]
@@ -1314,13 +1359,7 @@
                 killObjList.append(tagObj)
             TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
     useSkill.SetKillObjList(killObjList)
-    # 判断自己,因为反弹、平摊伤害的原因,有可能自己干死自己
-    selfAlive = curObj.IsAlive()
-    if selfAlive and curObj.GetHP() <= 0:
-        selfAlive = False
-        dieObjList.append(curObj)
-        TurnAttack.SetObjKilled(turnFight, curObj)
-        
+    
     # 统计伤血,可能单个技能对同一目标造成多次伤害
     totalHurtValue = 0
     isSuckHP = False
@@ -1328,11 +1367,18 @@
     stunObjIDList, superHitObjIDList, parryObjIDList = [], [], []
     beHurtObjIDList = [] # 受伤的对象ID列表
     reviveObjList = [] # 复活的对象列表
+    bounceObjList = [] # 有反弹的对象列表
     for hurtObj in useSkill.GetHurtObjListAll():
         hurtObjID = hurtObj.GetObjID()
         tagObj = batObjMgr.getBatObj(hurtObjID)
         if not tagObj:
             continue
+        
+        bounceHP = hurtObj.GetBounceHP()
+        if bounceHP:
+            if tagObj not in bounceObjList:
+                bounceObjList.append(tagObj)
+                
         if hurtObj.HaveHurtType(ChConfig.HurtAtkType_Hurt) and not hurtObj.HaveHurtType(ChConfig.HurtAtkType_Immune) \
             and (isTurnNormalSkill or isAngerSkill) and tagObj.IsAlive():
             __doSkillHurtAnger(tagObj, hurtObj.GetLostHP(), useSkill)
@@ -1372,6 +1418,12 @@
         if hurtObj.GetSuckHP() > 0:
             isSuckHP = True
             
+    # 判断自己死亡,因为反弹、平摊伤害的原因,有可能自己干死自己
+    if curObj.IsAlive() and curObj.GetHP() <= 0:
+        dieObjList.append(curObj)
+        killer = bounceObjList[0] if bounceObjList else None
+        TurnAttack.SetObjKilled(turnFight, curObj, killer)
+        
     # 记录最后一次总伤害,有伤害目标才记录
     if totalHurtValue:
         curObj.SetLastHurtValue(totalHurtValue)
@@ -1392,16 +1444,18 @@
     effIgnoreObjIDList = missObjIDList + immuneObjIDList
     useSkill.SetEffIgnoreObjIDList(effIgnoreObjIDList)
     # 优先触发本技能额外效果,注:仅该技能释放后该技能的额外效果视为主技能的效果,优先级最高
-    if selfAlive:
+    if curObj not in dieObjList:
         __DoCurSkillEff(turnFight, curObj, useSkill, effIgnoreObjIDList, isUseSkill)
     
     # ========== 以下触发被动 ==========
     
-    # 破盾时
-    for buffObjID, tagObjID, buffSkillTypeID in shieldBrokenList:
+    # buff消失后置处理的被动,优先处理,如破盾,区别于被动方式  ChConfig.TriggerWay_BuffDel(立即触发)
+    for buffObjID, buff, tagObjID, afterTriggerData in delBuffAfterEffList:
+        triggerWay, effInfoList = afterTriggerData
         buffObj = batObjMgr.getBatObj(buffObjID)
-        tagObj = batObjMgr.getBatObj(tagObjID)
-        TurnPassive.OnTriggerPassiveEffect(turnFight, buffObj, ChConfig.TriggerWay_ShieldBroken, tagObj, connSkillTypeID=buffSkillTypeID)
+        tagObj = batObjMgr.getBatObj(tagObjID) # 导致该buff消失的目标
+        GameWorld.DebugLogEx("buff消失后置处理的被动: buffObjID=%s,tagObjID=%s,triggerWay=%s,%s", buffObjID, tagObjID, triggerWay, effInfoList)
+        TurnPassive.OnTriggerPassiveEffList(turnFight, buffObj, triggerWay, tagObj, effInfoList, connSkill=useSkill, connBuff=buff)
         
     # 有击杀时
     for index, tagObj in enumerate(killObjList):
@@ -1412,6 +1466,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)
@@ -1424,10 +1479,10 @@
                     for dieObj in dieObjList:
                         # 敌方单位死亡时
                         if lineupObj.GetFaction() != dieObj.GetFaction():
-                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyDie, dieObj, connSkill=useSkill)
+                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyDie, dieObj, connSkill=useSkill, byKiller=curObj)
                         # 己方单位死亡时
                         else:
-                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill)
+                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill, byFriendObj=dieObj)
                  
     # 复活时
     for tagObj in reviveObjList:
@@ -1440,6 +1495,7 @@
     triggerOne = False
     batType = useSkill.GetBatType()
     isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
+    curBatLineup = None
     for tagObj in tagObjListAll:
         tagID = tagObj.GetID()
         
@@ -1456,6 +1512,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) 暂时用不到先屏蔽
             
         #  受到任意效果时(除直接攻击外的任意效果,如buff、dot、治疗、额外怒技)
         if not isAttackDirect:
@@ -1465,6 +1522,7 @@
         if isExObj:
             continue
         
+        isDotHurt = False
         # 直接攻击
         if isAttackDirect:
             if not triggerOne:
@@ -1475,7 +1533,9 @@
         elif not isAttackDirect:
             # 受到持续伤害
             if tagID in beHurtObjIDList:
-                TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeDOTHurt, curObj, connSkill=useSkill)
+                isDotHurt = True
+                TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_DOTHurt, tagObj, connSkill=useSkill, connBuff=timeBuff)
+                TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeDOTHurt, curObj, connSkill=useSkill, connBuff=timeBuff)
                 
         # 使用技能后
         if isUseSkill:
@@ -1511,12 +1571,68 @@
             TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_AtkBack, tagObj, connSkill=useSkill)
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAtkBack, curObj, connSkill=useSkill)
             
+            
+        # 敌友方
+        if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt:
+            if not curBatLineup:
+                curBatLineup = curObj.GetBatLineup()
+            for lineupObjID in curBatLineup.posObjIDDict.values():
+                lineupObj = batObjMgr.getBatObj(lineupObjID)
+                if not lineupObj.IsAlive():
+                    continue
+                
+                # 直接攻击
+                if isAttackDirect:
+                    if not triggerOne:
+                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOne, tagObj, connSkill=useSkill, byFriendObj=curObj)
+                        if curID != lineupObj.GetID():
+                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOneNoSelf, tagObj, connSkill=useSkill, byFriendObj=curObj)
+                # 持续伤害
+                elif isDotHurt:
+                    if not triggerOne:
+                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDotHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
+                        
+                # 连击
+                if batType == ChConfig.TurnBattleType_Combo:
+                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
+                    
+                # 追击
+                elif batType == ChConfig.TurnBattleType_Pursue:
+                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendPursue, tagObj, connSkill=useSkill, byFriendObj=curObj)
+                    
         triggerOne = True # 设置已经触发过一次
         
     # 验证是否结算,最后处理
     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):
@@ -1556,10 +1672,14 @@
         
     return
 
-def __doSkillUserAnger(turnFight, curBatObj, useSkill):
+def __doSkillUserAnger(turnFight, curBatObj, useSkill, **kwargs):
     ## 技能释放者怒气相关
     if SkillCommon.isAngerSkill(useSkill):
-        curBatObj.SetXP(0)
+        if "noUseXP" in kwargs:
+            kwargs.pop("noUseXP")
+            GameWorld.DebugLogEx("本次不消耗怒气")
+        else:
+            curBatObj.SetXP(0)
     elif SkillCommon.isTurnNormalSkill(useSkill) and useSkill.GetBatType() == ChConfig.TurnBattleType_Normal:
         addXP = IpyGameDataPY.GetFuncCfg("AngerXP", 3)
         AddFightXP(curBatObj, addXP, "skillID:%s" % useSkill.GetSkillID())
@@ -1609,11 +1729,14 @@
     Sync_PropertyRefreshView(turnFight, gameObj, ChConfig.AttrID_XP, updXP, addXP, diffType=1, relatedSkillID=relatedSkillID)
     return
 
-def GetEnhanceXP(gameObj, addXP):
+def GetEnhanceXP(gameObj, addXP, useSkill=None):
     ## 获取提升后的xp值
     addPer = gameObj.GetBatAttrValue(ChConfig.AttrID_XPRecoverPer)
     # 其他强化、弱化
     if addPer == 0:
+        return addXP
+    if useSkill and useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PotentialSkill and useSkill.GetSkillValue() == 50:
+        GameWorld.DebugLogEx("潜能初始50点暂时写死不受限: objID=%s,addXP=%s,skillID=%s", gameObj.GetID(), addXP, useSkill.GetSkillID())
         return addXP
     objID = gameObj.GetID()
     updAddXP = int(addXP * max(10000 + addPer, 0) / 10000.0)
@@ -1684,8 +1807,11 @@
         for tagObj in tagObjList:
             tagID = tagObj.GetID()
             if not tagObj.IsAlive():
-                GameWorld.DebugLogEx("    已被击杀不触发: tagID=%s", tagID)
-                continue
+                if enhanceSkillData.GetCurBuffState() == ChConfig.BatObjState_RebornLimit:
+                    GameWorld.DebugLogEx("    禁止复活buff允许对死亡对象释放: tagID=%s", tagID)
+                else:
+                    GameWorld.DebugLogEx("    已被击杀不触发: tagID=%s", tagID)
+                    continue
             if tagID in effIgnoreObjIDList:
                 GameWorld.DebugLogEx("    闪避或免疫的不触发: tagID=%s", tagID)
                 continue
@@ -1792,13 +1918,21 @@
             return
         passiveTagObjList = connSkill.GetTagObjList()
         isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+    elif tagAim == ChConfig.SkillTagAim_MainSkillFriend:
+        if "byFriendObj" not in kwargs:
+            return
+        byFriendObj = kwargs.pop("byFriendObj") # 触发即移除,防止一直传递引发其他问题,如触发的技能再触发其他技能会被视为也是有byFriendObj
+        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)
     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)
         
     return isOK
 
-def CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, **kwargs):
+def CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, addBatDamPer=0, **kwargs):
     '''按公式计算伤害,默认按攻击计算
     '''
     
@@ -1809,6 +1943,8 @@
     batType = curSkill.GetBatType()
     
     changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtType, curSkill)
+    if not changeHurtType:
+        changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtTypeByBuff, curSkill)
     if changeHurtType == 1:
         ignoreDef = True
         GameWorld.DebugLogEx("强制变更本次伤害为无视防御! skillID=%s", skillID)
@@ -1887,6 +2023,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:
@@ -1905,11 +2042,17 @@
         aDOTPer = atkObj.GetBatAttrValue(ChConfig.AttrID_DOTPer)
         dDOTPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_DOTPerDef)
         GameWorld.DebugLogEx("aDOTPer=%s,dDOTPerDef=%s", aDOTPer, dDOTPerDef)
-        
+        if curSkill.GetCurBuffState() in ChConfig.BurnStateList:
+            aDOTPer += atkObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPer)
+            dDOTPerDef += defObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPerDef)
+            GameWorld.DebugLogEx("是灼烧: aDOTPer=%s,dDOTPerDef=%s", aDOTPer, dDOTPerDef)
+            
     #aAddSkillPer = 0 # 技能增伤
-    aBatDamPer, dBatDamPerDef = 0, 0 # 战斗增减伤
+    dBatDamPerDef = 0 # 战斗增减伤
+    aBatDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_BatDamPer)
     aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_BatDamPer, curSkill)
     aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddBatDamPerByTagLostHP, curSkill)
+    aBatDamPer += addBatDamPer
     
     # 物法增减伤
     if pmType == IPY_GameWorld.ghtMag: # 法伤
@@ -2008,6 +2151,7 @@
         
     hurtAtkPerMax = curSkill.GetHurtAtkPerMax() # 最大万分比,限制最终伤害不超过攻击力万分率
     if hurtAtkPerMax:
+        hurtAtkPerMax += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddHurtAtkPerMax, curSkill)
         aAtk = atkObj.GetAtk()
         hurtValueMax = aAtk * hurtAtkPerMax / 10000.0
         hurtValue = min(hurtValue, hurtValueMax)
@@ -2127,8 +2271,10 @@
         defObj, hurtValue, hurtTypes, immuneHurt = hurtInfo[:4]
         isEx = hurtInfo[4] if len(hurtInfo) > 4 else 0 # 是否是额外目标
         
-        lostHP = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
-        
+        lostHP, ignoreShield, hurtValue = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
+        if ignoreShield:
+            hurtTypes |= pow(2, ChConfig.HurtAtkType_IgnoreShield)
+            
         #伤害结构体
         defID = defObj.GetID()
         if isEx:
@@ -2415,9 +2561,10 @@
     @param hpCanNegative: 扣除后的生命是否允许负值
     @param immuneHurt: 免疫的伤害值
     @param isSkillSelfTag: 是否技能自身的直接目标,如平摊伤害目标、溅射伤害目标这种就不算直接目标
-    @return: lostHP
+    @return: lostHP, ignoreShield, hurtValue
     '''
     
+    ignoreShield = None
     if immuneHurt > 0:
         buffMgr = defObj.GetBuffManager()
         wudiBuffList = buffMgr.FindBuffListByState(ChConfig.BatObjState_Wudi)
@@ -2432,8 +2579,14 @@
                                  defObj.GetID(), buff.GetBuffID(), buffSkillID, buffValue, immuneHurt, updBuffValue, lostType)
             
     if hurtValue <= 0:
-        return 0
+        return 0, ignoreShield, hurtValue
     
+    # 伤血上限保护
+    lostHPProtect = TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_LostHPProtect, curSkill)
+    if lostHPProtect > 0 and hurtValue > lostHPProtect:
+        GameWorld.DebugLogEx("    扣血时最大伤血保护: defID=%s,hurtValue=%s,lostHPProtect=%s", defObj.GetID(), hurtValue, lostHPProtect)
+        hurtValue = lostHPProtect
+        
     atkID = atkObj.GetID()
     defID = defObj.GetID()
     skillID = curSkill.GetSkillID()
@@ -2443,6 +2596,11 @@
     shieldBuffList = []
     buffMgr = defObj.GetBuffManager()
     for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamShield):
+        if ignoreShield == None:
+            if TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_IgnoreShield, curSkill):
+                ignoreShield = True # 无视承伤盾
+                break
+            ignoreShield = False
         skillData = buff.GetSkillData()
         remainTime = buff.GetRemainTime() # 剩余回合
         if not skillData.GetLastTime():
@@ -2471,7 +2629,9 @@
             shieldHurtValue -= decShieldValue # 承伤值
             if decShieldValue >= buffValue:
                 GameWorld.DebugLogEx("        删除盾: buffID=%s,剩余盾伤=%s", buffID, shieldHurtValue)
-                TurnBuff.DoBuffDel(turnFight, defObj, buff, relatedSkill=curSkill, afterLogic=True, tagObj=atkObj)
+                #盾破时buff会被删除,导致绑定在该buff上的被动效果同步被清除,后续就无法触发盾破后被动,固先取出来
+                effInfoList = defObj.GetPassiveEffManager().GetPassiveEffByTrigger(ChConfig.TriggerWay_ShieldBroken, connSkillTypeID=buffSkillID)
+                TurnBuff.DoBuffDel(turnFight, defObj, buff, relatedSkill=curSkill, afterLogic=True, tagObj=atkObj, afterTriggerData=[ChConfig.TriggerWay_ShieldBroken, effInfoList])
             else:
                 updShieldValue = buffValue - decShieldValue
                 GameWorld.DebugLogEx("        更新盾: updShieldValue=%s,剩余盾伤=%s", updShieldValue, shieldHurtValue)
@@ -2492,7 +2652,7 @@
     GameWorld.DebugLogEx("    扣血: atkID=%s,defID=%s,hurtValue=%s,lostType=%s,lostHP=%s,dHP=%s,updHP=%s/%s", 
                          atkID, defID, hurtValue, lostType, lostHP, dHP, defObj.GetHP(), defObj.GetMaxHP())
     TurnAttack.AddTurnObjHurtValue(atkObj, defObj, hurtValue, lostHP, skillID, lostType)
-    return lostHP
+    return lostHP, ignoreShield, hurtValue
 
 def CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill):
     '''计算反弹反弹伤害
@@ -2514,12 +2674,12 @@
         return
     
     GameWorld.DebugLogEx("    反弹伤害=%s,%s/%s, damBackPer=%s", bounceHP, atkObj.GetHP(), atkObj.GetMaxHP(), damBackPer)
-    bounceHP, _, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, bounceHP)
+    bounceHP, _, immuneHurt = CalcHurtWithBuff(turnFight, defObj, atkObj, bounceHP)
     if bounceHP <= 0:
         GameWorld.DebugLogEx("        bounceHP=%s", bounceHP)
         return
     hurtObj.SetBounceHP(bounceHP)
-    DoLostHP(turnFight, atkObj, defObj, bounceHP, curSkill, "Bounce", hpCanNegative=True, immuneHurt=immuneHurt) # 反弹后生命允许负值
+    DoLostHP(turnFight, defObj, atkObj, bounceHP, curSkill, "Bounce", hpCanNegative=True, immuneHurt=immuneHurt) # 反弹后生命允许负值
     return
 
 def CalcSuckBlood(turnFight, atkObj, defObj, hurtObj, curSkill):
@@ -2576,7 +2736,7 @@
     TurnAttack.AddTurnObjCureHP(atkObj, atkObj, suckHP, cureHP)
     return
 
-def CalcCureHP(turnFight, userObj, tagObj, curSkill, relativeObj=None):
+def CalcCureHP(turnFight, userObj, tagObj, curSkill, relativeObj=None, multiValue=1):
     ''' 计算治疗值
     '''
     
@@ -2617,6 +2777,10 @@
         cureHP += cureHPEx
         GameWorld.DebugLogEx("    额外治疗值(%s): cureType=%s,baseValue=%s,skillPer=%s,cureHP=%s", cureHPEx, cureType, baseValue, skillPer, cureHP)
         
+    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:
         tagCnt = max(1, len(curSkill.GetTagObjList()))

--
Gitblit v1.8.0