feat(map): 新增固定波次技能三选一弹窗系统

1.  新增MSkillBoxComp弹窗组件,实现固定波次触发的技能卡选择功能
2.  新增SkillBoxCardConfig配置与SkillBoxPool技能池,支持按波次配置技能
3.  重构MissionCardComp,将技能卡抽取改为固定波次弹窗触发
4.  扩展SingletonModuleComp与MissionComp,添加技能刷新次数持久化逻辑
5.  优化MissSkillsComp,新增SkillBox专属技能加载流程
6.  修复SkillBoxComp,支持自定义技能参数覆盖
7.  调整UIConfig与CardSet配置,适配新的技能卡流程
This commit is contained in:
pan
2026-06-03 16:36:22 +08:00
parent 1871551fca
commit e76cba7933
10 changed files with 2015 additions and 2773 deletions

View File

@@ -37,7 +37,7 @@ import { _decorator, instantiate, Label, Node, NodeEventType, Prefab, SpriteAtla
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
import { GameEvent } from "../common/config/GameEvent";
import { CARD_POOL_INIT_LEVEL, CARD_POOL_MAX_LEVEL, CARD_POOL_UPGRADE_DISCOUNT_PER_WAVE, CardConfig, CardType, CardsUpSet, drawCardsByRule, getCardsByLv, SpecialRefreshCardList, SpecialRefreshHeroType, SpecialUpgradeCardList } from "../common/config/CardSet";
import { CARD_POOL_INIT_LEVEL, CARD_POOL_MAX_LEVEL, CARD_POOL_UPGRADE_DISCOUNT_PER_WAVE, CardConfig, CardType, CardsUpSet, drawCardsByRule, getCardsByLv, SKILL_BOX_TRIGGER_WAVES, SpecialRefreshCardList, SpecialRefreshHeroType, SpecialUpgradeCardList } from "../common/config/CardSet";
import { CardComp } from "./CardComp";
import { oops } from "db://oops-framework/core/Oops";
import { HeroAttrsComp } from "../hero/HeroAttrsComp";
@@ -48,6 +48,7 @@ import { FacSet, FightSet } from "../common/config/GameSet";
import { MoveComp } from "../hero/MoveComp";
import { MissionHeroComp } from "./MissionHeroComp";
import { MissionEconomy } from "./MissionEconomy";
import { UIID } from "../common/config/GameUIConfig";
const { ccclass, property } = _decorator;
@@ -323,13 +324,35 @@ export class MissionCardComp extends CCComp {
}
/** 新一波:展开面板 → 刷新费用 UI → 重新抽卡分发 */
private onNewWave() {
private onNewWave(event?: string, args?: any) {
this.isBattlePhase = false;
this.enterPreparePhase();
this.updateCoinAndCostUI();
this.layoutCardSlots();
const cards = this.buildDrawCards();
this.dispatchCardsToSlots(cards);
// 固定波次(1/5/10/15/20)弹出技能三选一弹窗
const wave = Number(args?.wave ?? 0);
if (this.isSkillBoxTriggerWave(wave)) {
this.openSkillBox(wave);
}
}
/** 判断 wave 是否属于技能弹窗触发波次 */
private isSkillBoxTriggerWave(wave: number): boolean {
if (!wave || wave <= 0) return false;
return SKILL_BOX_TRIGGER_WAVES.includes(wave);
}
/** 打开技能三选一弹窗(MSkillBoxComp) */
private openSkillBox(wave: number) {
if (smc.map?.MapView) {
oops.gui.open(UIID.SkillBox, { wave, poolLv: this.poolLv });
mLogger.log(this.debugMode, "MissionCardComp", "openSkillBox", { wave, poolLv: this.poolLv });
} else {
mLogger.warn(this.debugMode, "MissionCardComp", "openSkillBox skipped, smc.map.MapView not ready");
}
}
/** 解除按钮监听,避免节点销毁后回调泄漏 */
@@ -637,12 +660,8 @@ export class MissionCardComp extends CCComp {
/** 构建本次抽卡结果保证最终可分发3条数据 */
private buildDrawCards(): CardConfig[] {
let targetType: CardType | CardType[] | undefined = undefined;
if (this.isBattlePhase) {
targetType = CardType.Skill;
} else {
targetType = [CardType.Hero, CardType.SpecialRefresh];
}
// 技能卡已不再通过常规刷新分发,统一走 MSkillBoxComp 固定波次弹窗
const targetType: CardType[] = [CardType.Hero, CardType.SpecialRefresh];
const cards = getCardsByLv(this.poolLv, targetType);
/** 正常情况下直接取前3 */