extends Control @onready var resume_button: Button = $PauseButtons/ResumeButton @onready var save_button: Button = $PauseButtons/SaveButton @onready var quit_button: Button = $PauseButtons/QuitToMenuButton var player: Node = null func _ready() -> void: visible = false process_mode = Node.PROCESS_MODE_ALWAYS if resume_button: resume_button.pressed.connect(_on_resume) if save_button: save_button.pressed.connect(_on_save) if quit_button: quit_button.pressed.connect(_on_quit_to_menu) ## Pause has its own binding; menu cancel must not pause during gameplay. func _input(event: InputEvent) -> void: var pause_pressed := event.is_action_pressed("ui_pause") var cancel_pressed := event.is_action_pressed("ui_cancel") if not pause_pressed and not (visible and cancel_pressed): return var banner := get_node_or_null("/root/Node3D/HUD/ScrambleBanner") if banner and banner.visible: return if visible or get_tree().paused: _on_resume() get_viewport().set_input_as_handled() return if not GameplayInput.gameplay_enabled(): return var p := get_tree().get_first_node_in_group("player") if p == null: p = get_node_or_null("/root/Node3D/Player") if p: open_pause(p) get_viewport().set_input_as_handled() ## Blocks gameplay and selects a controller-accessible control before pausing. func open_pause(player_ref: Node) -> void: player = player_ref visible = true GameplayInput.set_menu_open(self, true) resume_button.grab_focus() Input.mouse_mode = Input.MOUSE_MODE_VISIBLE get_tree().paused = true ## Restores control only after currently held gameplay inputs return to neutral. func _on_resume() -> void: visible = false get_tree().paused = false GameplayInput.set_menu_open(self, false) Input.mouse_mode = Input.MOUSE_MODE_CAPTURED func _on_save() -> void: if player: GameState.save_game(player) else: var p := get_tree().get_first_node_in_group("player") if p: GameState.save_game(p) func _on_quit_to_menu() -> void: get_tree().paused = false GameplayInput.set_menu_open(self, false) Input.mouse_mode = Input.MOUSE_MODE_VISIBLE get_tree().change_scene_to_file("res://Scenes/main_menu.tscn")