From 7f9ec6d10ebb5d741b10e2b4168b11ad0ebb22cd Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期二, 11 十一月 2025 17:05:01 +0800
Subject: [PATCH] 125 战斗 飘血 护盾 满怒气 吸血反伤拆分

---
 Main/System/Battle/Define/BattleDmgInfo.cs |  363 ++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 254 insertions(+), 109 deletions(-)

diff --git a/Main/System/Battle/Define/BattleDmgInfo.cs b/Main/System/Battle/Define/BattleDmgInfo.cs
index f1b8588..42ba730 100644
--- a/Main/System/Battle/Define/BattleDmgInfo.cs
+++ b/Main/System/Battle/Define/BattleDmgInfo.cs
@@ -1,4 +1,5 @@
 using System.Collections.Generic;
+using UnityEngine;
 
 public class BattleDmg
 {
@@ -11,42 +12,43 @@
     }
 }
 
-
 public class BattleDmgInfo
 {
-
     public string battleFieldGuid { 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 BattleObject casterObj { get { return battleHurtParam.casterObj; } }
-
     public HB427_tagSCUseSkill.tagSCUseSkillHurt hurt { get { return battleHurtParam.hurt; } }
-
     public SkillConfig skillConfig { get { return battleHurtParam.skillConfig; } }
 
-    //  鏄惁琚牸鎸′簡
     public bool isBlocked = false;
-
     public bool isLastHit = false;
 
     public List<BattleDmg> targetDamageList = new List<BattleDmg>();
-
     public List<BattleDmg> casterDamageList = new List<BattleDmg>();
+
+    #region Initialization
 
     public BattleDmgInfo(string battleFieldGuid, BattleHurtParam battleHurtParam)
     {
         this.battleFieldGuid = battleFieldGuid;
         this.battleHurtParam = battleHurtParam;
         this.isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1;
+        
         HandleDamageType();
         HandleAttackTypeAndDamage();
     }
 
+    #endregion
+
+    #region Damage Type Processing
+
     private void HandleDamageType()
     {
+        if (hurt == null) return;
+        
         int attackTypes = 0;
         foreach (ServerDamageType serverDamageType in System.Enum.GetValues(typeof(ServerDamageType)))
         {
@@ -59,111 +61,178 @@
         hurt.AttackTypes = (uint)attackTypes;
     }
 
+    #endregion
+
+    #region Damage List Generation
+
     private void HandleAttackTypeAndDamage()
     {
         isBlocked = HaveBlockDamage();
-        int rawAttackType = (int)hurt.AttackTypes;
-        float blockRatio = GeneralDefine.blockRatio; // 鏍兼尅鍑忎激鐜�
+        int rawAttackType = hurt == null ? 0 : (int)hurt.AttackTypes;
+        
+        int maxCount = CalculateMaxDamageSegmentCount();
 
-        // 澶勭悊姣忎竴娈典激瀹冲強鍏跺搴旂殑鍙嶄激鍜屽惛琛�
-        for (int i = 0; i < damageList.Count; i++)
+        for (int i = 0; i < maxCount; i++)
         {
-            long actualDamage = damageList[i];
-
-            // ============ 1. 鍏堝鐞嗗綋鍓嶆瀵瑰簲鐨勫弽浼� ============
-            if (battleHurtParam.reflectHpList != null && i < battleHurtParam.reflectHpList.Count)
-            {
-                long reflectHp = battleHurtParam.reflectHpList[i];
-                if (reflectHp > 0)
-                {
-                    casterDamageList.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)
-                {
-                    casterDamageList.Add(new BattleDmg 
-                    { 
-                        damage = suckHp, 
-                        attackType = (int)DamageType.SuckHP 
-                    });
-                }
-            }
-
-            // ============ 3. 鏈�鍚庡鐞嗕富瑕佷激瀹� ============
-            // 鏍兼尅澶勭悊
-            if (isBlocked)
-            {
-                // 鍘绘帀鏍兼尅绫诲瀷
-                int attackType = rawAttackType & (~(int)DamageType.Block);
-
-                // 璁$畻鏍兼尅浼ゅ
-                long totalDamage = (long)(actualDamage / (1 - blockRatio));
-                long blockDmg = totalDamage - actualDamage;
-                targetDamageList.Add(new BattleDmg { damage = blockDmg, attackType = (int)DamageType.Block });
-
-                // 鐪熷疄浼ゅ鐗规畩澶勭悊
-                if (IsRealdamage())
-                {
-                    int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0);
-                    targetDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType });
-                }
-                else
-                {
-                    // 鏅�氫激瀹�/娌荤枟澶勭悊
-                    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}");
-                    }
-                    targetDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType });
-                }
-            }
-            else
-            {
-                int attackType = rawAttackType;
-
-                // 鐪熷疄浼ゅ鐗规畩澶勭悊
-                if (IsRealdamage())
-                {
-                    int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0);
-                    targetDamageList.Add(new BattleDmg { damage = actualDamage, attackType = showAttackType });
-                }
-                else
-                {
-                    // 鏅�氫激瀹�/娌荤枟澶勭悊
-                    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}");
-                    }
-                    targetDamageList.Add(new BattleDmg { damage = actualDamage, attackType = attackType });
-                }
-            }
+            ProcessReflectDamage(i);
+            ProcessSuckHpDamage(i);
+            ProcessMainDamage(i, rawAttackType);
         }
     }
 
+    /// <summary>
+    /// 璁$畻鏈�澶т激瀹虫鏁�
+    /// </summary>
+    private int CalculateMaxDamageSegmentCount()
+    {
+        int maxCount = damageList != null ? damageList.Count : 0;
+        maxCount = Mathf.Max(maxCount, battleHurtParam.suckHpList != null ? battleHurtParam.suckHpList.Count : 0);
+        maxCount = Mathf.Max(maxCount, battleHurtParam.reflectHpList != null ? battleHurtParam.reflectHpList.Count : 0);
+        return maxCount;
+    }
+
+    /// <summary>
+    /// 澶勭悊鍙嶄激浼ゅ
+    /// </summary>
+    private void ProcessReflectDamage(int segmentIndex)
+    {
+        if (battleHurtParam.reflectHpList == null || segmentIndex >= battleHurtParam.reflectHpList.Count)
+            return;
+
+        long reflectHp = battleHurtParam.reflectHpList[segmentIndex];
+        if (reflectHp > 0)
+        {
+            casterDamageList.Add(new BattleDmg
+            {
+                damage = reflectHp,
+                attackType = (int)DamageType.Reflect
+            });
+        }
+    }
+
+    /// <summary>
+    /// 澶勭悊鍚歌浼ゅ
+    /// </summary>
+    private void ProcessSuckHpDamage(int segmentIndex)
+    {
+        if (battleHurtParam.suckHpList == null || segmentIndex >= battleHurtParam.suckHpList.Count)
+            return;
+
+        long suckHp = battleHurtParam.suckHpList[segmentIndex];
+        if (suckHp > 0)
+        {
+            casterDamageList.Add(new BattleDmg
+            {
+                damage = suckHp,
+                attackType = (int)DamageType.SuckHP
+            });
+        }
+    }
+
+    /// <summary>
+    /// 澶勭悊涓昏浼ゅ
+    /// </summary>
+    private void ProcessMainDamage(int segmentIndex, int rawAttackType)
+    {
+        if (damageList == null || segmentIndex >= damageList.Count)
+            return;
+
+        long actualDamage = damageList[segmentIndex];
+
+        if (isBlocked)
+        {
+            ProcessBlockedDamage(actualDamage, rawAttackType);
+        }
+        else
+        {
+            ProcessNormalDamage(actualDamage, rawAttackType);
+        }
+    }
+
+    /// <summary>
+    /// 澶勭悊琚牸鎸$殑浼ゅ
+    /// </summary>
+    private void ProcessBlockedDamage(long actualDamage, int rawAttackType)
+    {
+        float blockRatio = GeneralDefine.blockRatio;
+        int attackType = rawAttackType & (~(int)DamageType.Block);
+
+        // 娣诲姞鏍兼尅浼ゅ鏄剧ず
+        long totalDamage = (long)(actualDamage / (1 - blockRatio));
+        long blockDmg = totalDamage - actualDamage;
+        targetDamageList.Add(new BattleDmg { damage = blockDmg, attackType = (int)DamageType.Block });
+
+        // 娣诲姞瀹為檯浼ゅ鏄剧ず
+        if (IsRealdamage())
+        {
+            AddRealdamageToList(actualDamage);
+        }
+        else
+        {
+            AddNormalDamageToList(actualDamage, attackType);
+        }
+    }
+
+    /// <summary>
+    /// 澶勭悊姝e父浼ゅ锛堟湭琚牸鎸★級
+    /// </summary>
+    private void ProcessNormalDamage(long actualDamage, int rawAttackType)
+    {
+        if (IsRealdamage())
+        {
+            AddRealdamageToList(actualDamage);
+        }
+        else
+        {
+            AddNormalDamageToList(actualDamage, rawAttackType);
+        }
+    }
+
+    /// <summary>
+    /// 娣诲姞鐪熷疄浼ゅ鍒板垪琛�
+    /// </summary>
+    private void AddRealdamageToList(long damage)
+    {
+        int showAttackType = (int)DamageType.Realdamage + (IsCrit() ? (int)DamageType.Crit : 0);
+        targetDamageList.Add(new BattleDmg { damage = damage, attackType = showAttackType });
+    }
+
+    /// <summary>
+    /// 娣诲姞鏅�氫激瀹�/娌荤枟鍒板垪琛�
+    /// </summary>
+    private void AddNormalDamageToList(long damage, int attackType)
+    {
+        attackType = ValidateAndFixAttackType(attackType);
+        targetDamageList.Add(new BattleDmg { damage = damage, attackType = attackType });
+    }
+
+    /// <summary>
+    /// 楠岃瘉骞朵慨澶嶆敾鍑荤被鍨�
+    /// </summary>
+    private int ValidateAndFixAttackType(int attackType)
+    {
+        if (DamageNumConfig.Get(attackType) != null)
+            return attackType;
+
+        UnityEngine.Debug.LogError($"鏈嶅姟鍣ㄧ粰鐨勪激瀹崇被鍨嬩笉瀵癸紝寮哄埗杞崲涓烘櫘閫氫激瀹�/娌荤枟, attackType: {attackType}");
+
+        if ((attackType & (int)DamageType.Damage) != 0)
+            return (int)DamageType.Damage;
+
+        if ((attackType & (int)DamageType.Recovery) != 0)
+            return (int)DamageType.Recovery;
+
+        UnityEngine.Debug.LogError($"寮哄埗杞崲澶辫触锛岃绫诲瀷涓嶆槸娌荤枟涔熶笉鏄激瀹� {attackType}");
+        return attackType;
+    }
+
+    #endregion
+
+    #region Type Checking
+
     public bool IsType(DamageType damageType)
     {
-        return (hurt.AttackTypes & (int)damageType) == (int)damageType;
+        return hurt != null && (hurt.AttackTypes & (int)damageType) == (int)damageType;
     }
 
     public bool IsCrit()
