本次修改实现同技能不同角色的差异化技能效果: 1. 新增SkillOverrides接口与mergeSkillParams工具函数,用于合并基础技能配置和角色覆盖参数 2. 更新英雄配置、属性组件、触发辅助系统与施法系统以适配该机制 3. 为盾骑士、医师添加示例差异化配置,验证功能可行性 4. 整理技能配置,删除冗余重复的旧技能条目 5. 新增技能重构设计计划文档,替换旧的迁移计划文档
149 lines
4.4 KiB
Markdown
149 lines
4.4 KiB
Markdown
# 技能配置重构设计(简化版)
|
||
|
||
## 背景
|
||
|
||
当前技能系统核心问题:**同一个技能 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 — 这些文件不改动。
|