From 39f07767d2d7d1533ef07f384d35da75517d5f65 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 05 十一月 2025 17:47:31 +0800
Subject: [PATCH] 125 战斗 吸血跟反伤

---
 Main/System/Battle/BattleUtility.cs             |    5 +
 Main/System/Battle/BattleObject/BattleObject.cs |   23 ++---
 Main/System/Battle/Skill/SkillBase.cs           |   55 ++++++++++++-
 Main/System/Battle/Define/BattleDmgInfo.cs      |  122 ++++++++++++++++++++++--------
 4 files changed, 151 insertions(+), 54 deletions(-)

diff --git a/Main/System/Battle/BattleObject/BattleObject.cs b/Main/System/Battle/BattleObject/BattleObject.cs
index 24b2e63..7040934 100644
--- a/Main/System/Battle/BattleObject/BattleObject.cs
+++ b/Main/System/Battle/BattleObject/BattleObject.cs
@@ -291,14 +291,11 @@
         return true;
     }
 
-    public virtual void Hurt(List<long> damageValues, long _totalDamage,
-        HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig, int hitIndex,
-        BattleDrops battleDrops, HB422_tagMCTurnFightObjDead deadPack,
-        long fromHp, long toHp)
+    public virtual void Hurt(BattleHurtParam battleHurtParam)
     {
-        bool isLastHit = hitIndex >= skillConfig.DamageDivide.Length - 1;
-        bool firstHit = hitIndex == 0;
-        BattleDmgInfo dmgInfo = PopDamage(damageValues, _totalDamage, hurt, skillConfig, isLastHit, fromHp, toHp);
+        bool isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1;
+        bool firstHit = battleHurtParam.hitIndex == 0;
+        BattleDmgInfo dmgInfo = PopDamage(battleHurtParam);
 
 
         //  杩欓噷
@@ -318,7 +315,7 @@
 
 
 
-        bool isFatalAttack = (null != deadPack) && isLastHit;
+        bool isFatalAttack = (null != battleHurtParam.deadPack) && isLastHit;
 
         if (isFatalAttack)
         {
@@ -326,7 +323,7 @@
             {
                 PushDropItems(battleDrops);
             }
-            battleField.OnObjsDead(new List<HB422_tagMCTurnFightObjDead>() { deadPack });
+            battleField.OnObjsDead(new List<HB422_tagMCTurnFightObjDead>() { battleHurtParam.deadPack });
             
         }
         else
@@ -421,14 +418,12 @@
     }
 
     // 浼ゅ杩樿鐪� 鏄惁闂伩 鏆村嚮 and so on 闇�瑕佹湁涓�涓狣amageType 鏈嶅姟鍣ㄥ簲璇ヤ細缁�
-    protected virtual BattleDmgInfo PopDamage(List<long> damageValues, long _totalDamage, 
-        HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig, bool isLastHit,
-        long fromHp, long toHp)
+    protected virtual BattleDmgInfo PopDamage(BattleHurtParam battleHurtParam)
     {
-        BattleDmgInfo battleDmgInfo = new BattleDmgInfo(battleField.guid, damageValues, this, hurt, skillConfig, isLastHit);
+        BattleDmgInfo battleDmgInfo = new BattleDmgInfo(battleField.guid, battleHurtParam);
 
         // 浣跨敤浼犲叆鐨� fromHp 鍜� toHp 鏇存柊琛�鏉℃樉绀�
-        heroInfoBar.UpdateHP(fromHp, toHp, teamHero.maxHp);
+        heroInfoBar.UpdateHP(battleHurtParam.fromHp, battleHurtParam.toHp, teamHero.maxHp);
 
         // YYL TODO 鏄惁闇�瑕佹寕鍦ㄥ湪鑷韩鐨刦ollow鐐逛笂
         EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo);
