diff --git a/project.godot b/project.godot index 47f48bf..b39e007 100644 --- a/project.godot +++ b/project.godot @@ -25,7 +25,6 @@ config/windows_native_icon="res://icon.ico" [autoload] LevelController="*res://scripts/level/LevelController.cs" -Cursor="*res://scripts/Cursor.cs" GameRegistry="*res://scripts/systems/GameRegistry.cs" Cheats="*res://scripts/debug/Cheats.cs" AudioSequencer="*res://scenes/audio_sequencer.tscn" @@ -96,7 +95,6 @@ ui_left={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":9,"pressure":0.0,"pressed":true,"script":null) -, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":-1.0,"script":null) ] } ui_right={ @@ -104,20 +102,29 @@ ui_right={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":10,"pressure":0.0,"pressed":true,"script":null) -, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":1.0,"script":null) ] } ui_up={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null) -, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":-1.0,"script":null) ] } ui_down={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null) +] +} +ui_page_up={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194323,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":-1.0,"script":null) +] +} +ui_page_down={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194324,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null) ] } diff --git a/scenes/gui/almanach.gd b/scenes/gui/almanach.gd index c7e60de..ae21e7d 100644 --- a/scenes/gui/almanach.gd +++ b/scenes/gui/almanach.gd @@ -1,5 +1,24 @@ extends TabContainer +var stolen_focus : Control + +func _ready() -> void: + get_viewport().gui_focus_changed.connect(on_focus_changed) + visibility_changed.connect(on_visibility_changed) +func _exit_tree() -> void: + get_viewport().gui_focus_changed.disconnect(on_focus_changed) + func _on_quit_button_pressed() -> void: visible = false $ChannelPlayer.call("Play") + +func on_visibility_changed(): + if visible: + await get_tree().process_frame + $plants/SeedpacketsContainer/GridContainer.get_child(0).grab_focus() + else: + stolen_focus.grab_focus() + +func on_focus_changed(to : Control): + if visible: return + stolen_focus = to diff --git a/scenes/gui/almanach.tscn b/scenes/gui/almanach.tscn index 0603133..3ab973a 100644 --- a/scenes/gui/almanach.tscn +++ b/scenes/gui/almanach.tscn @@ -12,12 +12,12 @@ [sub_resource type="ViewportTexture" id="ViewportTexture_ru62c"] viewport_path = NodePath("plants/Infobox/FrameAndTitle/VboxContainer/Frame/Previewport") -[sub_resource type="InputEventAction" id="InputEventAction_vvhxq"] -action = &"ui_cancel" +[sub_resource type="InputEventJoypadButton" id="InputEventJoypadButton_vvhxq"] +button_index = 1 pressed = true [sub_resource type="Shortcut" id="Shortcut_lmmwe"] -events = [SubResource("InputEventAction_vvhxq")] +events = [SubResource("InputEventJoypadButton_vvhxq")] [sub_resource type="ViewportTexture" id="ViewportTexture_7yl8g"] viewport_path = NodePath("zombies/Infobox/FrameAndTitle/VBoxContainer/Frame/Previewport") @@ -180,6 +180,7 @@ expand_mode = 1 [node name="QuitButton" type="Button" parent="zombies/Infobox/FrameAndTitle/VBoxContainer"] layout_mode = 2 size_flags_vertical = 4 +shortcut = SubResource("Shortcut_lmmwe") text = "exit" [node name="Label" type="Label" parent="zombies/Infobox/FrameAndTitle"] diff --git a/scenes/gui/choose_your_seeds.tscn b/scenes/gui/choose_your_seeds.tscn index 7f22eba..d42916e 100644 --- a/scenes/gui/choose_your_seeds.tscn +++ b/scenes/gui/choose_your_seeds.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=20 format=3 uid="uid://dpxxjfd5lv5sv"] +[gd_scene load_steps=23 format=3 uid="uid://dpxxjfd5lv5sv"] [ext_resource type="Theme" uid="uid://e8n88g31w7x7" path="res://assets/themes/ChooseYourSeeds.tres" id="1_bfo8i"] [ext_resource type="Texture2D" uid="uid://dr8a0rx42o3qy" path="res://assets/sprites/gui/ChooseYourSeeds/PlantFrame.tres" id="2_so2bw"] @@ -7,13 +7,16 @@ [ext_resource type="Script" uid="uid://eq3ecja30mlj" path="res://scripts/gui/choose_your_seeds/GridLoader.cs" id="4_i7sou"] [ext_resource type="PackedScene" uid="uid://10b1egek6upx" path="res://scenes/gui/level_run_button.tscn" id="5_n80ic"] [ext_resource type="Script" uid="uid://d26waisd3v488" path="res://scripts/gui/choose_your_seeds/LevelRunButton.cs" id="7_k6b6g"] +[ext_resource type="Texture2D" uid="uid://y2hhywmmy0t5" path="res://assets/sprites/lehauico.png" id="8_f8xw6"] [ext_resource type="Texture2D" uid="uid://drydueofrb448" path="res://assets/sprites/gui/almanach/book.tres" id="8_hmdmm"] [ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="8_v7xff"] +[ext_resource type="Script" uid="uid://diwjgekhvn017" path="res://scripts/gui/choose_your_seeds/CYSResetButton.cs" id="9_kwnqh"] [ext_resource type="AudioStream" uid="uid://bdx83fokp6kha" path="res://assets/audio/sfx/buttonclick.mp3" id="9_v7xff"] [ext_resource type="Script" uid="uid://c1x4n4nqyq72f" path="res://scripts/audio/ChannelSettings.cs" id="10_nlh6x"] [ext_resource type="PackedScene" uid="uid://bvpt0q4j6nx18" path="res://scenes/gui/almanach.tscn" id="11_nlh6x"] [ext_resource type="AudioStream" uid="uid://mu86q1r1dvgo" path="res://assets/audio/music/03. Choose Your Seeds.mp3" id="13_y65t1"] [ext_resource type="Script" uid="uid://b4ysi1iutmju3" path="res://scripts/audio/ChooseYourSeedsMusic.cs" id="14_rptyw"] +[ext_resource type="Script" uid="uid://bksslrqq5vhm3" path="res://scripts/gui/choose_your_seeds/CYSFocusSetup.cs" id="15_rptyw"] [sub_resource type="ViewportTexture" id="ViewportTexture_rmoaa"] viewport_path = NodePath("Panel/MarginContainer/VBoxContainer/HBoxContainer/Frame/Previewport") @@ -28,8 +31,8 @@ script/source = "extends Button func _pressed() -> void: - $\"../../Independer/Almanach\".visible = true - $\"../../ChannelPlayer\".call(\"Play\") + $\"../../../Independer/Almanach\".visible = true + $\"../../../ChannelPlayer\".call(\"Play\") " [sub_resource type="Resource" id="Resource_l66rp"] @@ -114,6 +117,7 @@ size_flags_horizontal = 3 [node name="ScrollContainer" type="ScrollContainer" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer"] layout_mode = 2 +focus_mode = 2 horizontal_scroll_mode = 0 [node name="VBoxContainer" type="VBoxContainer" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer/ScrollContainer"] @@ -141,22 +145,33 @@ layout_mode = 2 columns = 7 script = ExtResource("4_i7sou") -[node name="LevelRunButton" parent="Panel" instance=ExtResource("5_n80ic")] +[node name="ButtonContainer" type="VBoxContainer" parent="Panel"] layout_mode = 1 +anchors_preset = -1 anchor_left = 1.0 -anchor_right = 1.181 -anchor_bottom = 0.131 -offset_right = -16.16 -offset_bottom = -16.016 +anchor_right = 1.18889 +anchor_bottom = 0.997024 +grow_vertical = 2 +metadata/_edit_use_anchors_ = true + +[node name="LevelRunButton" parent="Panel/ButtonContainer" instance=ExtResource("5_n80ic")] +layout_mode = 2 +focus_neighbor_left = NodePath("../../MarginContainer/VBoxContainer/HBoxContainer/PanelContainer/ScrollContainer") +focus_neighbor_bottom = NodePath("../Button") script = ExtResource("7_k6b6g") -[node name="AlmanachButton" type="Button" parent="Panel"] -layout_mode = 0 -anchor_left = 1.0 -anchor_top = 0.883929 -anchor_right = 1.14167 -anchor_bottom = 1.0 -offset_bottom = -3.05176e-05 +[node name="Button" type="Button" parent="Panel/ButtonContainer"] +layout_mode = 2 +focus_neighbor_top = NodePath("../LevelRunButton") +focus_neighbor_bottom = NodePath("../AlmanachButton") +icon = ExtResource("8_f8xw6") +icon_alignment = 1 +script = ExtResource("9_kwnqh") + +[node name="AlmanachButton" type="Button" parent="Panel/ButtonContainer"] +layout_mode = 2 +focus_neighbor_left = NodePath("../../MarginContainer/VBoxContainer/HBoxContainer/PanelContainer/ScrollContainer") +focus_neighbor_top = NodePath("../Button") icon = ExtResource("8_hmdmm") icon_alignment = 1 script = SubResource("GDScript_hmdmm") @@ -180,4 +195,10 @@ autoplay = true bus = &"MusicBus" script = ExtResource("14_rptyw") -[connection signal="pressed" from="Panel/LevelRunButton" to="ChannelPlayer" method="Play"] +[node name="FocusSetup" type="Node" parent="." node_paths=PackedStringArray("grid", "button", "textContainer")] +script = ExtResource("15_rptyw") +grid = NodePath("../Panel/MarginContainer/VBoxContainer/ScrollContainer/GridContainer") +button = NodePath("../Panel/ButtonContainer/LevelRunButton") +textContainer = NodePath("../Panel/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer/ScrollContainer") + +[connection signal="pressed" from="Panel/ButtonContainer/LevelRunButton" to="ChannelPlayer" method="Play"] diff --git a/scenes/gui/pause_button.tscn b/scenes/gui/pause_button.tscn index 154291c..d65dc65 100644 --- a/scenes/gui/pause_button.tscn +++ b/scenes/gui/pause_button.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://u5l3jd00s8vd"] [ext_resource type="Texture2D" uid="uid://dm0hjd67a6mva" path="res://assets/sprites/gui/Pause.tres" id="1_7k3tg"] -[ext_resource type="Script" uid="uid://cmfhiun6yrlr6" path="res://scripts/gui/PauseButton.cs" id="2_01o3l"] +[ext_resource type="Script" uid="uid://cmfhiun6yrlr6" path="res://scripts/gui/pause_menu/PauseButton.cs" id="2_01o3l"] [node name="PauseButton" type="Button"] anchors_preset = -1 diff --git a/scenes/gui/pause_menu.tscn b/scenes/gui/pause_menu.tscn index c9d2959..069dfa5 100644 --- a/scenes/gui/pause_menu.tscn +++ b/scenes/gui/pause_menu.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=11 format=3 uid="uid://fm471x22n8kr"] [ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_loim0"] -[ext_resource type="Script" uid="uid://gvwhpjoame6m" path="res://scripts/gui/PauseMenu.cs" id="2_4vp8g"] +[ext_resource type="Script" uid="uid://gvwhpjoame6m" path="res://scripts/gui/pause_menu/PauseMenu.cs" id="2_4vp8g"] [ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="3_4vp8g"] [ext_resource type="Script" uid="uid://ciccaxqo70s13" path="res://scripts/audio/AudioSlider.cs" id="3_e3p60"] [ext_resource type="AudioStream" uid="uid://bdx83fokp6kha" path="res://assets/audio/sfx/buttonclick.mp3" id="4_e3p60"] @@ -108,6 +108,7 @@ script = ExtResource("3_e3p60") affects = 1 [node name="ContinueButton" type="Button" parent="Pause/MarginContainer/Buttons"] +unique_name_in_owner = true layout_mode = 2 icon = SubResource("AtlasTexture_4k24j") icon_alignment = 1 diff --git a/scripts/Cursor.cs b/scripts/Cursor.cs index 17d9acf..274543c 100644 --- a/scripts/Cursor.cs +++ b/scripts/Cursor.cs @@ -35,9 +35,13 @@ public partial class Cursor : Node2D case CursorMode.Mouse: break; case CursorMode.Gamepad: + if (GamepadHandler.Instance.IsGamepadControlled == false) return; + var vector = Input.GetVector("cursor_left", "cursor_right", "cursor_up", "cursor_down"); - var set_position = GetGlobalMousePosition() + vector * (float)delta * sensitivity; + if (vector == Vector2.Zero) return; + + var set_position = GetGlobalMousePosition() + vector * (float)delta * sensitivity / (float)Engine.TimeScale; GetViewport().WarpMouse(GetGlobalTransformWithCanvas() * set_position); break; diff --git a/scripts/droppable-items/DroppableItem.cs b/scripts/droppable-items/DroppableItem.cs index ca9f314..afbd5ef 100644 --- a/scripts/droppable-items/DroppableItem.cs +++ b/scripts/droppable-items/DroppableItem.cs @@ -6,13 +6,23 @@ namespace Newlon.Components.Droppables; public partial class DroppableItem : Area2D { [Signal] public delegate void PickedUpEventHandler(); + public override void _MouseEnter() + { + if (GamepadHandler.Instance.IsGamepadControlled) + { + GetViewport().SetInputAsHandled(); + PickUp(); + EmitSignal(SignalName.PickedUp); + } + } + public override void _InputEvent(Viewport viewport, InputEvent @event, int shapeIdx) { if (@event.IsActionPressed("primary_action")) { GetViewport().SetInputAsHandled(); PickUp(); - EmitSignal(SignalName.PickedUp); + EmitSignal(SignalName.PickedUp); } } public virtual void PickUp() {} diff --git a/scripts/entities/Entity.cs b/scripts/entities/Entity.cs index 03c32a3..697f69f 100644 --- a/scripts/entities/Entity.cs +++ b/scripts/entities/Entity.cs @@ -181,6 +181,7 @@ public partial class Entity : Node2D if (_activeEffectSlots[slot] != null) { _activeEffectSlots[slot].Exit(this); + _effectSlotTimers[slot].Stop(); _activeEffectSlots[slot] = null; } } diff --git a/scripts/gamepad/GamepadHandler.cs b/scripts/gamepad/GamepadHandler.cs index 033cc36..9689029 100644 --- a/scripts/gamepad/GamepadHandler.cs +++ b/scripts/gamepad/GamepadHandler.cs @@ -4,48 +4,39 @@ using System; public partial class GamepadHandler : Node { + [Signal] public delegate void GamepadControlledEventHandler(bool isControlled); public static GamepadHandler Instance { get; private set; } public int CurrentDevice { get; private set; } = 0; - public bool IsGamepadControlled => focused && controlled; - private bool focused; + public bool IsGamepadControlled => controlled; private bool controlled; public override void _EnterTree() { Instance = this; } - - public override void _Notification(int what) - { - if (what == NotificationApplicationFocusIn) - { - focused = true; - } - if (what == NotificationApplicationFocusOut) - { - focused = false; - } - } public override void _Input(InputEvent @event) { if (@event is InputEventJoypadButton || @event is InputEventJoypadMotion) { SetControlled(true); } - if ((@event is InputEventMouse && Input.GetVector("cursor_left", "cursor_right", "cursor_up", "cursor_down") == Vector2.Zero) || @event is InputEventKey) + else if (@event is InputEventMouseButton || @event is InputEventKey) { SetControlled(false); } } private void SetControlled(bool to) { + if (controlled == to) return; controlled = to; if (controlled) { Cursor.Mode = Cursor.CursorMode.Gamepad; + EmitSignal(SignalName.GamepadControlled, true); } else { Cursor.Mode = Cursor.CursorMode.Mouse; + EmitSignal(SignalName.GamepadControlled, false); } } diff --git a/scripts/gui/LevelGUIElements.cs b/scripts/gui/LevelGUIElements.cs index f191d2f..e79eea4 100644 --- a/scripts/gui/LevelGUIElements.cs +++ b/scripts/gui/LevelGUIElements.cs @@ -11,7 +11,7 @@ public partial class LevelGUIElements : Control public HBoxContainer SeedpacketsHotbar; [Export] public SunCounter SunCounter; - public override void _Ready() + public override void _EnterTree() { Instance = this; } diff --git a/scripts/gui/choose_your_seeds/CYSFocusSetup.cs b/scripts/gui/choose_your_seeds/CYSFocusSetup.cs new file mode 100644 index 0000000..dd18203 --- /dev/null +++ b/scripts/gui/choose_your_seeds/CYSFocusSetup.cs @@ -0,0 +1,62 @@ +using Godot; +using System; + +public partial class CYSFocusSetup : Node +{ + [Export] private GridContainer grid; + [Export] private Button button; + [Export] private ScrollContainer textContainer; + public override void _Ready() + { + for (int i = 0; i < grid.GetChildCount(); i++) + { + int x = i % grid.Columns; + int y = i / grid.Columns; + + Control control = grid.GetChild(i); + + // If it isn't leftmost element + if (x != 0) + { + control.FocusNeighborLeft = control.GetPathTo(grid.GetChild(PositionToIndex(x - 1, y))); + } + // If it isn't upmost element + if (y != 0) + { + control.FocusNeighborTop = control.GetPathTo(grid.GetChild(PositionToIndex(x, y - 1))); + } + else + { + control.FocusNeighborTop = control.GetPathTo(textContainer); + } + // If it isn't rightmost element + if (x != grid.Columns - 1 && i != grid.GetChildCount()) + { + control.FocusNeighborRight = control.GetPathTo(grid.GetChild(PositionToIndex(x + 1, y))); + } + else + { + if (y != 0) + { + control.FocusNeighborRight = control.GetPathTo(grid.GetChild(PositionToIndex(x + 1, y - 1))); + } + else + { + control.FocusNeighborRight = control.GetPathTo(button); + } + } + if (PositionToIndex(x, y + 1) < grid.GetChildCount()) + { + control.FocusNeighborBottom = control.GetPathTo(grid.GetChild(PositionToIndex(x, y + 1))); + } + + } + + QueueFree(); + } + private int PositionToIndex(int x, int y) + { + return y * grid.Columns + x; + } + +} diff --git a/scripts/gui/choose_your_seeds/CYSFocusSetup.cs.uid b/scripts/gui/choose_your_seeds/CYSFocusSetup.cs.uid new file mode 100644 index 0000000..039f60f --- /dev/null +++ b/scripts/gui/choose_your_seeds/CYSFocusSetup.cs.uid @@ -0,0 +1 @@ +uid://bksslrqq5vhm3 diff --git a/scripts/gui/choose_your_seeds/CYSResetButton.cs b/scripts/gui/choose_your_seeds/CYSResetButton.cs new file mode 100644 index 0000000..a771b7b --- /dev/null +++ b/scripts/gui/choose_your_seeds/CYSResetButton.cs @@ -0,0 +1,17 @@ +using Godot; +using Newlon.Components; +using Newlon.Components.GUI.Seedpackets; + +public partial class CYSResetButton : Button +{ + public override void _Pressed() + { + foreach (Seedpacket packet in LevelGUIElements.Instance.SeedpacketsHotbar.GetChildren()) + { + packet._Pressed(); + packet.EmitSignal(Seedpacket.SignalName.Pressed); + } + GrabFocus(); + } + +} diff --git a/scripts/gui/choose_your_seeds/CYSResetButton.cs.uid b/scripts/gui/choose_your_seeds/CYSResetButton.cs.uid new file mode 100644 index 0000000..b42dfaa --- /dev/null +++ b/scripts/gui/choose_your_seeds/CYSResetButton.cs.uid @@ -0,0 +1 @@ +uid://diwjgekhvn017 diff --git a/scripts/gui/pause_menu/PM_GamepadFocus.cs b/scripts/gui/pause_menu/PM_GamepadFocus.cs new file mode 100644 index 0000000..a1e6696 --- /dev/null +++ b/scripts/gui/pause_menu/PM_GamepadFocus.cs @@ -0,0 +1,15 @@ +using Godot; +using System; + +public partial class PM_GamepadFocus : Node +{ + // Called when the node enters the scene tree for the first time. + public override void _Ready() + { + } + + // Called every frame. 'delta' is the elapsed time since the previous frame. + public override void _Process(double delta) + { + } +} diff --git a/scripts/gui/pause_menu/PM_GamepadFocus.cs.uid b/scripts/gui/pause_menu/PM_GamepadFocus.cs.uid new file mode 100644 index 0000000..ebc9a03 --- /dev/null +++ b/scripts/gui/pause_menu/PM_GamepadFocus.cs.uid @@ -0,0 +1 @@ +uid://cc8loabsf43m0 diff --git a/scripts/gui/PauseButton.cs b/scripts/gui/pause_menu/PauseButton.cs similarity index 100% rename from scripts/gui/PauseButton.cs rename to scripts/gui/pause_menu/PauseButton.cs diff --git a/scripts/gui/PauseButton.cs.uid b/scripts/gui/pause_menu/PauseButton.cs.uid similarity index 100% rename from scripts/gui/PauseButton.cs.uid rename to scripts/gui/pause_menu/PauseButton.cs.uid diff --git a/scripts/gui/PauseMenu.cs b/scripts/gui/pause_menu/PauseMenu.cs similarity index 66% rename from scripts/gui/PauseMenu.cs rename to scripts/gui/pause_menu/PauseMenu.cs index ac54d80..2beb8fd 100644 --- a/scripts/gui/PauseMenu.cs +++ b/scripts/gui/pause_menu/PauseMenu.cs @@ -8,9 +8,11 @@ public partial class PauseMenu : Control private bool previousPaused; private bool currently_paused = false; private AudioStream pauseSound = ResourceLoader.Load("uid://ckja8ym50y0d4"); - public override void _Ready() + private Control stolenFocus; + public override void _Ready() { Instance = this; + GetViewport().GuiFocusChanged += OnFocusChanged; } public void Continue() @@ -18,6 +20,7 @@ public partial class PauseMenu : Control GetParent().Visible = false; GetTree().Paused = previousPaused; currently_paused = false; + stolenFocus.GrabFocus(); } public void Restart() { @@ -36,10 +39,22 @@ public partial class PauseMenu : Control { return; } + Instance.currently_paused = true; + Instance.GetNode("%ContinueButton").GrabFocus(); + Instance.GetParent().Visible = true; Instance.previousPaused = Instance.GetTree().Paused; Instance.GetTree().Paused = true; - Instance.currently_paused = true; - AudioSequencer.Play("pause",Instance.pauseSound); + AudioSequencer.Play("pause", Instance.pauseSound); + } + public override void _ExitTree() + { + GetViewport().GuiFocusChanged -= OnFocusChanged; + } + + public void OnFocusChanged(Control to) + { + if (currently_paused) return; + stolenFocus = to; } } diff --git a/scripts/gui/PauseMenu.cs.uid b/scripts/gui/pause_menu/PauseMenu.cs.uid similarity index 100% rename from scripts/gui/PauseMenu.cs.uid rename to scripts/gui/pause_menu/PauseMenu.cs.uid