本次修改实现同技能不同角色的差异化技能效果: 1. 新增SkillOverrides接口与mergeSkillParams工具函数,用于合并基础技能配置和角色覆盖参数 2. 更新英雄配置、属性组件、触发辅助系统与施法系统以适配该机制 3. 为盾骑士、医师添加示例差异化配置,验证功能可行性 4. 整理技能配置,删除冗余重复的旧技能条目 5. 新增技能重构设计计划文档,替换旧的迁移计划文档
5.0 KiB
5.0 KiB
技能配置重构实施计划
1. 探索阶段总结 (Current State Analysis)
经过对代码库的探索,当前技能触发系统及相关配置状态如下:
SkillSet.ts包含了所有技能的基座配置SkillConfig和技能字典SkillSet。heroSet.ts中的HeroInfo存放英雄和怪物的配置,目前call,dead,fstart,fend被定义为number[],而atking和atked被定义为{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。 - 合并逻辑上移(架构优化):
- 在
forceCastTriggerSkill和castSkill的方法入口处(而非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)
- 编译 TypeScript 代码,确保
HeroAttrsComp,heroSet,SCastSystem等修改后的接口和类型无报错。 - 启动游戏或运行测试,确认
5001(见习战士) 触发的基础护盾只对自己生效。 - 确认
5002(盾骑士) 受击触发的护盾技能,正确地为全队附加护盾,并且护盾值(ap)与次数(hit_count)符合overrides配置。 - 确认所有旧版英雄技能在无
overrides时能够正确回退到SkillSet的默认配置,游戏运转正常无异常日志。