diff --git a/Main/System/Battle/BattleUtility.cs b/Main/System/Battle/BattleUtility.cs
index 201d318..6b8e4e6 100644
--- a/Main/System/Battle/BattleUtility.cs
+++ b/Main/System/Battle/BattleUtility.cs
@@ -306,6 +306,11 @@
     /// <returns>杩欎竴鍑诲唴姣忎竴娈电殑浼ゅ鍊煎垪琛�</returns>
     public static List<long> DivideDamageToList(int[][] damageDivideList, int hitIndex, long totalDamage)
     {
+        if (totalDamage <= 0)
+        {
+            return new List<long>{};
+        }
+
         if (damageDivideList == null || damageDivideList.Length == 0)
         {
             Debug.LogError("damageDivideList 涓虹┖鎴栭暱搴︿负0");
diff --git a/Main/System/Battle/Define/BattleDmgInfo.cs b/Main/System/Battle/Define/BattleDmgInfo.cs
index 2a45a98..7e06229 100644
--- a/Main/System/Battle/Define/BattleDmgInfo.cs
+++ b/Main/System/Battle/Define/BattleDmgInfo.cs
@@ -16,12 +16,14 @@
 {
 
     public string battleFieldGuid { get; private set; }
-    public List<long> damageList { get; private set; }
-    public BattleObject hurtObj { get; private set; }
 
-    public HB427_tagSCUseSkill.tagSCUseSkillHurt hurt { get; private set; }
+    public BattleHurtParam battleHurtParam { get; private set; }
+    public List<long> damageList { get { return battleHurtParam.damageList; } }
+    public BattleObject hurtObj { get { return battleHurtParam.hurtObj; } }
 
-    public SkillConfig skillConfig { get; private set; }
+    public HB427_tagSCUseSkill.tagSCUseSkillHurt hurt { get { return battleHurtParam.hurt; } }
+
+    public SkillConfig skillConfig { get { return battleHurtParam.skillConfig; } }
 
     //  鏄惁琚牸鎸′簡
     public bool isBlocked = false;
@@ -30,14 +32,11 @@
 
     public List<BattleDmg> battleDamageList = new List<BattleDmg>();
 
-    public BattleDmgInfo(string battleFieldGuid, List<long> damageList, BattleObject hurtObj, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig, bool isLastHit)
+    public BattleDmgInfo(string battleFieldGuid, BattleHurtParam battleHurtParam)
     {
         this.battleFieldGuid = battleFieldGuid;
-        this.damageList = damageList;
-        this.hurtObj = hurtObj;
-        this.hurt = hurt;
-        this.skillConfig = skillConfig;
-        this.isLastHit = isLastHit;
+        this.battleHurtParam = battleHurtParam;
+        this.isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1;
         HandleDamageType();
         HandleAttackTypeAndDamage();
     }
@@ -62,10 +61,40 @@
         int rawAttackType = (int)hurt.AttackTypes;
         float blockRatio = GeneralDefine.blockRatio; // 鏍兼尅鍑忎激鐜�
 
+        // 澶勭悊姣忎竴娈典激瀹冲強鍏跺搴旂殑鍙嶄激鍜屽惛琛�
         for (int i = 0; i < damageList.Count; i++)
         {
             long actualDamage = damageList[i];
 
+            // ============ 1. 鍏堝鐞嗗綋鍓嶆瀵瑰簲鐨勫弽浼� ============
+            if (battleHurtParam.reflectHpList != null && i < battleHurtParam.reflectHpList.Count)
+            {
+                long reflectHp = battleHurtParam.reflectHpList[i];
+                if (reflectHp > 0)
+                {
+                    battleDamageList.Add(new BattleDmg 
+                    { 
+                        damage = reflectHp, 
+                        attackType = (int)DamageType.Reflect 
+                    });
+                }
+            }
+
+            // ============ 2. 鐒跺悗澶勭悊褰撳墠娈靛搴旂殑鍚歌 ============
+            if (battleHurtParam.suckHpList != null && i < battleHurtParam.suckHpList.Count)
+            {
+                long suckHp = battleHurtParam.suckHpList[i];
+                if (suckHp > 0)
+                {
+                    battleDamageList.Add(new BattleDmg 
+                    { 
+                        damage = suckHp, 
+                        attackType = (int)DamageType.SuckHP 
+                    });
+                }
+            }
+
+            // ============ 3. 鏈�鍚庡鐞嗕富瑕佷激瀹� ============
             // 鏍兼尅澶勭悊
             if (isBlocked)
             {
@@ -82,21 +111,22 @@
                 {
                     int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0);
                     battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType });
-                    continue;
                 }
-
-                // 鏅�氫激瀹�/娌荤枟澶勭悊
-                if (DamageNumConfig.Get(attackType) == null)
+                else
                 {
-                    UnityEngine.Debug.LogError($"鏈嶅姟鍣ㄧ粰鐨勪激瀹崇被鍨嬩笉瀵癸紝寮哄埗杞崲涓烘櫘閫氫激瀹�/娌荤枟, attackType: {attackType}");
-                    if ((attackType & (int)DamageType.Damage) != 0)
-                        attackType = (int)DamageType.Damage;
-                    else if ((attackType & (int)DamageType.Recovery) != 0)
-                        attackType = (int)DamageType.Recovery;
-                    else
-                        UnityEngine.Debug.LogError($"寮哄埗杞崲澶辫触锛岃绫诲瀷涓嶆槸娌荤枟涔熶笉鏄激瀹� {attackType}");
+                    // 鏅�氫激瀹�/娌荤枟澶勭悊
+                    if (DamageNumConfig.Get(attackType) == null)
+                    {
+                        UnityEngine.Debug.LogError($"鏈嶅姟鍣ㄧ粰鐨勪激瀹崇被鍨嬩笉瀵癸紝寮哄埗杞崲涓烘櫘閫氫激瀹�/娌荤枟, attackType: {attackType}");
+                        if ((attackType & (int)DamageType.Damage) != 0)
+                            attackType = (int)DamageType.Damage;
+                        else if ((attackType & (int)DamageType.Recovery) != 0)
+                            attackType = (int)DamageType.Recovery;
+                        else
+                            UnityEngine.Debug.LogError($"寮哄埗杞崲澶辫触锛岃绫诲瀷涓嶆槸娌荤枟涔熶笉鏄激瀹� {attackType}");
+                    }
+                    battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType });
                 }
