Files
pixelheros/.trae/documents/2026-05-22-skill-template-refactor-design-plan.md
walkpan 88d7bdae47 feat(skill): 支持技能参数自定义覆盖
本次修改实现同技能不同角色的差异化技能效果:
1. 新增SkillOverrides接口与mergeSkillParams工具函数,用于合并基础技能配置和角色覆盖参数
2. 更新英雄配置、属性组件、触发辅助系统与施法系统以适配该机制
3. 为盾骑士、医师添加示例差异化配置,验证功能可行性
4. 整理技能配置,删除冗余重复的旧技能条目
5. 新增技能重构设计计划文档,替换旧的迁移计划文档
2026-05-23 12:11:00 +08:00

5.0 KiB
Raw Blame History

技能配置重构实施计划

1. 探索阶段总结 (Current State Analysis)

经过对代码库的探索,当前技能触发系统及相关配置状态如下:

  • SkillSet.ts 包含了所有技能的基座配置 SkillConfig 和技能字典 SkillSet
  • heroSet.ts 中的 HeroInfo 存放英雄和怪物的配置,目前 call, dead, fstart, fend 被定义为 number[],而 atkingatked 被定义为 {s_uuid: number, t_num: number}[]
  • HeroAttrsComp.ts 内部存储了与配置一致的触发技能结构。
  • SkillTriggerHelper.ts 负责判定并向外派发 GameEvent.TriggerSkill 事件,由 SCastSystem.ts 监听并执行 forceCastTriggerSkill
  • 目前 SCastSystem.ts 在收集技能目标和施放技能时,都是直接从 SkillSet[s_uuid] 读取 config,没有针对具体角色的差异化机制。

2. 拟议变更 (Proposed Changes)

2.1 修改 SkillSet.ts

  • 新增接口:定义 SkillOverrides 接口,包含所有可被角色覆盖的技能参数(如 TGroup, ap, hit_count, buffs 等,全部为可选字段)。
  • 新增函数:编写 mergeSkillParams(config, overrides?) 函数,将基座 config 和角色覆盖 overrides 进行合并,返回一个新的 SkillConfig 对象。

2.2 修改 heroSet.ts

  • 扩展接口
    • HSkillInfo 接口中增加 overrides?: SkillOverrides;
    • heroInfo 接口中的触发字段 call, dead, fstart, fend, atking, atked 统一更新为 { s_uuid: number; t_num: number; overrides?: SkillOverrides }[] 结构。
  • 更新配置示例:按照设计文档更新英雄 5001, 5002, 5301, 5302 的配置,为特定的触发技能添加 overrides 字段(如盾骑士 5002 全队护盾覆盖)。

2.3 修改 HeroAttrsComp.ts

  • 同步类型:将 call, dead, fstart, fend, atking, atked 的类型同步改为与 heroInfo 一致的 { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]

2.4 修改 SkillTriggerHelper.ts

  • 派发支持
    • 更新 dispatchSingle 方法签名,增加 overrides?: SkillOverrides 参数,并在 oops.message.dispatchEvent(GameEvent.TriggerSkill, {...}) 中将其传入。
    • 更新 handleCall, handleDead, handleArrayTrigger 处理逻辑,将原先对 number[] 的处理改为对 {s_uuid, t_num, overrides} 对象数组的处理,并提取 overrides 传递给 dispatchArray
    • 更新 handleAtking, handleAtked 中的 dispatchSingle 调用,传入 atkConfig.overrides

2.5 修改 SCastSystem.ts (关键运行时逻辑)

  • 事件监听更新:在 onTriggerSkill 方法的 args 参数定义中补充 overrides?: SkillOverrides,并传递给 forceCastTriggerSkill
  • 合并逻辑上移(架构优化)
    • forceCastTriggerSkillcastSkill方法入口处(而非 applyFriendlySkillEffects 内部),第一时间调用 mergeSkillParams(config, overrides) 获取 effective 技能配置。
    • 将后续所有关于阵营判定(如 effective.TGroup)、目标收集、以及传递给 applyFriendlySkillEffects / applyEnemySkillEffects 的参数全部替换为 effective
    • 为何如此设计:如果在原设计中仅在 applyFriendlySkillEffects 入口处合并,那么前置的目标选择逻辑(依赖 TGroup 判定是 Self 还是 Team)将会使用未合并的基础配置,导致类似“自己加盾变为全队加盾”的 TGroup 覆盖无法生效。将合并操作前置可以彻底解决这一问题。
  • 主动技能支持:在 pickCastSkill 中,读取 heroAttrs.skills[s_uuid]?.overrides 并进行合并判定,同时将 overrides 放入返回的 castPlan 中,以便 castSkill 使用。

3. 假设与决策 (Assumptions & Decisions)

  • 统一触发结构:虽然 call, dead, fstart, fend 不严格需要 t_num,但为了类型统一并完全遵守设计规范,统一采用了包含 t_num 的对象结构。
  • 合并前置决策:如上所述,坚决在施放方法入口处进行 mergeSkillParams 以保证目标收集逻辑能够感知到 TGroup 的变化。这比设计规范中要求的修改范围略有扩大,但对于系统功能的正确实现是必须的。
  • 卡牌技能影响:卡牌技能(forceCastCardSkill)当前没有绑定角色的 overrides,因此维持读取基础 SkillSet 逻辑不变。

4. 验证步骤 (Verification steps)

  1. 编译 TypeScript 代码,确保 HeroAttrsComp, heroSet, SCastSystem 等修改后的接口和类型无报错。
  2. 启动游戏或运行测试,确认 5001 (见习战士) 触发的基础护盾只对自己生效。
  3. 确认 5002 (盾骑士) 受击触发的护盾技能正确地为全队附加护盾并且护盾值ap与次数hit_count符合 overrides 配置。
  4. 确认所有旧版英雄技能在无 overrides 时能够正确回退到 SkillSet 的默认配置,游戏运转正常无异常日志。