From d6ad8c23fcd6f1708785a593204117ffd59700c7 Mon Sep 17 00:00:00 2001 From: LifeHckr Date: Tue, 15 Apr 2025 17:28:34 -0700 Subject: [PATCH 1/2] Auto pause pauseable scenes Scenes pause when controller is disconnected, or window is un focused. --- Scenes/UI/Scripts/MenuModule.cs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/Scenes/UI/Scripts/MenuModule.cs b/Scenes/UI/Scripts/MenuModule.cs index 55b56ebb..3f07a900 100644 --- a/Scenes/UI/Scripts/MenuModule.cs +++ b/Scenes/UI/Scripts/MenuModule.cs @@ -11,6 +11,16 @@ public partial class MenuModule : CanvasLayer, IFocusableMenu private Control _lastFocused { get; set; } + public override void _Ready() + { + Input.JoyConnectionChanged += (device, connected) => + { + if (!connected) + OpenPauseMenu(); //Pause on disconnection + }; + GetTree().GetRoot().FocusExited += OpenPauseMenu; + } + public void ResumeFocus() { CurSceneNode.ProcessMode = ProcessModeEnum.Inherit; @@ -39,9 +49,7 @@ public override void _Input(InputEvent @event) { if (@event.IsActionPressed("Pause")) { - var pauseMenu = GD.Load(PauseMenu.LoadPath).Instantiate(); - AddChild(pauseMenu); - pauseMenu.OpenMenu(this); + OpenPauseMenu(); } if (@event.IsActionPressed("Inventory")) { @@ -50,4 +58,13 @@ public override void _Input(InputEvent @event) invenMenu.OpenMenu(this); } } + + private void OpenPauseMenu() + { + if (CurSceneNode.ProcessMode == ProcessModeEnum.Disabled) + return; + var pauseMenu = GD.Load(PauseMenu.LoadPath).Instantiate(); + AddChild(pauseMenu); + pauseMenu.OpenMenu(this); + } } From 8a6037b874e5f3563592a93858de6f67f38643b1 Mon Sep 17 00:00:00 2001 From: LifeHckr Date: Wed, 16 Apr 2025 16:48:43 -0700 Subject: [PATCH 2/2] Consume input when window unfocused This should mainly just consumer controller input Also fix controller button attempting to grab focus when no controller is plugged in, and controller setting was last set. --- Globals/StageProducer.cs | 12 ++++++++++++ Scenes/BattleDirector/Scripts/BattleDirector.cs | 2 +- Scenes/Maps/Scripts/Cartographer.cs | 2 +- Scenes/UI/EndScreen.tscn | 2 +- Scenes/UI/Options/Scripts/HowToPlay.cs | 5 +++++ Scenes/UI/Options/Scripts/OptionsMenu.cs | 5 +++++ Scenes/UI/Remapping/ControlSettings.cs | 10 +++++++++- Scenes/UI/RewardSelectionUI.tscn | 2 +- Scenes/UI/Scripts/Inventory.cs | 5 +++++ Scenes/UI/Scripts/MenuModule.cs | 5 +++++ Scenes/UI/Scripts/PauseMenu.cs | 5 +++++ Scenes/UI/Scripts/RewardSelect.cs | 2 +- Scenes/UI/TitleScreen/Scripts/TitleScreen.cs | 10 +++++----- 13 files changed, 56 insertions(+), 11 deletions(-) diff --git a/Globals/StageProducer.cs b/Globals/StageProducer.cs index 7aada393..dd3a017a 100644 --- a/Globals/StageProducer.cs +++ b/Globals/StageProducer.cs @@ -212,4 +212,16 @@ private BattleConfig MakeBattleConfig(Stages nextRoom, int nextRoomIdx) CurRoom = nextRoomIdx; return result; } + + //Putting this here in an autoload. + public override void _Input(InputEvent @event) + { + //Consume controller input, if window out of focus. + //This handles ui_input, other scenes need to consume their own. + if (!GetWindow().HasFocus()) + { + GetViewport().SetInputAsHandled(); + return; + } + } } diff --git a/Scenes/BattleDirector/Scripts/BattleDirector.cs b/Scenes/BattleDirector/Scripts/BattleDirector.cs index 88ab9e13..d62c13f6 100644 --- a/Scenes/BattleDirector/Scripts/BattleDirector.cs +++ b/Scenes/BattleDirector/Scripts/BattleDirector.cs @@ -257,7 +257,7 @@ private void OnBattleLost() Audio.StreamPaused = true; SaveSystem.ClearSave(); AddChild(GD.Load(EndScreen.LoadPath).Instantiate()); - GetTree().Paused = true; + ProcessMode = ProcessModeEnum.Disabled; } private void ShowRewardSelection(int amount) diff --git a/Scenes/Maps/Scripts/Cartographer.cs b/Scenes/Maps/Scripts/Cartographer.cs index 030485e4..ae82b875 100644 --- a/Scenes/Maps/Scripts/Cartographer.cs +++ b/Scenes/Maps/Scripts/Cartographer.cs @@ -144,6 +144,6 @@ private void WinStage() EndScreen es = GD.Load(EndScreen.LoadPath).Instantiate(); AddChild(es); es.TopLabel.Text = Tr("BATTLE_ROOM_WIN"); - GetTree().Paused = true; + ProcessMode = ProcessModeEnum.Disabled; } } diff --git a/Scenes/UI/EndScreen.tscn b/Scenes/UI/EndScreen.tscn index 75dc3acf..040778e1 100644 --- a/Scenes/UI/EndScreen.tscn +++ b/Scenes/UI/EndScreen.tscn @@ -6,7 +6,7 @@ [ext_resource type="Theme" uid="uid://d37e3tpsbxwak" path="res://Scenes/UI/Assets/GeneralTheme.tres" id="4_1vt77"] [node name="CanvasLayer" type="CanvasLayer" node_paths=PackedStringArray("_buttons", "TopLabel")] -process_mode = 2 +process_mode = 3 script = ExtResource("1_37m3y") _buttons = [NodePath("MarginContainer2/MarginContainer/VBoxContainer/MarginContainer/Restart"), NodePath("MarginContainer2/MarginContainer/VBoxContainer/MarginContainer2/Title"), NodePath("MarginContainer2/MarginContainer/VBoxContainer/MarginContainer3/Quit")] TopLabel = NodePath("MarginContainer2/MarginContainer/VBoxContainer/TopLabel") diff --git a/Scenes/UI/Options/Scripts/HowToPlay.cs b/Scenes/UI/Options/Scripts/HowToPlay.cs index c3d49285..cc49e553 100644 --- a/Scenes/UI/Options/Scripts/HowToPlay.cs +++ b/Scenes/UI/Options/Scripts/HowToPlay.cs @@ -41,6 +41,11 @@ public void ReturnToPrev() public override void _Input(InputEvent @event) { + if (!GetWindow().HasFocus()) + { + GetViewport().SetInputAsHandled(); + return; + } if (@event.IsActionPressed("ui_cancel")) { ReturnToPrev(); diff --git a/Scenes/UI/Options/Scripts/OptionsMenu.cs b/Scenes/UI/Options/Scripts/OptionsMenu.cs index ee8bbc29..22eeb316 100644 --- a/Scenes/UI/Options/Scripts/OptionsMenu.cs +++ b/Scenes/UI/Options/Scripts/OptionsMenu.cs @@ -50,6 +50,11 @@ public override void _Ready() public override void _Input(InputEvent @event) { + if (!GetWindow().HasFocus()) + { + GetViewport().SetInputAsHandled(); + return; + } if (@event.IsActionPressed("ui_cancel")) { ReturnToPrev(); diff --git a/Scenes/UI/Remapping/ControlSettings.cs b/Scenes/UI/Remapping/ControlSettings.cs index 972c2657..e5cb8c31 100644 --- a/Scenes/UI/Remapping/ControlSettings.cs +++ b/Scenes/UI/Remapping/ControlSettings.cs @@ -131,11 +131,19 @@ private void GetCurrentSelection() OnControllerButtonPressed(); GetNode