feat(hero combat): 新增防御属性与除法递减减伤逻辑
1. 新增defense属性枚举、组件字段与结算方法 2. 配置防御减伤平衡常数DEFENSE_K为500 3. 在攻击结算流程中加入防御减伤计算 4. 采用除法递减模型实现防御收益随数值提升而降低
This commit is contained in:
@@ -48,6 +48,8 @@ export enum FightSet {
|
|||||||
CSKILL_START_Y = 30,
|
CSKILL_START_Y = 30,
|
||||||
/** 护盾数值上限(数值减免型:1 点护盾吸收 1 点伤害) */
|
/** 护盾数值上限(数值减免型:1 点护盾吸收 1 点伤害) */
|
||||||
SHIELD_MAX = 5,
|
SHIELD_MAX = 5,
|
||||||
|
/** 防御减伤平衡常数:减伤率 = defense / (defense + DEFENSE_K),K 越大每点防御收益越低 */
|
||||||
|
DEFENSE_K = 500,
|
||||||
WAVE_HEAL_RATE = 0.4, // 回合结束时所有英雄恢复最大生命值的比例(与 DDA 放水兜底分层:回血保节奏,放水防崩盘)
|
WAVE_HEAL_RATE = 0.4, // 回合结束时所有英雄恢复最大生命值的比例(与 DDA 放水兜底分层:回血保节奏,放水防崩盘)
|
||||||
PUNCTURE_DOWN = 50,
|
PUNCTURE_DOWN = 50,
|
||||||
/** 穿透伤害衰减系数:单体技能命中第2个及以后目标时按此比例折算伤害 */
|
/** 穿透伤害衰减系数:单体技能命中第2个及以后目标时按此比例折算伤害 */
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export enum Attrs {
|
|||||||
speed = "speed", // 基础移动速度
|
speed = "speed", // 基础移动速度
|
||||||
dis = "dis", // 基础距离
|
dis = "dis", // 基础距离
|
||||||
shield = "shield", // 当前护盾
|
shield = "shield", // 当前护盾
|
||||||
|
defense = "defense", // 防御(除法递减模型:减伤率 = defense / (defense + DEFENSE_K))
|
||||||
|
|
||||||
// // ==================== 攻击属性 ====================
|
// // ==================== 攻击属性 ====================
|
||||||
// a_cd = "a_cd", // 攻击计时
|
// a_cd = "a_cd", // 攻击计时
|
||||||
|
|||||||
@@ -171,6 +171,10 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
|||||||
}
|
}
|
||||||
if (damage <= 0) return reDate;
|
if (damage <= 0) return reDate;
|
||||||
|
|
||||||
|
// 防御减伤(除法递减模型,护盾吸收之后、扣血之前结算)
|
||||||
|
damage = TAttrsComp.applyDefense(damage);
|
||||||
|
mLogger.log(this.debugMode, 'HeroAtkSystem', " after defense", damage)
|
||||||
|
|
||||||
// TAttrsComp.hp -= damage; // 应用伤害到数据层
|
// TAttrsComp.hp -= damage; // 应用伤害到数据层
|
||||||
TAttrsComp.add_hp(-damage); // 使用 add_hp 以触发 dirty_hp 和 UI 更新
|
TAttrsComp.add_hp(-damage); // 使用 add_hp 以触发 dirty_hp 和 UI 更新
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ export class HeroAttrsComp extends ecs.Comp {
|
|||||||
speed: number = 100; // 基础移动速度
|
speed: number = 100; // 基础移动速度
|
||||||
dis: number = 100; // 基础距离
|
dis: number = 100; // 基础距离
|
||||||
shield: number = 0; // 当前护盾
|
shield: number = 0; // 当前护盾
|
||||||
|
defense: number = 0; // 防御(除法递减模型减伤,见 getFinalDefense)
|
||||||
|
|
||||||
// ==================== 攻击属性 (补充) ====================
|
// ==================== 攻击属性 (补充) ====================
|
||||||
skills: Record<number, HSkillInfo> = {};
|
skills: Record<number, HSkillInfo> = {};
|
||||||
@@ -517,6 +518,26 @@ export class HeroAttrsComp extends ecs.Comp {
|
|||||||
return this.vulnerable_res + mods.flatSum + mods.pctSum;
|
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。 */
|
/** 根据攻速加成换算实际攻击间隔,避免直接改写配置里的基础 CD。 */
|
||||||
public getEffectiveSkillCd(skillId: number): number {
|
public getEffectiveSkillCd(skillId: number): number {
|
||||||
const skill = this.skills[skillId];
|
const skill = this.skills[skillId];
|
||||||
@@ -578,6 +599,7 @@ export class HeroAttrsComp extends ecs.Comp {
|
|||||||
this.speed = 100;
|
this.speed = 100;
|
||||||
this.dis = 100;
|
this.dis = 100;
|
||||||
this.shield = 0;
|
this.shield = 0;
|
||||||
|
this.defense = 0;
|
||||||
|
|
||||||
// 重置新增属性
|
// 重置新增属性
|
||||||
this.skills = {};
|
this.skills = {};
|
||||||
|
|||||||
Reference in New Issue
Block a user