refactor(战斗系统): 重构伤害计算逻辑并统一属性命名
- 将DAMAGE_REDUCTION统一重命名为DMG_RED以提高一致性 - 优化暴击判定逻辑,加入暴击抗性计算 - 重构伤害计算公式,整合易伤和免伤效果 - 移除冗余的calculateDamage方法 - 为枚举值添加注释说明
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 护盾吸收伤害
|
||||
|
||||
@@ -208,8 +208,8 @@ export class TalComp extends ecs.Comp {
|
||||
case TalEffet.SKILL_DMG:
|
||||
heroAttrs.addCountTal(TalEffet.SKILL_DMG, talent.value + talent.value_add);
|
||||
break;
|
||||
case TalEffet.DAMAGE_REDUCTION:
|
||||
heroAttrs.addCountTal(TalEffet.DAMAGE_REDUCTION, talent.value + talent.value_add);
|
||||
case TalEffet.DMG_RED:
|
||||
heroAttrs.addCountTal(TalEffet.DMG_RED, talent.value + talent.value_add);
|
||||
break;
|
||||
case TalEffet.HP:
|
||||
heroAttrs.add_hp(talent.value + talent.value_add,talent.vType == BType.VALUE);
|
||||
|
||||
Reference in New Issue
Block a user