feat(护盾): 将护盾机制从数值吸收改为次数免疫

- 护盾技能配置的 `ap` 字段现在表示免疫次数而非攻击力百分比
- 修改护盾计算逻辑,每次受到攻击消耗1点护盾值
- 更新日志和注释以反映新的护盾行为
This commit is contained in:
panw
2026-03-27 15:22:16 +08:00
parent 829866fe60
commit cd0004e37c
4 changed files with 20 additions and 31 deletions

View File

@@ -295,39 +295,27 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
* 护盾吸收伤害
*
* 护盾吸收逻辑:
* 1. 如果护盾值 >= 伤害值完全吸收剩余伤害为0
* 2. 如果护盾值 < 伤害值:部分吸收,剩余伤害 = 原伤害 - 护盾值
* 3. 护盾被击破时,重置护盾最大值属性
* 1. 护盾值大于 0 时,抵挡本次伤害
* 2. 每次抵挡消耗 1 点护盾值
* 3. 护盾归零时,重置护盾最大值属性
*
* @param TAttrsComp 被攻击者的属性组件(包含当前护盾值)
* @param damage 原始伤害值
* @returns {remainingDamage, absorbedDamage} 剩余伤害值和吸收的护盾值
*/
private absorbShield(TAttrsComp: HeroAttrsComp, damage: number): {remainingDamage: number, absorbedDamage: number} {
if (TAttrsComp.shield <= 0) {
mLogger.log(this.debugMode, 'HeroAtkSystem', " 护盾值小于等于0无法吸收伤害");
return {remainingDamage: damage, absorbedDamage: 0};
};
if (TAttrsComp.shield >= damage) {
TAttrsComp.shield -= damage;
if (TAttrsComp.shield <= 0) {
TAttrsComp.shield = 0;
TAttrsComp.shield_max = 0;
}
TAttrsComp.dirty_shield = true;
mLogger.log(this.debugMode, 'HeroAtkSystem', ` 护盾值完全吸收伤害 ${damage}`);
return {remainingDamage: 0, absorbedDamage: damage};
} else {
const absorbedDamage = TAttrsComp.shield;
const remainingDamage = damage - TAttrsComp.shield;
}
TAttrsComp.shield = Math.max(0, TAttrsComp.shield - 1);
if (TAttrsComp.shield <= 0) {
TAttrsComp.shield = 0;
TAttrsComp.shield_max = 0;
TAttrsComp.dirty_shield = true;
mLogger.log(this.debugMode, 'HeroAtkSystem', ` 护盾值部分吸收伤害 ${absorbedDamage}`);
return {remainingDamage, absorbedDamage};
}
TAttrsComp.dirty_shield = true;
mLogger.log(this.debugMode, 'HeroAtkSystem', ` 护盾抵挡1次伤害剩余次数 ${TAttrsComp.shield}`);
return {remainingDamage: 0, absorbedDamage: 1};
}
/**

View File

@@ -93,14 +93,15 @@ export class HeroAttrsComp extends ecs.Comp {
}
add_shield(value:number){
const oldShield = this.shield;
let addValue = value;
const addValue = Math.max(0, Math.floor(value));
if (addValue <= 0) return;
this.shield += addValue;
this.shield_max += addValue;
if (this.shield < 0) this.shield = 0;
if (this.shield_max < 0) this.shield_max = 0;
this.dirty_shield = true; // 标记护盾需要更新
if (this.debugMode) {
mLogger.log(this.debugMode, 'HeroAttrs', ` 护盾变更: ${this.hero_name}, 变化=${addValue.toFixed(1)}, ${oldShield.toFixed(1)} -> ${this.shield.toFixed(1)}`);
mLogger.log(this.debugMode, 'HeroAttrs', ` 护盾次数变更: ${this.hero_name}, 变化=${addValue}, ${Math.floor(oldShield)} -> ${Math.floor(this.shield)}`);
}
}
add_hp_max(value:number){

View File

@@ -212,7 +212,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
model.add_hp(addHp);
target.health(addHp);
} else if (kind === SkillKind.Shield && sAp !== 0) {
const addShield = Math.floor(sAp*_cAttrsComp.ap/100);
const addShield = Math.max(0, Math.floor(sAp));
model.add_shield(addShield);
}
if (!config.buffs || config.buffs.length === 0) continue;