本次修改实现同技能不同角色的差异化技能效果: 1. 新增SkillOverrides接口与mergeSkillParams工具函数,用于合并基础技能配置和角色覆盖参数 2. 更新英雄配置、属性组件、触发辅助系统与施法系统以适配该机制 3. 为盾骑士、医师添加示例差异化配置,验证功能可行性 4. 整理技能配置,删除冗余重复的旧技能条目 5. 新增技能重构设计计划文档,替换旧的迁移计划文档
4.4 KiB
4.4 KiB
技能配置重构设计(简化版)
背景
当前技能系统核心问题:同一个技能 UUID,不同角色无法差异化效果。例如护盾技能 6301,所有角色都是给自己加盾,无法让某个角色给全队加盾。
设计目标
- SkillConfig 保持不变,作为技能基座(动画、弹道、默认数值)
- 角色通过 overrides 覆盖技能的可定制参数(ap、TGroup、hit_count、buffs 等)
- 同一个技能 UUID,不同角色可以有不同效果
- 触发技能(atking/atked)也支持 overrides
- 不迁移 SkillSet 数据,不拆分接口,不改消费者文件类型引用
改动内容(共 3 个接口 + 1 个函数)
1. SkillOverrides — 角色可覆盖的技能参数
/** 角色可覆盖的技能参数 — 所有字段可选 */
export interface SkillOverrides {
TGroup?: TGroup;
ap?: number;
hit_count?: number;
hitcd?: number;
crt?: number;
frz?: number;
bck?: number;
buffs?: BuffConf[];
}
2. HSkillInfo 增加 overrides
export interface HSkillInfo {
uuid: number;
lv: number;
cd: number;
ccd: number;
overrides?: SkillOverrides; // 新增:角色专属参数覆盖
}
3. 触发技能配置增加 overrides
// 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 — 合并基座 + 覆盖
/** 合并技能基座参数和角色覆盖参数 */
export function mergeSkillParams(
config: SkillConfig,
overrides?: SkillOverrides
): SkillConfig {
if (!overrides) return config;
return { ...config, ...overrides };
}
就这么简单:把 config 展开,把 overrides 展开覆盖上去。没有 overrides 时原样返回。
配置示例
SkillSet.ts — 不变
// 6301 护盾 — 保持原样
6301: {
uuid: 6301, name: "护盾", ..., TGroup: TGroup.Self, kind: SkillKind.Shield, ap: 3, ...
},
heroSet.ts — 角色差异化
// 见习战士:受击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 中:
// 旧:直接读 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 — 这些文件不改动。