From b19256e4f5eaf5ef440211953b1fca2155d4fb02 Mon Sep 17 00:00:00 2001 From: panFD Date: Sun, 16 Aug 2026 23:37:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(hero=20combat):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=98=B2=E5=BE=A1=E5=B1=9E=E6=80=A7=E4=B8=8E=E9=99=A4=E6=B3=95?= =?UTF-8?q?=E9=80=92=E5=87=8F=E5=87=8F=E4=BC=A4=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增defense属性枚举、组件字段与结算方法 2. 配置防御减伤平衡常数DEFENSE_K为500 3. 在攻击结算流程中加入防御减伤计算 4. 采用除法递减模型实现防御收益随数值提升而降低 --- assets/script/game/common/config/GameSet.ts | 2 ++ assets/script/game/common/config/HeroAttrs.ts | 1 + assets/script/game/hero/HeroAtkSystem.ts | 4 ++++ assets/script/game/hero/HeroAttrsComp.ts | 22 +++++++++++++++++++ 4 files changed, 29 insertions(+) diff --git a/assets/script/game/common/config/GameSet.ts b/assets/script/game/common/config/GameSet.ts index 390601fa..aac5191f 100644 --- a/assets/script/game/common/config/GameSet.ts +++ b/assets/script/game/common/config/GameSet.ts @@ -48,6 +48,8 @@ export enum FightSet { CSKILL_START_Y = 30, /** 护盾数值上限(数值减免型:1 点护盾吸收 1 点伤害) */ SHIELD_MAX = 5, + /** 防御减伤平衡常数:减伤率 = defense / (defense + DEFENSE_K),K 越大每点防御收益越低 */ + DEFENSE_K = 500, WAVE_HEAL_RATE = 0.4, // 回合结束时所有英雄恢复最大生命值的比例(与 DDA 放水兜底分层:回血保节奏,放水防崩盘) PUNCTURE_DOWN = 50, /** 穿透伤害衰减系数:单体技能命中第2个及以后目标时按此比例折算伤害 */ diff --git a/assets/script/game/common/config/HeroAttrs.ts b/assets/script/game/common/config/HeroAttrs.ts index 9f388756..d2372612 100644 --- a/assets/script/game/common/config/HeroAttrs.ts +++ b/assets/script/game/common/config/HeroAttrs.ts @@ -14,6 +14,7 @@ export enum Attrs { speed = "speed", // 基础移动速度 dis = "dis", // 基础距离 shield = "shield", // 当前护盾 + defense = "defense", // 防御(除法递减模型:减伤率 = defense / (defense + DEFENSE_K)) // // ==================== 攻击属性 ==================== // a_cd = "a_cd", // 攻击计时 diff --git a/assets/script/game/hero/HeroAtkSystem.ts b/assets/script/game/hero/HeroAtkSystem.ts index 8a884d10..8feeb91a 100644 --- a/assets/script/game/hero/HeroAtkSystem.ts +++ b/assets/script/game/hero/HeroAtkSystem.ts @@ -171,6 +171,10 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda } if (damage <= 0) return reDate; + // 防御减伤(除法递减模型,护盾吸收之后、扣血之前结算) + damage = TAttrsComp.applyDefense(damage); + mLogger.log(this.debugMode, 'HeroAtkSystem', " after defense", damage) + // TAttrsComp.hp -= damage; // 应用伤害到数据层 TAttrsComp.add_hp(-damage); // 使用 add_hp 以触发 dirty_hp 和 UI 更新 diff --git a/assets/script/game/hero/HeroAttrsComp.ts b/assets/script/game/hero/HeroAttrsComp.ts index 702f8487..e7c73034 100644 --- a/assets/script/game/hero/HeroAttrsComp.ts +++ b/assets/script/game/hero/HeroAttrsComp.ts @@ -39,6 +39,7 @@ export class HeroAttrsComp extends ecs.Comp { speed: number = 100; // 基础移动速度 dis: number = 100; // 基础距离 shield: number = 0; // 当前护盾 + defense: number = 0; // 防御(除法递减模型减伤,见 getFinalDefense) // ==================== 攻击属性 (补充) ==================== skills: Record = {}; @@ -517,6 +518,26 @@ export class HeroAttrsComp extends ecs.Comp { return this.vulnerable_res + mods.flatSum + mods.pctSum; } + /** 最终防御值 = 基础 + 限时修饰(加法模型),供除法递减减伤公式使用 */ + public getFinalDefense(): number { + const mods = this.aggregateTimedMods(Attrs.defense); + return Math.max(0, this.defense + mods.flatSum + mods.pctSum); + } + + /** + * 按除法递减模型计算防御减伤后的伤害 + * 减伤率 = defense / (defense + DEFENSE_K),防御收益递减且永不达到 100% + * @param damage 护盾结算后的原始伤害 + * @returns 减伤后的伤害,保底 1 点防止完全免伤 + */ + public applyDefense(damage: number): number { + if (damage <= 0) return damage; + const defense = this.getFinalDefense(); + if (defense <= 0) return damage; + const reduced = damage * (FightSet.DEFENSE_K / (defense + FightSet.DEFENSE_K)); + return Math.max(1, Math.floor(reduced)); + } + /** 根据攻速加成换算实际攻击间隔,避免直接改写配置里的基础 CD。 */ public getEffectiveSkillCd(skillId: number): number { const skill = this.skills[skillId]; @@ -578,6 +599,7 @@ export class HeroAttrsComp extends ecs.Comp { this.speed = 100; this.dis = 100; this.shield = 0; + this.defense = 0; // 重置新增属性 this.skills = {};