refactor(cardSkill): 完成卡牌技能触发机制类型化改造
本次提交为全量的卡牌技能触发系统重构,主要变更包括: 1. 新增CardTriggerType枚举,统一卡牌触发类型定义 2. 补全依赖事件派发:每波战斗结束FightEnd、英雄死亡HeroDead(带阵营过滤)、复活成功ReviveSuccess 3. 重构SkillBoxComp,按触发类型动态注册事件监听,拆分即时/定时/驻场/事件型逻辑 4. 批量迁移所有卡牌配置,为旧技能补充显式触发类型 5. 新增全局触发次数上限机制,区分每波/全局触发计数规则 6. 新增配套设计文档,记录改造背景与方案细节 本次重构彻底解决了原有隐式配置难以维护、无法支持事件型触发的痛点,实现了技能触发逻辑的标准化与可扩展性。
This commit is contained in:
@@ -37,6 +37,16 @@ export enum CKind {
|
||||
Potion = 4, //药水
|
||||
}
|
||||
|
||||
/** 技能卡触发类型 */
|
||||
export enum CardSkillType {
|
||||
Interval = 1, // 间隔定时触发 (战斗中每隔N秒执行)
|
||||
Field = 2, // 驻场技能 (被动光环)
|
||||
BattleStart = 3, // 战斗开始时触发一次
|
||||
BattleEnd = 4, // 战斗结束时触发一次
|
||||
HeroDead = 5, // 场上己方英雄死亡时触发
|
||||
HeroCall = 6, // 场上己方英雄召唤上场时触发
|
||||
}
|
||||
|
||||
/** 卡池等级定义 */
|
||||
export enum CardLV {
|
||||
LV1 = 1,
|
||||
@@ -46,6 +56,21 @@ export enum CardLV {
|
||||
LV5 = 5,
|
||||
}
|
||||
|
||||
/**
|
||||
* 卡牌技能触发类型
|
||||
* - 命名对齐英雄侧 SkillTriggerType,便于跨模块认知统一
|
||||
* - 枚举值从 1 开始,避免 0 的 falsy 坑(if (trigger_type) 判断出错)
|
||||
*/
|
||||
export enum CardTriggerType {
|
||||
Instant = 1, // 即时触发:使用后立即生效一次
|
||||
Interval = 2, // 定时循环:战斗中按 t_inv 间隔重复触发
|
||||
Field = 3, // 驻场光环:被动生效(仅显式分类,仍由 field 字段驱动)
|
||||
FightStart = 4, // 战斗开始时触发
|
||||
FightEnd = 5, // 战斗结束时触发(每波结束)
|
||||
HeroDead = 6, // 场上己方英雄死亡时触发
|
||||
HeroCall = 7, // 英雄上场时触发(主角召唤 + 技能召唤 + 复活)
|
||||
}
|
||||
|
||||
/** 通用卡牌配置 */
|
||||
export interface CardConfig {
|
||||
uuid: number
|
||||
@@ -69,6 +94,15 @@ export interface CardConfig {
|
||||
keep_waves?: number // 维持的波次数(-1表示持续到战斗结束,0或undefined表示仅本波次)
|
||||
overrides?: SkillOverrides // 技能参数覆写(如自定义伤害ap、buff值、金币数等)
|
||||
field?: number[] // 驻场技能 UUID 数组,表示该卡牌提供驻场属性加成
|
||||
|
||||
/** 触发类型(必填,技能卡专用;功能卡/英雄卡可缺省) */
|
||||
trigger_type?: CardTriggerType;
|
||||
/**
|
||||
* 事件型触发的全局次数上限(仅 FightStart/FightEnd/HeroDead/HeroCall 有效)
|
||||
* 默认 Infinity;达到上限后销毁节点
|
||||
* 注意:与 t_times 语义不同——t_times 控制每波内 Interval 的次数
|
||||
*/
|
||||
trigger_limit?: number;
|
||||
}
|
||||
export const CardsUpSet: Record<number, number> = {
|
||||
1: 50,
|
||||
@@ -150,48 +184,48 @@ const waveToPoolLv: Record<number, number> = {
|
||||
|
||||
const SkillCardData: any[] = [
|
||||
// === 1波技能 ===
|
||||
{ uuid: 8301, skill: 6301, wave: 1, name: "护盾", info: "每2秒为1个英雄添加抵挡3次伤害的护盾", is_inst: false, t_times: 999, t_inv: 2, keep_waves: -1 },
|
||||
{ uuid: 8302, skill: 6302, wave: 1, name: "治疗", info: "每2秒治疗1个英雄", is_inst: false, t_times: 999, t_inv: 2, keep_waves: -1},
|
||||
{ uuid: 8705, skill: 0, wave: 1, name: "金币收益", info: "每回合金币收益+1", is_inst: false, keep_waves: -1, field: [7005] },
|
||||
{ uuid: 8706, skill: 0, wave: 1, name: "出售强化", info: "卖出英雄金币+1", is_inst: false, keep_waves: -1, field: [7006] },
|
||||
{ uuid: 8707, skill: 0, wave: 1, name: "战后恢复", info: "战斗结束生命回复量+10%", is_inst: false, keep_waves: -1, field: [7007] },
|
||||
{ uuid: 8301, skill: 6301, wave: 1, name: "护盾", info: "为伙伴/自己添加护盾,可抵挡3次伤害", is_inst: true, keep_waves: -1, trigger_type: CardTriggerType.Instant },
|
||||
{ uuid: 8302, skill: 6302, wave: 1, name: "治疗", info: "治疗伙伴/自己", is_inst: true, keep_waves: -1, trigger_type: CardTriggerType.Instant },
|
||||
{ uuid: 8705, skill: 0, wave: 1, name: "金币收益", info: "每回合金币收益+1", is_inst: false, keep_waves: -1, field: [7005], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8706, skill: 0, wave: 1, name: "出售强化", info: "卖出英雄金币+1", is_inst: false, keep_waves: -1, field: [7006], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8707, skill: 0, wave: 1, name: "战后恢复", info: "战斗结束生命回复量+10%", is_inst: false, keep_waves: -1, field: [7007], trigger_type: CardTriggerType.Field },
|
||||
|
||||
// === 5波技能 ===
|
||||
{ uuid: 8303, skill: 6303, wave: 5, name: "获取金币", info: "战斗阶段:每5秒增加1个金币", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
{ uuid: 8401, skill: 6401, wave: 5, name: "攻击强化", info: "战斗阶段:每5秒为全体友方攻击力提升5点", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
{ uuid: 8402, skill: 6402, wave: 5, name: "生命强化", info: "战斗阶段:每5秒为全体友方最大生命值提升20点", is_inst: false, keep_waves: -1 },
|
||||
{ uuid: 8403, skill: 6403, wave: 5, name: "暴击强化", info: "战斗阶段:每5秒为全体友方暴击率提升1%", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
{ uuid: 8404, skill: 6404, wave: 5, name: "暴伤强化", info: "战斗阶段:每5秒为全体友方暴击伤害提升2%", is_inst: false, keep_waves: -1 },
|
||||
{ uuid: 8405, skill: 6405, wave: 5, name: "击晕强化", info: "战斗阶段:每5秒为全体友方击晕概率提升1%", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
{ uuid: 8408, skill: 6408, wave: 5, name: "穿刺强化", info: "战斗阶段:每5秒为全体友方穿透概率提升2%", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
{ uuid: 8409, skill: 6409, wave: 5, name: "风怒强化", info: "战斗阶段:每5秒为全体友方风怒概率提升1%", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
// { uuid: 8501, skill: 6501, wave: 5, name: "复活", info: "ap 代表复活的生命值百分比", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
{ uuid: 8303, skill: 6303, wave: 5, name: "获取金币", info: "增加一定数量的金币", is_inst: true, keep_waves: -1, trigger_type: CardTriggerType.Instant },
|
||||
{ uuid: 8401, skill: 6401, wave: 5, name: "攻击强化", info: "全体友方攻击力提升5点,持续1次", is_inst: true, keep_waves: -1, trigger_type: CardTriggerType.Instant },
|
||||
{ uuid: 8402, skill: 6402, wave: 5, name: "生命强化", info: "全体友方最大生命值提升20点,持续1次", is_inst: true, keep_waves: -1, trigger_type: CardTriggerType.Instant },
|
||||
{ uuid: 8403, skill: 6403, wave: 5, name: "暴击强化", info: "全体友方暴击率提升10%,持续1次", is_inst: true, keep_waves: -1, trigger_type: CardTriggerType.Instant },
|
||||
{ uuid: 8404, skill: 6404, wave: 5, name: "暴伤强化", info: "全体友方暴击伤害提升20%,持续1次", is_inst: true, keep_waves: -1, trigger_type: CardTriggerType.Instant },
|
||||
{ uuid: 8405, skill: 6405, wave: 5, name: "击晕强化", info: "全体友方击晕概率提升10%,持续1次", is_inst: true, keep_waves: -1, trigger_type: CardTriggerType.Instant },
|
||||
{ uuid: 8408, skill: 6408, wave: 5, name: "穿刺强化", info: "全体友方穿透概率提升20%,持续1次", is_inst: true, keep_waves: -1, trigger_type: CardTriggerType.Instant },
|
||||
{ uuid: 8409, skill: 6409, wave: 5, name: "风怒强化", info: "全体友方风怒次数提升1次,持续1次", is_inst: true, keep_waves: -1, trigger_type: CardTriggerType.Instant },
|
||||
// { uuid: 8501, skill: 6501, wave: 5, name: "复活", info: "ap 代表复活的生命值百分比", is_inst: true, keep_waves: -1 },
|
||||
|
||||
// === 10波技能 ===
|
||||
{ uuid: 8708, skill: 0, wave: 10, name: "攻击加成", info: "英雄攻击力+10%", is_inst: false, keep_waves: -1, field: [7008] },
|
||||
{ uuid: 8709, skill: 0, wave: 10, name: "击晕加成", info: "英雄击晕概率+10%", is_inst: false, keep_waves: -1, field: [7009] },
|
||||
{ uuid: 8710, skill: 0, wave: 10, name: "暴击加成", info: "英雄暴击率+10%", is_inst: false, keep_waves: -1, field: [7010] },
|
||||
{ uuid: 8711, skill: 0, wave: 10, name: "暴伤加成", info: "英雄暴击伤害+20%", is_inst: false, keep_waves: -1, field: [7011] },
|
||||
{ uuid: 8712, skill: 0, wave: 10, name: "攻速加成", info: "英雄攻击速度+10%", is_inst: false, keep_waves: -1, field: [7012] },
|
||||
{ uuid: 8713, skill: 0, wave: 10, name: "购买优惠", info: "购买卡牌费用-1金币", is_inst: false, keep_waves: -1, field: [7013] },
|
||||
{ uuid: 8714, skill: 0, wave: 10, name: "刷新优惠", info: "刷新卡牌费用-1金币", is_inst: false, keep_waves: -1, field: [7014] },
|
||||
{ uuid: 8716, skill: 0, wave: 10, name: "生命加成", info: "英雄最大生命+10%", is_inst: false, keep_waves: -1, field: [7016] },
|
||||
{ uuid: 8717, skill: 0, wave: 10, name: "风怒加成", info: "英雄风怒概率+10%", is_inst: false, keep_waves: -1, field: [7017] },
|
||||
{ uuid: 8718, skill: 0, wave: 10, name: "穿刺加成", info: "英雄穿刺概率+10%", is_inst: false, keep_waves: -1, field: [7018] },
|
||||
{ uuid: 8708, skill: 0, wave: 10, name: "攻击加成", info: "英雄攻击力+10%", is_inst: false, keep_waves: -1, field: [7008], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8709, skill: 0, wave: 10, name: "击晕加成", info: "英雄击晕概率+10%", is_inst: false, keep_waves: -1, field: [7009], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8710, skill: 0, wave: 10, name: "暴击加成", info: "英雄暴击率+10%", is_inst: false, keep_waves: -1, field: [7010], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8711, skill: 0, wave: 10, name: "暴伤加成", info: "英雄暴击伤害+20%", is_inst: false, keep_waves: -1, field: [7011], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8712, skill: 0, wave: 10, name: "攻速加成", info: "英雄攻击速度+10%", is_inst: false, keep_waves: -1, field: [7012], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8713, skill: 0, wave: 10, name: "购买优惠", info: "购买卡牌费用-1金币", is_inst: false, keep_waves: -1, field: [7013], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8714, skill: 0, wave: 10, name: "刷新优惠", info: "刷新卡牌费用-1金币", is_inst: false, keep_waves: -1, field: [7014], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8716, skill: 0, wave: 10, name: "生命加成", info: "英雄最大生命+10%", is_inst: false, keep_waves: -1, field: [7016], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8717, skill: 0, wave: 10, name: "风怒加成", info: "英雄风怒概率+10%", is_inst: false, keep_waves: -1, field: [7017], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8718, skill: 0, wave: 10, name: "穿刺加成", info: "英雄穿刺概率+10%", is_inst: false, keep_waves: -1, field: [7018], trigger_type: CardTriggerType.Field },
|
||||
|
||||
// === 15波技能 ===
|
||||
{ uuid: 8701, skill: 0, wave: 15, name: "召唤强化", info: "召唤触发技能次数+1", is_inst: false, keep_waves: -1, field: [7001] },
|
||||
{ uuid: 8702, skill: 0, wave: 15, name: "死亡强化", info: "死亡触发技能次数+1", is_inst: false, keep_waves: -1, field: [7002] },
|
||||
{ uuid: 8703, skill: 0, wave: 15, name: "开场强化", info: "战斗开始触发技能次数+1", is_inst: false, keep_waves: -1, field: [7003] },
|
||||
{ uuid: 8704, skill: 0, wave: 15, name: "结束强化", info: "战斗结束触发技能次数+1", is_inst: false, keep_waves: -1, field: [7004] },
|
||||
{ uuid: 8701, skill: 0, wave: 15, name: "召唤强化", info: "召唤触发技能次数+1", is_inst: false, keep_waves: -1, field: [7001], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8702, skill: 0, wave: 15, name: "死亡强化", info: "死亡触发技能次数+1", is_inst: false, keep_waves: -1, field: [7002], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8703, skill: 0, wave: 15, name: "开场强化", info: "战斗开始触发技能次数+1", is_inst: false, keep_waves: -1, field: [7003], trigger_type: CardTriggerType.Field },
|
||||
{ uuid: 8704, skill: 0, wave: 15, name: "结束强化", info: "战斗结束触发技能次数+1", is_inst: false, keep_waves: -1, field: [7004], trigger_type: CardTriggerType.Field },
|
||||
|
||||
// === 20波技能 ===
|
||||
{ uuid: 8201, skill: 6201, wave: 20, name: "雷墙", info: "召唤雷墙阻挡敌人,有概率击晕", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
{ uuid: 8202, skill: 6202, wave: 20, name: "火墙", info: "召唤火墙阻挡敌人,有概率击晕", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
{ uuid: 8203, skill: 6203, wave: 20, name: "飓风", info: "召唤飓风攻击敌人,有概率击晕", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
{ uuid: 8204, skill: 6204, wave: 20, name: "水墙", info: "召唤水墙阻挡敌人,有概率击晕", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
{ uuid: 8205, skill: 6205, wave: 20, name: "风墙", info: "召唤风墙困住敌人,有概率击晕", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
{ uuid: 8206, skill: 6206, wave: 20, name: "陨石术", info: "召唤陨石范围攻击敌人,有概率击晕", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1 },
|
||||
{ uuid: 8201, skill: 6201, wave: 20, name: "雷墙", info: "召唤雷墙阻挡敌人,有概率击晕", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1, trigger_type: CardTriggerType.Interval },
|
||||
{ uuid: 8202, skill: 6202, wave: 20, name: "火墙", info: "召唤火墙阻挡敌人,有概率击晕", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1, trigger_type: CardTriggerType.Interval },
|
||||
{ uuid: 8203, skill: 6203, wave: 20, name: "飓风", info: "召唤飓风攻击敌人,有概率击晕", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1, trigger_type: CardTriggerType.Interval },
|
||||
{ uuid: 8204, skill: 6204, wave: 20, name: "水墙", info: "召唤水墙阻挡敌人,有概率击晕", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1, trigger_type: CardTriggerType.Interval },
|
||||
{ uuid: 8205, skill: 6205, wave: 20, name: "风墙", info: "召唤风墙困住敌人,有概率击晕", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1, trigger_type: CardTriggerType.Interval },
|
||||
{ uuid: 8206, skill: 6206, wave: 20, name: "陨石术", info: "召唤陨石范围攻击敌人,有概率击晕", is_inst: false, t_times: 999, t_inv: 5, keep_waves: -1, trigger_type: CardTriggerType.Interval },
|
||||
];
|
||||
|
||||
SkillCardData.forEach(data => {
|
||||
@@ -211,7 +245,10 @@ SkillCardData.forEach(data => {
|
||||
t_times: data.t_times || (data.is_inst ? 1 : 999),
|
||||
t_inv: data.t_inv || 0,
|
||||
keep_waves: data.keep_waves,
|
||||
field: data.field
|
||||
field: data.field,
|
||||
overrides: data.overrides, // 【修复】原遗漏
|
||||
trigger_type: data.trigger_type, // 【新增】显式触发类型
|
||||
trigger_limit: data.trigger_limit, // 【新增】事件型触发次数上限
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user