refactor(cardSkill): 完成卡牌技能触发机制类型化改造

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

本次重构彻底解决了原有隐式配置难以维护、无法支持事件型触发的痛点,实现了技能触发逻辑的标准化与可扩展性。
This commit is contained in:
panFD
2026-06-19 23:01:24 +08:00
parent a866cba8d1
commit dc8391847b
14 changed files with 4924 additions and 2125 deletions

View 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()` 释放技能,并累加触发次数。
- 若已达最大触发次数,则销毁节点。