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

4.4 KiB
Raw Blame History

技能配置重构设计(简化版)

背景

当前技能系统核心问题:同一个技能 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 改动

applyFriendlySkillEffectsapplyActualFriendlyEffect 中:

// 旧:直接读 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 — 这些文件不改动。