feat(attr): add vulnerable resist attribute and damage calculation
1. 新增易伤抗性属性vulnerable_res,支持百分比减免易伤附加伤害 2. 实现易伤伤害计算逻辑,支持叠加层数与值覆盖 3. 更新技能与Buff配置,修正灼烧技能描述为易伤效果 4. 新增中毒、减攻Debuff配置与易伤Buff常量定义
This commit is contained in:
@@ -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,无法吸收伤害");
|
||||
|
||||
Reference in New Issue
Block a user