refactor(战斗系统): 重构伤害计算逻辑并统一属性命名

- 将DAMAGE_REDUCTION统一重命名为DMG_RED以提高一致性
- 优化暴击判定逻辑,加入暴击抗性计算
- 重构伤害计算公式,整合易伤和免伤效果
- 移除冗余的calculateDamage方法
- 为枚举值添加注释说明
This commit is contained in:
2025-11-27 10:19:54 +08:00
parent bbf8dbb8cb
commit dcf739d093
4 changed files with 33 additions and 48 deletions

View File

@@ -12,10 +12,10 @@ export enum BType {
} }
export enum NeAttrs { export enum NeAttrs {
IN_FROST = 0, IN_FROST = 0, // 冰冻状态
IN_STUN = 1, IN_STUN = 1, // 眩晕状态
IN_BURN = 2, IN_BURN = 2, // 灼烧状态
IN_POISON = 3, IN_POISON = 3, // 中毒状态
} }
// ========== 属性枚举 ========== // ========== 属性枚举 ==========
@@ -48,7 +48,7 @@ export enum Attrs {
MDEF = 21, // 魔法防御 MDEF = 21, // 魔法防御
DODGE = 22, // 闪避率 DODGE = 22, // 闪避率
BLOCK = 23, // 格挡率 BLOCK = 23, // 格挡率
DAMAGE_REDUCTION = 24, // 伤害减免 DMG_RED = 24, // 伤害减免
THORNS = 25, // 反伤 THORNS = 25, // 反伤
CRITICAL_RESIST = 26, // 暴击抗性 CRITICAL_RESIST = 26, // 暴击抗性
CON_RES = 27, // 控制抗性 CON_RES = 27, // 控制抗性
@@ -102,11 +102,9 @@ export enum Attrs {
BURN = 75, // 易伤效果 BURN = 75, // 易伤效果
WFUNY = 77, // 风怒 WFUNY = 77, // 风怒
// ========== 生存与恢复相关 (80-89) ========== // ========== 负面状态相关 (80-89) ==========
DMG_INVUL = 80, //易伤
// ========== 负面状态相关 (90-99) ========== // ========== 基础属性(影响其他属性) (90-99)==========
// ========== 基础属性(影响其他属性)(100-104) ==========
STRENGTH = 90, // 力量(影响物理相关) STRENGTH = 90, // 力量(影响物理相关)
INTELLIGENCE = 91, // 智力(影响魔法相关) INTELLIGENCE = 91, // 智力(影响魔法相关)
AGILITY = 92, // 敏捷(影响速度和闪避) AGILITY = 92, // 敏捷(影响速度和闪避)
@@ -173,7 +171,7 @@ export const AttrsType: Record<Attrs, BType> = {
[Attrs.MDEF]: BType.VALUE, // 魔法防御 - 数值型 [Attrs.MDEF]: BType.VALUE, // 魔法防御 - 数值型
[Attrs.DODGE]: BType.RATIO, // 闪避率 - 百分比型 [Attrs.DODGE]: BType.RATIO, // 闪避率 - 百分比型
[Attrs.BLOCK]: BType.RATIO, // 格挡率 - 百分比型 [Attrs.BLOCK]: BType.RATIO, // 格挡率 - 百分比型
[Attrs.DAMAGE_REDUCTION]: BType.RATIO, // 伤害减免 - 百分比型 [Attrs.DMG_RED]: BType.RATIO, // 伤害减免 - 百分比型
[Attrs.THORNS]: BType.RATIO, // 反伤 - 百分比型 [Attrs.THORNS]: BType.RATIO, // 反伤 - 百分比型
// ========== 暴击与命中属性(百分比型) ========== // ========== 暴击与命中属性(百分比型) ==========
@@ -227,9 +225,9 @@ export const AttrsType: Record<Attrs, BType> = {
[Attrs.BURN]: BType.RATIO, // 易伤效果 - 百分比型 [Attrs.BURN]: BType.RATIO, // 易伤效果 - 百分比型
[Attrs.WFUNY]: BType.RATIO, // 未知特殊属性 - 百分比型 [Attrs.WFUNY]: BType.RATIO, // 未知特殊属性 - 百分比型
// ========== 生存与恢复相关(混合类型) ==========
// ========== 负面状态相关(混合类型) ========== // ========== 负面状态相关(混合类型) ==========
[Attrs.DMG_INVUL]: BType.RATIO, //易伤
// ========== 基础属性(数值型) ========== // ========== 基础属性(数值型) ==========
[Attrs.STRENGTH]: BType.VALUE, // 力量 - 数值型 [Attrs.STRENGTH]: BType.VALUE, // 力量 - 数值型

View File

@@ -28,7 +28,7 @@ export enum TalEffet {
WFUNY=7, // 风怒 WFUNY=7, // 风怒
D_SKILL=8, //两次技能 D_SKILL=8, //两次技能
SHIELD=9, // 护盾 SHIELD=9, // 护盾
DAMAGE_REDUCTION=10, // 减伤 DMG_RED=10, // 减伤
C_MSKILL=11, // 必杀技能必暴 C_MSKILL=11, // 必杀技能必暴
C_ATK=12, // 普工必爆 C_ATK=12, // 普工必爆
C_SKILL=13, // 一般技能必暴 C_SKILL=13, // 一般技能必暴
@@ -47,7 +47,8 @@ export enum TalAttrs {
SILENCE_CHANCE=Attrs.SILENCE_CHANCE, // 沉默概率 SILENCE_CHANCE=Attrs.SILENCE_CHANCE, // 沉默概率
CRITICAL=Attrs.CRITICAL, // 暴击率 CRITICAL=Attrs.CRITICAL, // 暴击率
AP=Attrs.AP, // 攻击力 AP=Attrs.AP, // 攻击力
MP=Attrs.MAP, // 魔法 MP=Attrs.MAP, // 魔法攻击力
DMG_RED=Attrs.DMG_RED, // 魔法防御
} }
/** /**
* 天赋配置接口 * 天赋配置接口
@@ -111,7 +112,7 @@ export const talConf: Record<number, ItalConf> = {
desc:"被攻击3次后, 给于目标50%的伤害"}, desc:"被攻击3次后, 给于目标50%的伤害"},
7102:{uuid:7102,name:"护盾",triType:TriType.DMG,Trigger:3,count:1,target:TalTarget.SELF,effet:TalEffet.SHIELD,vType:BType.RATIO, value:20,attrs:TalAttrs.NON, 7102:{uuid:7102,name:"护盾",triType:TriType.DMG,Trigger:3,count:1,target:TalTarget.SELF,effet:TalEffet.SHIELD,vType:BType.RATIO, value:20,attrs:TalAttrs.NON,
desc:"被攻击3次后, 获得20%的生命值护盾"}, desc:"被攻击3次后, 获得20%的生命值护盾"},
7103:{uuid:7103,name:"减伤",triType:TriType.DMG,Trigger:3,count:1,target:TalTarget.ENEMY,effet:TalEffet.DAMAGE_REDUCTION,vType:BType.RATIO, value:50,attrs:TalAttrs.NON, 7103:{uuid:7103,name:"减伤",triType:TriType.DMG,Trigger:3,count:1,target:TalTarget.ENEMY,effet:TalEffet.DMG_RED,vType:BType.RATIO, value:50,attrs:TalAttrs.DMG_RED,
desc:"被攻击3次后, 下1次伤害减50%"}, desc:"被攻击3次后, 下1次伤害减50%"},

View File

@@ -154,10 +154,9 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
return reDate; return reDate;
} }
// 暴击判定 // 暴击判定
// 使用施法者的暴击率属性damageEvent.Attrs 快照) // 使用施法者的暴击率属性damageEvent.Attrs 快照)- 被攻击者的暴击抗性属性targetAttrs.Attrs[Attrs.CRITICAL_RESIST]
const isCrit = this.checkChance(damageEvent.Attrs[Attrs.CRITICAL]); const isCrit = this.checkChance(damageEvent.Attrs[Attrs.CRITICAL]-targetAttrs.Attrs[Attrs.CRITICAL_RESIST]);
if (isCrit) attackerModel?.useValueTalByAttr(Attrs.CRITICAL); // 清除施法者的暴击buff // 计算基础伤害
// 计算伤害
let damage = this.dmgCount(damageEvent,targetAttrs); let damage = this.dmgCount(damageEvent,targetAttrs);
if (isCrit) { if (isCrit) {
// 暴击伤害计算 // 暴击伤害计算
@@ -166,9 +165,9 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
const casterCritDmg = damageEvent.Attrs[Attrs.CRITICAL_DMG] || 0; const casterCritDmg = damageEvent.Attrs[Attrs.CRITICAL_DMG] || 0;
damage = Math.floor(damage * (1 + (FightSet.CRIT_DAMAGE + casterCritDmg) / 100)); damage = Math.floor(damage * (1 + (FightSet.CRIT_DAMAGE + casterCritDmg) / 100));
reDate.isCrit=true; reDate.isCrit=true;
attackerModel?.useValueTalByAttr(Attrs.CRITICAL); // 清除施法者的暴击buff
} }
// 伤害计算考虑易伤等debuff
damage = this.calculateDamage(targetAttrs, damage);
// 护盾吸收 // 护盾吸收
damage =Math.floor(this.absorbShield(targetAttrs, damage)) damage =Math.floor(this.absorbShield(targetAttrs, damage))
if (damage <= 0) return reDate; if (damage <= 0) return reDate;
@@ -253,6 +252,8 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
let apAfter = Math.floor(apBase * (1 - apRed)); // 物理伤害 - 防御减免 let apAfter = Math.floor(apBase * (1 - apRed)); // 物理伤害 - 防御减免
let mapAfter = Math.floor(mapBase * (1 - mapRed)); // 魔法伤害 - 防御减免 let mapAfter = Math.floor(mapBase * (1 - mapRed)); // 魔法伤害 - 防御减免
// 6. 应用物理/魔法攻击力和抗性修正 // 6. 应用物理/魔法攻击力和抗性修正
// 物理伤害修正:基础伤害 * (1 + 物理攻击力加成%) * (1 - 目标物理抗性%) // 物理伤害修正:基础伤害 * (1 + 物理攻击力加成%) * (1 - 目标物理抗性%)
apAfter = this.applyPR(apAfter, CAttrs[Attrs.PHYS_POWER]||0, TAttrs[Attrs.PHYS_RES]||0); apAfter = this.applyPR(apAfter, CAttrs[Attrs.PHYS_POWER]||0, TAttrs[Attrs.PHYS_RES]||0);
@@ -277,12 +278,15 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
// 8. 计算最终总伤害(物理伤害 + 魔法伤害) // 8. 计算最终总伤害(物理伤害 + 魔法伤害)
let total = apAfter + mapAfter; let total = apAfter + mapAfter;
// 9. 计算免 //9.1 易
let DMG_RED = TAttrs[Attrs.DAMAGE_REDUCTION]||0+TAttrsComp.useCountValTal(Attrs.DAMAGE_REDUCTION); let DMG_INVUL = TAttrs[Attrs.DMG_INVUL]||0
// 10. 应用最终伤害减免效果如特殊天赋、buff等提供的减免 //9.2 免伤 属性免伤+天赋免伤
total = Math.floor(total * (1 - ((TAttrs[Attrs.DAMAGE_REDUCTION]||0)/100))); let DMG_RED =TAttrs[Attrs.DMG_RED]||0+TAttrsComp.useCountValTal(Attrs.DMG_RED);
// 10. 确保伤害值非负,返回最终伤害
// 11. 确保伤害值非负,返回最终伤害 total = Math.max(0,total);
//11. 易伤减免 免伤属性免伤+天赋免伤
total = Math.floor(total * (1 + ((DMG_INVUL-DMG_RED)/100)));
return Math.max(0,total); return Math.max(0,total);
} }
@@ -382,24 +386,6 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
return r < rate; return r < rate;
} }
/**
* 伤害计算考虑易伤等debuff
*
* 预留的伤害计算扩展点,用于处理:
* - 被攻击者的易伤状态(增加受到伤害)
* - 被攻击者的伤害减免状态(减少受到伤害)
* - 元素抗性计算
* - 真实伤害/魔法伤害/物理伤害的类型区分
*
* @param model 被攻击者的属性组件(包含抗性、易伤等状态)
* @param baseDamage 基础伤害值
* @returns 最终伤害值(经过各种加成和减免后的结果)
*/
private calculateDamage(model: HeroAttrsComp, baseDamage: number): number {
// 这里可以添加易伤等debuff的计算逻辑
// 例如如果目标有易伤buff增加受到的伤害
return baseDamage;
}
/** /**
* 护盾吸收伤害 * 护盾吸收伤害

View File

@@ -208,8 +208,8 @@ export class TalComp extends ecs.Comp {
case TalEffet.SKILL_DMG: case TalEffet.SKILL_DMG:
heroAttrs.addCountTal(TalEffet.SKILL_DMG, talent.value + talent.value_add); heroAttrs.addCountTal(TalEffet.SKILL_DMG, talent.value + talent.value_add);
break; break;
case TalEffet.DAMAGE_REDUCTION: case TalEffet.DMG_RED:
heroAttrs.addCountTal(TalEffet.DAMAGE_REDUCTION, talent.value + talent.value_add); heroAttrs.addCountTal(TalEffet.DMG_RED, talent.value + talent.value_add);
break; break;
case TalEffet.HP: case TalEffet.HP:
heroAttrs.add_hp(talent.value + talent.value_add,talent.vType == BType.VALUE); heroAttrs.add_hp(talent.value + talent.value_add,talent.vType == BType.VALUE);