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