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

@@ -127,7 +127,7 @@ export interface SkillConfig {
TGroup:TGroup, // 目标群体(敌方/友方/自身等)
act:string, // 角色执行的动画
DTType:DTType, // 伤害类型(单体/范围)
ap:number, // 攻击百分比(角色攻击力)
ap:number, // 伤害/治疗技能为攻击百分比,护盾技能为免疫次数
hit_count:number, // 可命中次数
hitcd:number, // 持续伤害的伤害间隔(秒)
speed:number, // 移动速度
@@ -259,8 +259,8 @@ export const SkillSet: Record<number, SkillConfig> = {
//============================= ====== 辅助技能 ====== ==========================
6301:{
uuid:6301,name:"魔法盾",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Self,readyAnm:"up_hp",endAnm:"",act:"atk",
DTType:DTType.single,kind:SkillKind.Shield,ap:300,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.1,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"获得300%攻击力的护盾",
DTType:DTType.single,kind:SkillKind.Shield,ap:3,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.1,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"获得3次伤害免疫",
},
6302: {
uuid:6302,name:"治疗",sp_name:"buff_wind",icon:"1292",TGroup:TGroup.Team,readyAnm:"",endAnm:"",act:"atk",
@@ -269,8 +269,8 @@ export const SkillSet: Record<number, SkillConfig> = {
},
6303:{
uuid:6303,name:"护盾",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Self,readyAnm:"up_hp",endAnm:"",act:"atk",
DTType:DTType.single,kind:SkillKind.Shield,ap:300,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.1,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"随机1个友方获得300%攻击力的护盾",
DTType:DTType.single,kind:SkillKind.Shield,ap:3,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.1,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"随机1个友方获得3次伤害免疫",
},
6304: {
uuid:6304,name:"群体治疗",sp_name:"buff_wind",icon:"1292",TGroup:TGroup.Team,readyAnm:"",endAnm:"",act:"atk",
@@ -279,8 +279,8 @@ export const SkillSet: Record<number, SkillConfig> = {
},
6305:{
uuid:6305,name:"群体护盾",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"up_hp",endAnm:"",act:"atk",
DTType:DTType.single,kind:SkillKind.Shield,ap:200,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0.1,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"随机3个友方获得200%攻击力的护盾",
DTType:DTType.single,kind:SkillKind.Shield,ap:2,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0.1,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"随机3个友方获得2次伤害免疫",
},
//==========================buff 技能=====================
6401:{

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;