From d49f4fb77e86999c444b76ac527acbd7516c1a90 Mon Sep 17 00:00:00 2001 From: panFD Date: Sat, 15 Aug 2026 22:40:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(buff):=20=E6=96=B0=E5=A2=9E=E5=87=BA?= =?UTF-8?q?=E8=A1=80debuff=E5=B9=B6=E5=AE=9E=E7=8E=B0=E6=9A=B4=E5=87=BB?= =?UTF-8?q?=E7=8E=87=E5=8A=A0=E6=88=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 在BuffSet中新增出血debuff的配置、图标映射与相关常量 2. 在HeroAtkSystem中添加出血层数带来的被暴击率加成计算逻辑 --- assets/script/game/common/config/BuffSet.ts | 13 +++++++++++++ assets/script/game/hero/HeroAtkSystem.ts | 16 +++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/assets/script/game/common/config/BuffSet.ts b/assets/script/game/common/config/BuffSet.ts index e11aab7b..81ebde95 100644 --- a/assets/script/game/common/config/BuffSet.ts +++ b/assets/script/game/common/config/BuffSet.ts @@ -43,6 +43,7 @@ export enum DebuffIcon { Penetration = "Penetration", // 穿透 Stun = "Stun", // 击晕 Poison = "Poison", // 中毒 + Blood = "Blood", // 出血 } /** @@ -56,10 +57,15 @@ export const DEBUFF_ICON_MAP: Record = { 7004: DebuffIcon.Stun, // 击晕 7005: DebuffIcon.Poison, // 中毒 7006: DebuffIcon.AttackDebuff, // 减攻 + 7007: DebuffIcon.Blood, // 出血 }; /** 易伤 buff 的 id(HeroAtkSystem 结算时按此 id 汇总易伤值) */ export const VULNERABLE_BUFF_ID = 7002; +/** 出血 buff 的 id(每层使目标被暴击率 +1%) */ +export const BLEED_BUFF_ID = 7007; +/** 出血每层附加的被暴击率(百分点) */ +export const BLEED_CRIT_PER_STACK = 1; /** Buff 静态定义 */ export interface BuffConfig { @@ -121,6 +127,13 @@ export const BuffList: Record = { modifiers: [{ attr: Attrs.ap, op: ModOp.Flat, value: -10 }], 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 覆写成长) 7111: { id: 7111, name: "战前强攻", icon: "Stat_Attack_03", diff --git a/assets/script/game/hero/HeroAtkSystem.ts b/assets/script/game/hero/HeroAtkSystem.ts index c6fac102..8a884d10 100644 --- a/assets/script/game/hero/HeroAtkSystem.ts +++ b/assets/script/game/hero/HeroAtkSystem.ts @@ -19,7 +19,7 @@ import { getMonsterGoldDrop } from "../map/RogueConfig"; import { MissionEconomy } from "../map/MissionEconomy"; import { MoveComp } from "./MoveComp"; 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"; /** 最终伤害数据接口 @@ -135,8 +135,8 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda this.onAttacked(target); // 暴击判定 - // 使用施法者的暴击率属性(damageEvent.Attrs 快照),- 被攻击者的暴击抗性属 - const criticalChance = (damageEvent.Attrs[Attrs.critical] || 0) - TAttrsComp.getFinalCriticalRes(); + // 使用施法者的暴击率属性(damageEvent.Attrs 快照)- 被攻击者的暴击抗性 + 目标出血层数附加的被暴击率 + const criticalChance = (damageEvent.Attrs[Attrs.critical] || 0) - TAttrsComp.getFinalCriticalRes() + this.getBleedCritBonus(target); const isCrit = this.checkChance(criticalChance); // 计算基础伤害:DoT 直接用固定 tick 值,普攻走 dmgCount 公式 @@ -462,6 +462,16 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda * @param damage 原始伤害值 * @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 优先),再被易伤抗性百分比减免。 * @returns 附加伤害值(向下取整,非负)