feat(talent): 重构天赋升级交互,新增确认弹窗逻辑
1. 移除天赋预制件上的+号节点和旧的背景组件,改为按阶位切换颜色背景 2. 天赋点击逻辑改为先弹出确认弹窗再执行升级 3. 简化天赋项组件的参数传递和状态判断逻辑 4. 更新注释文档与组件职责描述
This commit is contained in:
@@ -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 二次确认(广告接入前先直接确认重置) */
|
||||
|
||||
Reference in New Issue
Block a user