@@ -181,6 +250,12 @@
         return skillConfig.HurtType / 10 == 1;
     }
 
+    public bool IsDamage()
+    {
+        return IsType(DamageType.Damage) || IsRealdamage() || IsType((DamageType)11) || IsType((DamageType)12);
+    }
+
+    #endregion
 }
 
 public class BattleHurtParam
@@ -191,17 +266,87 @@
     public List<long> suckHpList;
     public List<long> reflectHpList;
 
+    public long fromShieldValue;
+    public long toShieldValue;
     public long fromHp;
-
     public long toHp;
 
     public BattleDrops battleDrops;
-
     public HB427_tagSCUseSkill.tagSCUseSkillHurt hurt;
-
     public int hitIndex;
-
     public HB422_tagMCTurnFightObjDead deadPack;
-
     public SkillConfig skillConfig;
+    public long maxHp;
+
+    #region Shield Value Calculations
+
+    public long MaxSheildValue
+    {
+        get
+        {
+            return hurtObj == null ? 0 : hurtObj.teamHero.maxHp;
+        }
+    }
+
+    public long phase1FromShieldValue
+    {
+        get
+        {
+            if (fromShieldValue > 0)
+            {
+                return Mathf.Min((int)fromShieldValue, (int)MaxSheildValue);
+            }
+            else
+            {
+                return 0;
+            }
+        }
+    }
+
+    public long phase1ToShieldValue
+    {
+        get
+        {
+            if (toShieldValue > 0)
+            {
+                return Mathf.Min((int)toShieldValue, (int)MaxSheildValue);
+            }
+            else
+            {
+                return 0;
+            }
+        }
+    }
+
+    public long phase2FromShieldValue
+    {
+        get
+        {
+            if (fromShieldValue > MaxSheildValue)
+            {
+                return fromShieldValue - MaxSheildValue;
+            }
+            else
+            {
+                return 0;
+            }
+        }
+    }
+
+    public long phase2ToShieldValue
+    {
+        get
+        {
+            if (toShieldValue > MaxSheildValue)
+            {
+                return toShieldValue - MaxSheildValue;
+            }
+            else
+            {
+                return 0;
+            }
+        }
+    }
+
+    #endregion
 }
\ No newline at end of file

--
Gitblit v1.8.0