refactor(cardSkill): 完成卡牌技能触发机制类型化改造
本次提交为全量的卡牌技能触发系统重构,主要变更包括: 1. 新增CardTriggerType枚举,统一卡牌触发类型定义 2. 补全依赖事件派发:每波战斗结束FightEnd、英雄死亡HeroDead(带阵营过滤)、复活成功ReviveSuccess 3. 重构SkillBoxComp,按触发类型动态注册事件监听,拆分即时/定时/驻场/事件型逻辑 4. 批量迁移所有卡牌配置,为旧技能补充显式触发类型 5. 新增全局触发次数上限机制,区分每波/全局触发计数规则 6. 新增配套设计文档,记录改造背景与方案细节 本次重构彻底解决了原有隐式配置难以维护、无法支持事件型触发的痛点,实现了技能触发逻辑的标准化与可扩展性。
This commit is contained in:
59
docs/superpowers/skill_card_trigger_refactor.md
Normal file
59
docs/superpowers/skill_card_trigger_refactor.md
Normal file
@@ -0,0 +1,59 @@
|
||||
# 技能卡触发机制重构方案(已废弃)
|
||||
|
||||
> ⚠️ **本文档已废弃**,被以下执行计划取代:
|
||||
> [`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()` 释放技能,并累加触发次数。
|
||||
- 若已达最大触发次数,则销毁节点。
|
||||
Reference in New Issue
Block a user