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

60 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 技能卡触发机制重构方案(已废弃)
> ⚠️ **本文档已废弃**,被以下执行计划取代:
> [`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()` 释放技能,并累加触发次数。
- 若已达最大触发次数,则销毁节点。