feat: 实现DoT灼烧技能与debuff图标系统

本次提交完成了以下核心改动:
1.  调整fb-1~fb-6技能预制件的攻击偏移坐标,优化技能弹道位置
2.  新增DoT伤害机制,支持周期伤害/治疗的独立结算
3.  为Buff系统添加施法者属性快照,让DoT暴击、控制判定更准确
4.  新增顶栏debuff图标显示功能,支持灼烧等负面状态可视化
5.  为破晓先知等英雄替换为新的灼烧火球技能6104
6.  修复fb-2预制件的配置字段顺序与多余属性问题
This commit is contained in:
panFD
2026-08-15 14:36:38 +08:00
parent 8e5c0d3852
commit e8c6a7ca6a
17 changed files with 4118 additions and 970 deletions

View File

@@ -15,6 +15,7 @@ import { Timer } from "db://oops-framework/core/common/timer/Timer";
import { BuffList } from "../common/config/BuffSet";
import { HeroAttrsComp } from "./HeroAttrsComp";
import { BuffComp, ActiveBuff } from "./BuffComp";
import { DamageQueueHelper } from "./DamageQueueComp";
import { mLogger } from "../common/Logger";
/** Buff 模块调试日志开关 */
@@ -52,7 +53,7 @@ export class BuffSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
// 周期效果结算(先于到期判断,避免到期帧丢失末次 tick
if (cfg.tick && attrsComp) {
this.processTick(layer, cfg.tick, attrsComp);
this.processTick(e, buffId, layer, cfg.tick, attrsComp);
}
// 永久 buffduration<=0不递减 remaining
@@ -84,11 +85,17 @@ export class BuffSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
* 处理单层的周期效果DoT/HoT
* 累计 tick_acc 到 interval 时结算一次伤害/治疗。
*
* DoT负值转为 DamageEvent 入队,由 HeroAtkSystem.doAttack 走完整结算链
* (护盾抵扣 / 暴击 / 冰冻 / 击晕 / 飘字 / 死亡链Attrs 取 buff 层的施法者属性快照;
* HoT正值保持直接回血不走伤害链。
*
* @param target 被作用者实体DoT 入队用)
* @param buffId buff 配置 idDoT 事件借 s_uuid 字段携带,仅作日志追溯)
* @param layer 当前 buff 层实例
* @param tick 周期效果配置
* @param attrs 被作用者属性组件(调用 add_hp
* @param attrs 被作用者属性组件
*/
private processTick(layer: ActiveBuff, tick: { interval: number; damage_or_heal: number; scale_by_ap_pct: number }, attrs: HeroAttrsComp): void {
private processTick(target: ecs.Entity, buffId: number, layer: ActiveBuff, tick: { interval: number; damage_or_heal: number; scale_by_ap_pct: number }, attrs: HeroAttrsComp): void {
// interval 非正值守卫,避免死循环
if (tick.interval <= 0) return;
layer.tick_acc += TICK_STEP;
@@ -99,7 +106,12 @@ export class BuffSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
const baseAmount = layer.value_override !== undefined ? layer.value_override : tick.damage_or_heal;
const scale = 1 + layer.source_ap_snapshot * tick.scale_by_ap_pct / 10000;
const amount = Math.floor(baseAmount * scale);
attrs.add_hp(amount);
if (amount < 0) {
// DoT 走伤害队列dot_dmg 传正值doAttack 内识别并走固定伤害分支
DamageQueueHelper.addDamageToEntity(target, layer.source_attrs_snapshot ?? null, layer.source_uuid, buffId, 0, 1, -amount);
} else if (amount > 0) {
attrs.add_hp(amount);
}
}
}
}