-                battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType });
             }
             else
             {
@@ -107,21 +137,22 @@
                 {
                     int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0);
                     battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType });
-                    continue;
                 }
-
-                // 鏅�氫激瀹�/娌荤枟澶勭悊
-                if (DamageNumConfig.Get(attackType) == null)
+                else
                 {
-                    UnityEngine.Debug.LogError($"鏈嶅姟鍣ㄧ粰鐨勪激瀹崇被鍨嬩笉瀵癸紝寮哄埗杞崲涓烘櫘閫氫激瀹�/娌荤枟, attackType: {attackType}");
-                    if ((attackType & (int)DamageType.Damage) != 0)
-                        attackType = (int)DamageType.Damage;
-                    else if ((attackType & (int)DamageType.Recovery) != 0)
-                        attackType = (int)DamageType.Recovery;
-                    else
-                        UnityEngine.Debug.LogError($"寮哄埗杞崲澶辫触锛岃绫诲瀷涓嶆槸娌荤枟涔熶笉鏄激瀹� {attackType}");
+                    // 鏅�氫激瀹�/娌荤枟澶勭悊
+                    if (DamageNumConfig.Get(attackType) == null)
+                    {
+                        UnityEngine.Debug.LogError($"鏈嶅姟鍣ㄧ粰鐨勪激瀹崇被鍨嬩笉瀵癸紝寮哄埗杞崲涓烘櫘閫氫激瀹�/娌荤枟, attackType: {attackType}");
+                        if ((attackType & (int)DamageType.Damage) != 0)
+                            attackType = (int)DamageType.Damage;
+                        else if ((attackType & (int)DamageType.Recovery) != 0)
+                            attackType = (int)DamageType.Recovery;
+                        else
+                            UnityEngine.Debug.LogError($"寮哄埗杞崲澶辫触锛岃绫诲瀷涓嶆槸娌荤枟涔熶笉鏄激瀹� {attackType}");
+                    }
+                    battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType });
                 }
-                battleDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType });
             }
         }
     }
@@ -146,4 +177,27 @@
         return skillConfig.HurtType / 10 == 1;
     }
 
+}
+
+public class BattleHurtParam
+{
+    public BattleObject casterObj;
+    public BattleObject hurtObj;
+    public List<long> damageList;
+    public List<long> suckHpList;
+    public List<long> reflectHpList;
+
+    public long fromHp;
+
+    public long toHp;
+
+    public BattleDrops battleDrops;
+
+    public HB427_tagSCUseSkill.tagSCUseSkillHurt hurt;
+
+    public int hitIndex;
+
+    public HB422_tagMCTurnFightObjDead deadPack;
+
+    public SkillConfig skillConfig;
 }
