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

149 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 技能配置重构设计(简化版)
## 背景
当前技能系统核心问题:**同一个技能 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 — 这些文件不改动。