卡④T4(迭代47·营地场景图批): 大门两分支+ConfirmDialog三钮化+三钮消费方编排+篝火二次确认动线——点大门永远先出确认/cancelled恒无变更退回营地

- ConfirmDialog三钮化(契约3/Q5甲): open_three增设次钮+secondary_confirmed信号——双钮调用方零改动(open隐藏次钮);钮序=[取消][次选项][确认]
- 大门两分支(裁决5): 有断点=三出口弹窗(继续上一段冒险/开始新冒险/取消,open_three)+无断点=是否开始新冒险(是/否);点大门永远先出确认不直接进冒险;cancelled恒=无变更退回营地
- 消费方编排扩展(卡③契约3机制零重构): _confirm_consumer新增gate/gate_new/campfire_leave三消费方+_on_confirm_secondary次确认分派——继续接现役续玩编排(_resume_from_menu同源)/开始接现役开局编排(_start_adventure同源)/冒险发起后营地场景屏隐藏(presenter.on_camp_closed关层收闭=营地与选档层同收+开始层恢复,T3已建);main_ui_build补secondary_confirmed接线
- 篝火动线: 二次确认(camp.md v2.2裁定走ConfirmDialog先例)→确认离场=on_camp_closed;命中只火堆已随T2布局表(560,640,160,80)
- _refresh_resume_button不复用(随卡②删——大门两分支直读has_breakpoint无钮可刷);终局落点不变量T0互证=现役终局continue回主菜单不改
- main.gd零新增成员(分派扩match臂+新方法,15/15保持)
- 验证: 全流程孤检绿(10项:篝火cancel/confirm/大门无断点cancel/confirm/次钮隐藏/三钮形态/次确认开局/主确认续玩no-op——临时件不入库,T5探针承载正式验收);S9/S10/S13归基线
This commit is contained in:
DKChan committed 2026-11-01 18:11:42 +08:00
1 parent 98470adc4d
commit 5a0e7069c1
4 files changed
+62 -6

No files matched your search

+21 -3
View File
@@ -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 = ""
+19 -1
View File
@@ -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(开层调用点直接改引)
+1
View File
@@ -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)
# 调试浮窗(主菜单三散件收一:随机种子/数值调整/批量模拟/两层调试入口;
+21 -2
View File
@@ -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()