From 7cf1be63a7bbf9119bf6c404899e8f71f12400c9 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 20 一月 2026 21:10:30 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(命格技能朱雀;增加触发方式61-附加持续伤害buff时;群攻触发的命格buff默认只触发一次;增加效果5029-额外结算dot伤害;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py |  213 ++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 169 insertions(+), 44 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 af339b5..135eb26 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -38,6 +38,11 @@
     ght = useSkill.GetHurtType() % 10
     if ght == IPY_GameWorld.ghtMag: # 做配置兼容用,优先验证法伤,否则默认物伤
         return IPY_GameWorld.ghtMag
+    if ght == 3: # 由触发的技能决定
+        bySkill = useSkill.GetBySkill()
+        if bySkill:
+            #GameWorld.DebugLogEx("物法类型取触发的技能: useSkillID=%s,bySkillID=%s", useSkill.GetSkillID(), bySkill.GetSkillID())
+            return GetPMType(batObj, bySkill)
     return IPY_GameWorld.ghtPhy
 
 def IsIgnoreDef(useSkill):
@@ -60,6 +65,19 @@
         return
     
     skillType = useSkill.GetSkillType()
+    byBatObj = kwargs.pop("byBatObj", None)
+    if useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_MinggeSkill:
+        if useSkill.GetSkillType() in ChConfig.Def_HurtSkill_List:
+            if not byBatObj:
+                return
+            GameWorld.DebugLogEx("命格攻击类技能施法方算触发者! mgObjID=%s,byObjID=%s,skillID=%s", curBatObj.GetID(), byBatObj.GetID(), skillID)
+            curBatObj = byBatObj
+        else:
+            # 因为命格攻击类技能修改了施法者,后续如果有子技能触发会变成还是变更后的施法者,导致命格全体buff可能存在多个施法来源,可能导致bug
+            batLineup = curBatObj.GetTFBatLineup()
+            curBatObj = batLineup.getMinggeObj()
+            GameWorld.DebugLogEx("命格非攻击类技能强制施法者为命格自己! mgObjID=%s,skillID=%s", curBatObj.GetID(), skillID)
+            
     byTriggerWay = kwargs["byTriggerWay"] if "byTriggerWay" in kwargs else 0 # 不使用参数名 triggerWay, 防止传递过程中参数混乱
     if not curBatObj.IsAlive():
         if skillType == ChConfig.Def_SkillType_Revive:
@@ -158,6 +176,8 @@
     useSkill.SetBatType(batType)
     useSkill.SetBySkill(bySkill)
     useSkill.SetByBuff(byBuff)
+    # 注:理论上原先的 byFriendObj 都可以直接用这个,但是旧的代码先不修改了,后续的累计敌军、友军之类的触发可以统一使用 byBatObj
+    useSkill.SetByBatObj(kwargs.pop("byBatObj", None))
     useSkill.SetByTriggerWay(byTriggerWay)
     
     isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
@@ -378,13 +398,14 @@
                     colNumList.insert(0, specInColNum)
                     
             GameWorld.DebugLogEx("纵排: colNumList=%s,specObjID-PosNum=%s-%s", colNumList, specObjID, specObjPosNum)
+            posObjIDDict = batLineup.getPosObjIDDict()
             for col in colNumList:
                 for row in range(1, 1 + ChConfig.TurnFightRows):
                     pNum = (row - 1) * ChConfig.TurnFightCols + col
                     #GameWorld.DebugLogEx("    col=%s,row=%s,pNum=%s", col, row, pNum)
-                    if pNum not in batLineup.posObjIDDict:
+                    if pNum not in posObjIDDict:
                         continue
-                    tagObjID = batLineup.posObjIDDict[pNum]
+                    tagObjID = posObjIDDict[pNum]
                     tagBatObj = batObjMgr.getBatObj(tagObjID)
                     if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
                         continue
@@ -403,13 +424,14 @@
                 
             GameWorld.DebugLogEx("全部: colNumList=%s,specObjID-PosNum=%s-%s", colNumList, specObjID, specObjPosNum)
             # 按前排优先原则
+            posObjIDDict = batLineup.getPosObjIDDict()
             for row in range(1, 1 + ChConfig.TurnFightRows):
                 for col in colNumList:
                     pNum = (row - 1) * ChConfig.TurnFightCols + col
                     #GameWorld.DebugLogEx("    col=%s,row=%s,pNum=%s", col, row, pNum)
-                    if pNum not in batLineup.posObjIDDict:
+                    if pNum not in posObjIDDict:
                         continue
-                    tagObjID = batLineup.posObjIDDict[pNum]
+                    tagObjID = posObjIDDict[pNum]
                     tagBatObj = batObjMgr.getBatObj(tagObjID)
                     if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
                         continue
@@ -541,7 +563,7 @@
     batObjMgr = BattleObj.GetBatObjMgr()
     for num in lineupNumList:
         batLineup = batFaction.getBatlineup(num)
-        for tagID in batLineup.posObjIDDict.values():
+        for tagID in batLineup.getBatHeroObjIDList():
             tagObj = batObjMgr.getBatObj(tagID)
             if tagObj.IsAlive() and tagObj.CheckInState(checkInStates):
                 return lineupNum, changeTagSet
@@ -577,13 +599,14 @@
         
     GameWorld.DebugLogEx("前后排: rowNumList=%s,colNumList=%s,specObjID-PosNum=%s-%s", rowNumList, colNumList, specObjID, specObjPosNum)
     aimObjList = []
+    posObjIDDict = batLineup.getPosObjIDDict()
     for row in rowNumList:
         for col in colNumList:
             pNum = (row - 1) * ChConfig.TurnFightCols + col
             #GameWorld.DebugLogEx("    row=%s,col=%s,pNum=%s", row, col, pNum)
-            if pNum not in batLineup.posObjIDDict:
+            if pNum not in posObjIDDict:
                 continue
-            tagObjID = batLineup.posObjIDDict[pNum]
+            tagObjID = posObjIDDict[pNum]
             tagBatObj = batObjMgr.getBatObj(tagObjID)
             if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
                 continue
@@ -608,13 +631,14 @@
     row = inRowNum # 目标玩家所在横排
     
     batObjMgr = BattleObj.GetBatObjMgr()
-    batLineup = tagObj.GetBatLineup()
+    batLineup = tagObj.GetTFBatLineup()
     aimObjList = []
+    posObjIDDict = batLineup.getPosObjIDDict()
     for col in colNumList:
         pNum = (row - 1) * ChConfig.TurnFightCols + col
-        if pNum not in batLineup.posObjIDDict:
+        if pNum not in posObjIDDict:
             continue
-        tagObjID = batLineup.posObjIDDict[pNum]
+        tagObjID = posObjIDDict[pNum]
         tagBatObj = batObjMgr.getBatObj(tagObjID)
         if not tagBatObj.IsAlive():
             continue
@@ -637,13 +661,14 @@
     col = inColNum # 目标玩家所在纵排
     
     batObjMgr = BattleObj.GetBatObjMgr()
-    batLineup = tagObj.GetBatLineup()
+    batLineup = tagObj.GetTFBatLineup()
     aimObjList = []
+    posObjIDDict = batLineup.getPosObjIDDict()
     for row in range(1, 1 + ChConfig.TurnFightRows):
         pNum = (row - 1) * ChConfig.TurnFightCols + col
-        if pNum not in batLineup.posObjIDDict:
+        if pNum not in posObjIDDict:
             continue
-        tagObjID = batLineup.posObjIDDict[pNum]
+        tagObjID = posObjIDDict[pNum]
         tagBatObj = batObjMgr.getBatObj(tagObjID)
         if not tagBatObj.IsAlive():
             continue
@@ -695,12 +720,13 @@
         colNumList.insert(0, inColNum)
         
     # 按前排优先原则
+    posObjIDDict = batLineup.getPosObjIDDict()
     for row in range(ChConfig.TurnFightRows):
         for col in colNumList:
             pNum = row * ChConfig.TurnFightCols + col
-            if pNum not in batLineup.posObjIDDict:
+            if pNum not in posObjIDDict:
                 continue
-            tagObjID = batLineup.posObjIDDict[pNum]
+            tagObjID = posObjIDDict[pNum]
             tagBatObj = batObjMgr.getBatObj(tagObjID)
             if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf=True):
                 continue
