From d70995515d489f4ba2e9719e3808d0d089229f05 Mon Sep 17 00:00:00 2001 From: Rmojarro1 <48000819+Rmojarro1@users.noreply.github.com> Date: Tue, 4 Mar 2025 18:57:54 -0800 Subject: [PATCH 1/5] Added basic controller support Added new button for controller in settings, will also swap to controller controls if gamepad buttons are pressed in battle if they were not selected. currently only for d-pad directions, added functionality for menu navigation, pausing game(start button), opening inventory(select button), confirming (A button). Testing with 8BitDo Ultimate Cotroller --- scenes/NoteManager/scripts/InputHandler.cs | 66 +++++++++++++++++- scenes/Remapping/ControlSchemes.cs | 20 ++++++ scenes/Remapping/ControlSettings.cs | 14 ++++ scenes/Remapping/Remap.tscn | 8 +++ scenes/Remapping/assets/360_Dpad_Down.png | Bin 0 -> 5248 bytes .../Remapping/assets/360_Dpad_Down.png.import | 34 +++++++++ scenes/Remapping/assets/360_Dpad_Left.png | Bin 0 -> 5201 bytes .../Remapping/assets/360_Dpad_Left.png.import | 34 +++++++++ scenes/Remapping/assets/360_Dpad_Right.png | Bin 0 -> 5173 bytes .../assets/360_Dpad_Right.png.import | 34 +++++++++ scenes/Remapping/assets/360_Dpad_Up.png | Bin 0 -> 5157 bytes .../Remapping/assets/360_Dpad_Up.png.import | 34 +++++++++ 12 files changed, 241 insertions(+), 3 deletions(-) create mode 100644 scenes/Remapping/assets/360_Dpad_Down.png create mode 100644 scenes/Remapping/assets/360_Dpad_Down.png.import create mode 100644 scenes/Remapping/assets/360_Dpad_Left.png create mode 100644 scenes/Remapping/assets/360_Dpad_Left.png.import create mode 100644 scenes/Remapping/assets/360_Dpad_Right.png create mode 100644 scenes/Remapping/assets/360_Dpad_Right.png.import create mode 100644 scenes/Remapping/assets/360_Dpad_Up.png create mode 100644 scenes/Remapping/assets/360_Dpad_Up.png.import diff --git a/scenes/NoteManager/scripts/InputHandler.cs b/scenes/NoteManager/scripts/InputHandler.cs index 1b6f32c5..c373a308 100644 --- a/scenes/NoteManager/scripts/InputHandler.cs +++ b/scenes/NoteManager/scripts/InputHandler.cs @@ -97,17 +97,56 @@ private void LoadControlScheme() } var selectedScheme = ControlSchemes.Schemes[scheme]; + foreach (var arrow in Arrows) { if (selectedScheme.ContainsKey(arrow.Key)) { - InputEventKey eventKey = new InputEventKey(); - eventKey.Keycode = (Key)Enum.Parse(typeof(Key), selectedScheme[arrow.Key]); - InputMap.ActionAddEvent(arrow.Key, eventKey); + string inputName = selectedScheme[arrow.Key]; + + if (inputName.StartsWith("Joypad")) // Controller input + { + InputEventJoypadButton eventJoypad = new InputEventJoypadButton(); + eventJoypad.ButtonIndex = GetJoypadButton(inputName); + + if (eventJoypad.ButtonIndex != JoyButton.Invalid) // Ensure it's valid + { + InputMap.ActionAddEvent(arrow.Key, eventJoypad); + } + else + { + GD.PrintErr($"Invalid joypad button mapping: {inputName}"); + } + } + else // Keyboard input + { + if (Enum.TryParse(inputName, out Key keycode)) // Check if valid keyboard key + { + InputEventKey eventKey = new InputEventKey(); + eventKey.Keycode = keycode; + InputMap.ActionAddEvent(arrow.Key, eventKey); + } + else + { + GD.PrintErr($"Invalid key mapping: {inputName}"); + } + } } } } + private JoyButton GetJoypadButton(string action) + { + return action switch + { + "Joypad_Dpad_Up" => JoyButton.DpadUp, + "Joypad_Dpad_Down" => JoyButton.DpadDown, + "Joypad_Dpad_Left" => JoyButton.DpadLeft, + "Joypad_Dpad_Right" => JoyButton.DpadRight, + _ => JoyButton.Invalid, // Return an invalid button if unknown + }; + } + public override void _Process(double delta) { foreach (var arrow in Arrows) @@ -124,4 +163,25 @@ public override void _Process(double delta) } } } + + public override void _Input(InputEvent @event) + { + // Detect if a gamepad button is pressed + if (@event is InputEventJoypadButton || @event is InputEventJoypadMotion) + { + // Get the currently active control scheme + string currentScheme = (string)ProjectSettings.GetSetting("game/input_scheme"); + + // Switch to "CONTROLLER" scheme if not already active + if (currentScheme != "CONTROLLER") + { + GD.Print("Gamepad detected, switching to CONTROLLER scheme."); + ProjectSettings.SetSetting("game/input_scheme", "CONTROLLER"); + ProjectSettings.Save(); + + // Reload the control scheme to apply changes + LoadControlScheme(); + } + } + } } diff --git a/scenes/Remapping/ControlSchemes.cs b/scenes/Remapping/ControlSchemes.cs index 7d8ac898..22eb999d 100644 --- a/scenes/Remapping/ControlSchemes.cs +++ b/scenes/Remapping/ControlSchemes.cs @@ -38,6 +38,16 @@ public static class ControlSchemes { "arrowRight", "R" }, } }, + { + "CONTROLLER", + new Dictionary() + { + { "arrowUp", "Joypad_Dpad_Up" }, + { "arrowDown", "Joypad_Dpad_Down" }, + { "arrowLeft", "Joypad_Dpad_Left" }, + { "arrowRight", "Joypad_Dpad_Right" }, + } + }, }; public static Dictionary> SpriteMappings = new Dictionary< @@ -75,5 +85,15 @@ public static class ControlSchemes { "down", "res://scenes/Remapping/assets/E_Key_Light.png" }, } }, + { + "CONTROLLER", + new Dictionary() + { + { "left", "res://scenes/Remapping/assets/360_Dpad_Left.png" }, + { "right", "res://scenes/Remapping/assets/360_Dpad_Right.png" }, + { "up", "res://scenes/Remapping/assets/360_Dpad_Up.png" }, + { "down", "res://scenes/Remapping/assets/360_Dpad_Down.png" }, + } + }, }; } diff --git a/scenes/Remapping/ControlSettings.cs b/scenes/Remapping/ControlSettings.cs index 21d3d3b0..13ecb99f 100644 --- a/scenes/Remapping/ControlSettings.cs +++ b/scenes/Remapping/ControlSettings.cs @@ -28,6 +28,8 @@ public override void _Ready() .Connect("pressed", Callable.From(OnArrowButtonPressed)); GetNode