From dad9663bc4a1f0528f07d9e5cef818df95a75cd1 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Sat, 18 May 2024 08:31:13 -0400 Subject: [PATCH] feat: allow configuring menu toggle button --- include/recomp_input.h | 8 +++++++- src/game/config.cpp | 1 + src/game/input.cpp | 12 +++++++++++- src/ui/ui_renderer.cpp | 19 +++++++++++++++---- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/include/recomp_input.h b/include/recomp_input.h index d2d718e..649a2ab 100644 --- a/include/recomp_input.h +++ b/include/recomp_input.h @@ -36,9 +36,13 @@ namespace recomp { DEFINE_INPUT(X_AXIS_NEG, 0, "Left") \ DEFINE_INPUT(X_AXIS_POS, 0, "Right") \ + #define DEFINE_RECOMP_UI_INPUTS() \ + DEFINE_INPUT(TOGGLE_MENU, 0, "Toggle Menu") + #define DEFINE_ALL_INPUTS() \ DEFINE_N64_BUTTON_INPUTS() \ - DEFINE_N64_AXIS_INPUTS() + DEFINE_N64_AXIS_INPUTS() \ + DEFINE_RECOMP_UI_INPUTS() // Enum containing every recomp input. #define DEFINE_INPUT(name, value, readable) name, @@ -104,6 +108,8 @@ namespace recomp { std::vector analog_right; std::vector analog_up; std::vector analog_down; + + std::vector toggle_menu; }; extern const DefaultN64Mappings default_n64_keyboard_mappings; diff --git a/src/game/config.cpp b/src/game/config.cpp index 9e31488..9a14e0a 100644 --- a/src/game/config.cpp +++ b/src/game/config.cpp @@ -232,6 +232,7 @@ void assign_all_mappings(recomp::InputDevice device, const recomp::DefaultN64Map assign_mapping_complete(device, recomp::GameInput::X_AXIS_POS, values.analog_right); assign_mapping_complete(device, recomp::GameInput::Y_AXIS_NEG, values.analog_down); assign_mapping_complete(device, recomp::GameInput::Y_AXIS_POS, values.analog_up); + assign_mapping_complete(device, recomp::GameInput::TOGGLE_MENU, values.toggle_menu); }; void recomp::reset_input_bindings() { diff --git a/src/game/input.cpp b/src/game/input.cpp index 94c4d29..b06d8b8 100644 --- a/src/game/input.cpp +++ b/src/game/input.cpp @@ -172,7 +172,11 @@ bool sdl_event_filter(void* userdata, SDL_Event* event) { break; case SDL_EventType::SDL_CONTROLLERBUTTONDOWN: if (scanning_device != recomp::InputDevice::COUNT) { - if (event->cbutton.button == SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_BACK) { + auto menuToggleBinding0 = recomp::get_input_binding(recomp::GameInput::TOGGLE_MENU, 0, recomp::InputDevice::Controller); + auto menuToggleBinding1 = recomp::get_input_binding(recomp::GameInput::TOGGLE_MENU, 1, recomp::InputDevice::Controller); + // note - magic number: 0 is InputType::None + if ((menuToggleBinding0.input_type != 0 && event->cbutton.button == menuToggleBinding0.input_id) || + (menuToggleBinding1.input_type != 0 && event->cbutton.button == menuToggleBinding1.input_id)) { recomp::cancel_scanning_input(); } else if (scanning_device == recomp::InputDevice::Controller) { SDL_ControllerButtonEvent* button_event = &event->cbutton; @@ -325,6 +329,9 @@ const recomp::DefaultN64Mappings recomp::default_n64_keyboard_mappings = { .analog_down = { {.input_type = (uint32_t)InputType::Keyboard, .input_id = SDL_SCANCODE_S} }, + .toggle_menu = { + {.input_type = (uint32_t)InputType::Keyboard, .input_id = SDL_SCANCODE_ESCAPE} + }, }; const recomp::DefaultN64Mappings recomp::default_n64_controller_mappings = { @@ -386,6 +393,9 @@ const recomp::DefaultN64Mappings recomp::default_n64_controller_mappings = { .analog_down = { {.input_type = (uint32_t)InputType::ControllerAnalog, .input_id = SDL_CONTROLLER_AXIS_LEFTY + 1}, }, + .toggle_menu = { + {.input_type = (uint32_t)InputType::ControllerDigital, .input_id = SDL_CONTROLLER_BUTTON_BACK}, + }, }; void recomp::poll_inputs() { diff --git a/src/ui/ui_renderer.cpp b/src/ui/ui_renderer.cpp index c885184..4b4e950 100644 --- a/src/ui/ui_renderer.cpp +++ b/src/ui/ui_renderer.cpp @@ -1193,10 +1193,17 @@ int cont_button_to_key(SDL_ControllerButtonEvent& button) { case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_X: case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_START: return SDLK_f; - // Allows closing the menu - case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_BACK: - return SDLK_ESCAPE; } + + // Allows closing the menu + auto menuToggleBinding0 = recomp::get_input_binding(recomp::GameInput::TOGGLE_MENU, 0, recomp::InputDevice::Controller); + auto menuToggleBinding1 = recomp::get_input_binding(recomp::GameInput::TOGGLE_MENU, 1, recomp::InputDevice::Controller); + // note - magic number: 0 is InputType::None + if ((menuToggleBinding0.input_type != 0 && button.button == menuToggleBinding0.input_id) || + (menuToggleBinding1.input_type != 0 && button.button == menuToggleBinding1.input_id)) { + return SDLK_ESCAPE; + } + return 0; } @@ -1383,7 +1390,11 @@ void draw_hook(RT64::RenderCommandList* command_list, RT64::RenderFramebuffer* s } break; case SDL_EventType::SDL_CONTROLLERBUTTONDOWN: - if (cur_event.cbutton.button == SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_BACK) { + auto menuToggleBinding0 = recomp::get_input_binding(recomp::GameInput::TOGGLE_MENU, 0, recomp::InputDevice::Controller); + auto menuToggleBinding1 = recomp::get_input_binding(recomp::GameInput::TOGGLE_MENU, 1, recomp::InputDevice::Controller); + // note - magic number: 0 is InputType::None + if ((menuToggleBinding0.input_type != 0 && cur_event.cbutton.button == menuToggleBinding0.input_id) || + (menuToggleBinding1.input_type != 0 && cur_event.cbutton.button == menuToggleBinding1.input_id)) { open_config = true; } break;