feat(buff): 新增出血debuff并实现暴击率加成逻辑
1. 在BuffSet中新增出血debuff的配置、图标映射与相关常量 2. 在HeroAtkSystem中添加出血层数带来的被暴击率加成计算逻辑
This commit is contained in:
@@ -43,6 +43,7 @@ export enum DebuffIcon {
|
|||||||
Penetration = "Penetration", // 穿透
|
Penetration = "Penetration", // 穿透
|
||||||
Stun = "Stun", // 击晕
|
Stun = "Stun", // 击晕
|
||||||
Poison = "Poison", // 中毒
|
Poison = "Poison", // 中毒
|
||||||
|
Blood = "Blood", // 出血
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,10 +57,15 @@ export const DEBUFF_ICON_MAP: Record<number, DebuffIcon> = {
|
|||||||
7004: DebuffIcon.Stun, // 击晕
|
7004: DebuffIcon.Stun, // 击晕
|
||||||
7005: DebuffIcon.Poison, // 中毒
|
7005: DebuffIcon.Poison, // 中毒
|
||||||
7006: DebuffIcon.AttackDebuff, // 减攻
|
7006: DebuffIcon.AttackDebuff, // 减攻
|
||||||
|
7007: DebuffIcon.Blood, // 出血
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 易伤 buff 的 id(HeroAtkSystem 结算时按此 id 汇总易伤值) */
|
/** 易伤 buff 的 id(HeroAtkSystem 结算时按此 id 汇总易伤值) */
|
||||||
export const VULNERABLE_BUFF_ID = 7002;
|
export const VULNERABLE_BUFF_ID = 7002;
|
||||||
|
/** 出血 buff 的 id(每层使目标被暴击率 +1%) */
|
||||||
|
export const BLEED_BUFF_ID = 7007;
|
||||||
|
/** 出血每层附加的被暴击率(百分点) */
|
||||||
|
export const BLEED_CRIT_PER_STACK = 1;
|
||||||
|
|
||||||
/** Buff 静态定义 */
|
/** Buff 静态定义 */
|
||||||
export interface BuffConfig {
|
export interface BuffConfig {
|
||||||
@@ -121,6 +127,13 @@ export const BuffList: Record<number, BuffConfig> = {
|
|||||||
modifiers: [{ attr: Attrs.ap, op: ModOp.Flat, value: -10 }],
|
modifiers: [{ attr: Attrs.ap, op: ModOp.Flat, value: -10 }],
|
||||||
info: "攻击力降低 10 点,持续 5 秒",
|
info: "攻击力降低 10 点,持续 5 秒",
|
||||||
},
|
},
|
||||||
|
// 出血(每层使目标被暴击率 +1%,微量伤害 DoT;暴击率加成由 HeroAtkSystem 按 BLEED_BUFF_ID 层数结算)
|
||||||
|
7007: {
|
||||||
|
id: 7007, name: "出血", icon: "Stat_Blood",
|
||||||
|
category: BuffCategory.Debuff, duration: 5, max_stack: 5,
|
||||||
|
tick: { interval: 0.5, damage_or_heal: -1, scale_by_ap_pct: 0 },
|
||||||
|
info: "微量出血,每层使自身被暴击率提升 1%,可叠加,持续 5 秒",
|
||||||
|
},
|
||||||
// 占卜师战前攻击强化(基础档:+30/5s;高阶通过 buff_value/buff_duration 覆写成长)
|
// 占卜师战前攻击强化(基础档:+30/5s;高阶通过 buff_value/buff_duration 覆写成长)
|
||||||
7111: {
|
7111: {
|
||||||
id: 7111, name: "战前强攻", icon: "Stat_Attack_03",
|
id: 7111, name: "战前强攻", icon: "Stat_Attack_03",
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import { getMonsterGoldDrop } from "../map/RogueConfig";
|
|||||||
import { MissionEconomy } from "../map/MissionEconomy";
|
import { MissionEconomy } from "../map/MissionEconomy";
|
||||||
import { MoveComp } from "./MoveComp";
|
import { MoveComp } from "./MoveComp";
|
||||||
import { buffManager, BuffApplyOverrides } from "./BuffManager";
|
import { buffManager, BuffApplyOverrides } from "./BuffManager";
|
||||||
import { DEBUFF_ICON_MAP, VULNERABLE_BUFF_ID, BuffList } from "../common/config/BuffSet";
|
import { DEBUFF_ICON_MAP, VULNERABLE_BUFF_ID, BLEED_BUFF_ID, BLEED_CRIT_PER_STACK, BuffList } from "../common/config/BuffSet";
|
||||||
import { BuffComp } from "./BuffComp";
|
import { BuffComp } from "./BuffComp";
|
||||||
|
|
||||||
/** 最终伤害数据接口
|
/** 最终伤害数据接口
|
||||||
@@ -135,8 +135,8 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
|||||||
this.onAttacked(target);
|
this.onAttacked(target);
|
||||||
|
|
||||||
// 暴击判定
|
// 暴击判定
|
||||||
// 使用施法者的暴击率属性(damageEvent.Attrs 快照),- 被攻击者的暴击抗性属
|
// 使用施法者的暴击率属性(damageEvent.Attrs 快照)- 被攻击者的暴击抗性 + 目标出血层数附加的被暴击率
|
||||||
const criticalChance = (damageEvent.Attrs[Attrs.critical] || 0) - TAttrsComp.getFinalCriticalRes();
|
const criticalChance = (damageEvent.Attrs[Attrs.critical] || 0) - TAttrsComp.getFinalCriticalRes() + this.getBleedCritBonus(target);
|
||||||
const isCrit = this.checkChance(criticalChance);
|
const isCrit = this.checkChance(criticalChance);
|
||||||
|
|
||||||
// 计算基础伤害:DoT 直接用固定 tick 值,普攻走 dmgCount 公式
|
// 计算基础伤害:DoT 直接用固定 tick 值,普攻走 dmgCount 公式
|
||||||
@@ -462,6 +462,16 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
|||||||
* @param damage 原始伤害值
|
* @param damage 原始伤害值
|
||||||
* @returns {remainingDamage, absorbedDamage} 剩余伤害值和被护盾减免的伤害值
|
* @returns {remainingDamage, absorbedDamage} 剩余伤害值和被护盾减免的伤害值
|
||||||
*/
|
*/
|
||||||
|
/**
|
||||||
|
* 目标出血层数附加的被暴击率(每层 +BLEED_CRIT_PER_STACK 百分点)。
|
||||||
|
* @returns 附加的被暴击率(百分点)
|
||||||
|
*/
|
||||||
|
private getBleedCritBonus(target: ecs.Entity): number {
|
||||||
|
if (!target.has(BuffComp)) return 0;
|
||||||
|
const layers = target.get(BuffComp).buffs.get(BLEED_BUFF_ID);
|
||||||
|
return (layers?.length ?? 0) * BLEED_CRIT_PER_STACK;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算易伤附加伤害:汇总目标每层易伤 buff 的数值(value_override 优先),再被易伤抗性百分比减免。
|
* 计算易伤附加伤害:汇总目标每层易伤 buff 的数值(value_override 优先),再被易伤抗性百分比减免。
|
||||||
* @returns 附加伤害值(向下取整,非负)
|
* @returns 附加伤害值(向下取整,非负)
|
||||||
|
|||||||
Reference in New Issue
Block a user