@@ -1395,6 +1421,8 @@
     # 优先处理afterLogic,可再预先汇总一些会触发被动的信息
     relatedSkillID = useSkill.GetSkillID()
     delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
+    beControlledHardDict = {} # 受控目标 {objID:buff, ...}
+    beDotBuffDict = {} # 被添加dot的目标 {objID:buff, ...}
     afterLogicList = useSkill.GetAfterLogicList()
     for logicType, logicData in afterLogicList:
         if logicType == ChConfig.AfterLogic_DelBuff:
@@ -1413,6 +1441,15 @@
             buff = logicData[1]
             TurnBuff.SyncBuffRefresh(turnFight, buffObj, buff, relatedSkillID)
             
+        # 统计添加buff需要触发的被动
+        elif logicType == ChConfig.AfterLogic_TriggerAddBuff:
+            triggerType, batObj, buff, buffOwner = logicData
+            if buffOwner.GetID() == curID:
+                if triggerType == ChConfig.TriggerWay_BeControlledHard:
+                    beControlledHardDict[batObj.GetID()] = buff
+                elif triggerType == ChConfig.TriggerWay_AddDOTBuff:
+                    beDotBuffDict[batObj.GetID()] = buff
+                    
     # 统计击杀
     killObjList = [] # 击杀其他阵营目标列表
     dieObjList = [] # 死亡的单位列表,包含友方单位或自己
