Files
pixelheros/docs/superpowers/skill_card_trigger_refactor.md
panFD dc8391847b refactor(cardSkill): 完成卡牌技能触发机制类型化改造
本次提交为全量的卡牌技能触发系统重构,主要变更包括:
1.  新增CardTriggerType枚举,统一卡牌触发类型定义
2.  补全依赖事件派发:每波战斗结束FightEnd、英雄死亡HeroDead(带阵营过滤)、复活成功ReviveSuccess
3.  重构SkillBoxComp,按触发类型动态注册事件监听,拆分即时/定时/驻场/事件型逻辑
4.  批量迁移所有卡牌配置,为旧技能补充显式触发类型
5.  新增全局触发次数上限机制,区分每波/全局触发计数规则
6.  新增配套设计文档,记录改造背景与方案细节

本次重构彻底解决了原有隐式配置难以维护、无法支持事件型触发的痛点,实现了技能触发逻辑的标准化与可扩展性。
2026-06-19 23:01:24 +08:00

3.1 KiB
Raw Blame History

技能卡触发机制重构方案(已废弃)

⚠️ 本文档已废弃,被以下执行计划取代: 2026-06-19-card-skill-trigger-type-refactor-plan.md

废弃原因:本草案存在 3 处关键错误,已在新计划中修正:

  1. 缺少 Instant 类型,导致现有即时卡牌无法归类
  2. BattleEnd 错误映射到 MissionEnd(整局结束),应为 FightEnd(每波结束)
  3. HeroDead 未提阵营过滤,会导致怪物死亡误触发

保留本文档仅作历史记录,请勿参考。


旧草案内容(仅供参考)

原始需求背景

当前技能卡SkillCardDataCardSet.ts 中仅通过 is_inst(是否即时)和 t_inv(触发间隔)隐式区分类型。随着技能丰富,需要:

  1. 明确定义卡牌技能的触发类型(如:驻场、定时)。
  2. 新增类似于英雄生命周期的触发时机:战斗开始、战斗结束、场上英雄死亡、英雄召唤上场。

原始修改方案

1. 明确技能触发类型 (CardSet.ts)

新增枚举 CardSkillType,用于明确区分卡牌技能的触发时机:

export enum CardSkillType {
    Interval = 1,       // 间隔定时触发 (战斗中每隔N秒执行)
    Field = 2,          // 驻场技能 (被动光环)
    BattleStart = 3,    // 战斗开始时触发一次
    BattleEnd = 4,      // 战斗结束时触发一次
    HeroDead = 5,       // 场上己方英雄死亡时触发
    HeroCall = 6,       // 场上己方英雄召唤上场时触发
}

错误 1:缺少 Instant 类型,现有 is_inst: true 的卡牌8301护盾、8302治疗等无法归类。

2. 完善事件派发机制

为支持新的触发类型,确保相关事件被正确派发:

  • 英雄召唤上场 (GameEvent.MasterCalled):已在 Hero.ts 中实现。
  • 英雄死亡 (GameEvent.HeroDead):需在 HeroAtkSystem.ts 中的英雄死亡逻辑里,补充派发 GameEvent.HeroDead 事件,供技能盒子监听。
  • 战斗开始/结束 (GameEvent.FightStart / GameEvent.MissionEnd):已支持。

错误 2BattleEnd 映射到 MissionEnd 是错的——MissionEnd 是整局任务结束,不是每波战斗结束。 错误 3HeroDead 未提阵营过滤,怪物死亡会误触发。

3. 重构技能盒子逻辑 (SkillBoxComp.ts)

修改 SkillBoxComp,使其根据 trigger_type 进行不同的监听与触发:

  • 属性定义:新增解析并保存 trigger_type
  • 事件监听:在 onLoadinit 后根据 trigger_type 注册相应的监听:
    • CardSkillType.BattleStart: 监听 GameEvent.FightStart
    • CardSkillType.BattleEnd: 监听 GameEvent.MissionEnd
    • CardSkillType.HeroDead: 监听 GameEvent.HeroDead
    • CardSkillType.HeroCall: 监听 GameEvent.MasterCalled
  • 触发处理
    • 每当监听到对应事件,调用 triggerSkill() 释放技能,并累加触发次数。
    • 若已达最大触发次数,则销毁节点。