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

View File

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

View File

@@ -212,7 +212,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
model.add_hp(addHp); model.add_hp(addHp);
target.health(addHp); target.health(addHp);
} else if (kind === SkillKind.Shield && sAp !== 0) { } 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); model.add_shield(addShield);
} }
if (!config.buffs || config.buffs.length === 0) continue; if (!config.buffs || config.buffs.length === 0) continue;