# 技能卡触发机制重构方案(已废弃) > ⚠️ **本文档已废弃**,被以下执行计划取代: > [`2026-06-19-card-skill-trigger-type-refactor-plan.md`](./2026-06-19-card-skill-trigger-type-refactor-plan.md) > > 废弃原因:本草案存在 3 处关键错误,已在新计划中修正: > 1. 缺少 `Instant` 类型,导致现有即时卡牌无法归类 > 2. `BattleEnd` 错误映射到 `MissionEnd`(整局结束),应为 `FightEnd`(每波结束) > 3. `HeroDead` 未提阵营过滤,会导致怪物死亡误触发 > > 保留本文档仅作历史记录,请勿参考。 --- ## 旧草案内容(仅供参考) ### 原始需求背景 当前技能卡(SkillCardData)在 `CardSet.ts` 中仅通过 `is_inst`(是否即时)和 `t_inv`(触发间隔)隐式区分类型。随着技能丰富,需要: 1. 明确定义卡牌技能的触发类型(如:驻场、定时)。 2. 新增类似于英雄生命周期的触发时机:战斗开始、战斗结束、场上英雄死亡、英雄召唤上场。 ### 原始修改方案 #### 1. 明确技能触发类型 (`CardSet.ts`) 新增枚举 `CardSkillType`,用于明确区分卡牌技能的触发时机: ```typescript 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`)**:已支持。 > ❌ **错误 2**:`BattleEnd` 映射到 `MissionEnd` 是错的——MissionEnd 是整局任务结束,不是每波战斗结束。 > ❌ **错误 3**:HeroDead 未提阵营过滤,怪物死亡会误触发。 #### 3. 重构技能盒子逻辑 (`SkillBoxComp.ts`) 修改 `SkillBoxComp`,使其根据 `trigger_type` 进行不同的监听与触发: - **属性定义**:新增解析并保存 `trigger_type`。 - **事件监听**:在 `onLoad` 或 `init` 后根据 `trigger_type` 注册相应的监听: - `CardSkillType.BattleStart`: 监听 `GameEvent.FightStart`。 - `CardSkillType.BattleEnd`: 监听 `GameEvent.MissionEnd`。 - `CardSkillType.HeroDead`: 监听 `GameEvent.HeroDead`。 - `CardSkillType.HeroCall`: 监听 `GameEvent.MasterCalled`。 - **触发处理**: - 每当监听到对应事件,调用 `triggerSkill()` 释放技能,并累加触发次数。 - 若已达最大触发次数,则销毁节点。