\ No newline at end of file
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 8cf3584..172bbe1 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -466,6 +466,18 @@
         // ============ 绗簩姝�:鍒锋柊瀹為檯琛�閲� ============
         long fromHp = target.teamHero.curHp;
         
+
+
+        // ============澶勭悊鍚歌璺熷弽浼� ===============
+        //  涔熻鎸夋瘡涓�鍑诲钩鍧囩畻 鏈�鍚庤琛ラ綈浼ゅ
+        long suckHp = hurt.SuckHP;
+        long reflectHp = hurt.BounceHP;
+
+        List<long> suckHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, suckHp);
+
+        List<long> reflectHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, hurt.BounceHP);
+        // long currentSuckHp = suckHp / tagUseSkillAttack.HurtCount;
+
         // 璁$畻褰撳墠杩欎竴鍑荤殑瀹為檯浼ゅ(鎵�鏈夊垎娈典激瀹充箣鍜�)
         long currentHitDamage = 0;
         foreach (long dmg in damageList)
@@ -473,7 +485,20 @@
             currentHitDamage += dmg;
         }
 
-        long toHp = Math.Max(0, fromHp - currentHitDamage);
+        long currentHitSuckHp = 0;
+        foreach (long suck in suckHpList)
+        {
+            currentHitSuckHp += suck;
+        }
+
+        long currentHitReflectHp = 0;
+        foreach (long reflect in reflectHpList)
+        {
+            currentHitReflectHp += reflect;
+        }
+
+        long toHp = Math.Max(0, fromHp - currentHitDamage + currentHitSuckHp - currentHitReflectHp);
+
 
         // 鏇存柊鐩爣琛�閲�
         target.teamHero.curHp = toHp;
@@ -485,6 +510,8 @@
             $"鐩爣: {target.teamHero.name}\n" +
             $"鎶�鑳�: {skillConfig.SkillName} (绗瑊_hitIndex}鍑�)\n" +
             $"浼ゅ: {currentHitDamage} (鎬讳激瀹�: {totalDamage})\n" +
+            $"鍚歌: {currentHitSuckHp}\n" +
+            $"鍙嶄激: {currentHitReflectHp}\n" +
             $"琛�閲忓彉鍖�: {fromHp} -> {toHp}"
         );
 #endif
@@ -497,12 +524,28 @@
         tempDropList.TryGetValue(objID, out BattleDrops battleDrops);
         tempDeadPackList.TryGetValue(objID, out HB422_tagMCTurnFightObjDead deadPack);
 
-        // ============ 绗洓姝�:鎵ц琛ㄧ幇(椋樺瓧銆佸姩鐢荤瓑) ============
-        target.Hurt(damageList, totalDamage, hurt, skillConfig, _hitIndex, battleDrops, deadPack, fromHp, toHp);
 
-        // ============ 绗簲姝�:澶勭悊鏂芥硶鑰呯浉鍏虫晥鏋� ============
-        caster.SuckHp(hurt.SuckHP, skillConfig);
-        caster.HurtByReflect(hurt.BounceHP, skillConfig);
+        //  鍙傛暟鎵撳寘
+        BattleHurtParam hurtParam = new BattleHurtParam()
+        {
+            casterObj = caster,
+            hurtObj = target,
+            damageList = damageList,
+            suckHpList = suckHpList,
+            reflectHpList = reflectHpList,
+            fromHp = fromHp,
+            toHp = toHp,
+            battleDrops = battleDrops,
+            hurt = hurt,
+            hitIndex = _hitIndex,
+            deadPack = deadPack,
+            skillConfig = skillConfig
+        };
+
+        // ============ 绗洓姝�:鎵ц琛ㄧ幇(椋樺瓧銆佸姩鐢荤瓑) ============
+        target.Hurt(hurtParam);
+
+
     }
 
     // 澶勭悊HP鍒锋柊鍖咃紙绠�鍖栭�昏緫锛�

--
Gitblit v1.8.0