@@ -1555,7 +1592,7 @@
             batFaction = turnFight.getBatFaction(faction)
             for lineupNum in batFaction.lineupDict.keys():
                 batLineup = batFaction.getBatlineup(lineupNum)
-                for lineupObjID in batLineup.posObjIDDict.values():
+                for lineupObjID in batLineup.getBatHeroObjIDList():
                     lineupObj = batObjMgr.getBatObj(lineupObjID)
                     if not lineupObj.IsAlive():
                         continue
@@ -1581,7 +1618,7 @@
         
     # 曹仁防护触发,暂写死
     for tagObj in caorenProtectList:
-        tagBatLineup = tagObj.GetBatLineup()
+        tagBatLineup = tagObj.GetTFBatLineup()
         caorenObj = tagBatLineup.getHeroObj(ChConfig.HeroID_Caoren) # 获取被防护目标阵容的曹仁
         if not caorenObj or not caorenObj.IsAlive():
             continue
@@ -1596,7 +1633,9 @@
     triggerOne = False
     batType = useSkill.GetBatType()
     isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
-    curBatLineup = None
+    curBatLineup = curObj.GetTFBatLineup()
+    curMGObj = curBatLineup.getMinggeObj()
+    mgTriggerWayList = [] # 命格本次技能已触发方式列表,命格固定只触发一次
     for tagObj in tagObjListAll:
         tagID = tagObj.GetID()
         
@@ -1653,6 +1692,21 @@
             TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Stun, tagObj, connSkill=useSkill)
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeStun, curObj, connSkill=useSkill)
             
+        # 控制
+        if tagID in beControlledHardDict:
+            buff = beControlledHardDict[tagID]
+            if buff.GetCurBuffState() == ChConfig.BatObjState_Frozen:
+                if curMGObj and ChConfig.TriggerWay_Frozen not in mgTriggerWayList:
+                    mgTriggerWayList.append(ChConfig.TriggerWay_Frozen)
+                    TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Frozen, tagObj, connSkill=useSkill, byBatObj=curObj)
+            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeControlledHard, curObj, connSkill=useSkill, connBuff=buff)
+            
+        # 附加dot
+        if tagID in beDotBuffDict:
+            if curMGObj and ChConfig.TriggerWay_AddDOTBuff not in mgTriggerWayList:
+                mgTriggerWayList.append(ChConfig.TriggerWay_AddDOTBuff)
+                TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_AddDOTBuff, tagObj, connSkill=useSkill, byBatObj=curObj)
+                
         # 暴击
         if tagID in superHitObjIDList:
             TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill)
@@ -1676,6 +1730,10 @@
         # 追击
         elif batType == ChConfig.TurnBattleType_Pursue:
             TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Pursue, tagObj, connSkill=useSkill)
+            if isAttackDirect:
+                if curMGObj and ChConfig.TriggerWay_PursueAtk not in mgTriggerWayList:
+                    mgTriggerWayList.append(ChConfig.TriggerWay_PursueAtk)
+                    TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_PursueAtk, tagObj, connSkill=useSkill, byBatObj=curObj)
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
         # 反击
         elif batType == ChConfig.TurnBattleType_AtkBack:
@@ -1684,10 +1742,8 @@
             
             
         # 敌友方
-        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():
+        if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt or tagID in beControlledHardDict:
+            for lineupObjID in curBatLineup.getBatHeroObjIDList():
                 lineupObj = batObjMgr.getBatObj(lineupObjID)
                 if not lineupObj.IsAlive():
                     continue
