# 技能配置重构设计(简化版) ## 背景 当前技能系统核心问题:**同一个技能 UUID,不同角色无法差异化效果**。例如护盾技能 6301,所有角色都是给自己加盾,无法让某个角色给全队加盾。 ## 设计目标 - SkillConfig **保持不变**,作为技能基座(动画、弹道、默认数值) - 角色通过 **overrides** 覆盖技能的可定制参数(ap、TGroup、hit_count、buffs 等) - 同一个技能 UUID,不同角色可以有不同效果 - 触发技能(atking/atked)也支持 overrides - **不迁移 SkillSet 数据**,不拆分接口,不改消费者文件类型引用 ## 改动内容(共 3 个接口 + 1 个函数) ### 1. SkillOverrides — 角色可覆盖的技能参数 ```typescript /** 角色可覆盖的技能参数 — 所有字段可选 */ export interface SkillOverrides { TGroup?: TGroup; ap?: number; hit_count?: number; hitcd?: number; crt?: number; frz?: number; bck?: number; buffs?: BuffConf[]; } ``` ### 2. HSkillInfo 增加 overrides ```typescript export interface HSkillInfo { uuid: number; lv: number; cd: number; ccd: number; overrides?: SkillOverrides; // 新增:角色专属参数覆盖 } ``` ### 3. 触发技能配置增加 overrides ```typescript // heroInfo 中触发字段扩展: atking?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; atked?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; call?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; dead?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; fstart?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; fend?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; ``` ### 4. mergeSkillParams — 合并基座 + 覆盖 ```typescript /** 合并技能基座参数和角色覆盖参数 */ export function mergeSkillParams( config: SkillConfig, overrides?: SkillOverrides ): SkillConfig { if (!overrides) return config; return { ...config, ...overrides }; } ``` 就这么简单:把 config 展开,把 overrides 展开覆盖上去。没有 overrides 时原样返回。 ## 配置示例 ### SkillSet.ts — 不变 ```typescript // 6301 护盾 — 保持原样 6301: { uuid: 6301, name: "护盾", ..., TGroup: TGroup.Self, kind: SkillKind.Shield, ap: 3, ... }, ``` ### heroSet.ts — 角色差异化 ```typescript // 见习战士:受击2次触发护盾,使用基座默认值(给自己加3次盾) 5001: { ..., atked: [{ s_uuid: 6301, t_num: 2 }], }, // 盾骑士:受击2次触发护盾,覆盖为全队加2次盾 5002: { ..., atked: [{ s_uuid: 6301, t_num: 2, overrides: { TGroup: TGroup.Team, ap: 2, hit_count: 3 } }], }, // 牧师:普攻2次触发治疗,使用基座默认值 5301: { ..., atking: [{ s_uuid: 6302, t_num: 2 }], }, // 医师:普攻2次触发治疗,覆盖为持续3次 5302: { ..., atking: [{ s_uuid: 6302, t_num: 2, overrides: { hit_count: 3, ap: 200 } }], }, ``` ## 运行时改动(仅 SCastSystem + SkillTriggerHelper) ### SCastSystem 改动 `applyFriendlySkillEffects` 和 `applyActualFriendlyEffect` 中: ```typescript // 旧:直接读 config const kind = config.kind ?? SkillKind.Support; const sAp = config.ap + sUp.ap * _skillLv; // 新:先合并 overrides,再读 const effective = mergeSkillParams(config, triggerConf?.overrides); const kind = effective.kind ?? SkillKind.Support; const sAp = effective.ap + sUp.ap * _skillLv; ``` 改动范围:只在 `applyFriendlySkillEffects` 入口处加一行 `mergeSkillParams`,其余逻辑不变。 ### SkillTriggerHelper 改动 触发技能时传递 `triggerConf.overrides` 给 SCastSystem。 ### HeroAttrsComp 类型同步 atking/atked 的内联类型加上 `overrides?: SkillOverrides`。 ## 涉及文件 | 文件 | 改动 | |------|------| | `SkillSet.ts` | 新增 `SkillOverrides` 接口 + `mergeSkillParams` 函数 | | `heroSet.ts` | HSkillInfo 增加 `overrides?`,触发配置增加 `overrides?` | | `HeroAttrsComp.ts` | atking/atked 内联类型增加 `overrides?` | | `SCastSystem.ts` | applyFriendlySkillEffects 中调用 mergeSkillParams | | `SkillTriggerHelper.ts` | 传递 overrides | **不涉及的文件**:Skill.ts、SkillView.ts、SMoveSystem.ts、STimeComp.ts、HeroAtkSystem.ts、HeroViewComp.ts、Hero.ts、Mon.ts、CardComp.ts、IBoxComp.ts — 这些文件不改动。