本次提交为全量的卡牌技能触发系统重构,主要变更包括: 1. 新增CardTriggerType枚举,统一卡牌触发类型定义 2. 补全依赖事件派发:每波战斗结束FightEnd、英雄死亡HeroDead(带阵营过滤)、复活成功ReviveSuccess 3. 重构SkillBoxComp,按触发类型动态注册事件监听,拆分即时/定时/驻场/事件型逻辑 4. 批量迁移所有卡牌配置,为旧技能补充显式触发类型 5. 新增全局触发次数上限机制,区分每波/全局触发计数规则 6. 新增配套设计文档,记录改造背景与方案细节 本次重构彻底解决了原有隐式配置难以维护、无法支持事件型触发的痛点,实现了技能触发逻辑的标准化与可扩展性。
3.1 KiB
3.1 KiB
技能卡触发机制重构方案(已废弃)
⚠️ 本文档已废弃,被以下执行计划取代:
2026-06-19-card-skill-trigger-type-refactor-plan.md废弃原因:本草案存在 3 处关键错误,已在新计划中修正:
- 缺少
Instant类型,导致现有即时卡牌无法归类BattleEnd错误映射到MissionEnd(整局结束),应为FightEnd(每波结束)HeroDead未提阵营过滤,会导致怪物死亡误触发保留本文档仅作历史记录,请勿参考。
旧草案内容(仅供参考)
原始需求背景
当前技能卡(SkillCardData)在 CardSet.ts 中仅通过 is_inst(是否即时)和 t_inv(触发间隔)隐式区分类型。随着技能丰富,需要:
- 明确定义卡牌技能的触发类型(如:驻场、定时)。
- 新增类似于英雄生命周期的触发时机:战斗开始、战斗结束、场上英雄死亡、英雄召唤上场。
原始修改方案
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):已支持。
❌ 错误 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()释放技能,并累加触发次数。 - 若已达最大触发次数,则销毁节点。
- 每当监听到对应事件,调用