refactor(rogue): 重构关卡刷怪与流程为一关一局模式
1. 将原10小节/关改为5小节/关,固定节类型为1-3普通节、4精英节、5Boss节 2. 调整刷怪逻辑:普通节3只小怪立即全刷,移除定时分批刷怪 3. 统一怪物入场方式为从右侧屏幕外贴地跑入,移除高空掉落动画 4. 移除小节间结算弹窗,改为自动连战,节间仅播放背景滚动过渡 5. 简化结算逻辑,仅保留通关/失败两种结算类型,移除小节胜利分支 6. 重构关卡进度存储,仅保存章节关卡,小节恒从1开始
This commit is contained in:
@@ -172,7 +172,7 @@ export class VictoryComp extends CCComp {
|
||||
/** 是否可以复活(由 MissionComp 传入,取决于剩余复活次数) */
|
||||
private canRevive: boolean = false;
|
||||
|
||||
/** 结算类型:section=小节胜利, victory=末关通关, defeat=失败 */
|
||||
/** 结算类型:final=通关(确认退出), defeat=失败(再来一次/退出) */
|
||||
private settleType: string = "defeat";
|
||||
/** 是否胜利场(驱动主按钮文案与行为) */
|
||||
private isVictory: boolean = false;
|
||||
@@ -188,7 +188,7 @@ export class VictoryComp extends CCComp {
|
||||
this.node.getChildByName("loading").active = false
|
||||
|
||||
// 代码绑定按钮点击事件,替代编辑器 Click Events 配置
|
||||
// next 按钮按状态分发:小节胜利→下一节,失败→再来一次
|
||||
// next 按钮按状态分发:失败→再来一次(一关一局无节间"下一节")
|
||||
this.bindButtonClick(this.next_section_btn, this.on_next_btn_click);
|
||||
this.bindButtonClick(this.confirm_btn, this.victory_end);
|
||||
}
|
||||
@@ -214,8 +214,8 @@ export class VictoryComp extends CCComp {
|
||||
* @param args.rewards 掉落奖励列表
|
||||
* @param args.game_data 累计数据 { exp, gold, diamond }
|
||||
* @param args.can_revive 是否可复活
|
||||
* @param args.settle_type 结算类型:section=小节胜利(下一节按钮),其余=确认退出
|
||||
* @param args.settle_title 末关通关标题(如"本关通关"),非空时在结算页顶部展示
|
||||
* @param args.settle_type 结算类型:final=通关(确认退出),defeat=失败(再来一次/退出)
|
||||
* @param args.settle_title 通关标题(如"本关通关"),非空时在结算页顶部展示
|
||||
*/
|
||||
onAdded(args: any) {
|
||||
this.node.getChildByName("loading").active = false
|
||||
@@ -233,9 +233,9 @@ export class VictoryComp extends CCComp {
|
||||
// 根据是否可复活决定按钮显示
|
||||
this.node.getChildByName("btns").getChildByName("next").active = !args.can_revive
|
||||
|
||||
// 按钮显隐与文案:下一节 / 再来一次 / 确认
|
||||
// 按钮显隐与文案:再来一次 / 确认退出(通关隐藏再来一次)
|
||||
this.updateButtonStates();
|
||||
// 通关标题:仅末关通关时显示
|
||||
// 通关标题:仅通关时显示
|
||||
this.updateSettleTitle(args.settle_title ? String(args.settle_title) : "");
|
||||
|
||||
// 计算总分并写入历史纪录
|
||||
@@ -779,10 +779,9 @@ export class VictoryComp extends CCComp {
|
||||
// ======================== 操作入口 ========================
|
||||
|
||||
/**
|
||||
* 统一更新按钮显隐与文案:
|
||||
* section(小节胜利)→ btn="退出",next="下一节"
|
||||
* final(末关通关) → btn="返回",next 隐藏
|
||||
* defeat(失败) → btn="退出",next="再来一次"
|
||||
* 统一更新按钮显隐与文案(一关一局,无节间"下一节"):
|
||||
* final(通关) → btn="返回",next 隐藏
|
||||
* defeat(失败) → btn="退出",next="再来一次"
|
||||
*/
|
||||
private updateButtonStates() {
|
||||
const btns = this.node.getChildByName("btns");
|
||||
@@ -800,12 +799,12 @@ export class VictoryComp extends CCComp {
|
||||
}
|
||||
}
|
||||
|
||||
// next 按钮:小节胜利→"下一节",失败→"再来一次",末关通关隐藏
|
||||
// next 按钮:失败→"再来一次",通关隐藏
|
||||
if (nextNode) {
|
||||
nextNode.active = this.settleType !== "final";
|
||||
const label = nextNode.getChildByName("Label")?.getComponent(Label);
|
||||
if (label) {
|
||||
label.string = this.settleType === "section" ? "下一节" : "再来一次";
|
||||
label.string = "再来一次";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -816,7 +815,7 @@ export class VictoryComp extends CCComp {
|
||||
}
|
||||
|
||||
/**
|
||||
* 通关标题显隐与文案:仅末关通关时显示("本关通关"/"本章通关")。
|
||||
* 通关标题显隐与文案:仅通关时显示("本关通关"/"本章通关")。
|
||||
* 该 Label 为 @property 绑定节点,编辑器中默认隐藏。
|
||||
* @param title 文案,空串时隐藏
|
||||
*/
|
||||
@@ -828,41 +827,21 @@ export class VictoryComp extends CCComp {
|
||||
}
|
||||
|
||||
/**
|
||||
* next 按钮点击分发:
|
||||
* 小节胜利 → 派发 NextSection 推进下一节
|
||||
* 失败场 → 派发 RestartMission 重开本关
|
||||
* next 按钮点击分发:失败场 → 派发 RestartMission 重开本关
|
||||
* (一关一局:通关场 next 隐藏,无"下一节")
|
||||
*/
|
||||
on_next_btn_click() {
|
||||
if (this.settleType === "section") {
|
||||
oops.message.dispatchEvent(GameEvent.NextSection);
|
||||
} else {
|
||||
oops.message.dispatchEvent(GameEvent.RestartMission);
|
||||
}
|
||||
oops.message.dispatchEvent(GameEvent.RestartMission);
|
||||
}
|
||||
|
||||
/**
|
||||
* 确认按钮点击(代码绑定,btns/btn):
|
||||
* - 小节胜利(section)→ 推进存档到下一节并保存 → 派发 MissionEnd → 关闭结算弹窗
|
||||
* - 末关通关(final) → 清理数据 → 派发 MissionEnd → 关闭结算弹窗
|
||||
* - 失败(defeat) → 清理数据 → 派发 MissionEnd → 关闭结算弹窗
|
||||
* 通关 / 失败统一 → 清理数据 → 派发 MissionEnd → 关闭结算弹窗
|
||||
*
|
||||
* Why: 小节胜利点"退出"既要保存进度(避免下次重玩卡在原节),
|
||||
* 又不能像"下一节"按钮那样直接开战(玩家已选退出,不再继续本局战斗)。
|
||||
* Why: 一关一局,存档只在 MissionComp 通关时推进到下一关(section 恒为 1),
|
||||
* 此处不再做 section 推进,直接结束本局返回。
|
||||
*/
|
||||
victory_end() {
|
||||
if (this.settleType === "section") {
|
||||
// 小节胜利:手动推进 section 到下一节并保存存档,避免点退出后进度丢失。
|
||||
// 注:MissionComp 的 NextSection 会进入战斗流程,这里不走该事件以避免自动开战。
|
||||
const cur = (smc.data.stage_progress ?? { chapter: 1, stage: 1, section: 1 }) as { chapter: number; stage: number; section: number };
|
||||
// 当前节已胜利,写入下一节作为待挑战存档;若已是末节(section=10),则不做 section 推进
|
||||
if (cur.section < 10) {
|
||||
smc.updateStageProgress({
|
||||
chapter: cur.chapter,
|
||||
stage: cur.stage,
|
||||
section: cur.section + 1,
|
||||
});
|
||||
}
|
||||
}
|
||||
this.clear_data()
|
||||
oops.message.dispatchEvent(GameEvent.MissionEnd)
|
||||
oops.gui.removeByNode(this.node)
|
||||
|
||||
Reference in New Issue
Block a user