From 2dc43b5b81864ac31e8b55e3de7a8883b1dc8898 Mon Sep 17 00:00:00 2001 From: panw Date: Fri, 21 Nov 2025 10:28:14 +0800 Subject: [PATCH] =?UTF-8?q?refactor(HeroAtkSystem):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E4=BC=A4=E5=AE=B3=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91=E4=BB=A5?= =?UTF-8?q?=E6=8F=90=E9=AB=98=E5=8F=AF=E7=BB=B4=E6=8A=A4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将原有的伤害计算逻辑拆分为更清晰的步骤,引入applyPR方法统一处理伤害加成和抗性计算 根据技能类型(DType)应用对应的元素伤害计算 使用防御和魔防的百分比减免公式替代原有的固定值减免 --- assets/script/game/hero/HeroAtkSystem.ts | 36 ++++++++++++++++-------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/assets/script/game/hero/HeroAtkSystem.ts b/assets/script/game/hero/HeroAtkSystem.ts index 1479df91..0b81ef6f 100644 --- a/assets/script/game/hero/HeroAtkSystem.ts +++ b/assets/script/game/hero/HeroAtkSystem.ts @@ -2,7 +2,7 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ec import { FacSet } from "../common/config/GameSet"; import { Attrs } from "../common/config/HeroAttrs"; import { FightSet } from "../common/config/GameSet"; -import { SkillSet } from "../common/config/SkillSet"; +import { SkillSet, DType } from "../common/config/SkillSet"; import { HeroAttrsComp } from "./HeroAttrsComp"; import { HeroViewComp } from "./HeroViewComp"; import { DamageQueueComp, DamageEvent, DamageQueueHelper } from "./DamageQueueComp"; @@ -220,21 +220,33 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd if (!sConf) return 0; let apBase = (sConf.ap||0)*CAttrs[Attrs.AP]/100; let mapBase = (sConf.map||0)*CAttrs[Attrs.MAP]/100; - let apAfter = Math.max(0, Math.floor(apBase - (TAttrs[Attrs.DEF]||0))); - let mapAfter = Math.max(0, Math.floor(mapBase - (TAttrs[Attrs.MDEF]||0))); - mapAfter = Math.floor(mapAfter * (1 - ((TAttrs[Attrs.MAGIC_RES]||0)/100))); - let total = apAfter + mapAfter; - if (sConf.elem){ - const iceR = sConf.elem.ice||0; - if (iceR) total += Math.floor(total * iceR/100 * (1 + ((CAttrs[Attrs.ICE_POWER]||0)/100)) * (1 - ((TAttrs[Attrs.ICE_RES]||0)/100))); - const fireR = sConf.elem.fire||0; - if (fireR) total += Math.floor(total * fireR/100 * (1 + ((CAttrs[Attrs.FIRE_POWER]||0)/100)) * (1 - ((TAttrs[Attrs.FIRE_RES]||0)/100))); - const windR = sConf.elem.wind||0; - if (windR) total += Math.floor(total * windR/100 * (1 + ((CAttrs[Attrs.WIND_POWER]||0)/100)) * (1 - ((TAttrs[Attrs.WIND_RES]||0)/100))); + const def = (TAttrs[Attrs.DEF]||0); + const mdef = (TAttrs[Attrs.MDEF]||0); + const apRed = def / (def + FightSet.DEF_C); + const mapRed = mdef / (mdef + FightSet.MDEF_C); + let apAfter = Math.floor(apBase * (1 - apRed)); + let mapAfter = Math.floor(mapBase * (1 - mapRed)); + apAfter = this.applyPR(apAfter, CAttrs[Attrs.PHYS_POWER]||0, TAttrs[Attrs.PHYS_RES]||0); + mapAfter = this.applyPR(mapAfter, CAttrs[Attrs.MAGIC_POWER]||0, TAttrs[Attrs.MAGIC_RES]||0); + switch (sConf.DType) { + case DType.ICE: + mapAfter = this.applyPR(mapAfter, CAttrs[Attrs.ICE_POWER]||0, TAttrs[Attrs.ICE_RES]||0); + break; + case DType.FIRE: + mapAfter = this.applyPR(mapAfter, CAttrs[Attrs.FIRE_POWER]||0, TAttrs[Attrs.FIRE_RES]||0); + break; + case DType.WIND: + mapAfter = this.applyPR(mapAfter, CAttrs[Attrs.WIND_POWER]||0, TAttrs[Attrs.WIND_RES]||0); + break; } + let total = apAfter + mapAfter; total = Math.floor(total * (1 - ((TAttrs[Attrs.DAMAGE_REDUCTION]||0)/100))); return Math.max(0,total); } + + private applyPR(base: number, power: number, res: number): number { + return Math.floor(base * (1 + (power/100)) * (1 - (res/100))); + } /** * 处理角色死亡 *