refactor(战斗系统): 重构伤害计算逻辑并统一属性命名
- 将DAMAGE_REDUCTION统一重命名为DMG_RED以提高一致性 - 优化暴击判定逻辑,加入暴击抗性计算 - 重构伤害计算公式,整合易伤和免伤效果 - 移除冗余的calculateDamage方法 - 为枚举值添加注释说明
This commit is contained in:
@@ -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, // 力量 - 数值型
|
||||||
|
|||||||
@@ -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%"},
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 护盾吸收伤害
|
* 护盾吸收伤害
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user