@@ -1703,6 +1759,10 @@
                     if not triggerOne:
                         TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDotHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
                         
+                # 敌方被控时
+                if tagID in beControlledHardDict and lineupObj.GetFaction() != tagObj.GetFaction():
+                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyBeControlledHard, tagObj, connSkill=useSkill)
+                    
                 # 连击
                 if batType == ChConfig.TurnBattleType_Combo:
                     TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
@@ -1727,9 +1787,7 @@
     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])
+    dongbaiObj = batLineup.getHeroObj(ChConfig.HeroID_Dongbai)
     if not dongbaiObj or dongbaiObj.IsAlive():
         return
     skill = dongbaiObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_DongbaiRevive)
@@ -1985,7 +2043,7 @@
     @param effectID: 被动效果ID
     注:可能由A引起触发B技能的效果释放技能C
     '''
-    if not passiveSkill:
+    if not passiveSkill or not batObj:
         return
     if isinstance(passiveSkill, int):
         passiveSkillID = passiveSkill
@@ -2065,8 +2123,8 @@
     '''按公式计算伤害,默认按攻击计算
     '''
     
-    #mapID = turnFight.mapID
     skillID = curSkill.GetSkillID()
+    #mapID = turnFight.mapID
     pmType = GetPMType(atkObj, curSkill)
     ignoreDef = IsIgnoreDef(curSkill)
     batType = curSkill.GetBatType()
@@ -2091,10 +2149,7 @@
         mustHit = True
         
     angerOverflow = atkObj.GetAngerOverflow() # 怒气溢出值
-    if isAngerSkill:
-        curXP = atkObj.GetXP()
-        GameWorld.DebugLogEx("怒技攻击! curXP=%s,angerOverflow=%s", curXP, angerOverflow)
-        
+    
     #命中公式 攻击方类型不同,公式不同
     if not mustHit and not curSkill.GetEffectByID(ChConfig.SkillEff_MustHit) and not defObj.IsInControlledHard():
         aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_MissRateDef) #atkObj.GetHit() # 抗闪避率 - 命中
@@ -2126,7 +2181,6 @@
         aSuperDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_SuperDamPer, curSkill)
         
         dSuperDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPerDef)
-        GameWorld.DebugLogEx("aSuperDamPer=%s,dSuperDamPerDef=%s", aSuperDamPer, dSuperDamPerDef)
         
     if isParry:
         hurtTypes |= pow(2, ChConfig.HurtAtkType_Parry)
@@ -2154,6 +2208,32 @@
     aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddFinalDamPer, curSkill)
     aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_FinalDamPer, curSkill)
     
+    #招架  - 无视攻击方最终增伤百分比
+    dZhaojia = defObj.GetBatAttrValue(ChConfig.AttrID_Zhaojia)
+    aZhaojiaDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ZhaojiaDef)
+    if dZhaojia > aZhaojiaDef:
+        perMoreValue, perReduce = IpyGameDataPY.GetFuncEvalCfg("ZhaojiaCfg", 1) # 每高与对方抗贯穿x值无视y%最终减伤
+        reducePer = (dZhaojia - aZhaojiaDef) / float(perMoreValue) * perReduce
+        reduceMin, reduceMax = IpyGameDataPY.GetFuncEvalCfg("ZhaojiaCfg", 2) # 最小无视百分比|最大无视百分比
+        if reducePer >= reduceMin and GameWorld.CanHappen(IpyGameDataPY.GetFuncCfg("ZhaojiaCfg", 3)):
+            reducePer = min(reducePer, reduceMax)
+            hurtTypes |= pow(2, ChConfig.HurtAtkType_Zhaojia)
+            aFinalDamPer = int(aFinalDamPer * (100 - reducePer) / 100.0) # 按百分比减少
+            GameWorld.DebugLogEx("dZhaojia=%s,aZhaojiaDef=%s,reducePer=%s,aFinalDamPer=%s", dZhaojia, aZhaojiaDef, reducePer, aFinalDamPer)
+            
+    #贯穿  - 无视防守方最终减伤百分比
+    aGuanchuan = atkObj.GetBatAttrValue(ChConfig.AttrID_Guanchuan)
+    dGuanchuanDef = defObj.GetBatAttrValue(ChConfig.AttrID_GuanchuanDef)
+    if aGuanchuan > dGuanchuanDef:
+        perMoreValue, perReduce = IpyGameDataPY.GetFuncEvalCfg("GuanchuanCfg", 1) # 每高与对方抗贯穿x值无视y%最终减伤
+        reducePer = (aGuanchuan - dGuanchuanDef) / float(perMoreValue) * perReduce
+        reduceMin, reduceMax = IpyGameDataPY.GetFuncEvalCfg("GuanchuanCfg", 2) # 最小无视百分比|最大无视百分比
+        if reducePer >= reduceMin and GameWorld.CanHappen(IpyGameDataPY.GetFuncCfg("GuanchuanCfg", 3)):
+            reducePer = min(reducePer, reduceMax)
+            hurtTypes |= pow(2, ChConfig.HurtAtkType_Guanchuan)
+            dFinalDamPerDef = int(dFinalDamPerDef * (100 - reducePer) / 100.0) # 按百分比减少
+            GameWorld.DebugLogEx("aGuanchuan=%s,dGuanchuanDef=%s,reducePer=%s,dFinalDamPerDef=%s", aGuanchuan, dGuanchuanDef, reducePer, dFinalDamPerDef)   
+            
     aNormalSkillPer, dNormalSkillPerDef = 0, 0
     if isTurnNormalSkill:
         aNormalSkillPer = atkObj.GetBatAttrValue(ChConfig.AttrID_NormalSkillPer) # 普技增伤
@@ -2216,7 +2296,6 @@
     if turnFight.isPVP() > 0:
         aPVPDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_PVPDamPer)
         dPVPDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_PVPDamPerDef)
-        GameWorld.DebugLogEx("PVP aPVPDamPer=%s,dPVPDamPerDef=%s", aPVPDamPer, dPVPDamPerDef)
         
     # 所有万分率参数统一除10000.0
     atkSkillPer /= 10000.0
@@ -2245,19 +2324,30 @@
     
     if calcType != ChConfig.Def_Calc_Attack:
         aAtk = GetCalcBaseValue(calcType, atkObj, defObj, curSkill)
-    GameWorld.DebugLogEx("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s/%s,hurtTypes=%s,aBatDamPer=%s,aFinalDamPer=%s", 
-                         atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, dMaxHP, hurtTypes, aBatDamPer, aFinalDamPer)
-    #GameWorld.DebugLogEx("aCountry=%s,dCountry=%s,aCountryDamPer=%s,dCountryDamPerDef=%s", aCountry, dCountry, aCountryDamPer, dCountryDamPerDef)
-    
+    GameWorld.DebugLogEx("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s/%s,hurtTypes=%s,aBatDamPer=%s,dBatDamPerDef=%s,aFinalDamPer=%s,dFinalDamPerDef=%s", 
+                         atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, dMaxHP, hurtTypes, aBatDamPer, dBatDamPerDef, aFinalDamPer, dFinalDamPerDef)
+    if isSuperHit:
+        GameWorld.DebugLogEx("    暴击 aSuperDamPer=%s,dSuperDamPerDef=%s", aSuperDamPer, dSuperDamPerDef)
+    if aPMDamPer or dPMDamPerDef:
+        GameWorld.DebugLogEx("    物法 aPMDamPer=%s,dPMDamPerDef=%s,pmType=%s", aPMDamPer, dPMDamPerDef, pmType)
+    if aComboDamPer or dComboDamPerDef:
+        GameWorld.DebugLogEx("    连击 aComboDamPer=%s,dComboDamPerDef=%s", aComboDamPer, dComboDamPerDef)
+    if aPursueDamPer or dPursueDamPerDef:
+        GameWorld.DebugLogEx("    追击 aPursueDamPer=%s,dPursueDamPerDef=%s", aPursueDamPer, dPursueDamPerDef)
+    if aPVPDamPer or dPVPDamPerDef:
+        GameWorld.DebugLogEx("    PVP aPVPDamPer=%s,dPVPDamPerDef=%s", aPVPDamPer, dPVPDamPerDef)
+    if aCountryDamPer or dCountryDamPerDef:
+        GameWorld.DebugLogEx("    国家 aCountry=%s,dCountry=%s,aCountryDamPer=%s,dCountryDamPerDef=%s", aCountry, dCountry, aCountryDamPer, dCountryDamPerDef)
+        
     if isTurnNormalSkill:
         hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 1))
         GameWorld.DebugLogEx("    普攻技能伤害=%s,aNormalSkillPer=%s,dNormalSkillPerDef=%s", hurtValue, aNormalSkillPer, dNormalSkillPerDef)
     elif isAngerSkill:
         hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 2))
-        GameWorld.DebugLogEx("    怒气技能伤害=%s,aAngerSkillPer=%s,dAngerSkillPerDef=%s", hurtValue, aAngerSkillPer, dAngerSkillPerDef)
+        GameWorld.DebugLogEx("    怒气技能伤害=%s,aAngerSkillPer=%s,dAngerSkillPerDef=%s,angerOverflow=%s,curXP=%s", hurtValue, aAngerSkillPer, dAngerSkillPerDef, angerOverflow, atkObj.GetXP())
     elif isDot:
         hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
-        GameWorld.DebugLogEx("    持续技能伤害=%s" % (hurtValue))
+        GameWorld.DebugLogEx("    持续技能伤害=%s,aDOTPer=%s,dDOTPerDef=%s", hurtValue, aDOTPer, dDOTPerDef)
     elif calcType == ChConfig.Def_Calc_ByBuffValue:
         hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 2))
         GameWorld.DebugLogEx("    按最后一次buff值计算伤害=%s,calcType=%s,LastHurt=%s", hurtValue, calcType, aAtk)
@@ -2564,12 +2654,10 @@
                          faction, lineupNum, hurtValueDict, immuneHurtDict)
     # 按优先级顺序处理拥有分摊效果的武将
     for effHeroID in effHeroIDList:
-        if effHeroID not in batLineup.heroObjIDDict:
-            continue
-        objID = batLineup.heroObjIDDict[effHeroID]
-        batObj = batObjMgr.getBatObj(objID)
+        batObj = batLineup.getHeroObj(effHeroID)
         if not batObj or not batObj.IsAlive():
             continue
+        objID = batObj.GetID()
         buffMgr = batObj.GetBuffManager()
         
         inHurt = objID in hurtValueDict # 光环里的人员是否有受伤
@@ -2805,7 +2893,7 @@
     for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamBackShield):
         damBackPer += buff.GetValue1()
         connSkillTypeID = buff.GetSkillTypeID()
-        damBackPer += TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_AddSkillPerByBuffLayer, connSkillTypeID=connSkillTypeID)
+        damBackPer += TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_AddDamBackPerByBuffLayer, connSkillTypeID=connSkillTypeID)
         
     if damBackPer <= 0:
         return
@@ -3027,6 +3115,43 @@
     useSkill.ResetUseRec()
     return
 
+def DoHurtExAtk(turnFight, atkObj, defObj, hurtValue, skillID, hurtTypes=0):
+    ## 额外结算指定伤害
+    skillIpyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
+    if not skillIpyData:
+        return
+    
+    atkID = atkObj.GetID()
+    defID = defObj.GetID()
+    
+    # 结算需要同步标签
+    useTag = "Skill_%s_%s_Dot_%s" % (atkID, skillID, atkObj.GetIncrementValue()) # 复用dot的标签
+    Sync_TurnFightTag(turnFight, useTag, 0)
+    
+    dHP = defObj.GetHP()
+    dMaxHP = defObj.GetMaxHP()
+    GameWorld.DebugLogEx("额外结算指定伤害: atkID=%s,defID=%s,skillID=%s,hurtValue=%s,,dHP=%s/%s", 
+                         atkID, defID, skillID, hurtValue, dHP, dMaxHP)
+    
+    useSkill = BattleObj.PySkill(skillIpyData, atkID)
+    useSkill.SetTagObjList([defObj])
+    useSkill.SetBatType(ChConfig.TurnBattleType_Dot) # 要修改表现的话等前端同步修改
+    
+    hurtTypes |= pow(2, ChConfig.HurtAtkType_Hurt) # 确保有基础的伤害类型
+    hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
+    calcHurtResults = [[defObj, hurtValue, hurtTypes, immuneHurt]]
+    DoSkillHurtHP(turnFight, atkObj, useSkill, calcHurtResults, "HurtExAtk")
+    
+    Sync_UseSkill(turnFight, atkObj, useSkill)
+    
+    DoBeAttackResult(turnFight, atkObj, useSkill)
+    
+    # 通知结束标签
+    Sync_TurnFightTag(turnFight, useTag, 1)
+    
+    useSkill.ResetUseRec()
+    return True
+
 def Sync_TurnFightTag(turnFight, useTag, sign):
     ## 通知技能标签
     clientPack = ChPyNetSendPack.tagSCTurnFightTag()

--
Gitblit v1.8.0