refactor(rogue): 重构关卡刷怪与流程为一关一局模式

1.  将原10小节/关改为5小节/关,固定节类型为1-3普通节、4精英节、5Boss节
2.  调整刷怪逻辑:普通节3只小怪立即全刷,移除定时分批刷怪
3.  统一怪物入场方式为从右侧屏幕外贴地跑入,移除高空掉落动画
4.  移除小节间结算弹窗,改为自动连战,节间仅播放背景滚动过渡
5.  简化结算逻辑,仅保留通关/失败两种结算类型,移除小节胜利分支
6.  重构关卡进度存储,仅保存章节关卡,小节恒从1开始
This commit is contained in:
panFD
2026-09-12 19:03:48 +08:00
parent d951896799
commit 1b2545deec
5 changed files with 196 additions and 260 deletions

View File

@@ -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)