feat(talent): 重构天赋升级交互,新增确认弹窗逻辑

1.  移除天赋预制件上的+号节点和旧的背景组件,改为按阶位切换颜色背景
2.  天赋点击逻辑改为先弹出确认弹窗再执行升级
3.  简化天赋项组件的参数传递和状态判断逻辑
4.  更新注释文档与组件职责描述
This commit is contained in:
panFD
2026-08-30 17:18:36 +08:00
parent 0ceff6fb05
commit 69aa1863b7
7 changed files with 2604 additions and 1316 deletions

View File

@@ -4,7 +4,7 @@
*
* 职责:
* 1. 三阶页签(Ⅰ 基础 / Ⅱ 专精 / Ⅲ 超强)状态机:单屏聚焦当前阶位的迷你天赋卡。
* 2. 页签常显解锁进度(前阶投入 x/10),点击卡/+ 徽标升级(smc.upgradeTalent)。
* 2. 页签常显解锁进度(前阶投入 x/10),点击天赋卡弹出 CommonPrompt 确认加点(smc.upgradeTalent)。
* 3. 监听 GameEvent.TALENT_UPDATE 全量重渲染(23 条卡片,无需虚拟列表)。
* 4. 看广告重置入口:CommonPrompt 二次确认后调 smc.resetTalents() 退还全部点数。
*
@@ -19,7 +19,7 @@ import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/modu
import {
TalentSet, TalentTier,
TALENT_TIER_UNLOCK_THRESHOLD,
getTalentLevelExp, getTalentTierInvestedPoints, getTalentUpgradeCost, isTalentTierUnlocked,
getTalentDisplayText, getTalentLevelExp, getTalentTierInvestedPoints, getTalentUpgradeCost, isTalentTierUnlocked,
} from "../common/config/TalentSet";
import { GameEvent } from "../common/config/GameEvent";
import { UIID } from "../common/config/GameUIConfig";
@@ -196,7 +196,6 @@ export class TalentsComp extends CCComp {
private refreshGrid(levels: Record<number, number>): void {
this.talents_content.removeAllChildren();
const unlocked = isTalentTierUnlocked(levels, this.curTier);
const points = smc.getTalentPoints();
const cfgs = Object.values(TalentSet)
.filter(cfg => cfg.tier === this.curTier)
.sort((a, b) => a.uuid - b.uuid);
@@ -204,15 +203,12 @@ export class TalentsComp extends CCComp {
let cardHeight = 0;
for (const cfg of cfgs) {
const lv = levels[cfg.uuid] ?? 0;
const cost = getTalentUpgradeCost(lv);
// 可升级 = 阶位解锁 + 未满级 + 点数足够(+ 徽标显示依据)
const canUp = unlocked && lv < cfg.max_lv && cost > 0 && points >= cost;
const itemNode = instantiate(this.prefab_talent_item);
this.talents_content.addChild(itemNode);
const comp = itemNode.getComponent(TalentItemComp);
if (!comp) continue;
comp.updateItem(cfg, lv, unlocked, canUp);
comp.updateItem(cfg, lv, unlocked);
comp.onTalentTap = (uuid: number) => this.onTalentTap(uuid);
if (!cardHeight) cardHeight = itemNode.getComponent(UITransform)?.height ?? 0;
}
@@ -226,7 +222,7 @@ export class TalentsComp extends CCComp {
}
}
/** 卡片点击统一入口:阶位未解锁/已满级/点数不足分别 toast,成功升级由事件驱动刷新 */
/** 卡片点击统一入口:未解锁/已满级直接 toast;其余弹出 CommonPrompt 确认加点,成功后事件驱动刷新 */
private onTalentTap(uuid: number): void {
const cfg = TalentSet[uuid];
if (!cfg) return;
@@ -237,13 +233,32 @@ export class TalentsComp extends CCComp {
oops.gui.toast(`${TIER_TAB_TEXT[cfg.tier].lockName}投入 ${invested}/${TALENT_TIER_UNLOCK_THRESHOLD} 点解锁本阶`);
return;
}
if (smc.getTalentLv(uuid) >= cfg.max_lv) {
const lv = smc.getTalentLv(uuid);
if (lv >= cfg.max_lv) {
oops.gui.toast("该天赋已满级");
return;
}
if (!smc.upgradeTalent(uuid)) {
const cost = getTalentUpgradeCost(lv);
if (cost <= 0) return;
if (smc.getTalentPoints() < cost) {
oops.gui.toast("天赋点不足");
return;
}
// CommonPrompt 确认加点(UIID.Window)
oops.gui.open(UIID.Window, {
title: "天赋加点",
content: `${cfg.name} Lv.${lv} → Lv.${lv + 1}\n消耗 <color=#E0A93D>${cost}</color> 点天赋点,获得 ${getTalentDisplayText(cfg, 1)}。是否加点?`,
okWord: "加点",
cancelWord: "取消",
needCancel: true,
maskClose: true,
okFunc: () => {
if (!smc.upgradeTalent(uuid)) {
oops.gui.toast("天赋点不足");
}
},
});
}
/** 看广告重置入口:CommonPrompt 二次确认(广告接入前先直接确认重置) */