feat(attr): add vulnerable resist attribute and damage calculation

1. 新增易伤抗性属性vulnerable_res,支持百分比减免易伤附加伤害
2. 实现易伤伤害计算逻辑,支持叠加层数与值覆盖
3. 更新技能与Buff配置,修正灼烧技能描述为易伤效果
4. 新增中毒、减攻Debuff配置与易伤Buff常量定义
This commit is contained in:
panFD
2026-08-15 15:26:19 +08:00
parent b31cb877fe
commit 812cc3ee9f
5 changed files with 64 additions and 11 deletions

View File

@@ -19,7 +19,8 @@ import { getMonsterGoldDrop } from "../map/RogueConfig";
import { MissionEconomy } from "../map/MissionEconomy";
import { MoveComp } from "./MoveComp";
import { buffManager, BuffApplyOverrides } from "./BuffManager";
import { DEBUFF_ICON_MAP } from "../common/config/BuffSet";
import { DEBUFF_ICON_MAP, VULNERABLE_BUFF_ID, BuffList } from "../common/config/BuffSet";
import { BuffComp } from "./BuffComp";
/** 最终伤害数据接口
* 用于封装一次攻击计算的所有结果数据
@@ -153,6 +154,9 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
}
}
mLogger.log(this.debugMode, 'HeroAtkSystem', " after crit", damage)
// 易伤附加:目标每层易伤 buff 附加固定伤害,被易伤抗性百分比减免;普攻与 DoT 均生效
damage += this.calcVulnerableBonus(target, TAttrsComp);
mLogger.log(this.debugMode, 'HeroAtkSystem', " after vulnerable", damage)
// 护盾数值减免1 点护盾吸收 1 点伤害,扣完为止,溢出部分继续扣血)
const shieldResult = this.absorbShield(TAttrsComp, damage);
damage = shieldResult.remainingDamage;
@@ -458,6 +462,26 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
* @param damage 原始伤害值
* @returns {remainingDamage, absorbedDamage} 剩余伤害值和被护盾减免的伤害值
*/
/**
* 计算易伤附加伤害:汇总目标每层易伤 buff 的数值value_override 优先),再被易伤抗性百分比减免。
* @returns 附加伤害值(向下取整,非负)
*/
private calcVulnerableBonus(target: ecs.Entity, TAttrsComp: HeroAttrsComp): number {
if (!target.has(BuffComp)) return 0;
const layers = target.get(BuffComp).buffs.get(VULNERABLE_BUFF_ID);
if (!layers || layers.length === 0) return 0;
const cfg = BuffList[VULNERABLE_BUFF_ID];
const baseVal = cfg?.modifiers?.[0]?.value ?? 0;
let sum = 0;
for (const layer of layers) {
sum += layer.value_override !== undefined ? layer.value_override : baseVal;
}
if (sum <= 0) return 0;
// 易伤抗性百分比减免vulnerable_res=30 即减免 30%
const res = TAttrsComp.getFinalVulnerableRes();
return Math.max(0, Math.floor(sum * (1 - res / 100)));
}
private absorbShield(TAttrsComp: HeroAttrsComp, damage: number): { remainingDamage: number, absorbedDamage: number } {
if (TAttrsComp.shield <= 0) {
mLogger.log(this.debugMode, 'HeroAtkSystem', " 护盾值小于等于0无法吸收伤害");