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))); + } /** * 处理角色死亡 *