feat(战斗系统): 完善伤害计算逻辑并添加元素伤害支持
修改 HeroAtkSystem 的 dmgCount 方法,增加目标属性参数并实现完整的伤害计算逻辑,包括物理/魔法伤害区分、防御减免和元素伤害计算。同时在 SkillSet 配置中新增 map 属性和元素伤害配置,支持冰/火/风三种元素伤害类型。
This commit is contained in:
@@ -158,7 +158,7 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
|
||||
const isCrit = this.checkChance(damageEvent.Attrs[Attrs.CRITICAL]);
|
||||
if (isCrit) attackerModel?.clearTalBuffByAttr(Attrs.CRITICAL);
|
||||
// 计算伤害
|
||||
let damage = this.dmgCount(damageEvent.Attrs,damageEvent.s_uuid);
|
||||
let damage = this.dmgCount(damageEvent.Attrs,targetAttrs.Attrs,damageEvent.s_uuid);
|
||||
if (isCrit) {
|
||||
// 暴击伤害计算
|
||||
// 使用施法者的暴击伤害加成属性(damageEvent.Attrs 快照)
|
||||
@@ -215,11 +215,25 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
|
||||
* - 元素伤害计算
|
||||
* - 真实伤害/魔法伤害/物理伤害区分
|
||||
*/
|
||||
private dmgCount(CAttrs:any,s_uuid:number){
|
||||
private dmgCount(CAttrs:any,TAttrs:any,s_uuid:number){
|
||||
let sConf = SkillSet[s_uuid];
|
||||
if (!sConf) return 0;
|
||||
let AP = sConf.ap*CAttrs[Attrs.AP]/100;
|
||||
return AP;
|
||||
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)));
|
||||
}
|
||||
total = Math.floor(total * (1 - ((TAttrs[Attrs.DAMAGE_REDUCTION]||0)/100)));
|
||||
return Math.max(0,total);
|
||||
}
|
||||
/**
|
||||
* 处理角色死亡
|
||||
|
||||
Reference in New Issue
Block a user