refactor(战斗系统): 重构伤害计算逻辑并统一属性命名

- 将DAMAGE_REDUCTION统一重命名为DMG_RED以提高一致性
- 优化暴击判定逻辑,加入暴击抗性计算
- 重构伤害计算公式,整合易伤和免伤效果
- 移除冗余的calculateDamage方法
- 为枚举值添加注释说明
This commit is contained in:
2025-11-27 10:19:54 +08:00
parent bbf8dbb8cb
commit dcf739d093
4 changed files with 33 additions and 48 deletions

View File

@@ -154,10 +154,9 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
return reDate;
}
// 暴击判定
// 使用施法者的暴击率属性damageEvent.Attrs 快照)
const isCrit = this.checkChance(damageEvent.Attrs[Attrs.CRITICAL]);
if (isCrit) attackerModel?.useValueTalByAttr(Attrs.CRITICAL); // 清除施法者的暴击buff
// 计算伤害
// 使用施法者的暴击率属性damageEvent.Attrs 快照)- 被攻击者的暴击抗性属性targetAttrs.Attrs[Attrs.CRITICAL_RESIST]
const isCrit = this.checkChance(damageEvent.Attrs[Attrs.CRITICAL]-targetAttrs.Attrs[Attrs.CRITICAL_RESIST]);
// 计算基础伤害
let damage = this.dmgCount(damageEvent,targetAttrs);
if (isCrit) {
// 暴击伤害计算
@@ -166,9 +165,9 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
const casterCritDmg = damageEvent.Attrs[Attrs.CRITICAL_DMG] || 0;
damage = Math.floor(damage * (1 + (FightSet.CRIT_DAMAGE + casterCritDmg) / 100));
reDate.isCrit=true;
attackerModel?.useValueTalByAttr(Attrs.CRITICAL); // 清除施法者的暴击buff
}
// 伤害计算考虑易伤等debuff
damage = this.calculateDamage(targetAttrs, damage);
// 护盾吸收
damage =Math.floor(this.absorbShield(targetAttrs, damage))
if (damage <= 0) return reDate;
@@ -253,6 +252,8 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
let apAfter = Math.floor(apBase * (1 - apRed)); // 物理伤害 - 防御减免
let mapAfter = Math.floor(mapBase * (1 - mapRed)); // 魔法伤害 - 防御减免
// 6. 应用物理/魔法攻击力和抗性修正
// 物理伤害修正:基础伤害 * (1 + 物理攻击力加成%) * (1 - 目标物理抗性%)
apAfter = this.applyPR(apAfter, CAttrs[Attrs.PHYS_POWER]||0, TAttrs[Attrs.PHYS_RES]||0);
@@ -277,12 +278,15 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
// 8. 计算最终总伤害(物理伤害 + 魔法伤害)
let total = apAfter + mapAfter;
// 9. 计算免
let DMG_RED = TAttrs[Attrs.DAMAGE_REDUCTION]||0+TAttrsComp.useCountValTal(Attrs.DAMAGE_REDUCTION);
// 10. 应用最终伤害减免效果如特殊天赋、buff等提供的减免
total = Math.floor(total * (1 - ((TAttrs[Attrs.DAMAGE_REDUCTION]||0)/100)));
// 11. 确保伤害值非负,返回最终伤害
//9.1 易
let DMG_INVUL = TAttrs[Attrs.DMG_INVUL]||0
//9.2 免伤 属性免伤+天赋免伤
let DMG_RED =TAttrs[Attrs.DMG_RED]||0+TAttrsComp.useCountValTal(Attrs.DMG_RED);
// 10. 确保伤害值非负,返回最终伤害
total = Math.max(0,total);
//11. 易伤减免 免伤属性免伤+天赋免伤
total = Math.floor(total * (1 + ((DMG_INVUL-DMG_RED)/100)));
return Math.max(0,total);
}
@@ -382,24 +386,6 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
return r < rate;
}
/**
* 伤害计算考虑易伤等debuff
*
* 预留的伤害计算扩展点,用于处理:
* - 被攻击者的易伤状态(增加受到伤害)
* - 被攻击者的伤害减免状态(减少受到伤害)
* - 元素抗性计算
* - 真实伤害/魔法伤害/物理伤害的类型区分
*
* @param model 被攻击者的属性组件(包含抗性、易伤等状态)
* @param baseDamage 基础伤害值
* @returns 最终伤害值(经过各种加成和减免后的结果)
*/
private calculateDamage(model: HeroAttrsComp, baseDamage: number): number {
// 这里可以添加易伤等debuff的计算逻辑
// 例如如果目标有易伤buff增加受到的伤害
return baseDamage;
}
/**
* 护盾吸收伤害