Close every top modal through one Esc and right-click path
Full build / Import + headless tests (push) Successful in 37s
Full build / Full desktop build + optional release (push) Skipped

- Add Help, Settings, Pause and review to the top-modal close chain so right-click and Esc behave consistently.
- Restore the venue menu after menu Settings and prevent Help from opening Pause behind itself.
- Reopen pause after in-shift Settings apply and recapture the mouse/unfreeze state on close.
- Extend the session smoke for menu Settings, right-click Help and guard unfreeze.
This commit is contained in:
Gig Line Dev committed 2026-11-02 16:10:50 +01:00
1 parent 8f65751975
commit 26e6dd6413
8 files changed
+111 -6

No files matched your search

+39 -3
View File
@@ -99,6 +99,9 @@ var shift_review_panel: ShiftReview = null
var start_menu: StartMenu = null
var pause_overlay: PauseOverlay = null
var settings_panel: SettingsPanel = null
## Settings opened from the venue menu must return there on Cancel/Apply;
## settings opened from pause must not leave a menu visible or the guard frozen.
var _settings_from_start_menu := false
var event_timeline: EventTimeline = null
var tutorial_overlay: TutorialOverlay = null
var help_overlay: HelpOverlay = null
@@ -352,8 +355,15 @@ func _phase_start_s(phase: int) -> float:
func _show_start_menu() -> void:
_shift_running = false
_settings_from_start_menu = false
if pause_overlay:
pause_overlay.close()
if settings_panel:
settings_panel.close()
if help_overlay:
help_overlay.close_panel()
if event_timeline:
event_timeline.close()
if shift_review_panel:
shift_review_panel.hide()
if guard:
@@ -411,11 +421,21 @@ func _on_settings_applied(settings: Dictionary) -> void:
Save.save_campaign(campaign.summary())
if coordinator:
coordinator.scheduler.spawn_rate_multiplier = float(_difficulty()["spawn"])
if start_menu and start_menu.visible:
start_menu.open(campaign.summary() if campaign else {})
elif _shift_running:
# A settings panel opened from the venue menu is restored by
# `_on_settings_closed`; an in-shift panel returns to pause. Close it before
# opening pause so the new top-modal pass cannot cancel it twice.
if _shift_running:
if settings_panel:
settings_panel.close()
_open_pause()
func _on_settings_closed() -> void:
if _settings_from_start_menu:
_settings_from_start_menu = false
_show_start_menu()
else:
_refresh_freeze()
## Clear the tutorial completion/skip flags and restart the Hollywood shift so
## the next player can replay the first-shift lesson from Settings.
func _on_reset_campaign() -> void:
@@ -423,6 +443,7 @@ func _on_reset_campaign() -> void:
Save.reset_campaign()
if campaign:
campaign.setup({})
_settings_from_start_menu = false
if settings_panel:
settings_panel.close()
if pause_overlay:
@@ -434,6 +455,7 @@ func _on_replay_tutorial() -> void:
player_settings["tutorial_skipped"] = false
if Save:
Save.save_settings(player_settings)
_settings_from_start_menu = false
if settings_panel:
settings_panel.close()
if pause_overlay:
@@ -445,6 +467,7 @@ func _open_help() -> void:
help_overlay.open(selected_scenario.policy_summary if selected_scenario else "")
func _open_settings() -> void:
_settings_from_start_menu = start_menu != null and start_menu.visible
if start_menu:
start_menu.close()
if pause_overlay:
@@ -517,6 +540,7 @@ func _build_ui() -> void:
settings_panel.applied.connect(_on_settings_applied)
settings_panel.replay_tutorial_requested.connect(_on_replay_tutorial)
settings_panel.reset_campaign_requested.connect(_on_reset_campaign)
settings_panel.closed.connect(_on_settings_closed)
event_timeline = EventTimeline.new()
add_child(event_timeline)
@@ -1367,6 +1391,18 @@ func _close_top_modal() -> bool:
if event_timeline and event_timeline.visible:
event_timeline.close()
return true
if help_overlay and help_overlay.visible:
help_overlay.close_panel()
return true
if settings_panel and settings_panel.visible:
settings_panel._on_cancel()
return true
if pause_overlay and pause_overlay.visible:
_close_pause()
return true
if shift_review_panel and shift_review_panel.visible:
_on_review_restart()
return true
return false
func _open_radial() -> void:
+31
View File
@@ -22,6 +22,33 @@ func _initialize() -> void:
func _process(_delta: float) -> bool:
_frames += 1
if _frames == 5:
_manager = _main.get_node_or_null("GameManager")
if _manager == null or _manager.start_menu == null or not _manager.start_menu.visible:
printerr("start menu not visible before settings check")
quit(1)
return true
_manager._open_settings()
if _frames == 7:
if _manager.settings_panel == null or not _manager.settings_panel.visible:
printerr("settings did not open from the venue menu")
quit(1)
return true
_manager.settings_panel._on_cancel()
if _frames == 8:
if not _manager.start_menu.visible:
printerr("cancelling menu settings did not return to the venue menu")
quit(1)
return true
print("boot: menu settings cancel returns to menu")
_manager._open_help()
_manager._handle_cancel(true)
if _frames == 9:
if _manager.help_overlay.visible or not _manager.start_menu.visible:
printerr("right-click did not close Help and keep the venue menu")
quit(1)
return true
print("boot: help closes on right-click")
if _frames == 10:
_manager = _main.get_node_or_null("GameManager")
if _manager.start_menu == null or not _manager.start_menu.visible:
@@ -65,6 +92,10 @@ func _process(_delta: float) -> bool:
return true
print("boot: settings visible")
_manager.settings_panel._on_cancel()
if _manager.guard.input_locked:
printerr("guard stayed frozen after settings cancel")
quit(1)
return true
_manager._quit_to_menu()
if _frames == 290:
if not _manager.start_menu.visible: