diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 1db78d46..8d10c7ae 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -123,19 +123,37 @@ func _start_adventure_from_menu() -> void: # 确认弹窗分派(卡③ 契约 3):按 _confirm_consumer 路由——"delete_slot"=卡③ 删档确认 -#(确认才删、取消只关窗——裁决 3)。"new_adventure" 消费方已随卡② 主菜单确认链摘除退役 -#(mn6/V5——主菜单零确认残留),分派机制保留(卡④ 到位接入第三消费方不返工)。 +#(确认才删、取消只关窗——裁决 3)。"gate"/"gate_new"=卡④ 大门两分支消费方(有/无断点), +# "campfire_leave"=篝火二次确认(卡④ T4 接入——分派机制扩展第三/第四消费方)。 func _on_confirm_accepted() -> void: ui.modals.flow.close(ui.modals.confirm_dialog) # 模态栈单口 match _confirm_consumer: "delete_slot": save_manager.slots.delete_slot(_confirm_consumer_slot) ui.modals.save_select_overlay.open_save_select(HudPresenter.save_select_data(save_manager)) # 就地刷新(该槽回空态) + "gate": + _camp_pres.on_camp_closed() # 冒险发起后营地场景屏隐藏(选档层同收——卡④ T4 关层收闭) + _resume_from_menu() # 继续上一段冒险(现役续玩编排同源——卡④ 契约 4) + "gate_new": + _camp_pres.on_camp_closed() + _start_adventure() # 开始新冒险(现役开局编排同源) + "campfire_leave": + _camp_pres.on_camp_closed() # 篝火确认离场=营地与选档层同收+开始层恢复(回主菜单) + _confirm_consumer = "" + + +# 次确认分派(三钮形态中钮——大门「开始新冒险」出口;卡④ T4) +func _on_confirm_secondary() -> void: + ui.modals.flow.close(ui.modals.confirm_dialog) # 模态栈单口 + match _confirm_consumer: + "gate": + _camp_pres.on_camp_closed() + _start_adventure() _confirm_consumer = "" func _on_confirm_declined() -> void: - ui.modals.flow.close(ui.modals.confirm_dialog) # 只关窗(取消无状态变更——裁决 3:取消不删);关侧恢复归 ModalFlow + ui.modals.flow.close(ui.modals.confirm_dialog) # 只关窗(取消无状态变更——裁决 3:取消不删/卡④:退回营地);关侧恢复归 ModalFlow _confirm_consumer = "" diff --git a/game/presentation/main_overlay_flow.gd b/game/presentation/main_overlay_flow.gd index 8389bf5d..bf8d5a4d 100644 --- a/game/presentation/main_overlay_flow.gd +++ b/game/presentation/main_overlay_flow.gd @@ -44,7 +44,10 @@ static func _on_career_closed(root: Variant) -> void: root.ui.screens.start_overlay.visible = true -# ---- 营地场景点选路由(卡④ T3——场景根 object_pressed 组合根分派;gate/campfire 动线归卡④ T4)---- +# ---- 营地场景点选路由(卡④ T3/T4——场景根 object_pressed 组合根分派)---- +# 大门两分支(裁决 5,Q5 甲):点大门永远先出确认不直接进冒险——有断点=三出口弹窗 +#(继续上一段冒险/开始新冒险/取消),无断点=是否开始新冒险(是/否);cancelled 恒=无变更退回营地。 +# 篝火回主菜单必须二次确认(camp.md v2.2 裁定);确认后营地层与选档层同收+开始层恢复(关层收闭)。 static func _on_camp_object_pressed(root: Variant, key: StringName) -> void: @@ -59,6 +62,21 @@ static func _on_camp_object_pressed(root: Variant, key: StringName) -> void: root._camp_pres.open_camp_codex() &"notebook": _open_career(root) # 生涯页入口改挂帐篷旁笔记本(CareerOverlay 本体零改——卡④ T3) + &"gate": + _open_gate_confirm(root) + &"campfire": + root._confirm_consumer = "campfire_leave" + root.ui.modals.confirm_dialog.open("确定离开营地回到主菜单?", "离开", "留下") + + +static func _open_gate_confirm(root: Variant) -> void: + if root.save_manager.has_breakpoint(): + root._confirm_consumer = "gate" + root.ui.modals.confirm_dialog.open_three("有未完成的冒险——继续上一段冒险,还是开始新冒险?", + "继续上一段冒险", "开始新冒险", "取消") + return + root._confirm_consumer = "gate_new" + root.ui.modals.confirm_dialog.open("是否开始新冒险?", "是", "否") # 生涯页快照投影 —— 承接体见 HudPresenter.career_data(开层调用点直接改引) diff --git a/game/presentation/main_ui_build.gd b/game/presentation/main_ui_build.gd index b6eb8ad3..15172e8d 100644 --- a/game/presentation/main_ui_build.gd +++ b/game/presentation/main_ui_build.gd @@ -224,6 +224,7 @@ static func _build_debug_and_resolvers(root: Variant) -> void: # 消费方编排(卡③ 契约 3/sl8——禁双常驻静态接线):open 前设 _confirm_consumer, # confirmed/cancelled 后按该状态量分派;分派面可容纳后续消费方(卡④ 到位直接接入不返工) root.ui.modals.confirm_dialog.confirmed.connect(root._on_confirm_accepted) + root.ui.modals.confirm_dialog.secondary_confirmed.connect(root._on_confirm_secondary) # 三钮次确认(卡④ 大门「开始新冒险」出口) root.ui.modals.confirm_dialog.cancelled.connect(root._on_confirm_declined) # 调试浮窗(主菜单三散件收一:随机种子/数值调整/批量模拟/两层调试入口; diff --git a/game/presentation/views/confirm_dialog.gd b/game/presentation/views/confirm_dialog.gd index 5025b5b0..6ce39f15 100644 --- a/game/presentation/views/confirm_dialog.gd +++ b/game/presentation/views/confirm_dialog.gd @@ -1,14 +1,18 @@ ## VERTICAL SLICE - NOT FOR PRODUCTION -## 通用确认弹窗:open(text, confirm_label, cancel_label) 双钮外发 confirmed/cancelled。 +## 通用确认弹窗:open(text, confirm_label, cancel_label) 双钮外发 confirmed/cancelled; +## open_three(text, confirm_label, secondary_label, cancel_label) 三钮增设 secondary_confirmed +##(营地大门两分支——卡④ T4;双钮调用方零改动:次钮随 open 隐藏)。 ## 文案与按钮语义装配归调用方——本类零业务触碰。 class_name ConfirmDialog extends Control signal confirmed +signal secondary_confirmed ## 次确认(三钮形态中钮——营地大门「开始新冒险」出口;卡④ T4) signal cancelled var _text: Label var _confirm_btn: Button +var _secondary_btn: Button var _cancel_btn: Button @@ -27,6 +31,9 @@ func _init() -> void: _cancel_btn = UiKit.button("取消") _cancel_btn.pressed.connect(_emit_cancelled) btn_row.add_child(_cancel_btn) + _secondary_btn = UiKit.button("次选项") + _secondary_btn.pressed.connect(_emit_secondary) + btn_row.add_child(_secondary_btn) _confirm_btn = UiKit.button("确认") _confirm_btn.pressed.connect(_emit_confirmed) btn_row.add_child(_confirm_btn) @@ -37,12 +44,20 @@ func open(text: String, confirm_label: String, cancel_label: String = "取消") _text.text = text _confirm_btn.text = confirm_label _cancel_btn.text = cancel_label + _secondary_btn.visible = false # 双钮形态(次钮隐藏——既有调用方零改动) # z 序纪律:层序唯一事实源=main.LAYER_CONTRACT(树序与登记序同源派生);开合单口 # 归组合根 ModalFlow(挂起兜底/遮挡记账/开侧同步)——本类只管文案与显示,不自行抬层 - + visible = true +## 三钮形态(营地大门有断点分支——继续上一段冒险/开始新冒险/取消;Q5 裁甲) +func open_three(text: String, confirm_label: String, secondary_label: String, cancel_label: String) -> void: + open(text, confirm_label, cancel_label) + _secondary_btn.text = secondary_label + _secondary_btn.visible = true + + func close() -> void: visible = false @@ -55,5 +70,9 @@ func _emit_confirmed() -> void: confirmed.emit() +func _emit_secondary() -> void: + secondary_confirmed.emit() + + func _emit_cancelled() -> void: cancelled.emit()