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