From 022a271f7170825627d47358cb0a3ea547af5b0f Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Sat, 9 May 2026 13:36:40 -0700 Subject: [PATCH] Add new mapping for NSO Gamecube and special case it (#165) * Add new mapping for NSO Gamecube and special case it * No need to swap a/y for NSO Gamecube --- include/dolphin/pad.h | 3 +- lib/dolphin/pad/pad.cpp | 172 ++++++++++++++++++++++------------------ 2 files changed, 99 insertions(+), 76 deletions(-) diff --git a/include/dolphin/pad.h b/include/dolphin/pad.h index 80a4b63..1803528 100644 --- a/include/dolphin/pad.h +++ b/include/dolphin/pad.h @@ -240,7 +240,8 @@ typedef enum { PAD_TYPE_JOYCON_LEFT, PAD_TYPE_JOYCON_RIGHT, PAD_TYPE_JOYCON_PAIR, - PAD_TYPE_GAMECUBE + PAD_TYPE_GAMECUBE, + PAD_TYPE_NSO_GAMECUBE, } PADControllerType; void PADSetDefaultMapping(const PADDefaultMapping* mapping, PADControllerType type); diff --git a/lib/dolphin/pad/pad.cpp b/lib/dolphin/pad/pad.cpp index dca4c1f..a933178 100644 --- a/lib/dolphin/pad/pad.cpp +++ b/lib/dolphin/pad/pad.cpp @@ -10,23 +10,7 @@ namespace { constexpr int32_t k_mappingsFileVersion = 3; - -std::array g_defaultButtonsStandard {{ - {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, - {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_B}, - {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_X}, - {SDL_GAMEPAD_BUTTON_NORTH, PAD_BUTTON_Y}, - {SDL_GAMEPAD_BUTTON_START, PAD_BUTTON_START}, - {SDL_GAMEPAD_BUTTON_BACK, PAD_TRIGGER_Z}, - {SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, PAD_TRIGGER_L}, - {SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, PAD_TRIGGER_R}, - {SDL_GAMEPAD_BUTTON_DPAD_UP, PAD_BUTTON_UP}, - {SDL_GAMEPAD_BUTTON_DPAD_DOWN, PAD_BUTTON_DOWN}, - {SDL_GAMEPAD_BUTTON_DPAD_LEFT, PAD_BUTTON_LEFT}, - {SDL_GAMEPAD_BUTTON_DPAD_RIGHT, PAD_BUTTON_RIGHT}, -}}; - -std::array g_defaultButtonsXBox360 {{ +std::array g_defaultButtonsStandard{{ {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_B}, {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_X}, @@ -41,71 +25,99 @@ std::array g_defaultButtonsXBox360 {{ {SDL_GAMEPAD_BUTTON_DPAD_RIGHT, PAD_BUTTON_RIGHT}, }}; -std::array g_defaultButtonsXBoxOne {{ - {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, - {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_B}, - {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_X}, - {SDL_GAMEPAD_BUTTON_NORTH, PAD_BUTTON_Y}, - {SDL_GAMEPAD_BUTTON_START, PAD_BUTTON_START}, - {SDL_GAMEPAD_BUTTON_BACK, PAD_TRIGGER_Z}, - {SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, PAD_TRIGGER_L}, - {SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, PAD_TRIGGER_R}, - {SDL_GAMEPAD_BUTTON_DPAD_UP, PAD_BUTTON_UP}, - {SDL_GAMEPAD_BUTTON_DPAD_DOWN, PAD_BUTTON_DOWN}, - {SDL_GAMEPAD_BUTTON_DPAD_LEFT, PAD_BUTTON_LEFT}, - {SDL_GAMEPAD_BUTTON_DPAD_RIGHT, PAD_BUTTON_RIGHT}, +std::array g_defaultButtonsXBox360{{ + {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, + {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_B}, + {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_X}, + {SDL_GAMEPAD_BUTTON_NORTH, PAD_BUTTON_Y}, + {SDL_GAMEPAD_BUTTON_START, PAD_BUTTON_START}, + {SDL_GAMEPAD_BUTTON_BACK, PAD_TRIGGER_Z}, + {SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, PAD_TRIGGER_L}, + {SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, PAD_TRIGGER_R}, + {SDL_GAMEPAD_BUTTON_DPAD_UP, PAD_BUTTON_UP}, + {SDL_GAMEPAD_BUTTON_DPAD_DOWN, PAD_BUTTON_DOWN}, + {SDL_GAMEPAD_BUTTON_DPAD_LEFT, PAD_BUTTON_LEFT}, + {SDL_GAMEPAD_BUTTON_DPAD_RIGHT, PAD_BUTTON_RIGHT}, }}; -std::array g_defaultButtonsPS3 {{ - {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, - {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_B}, - {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_X}, - {SDL_GAMEPAD_BUTTON_NORTH, PAD_BUTTON_Y}, - {SDL_GAMEPAD_BUTTON_START, PAD_BUTTON_START}, - {SDL_GAMEPAD_BUTTON_BACK, PAD_TRIGGER_Z}, - {SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, PAD_TRIGGER_L}, - {SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, PAD_TRIGGER_R}, - {SDL_GAMEPAD_BUTTON_DPAD_UP, PAD_BUTTON_UP}, - {SDL_GAMEPAD_BUTTON_DPAD_DOWN, PAD_BUTTON_DOWN}, - {SDL_GAMEPAD_BUTTON_DPAD_LEFT, PAD_BUTTON_LEFT}, - {SDL_GAMEPAD_BUTTON_DPAD_RIGHT, PAD_BUTTON_RIGHT}, +std::array g_defaultButtonsXBoxOne{{ + {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, + {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_B}, + {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_X}, + {SDL_GAMEPAD_BUTTON_NORTH, PAD_BUTTON_Y}, + {SDL_GAMEPAD_BUTTON_START, PAD_BUTTON_START}, + {SDL_GAMEPAD_BUTTON_BACK, PAD_TRIGGER_Z}, + {SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, PAD_TRIGGER_L}, + {SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, PAD_TRIGGER_R}, + {SDL_GAMEPAD_BUTTON_DPAD_UP, PAD_BUTTON_UP}, + {SDL_GAMEPAD_BUTTON_DPAD_DOWN, PAD_BUTTON_DOWN}, + {SDL_GAMEPAD_BUTTON_DPAD_LEFT, PAD_BUTTON_LEFT}, + {SDL_GAMEPAD_BUTTON_DPAD_RIGHT, PAD_BUTTON_RIGHT}, }}; - -std::array g_defaultButtonsPS4 {{ - {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, - {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_B}, - {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_X}, - {SDL_GAMEPAD_BUTTON_NORTH, PAD_BUTTON_Y}, - {SDL_GAMEPAD_BUTTON_START, PAD_BUTTON_START}, - {SDL_GAMEPAD_BUTTON_BACK, PAD_TRIGGER_Z}, - {SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, PAD_TRIGGER_L}, - {SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, PAD_TRIGGER_R}, - {SDL_GAMEPAD_BUTTON_DPAD_UP, PAD_BUTTON_UP}, - {SDL_GAMEPAD_BUTTON_DPAD_DOWN, PAD_BUTTON_DOWN}, - {SDL_GAMEPAD_BUTTON_DPAD_LEFT, PAD_BUTTON_LEFT}, - {SDL_GAMEPAD_BUTTON_DPAD_RIGHT, PAD_BUTTON_RIGHT}, +std::array g_defaultButtonsPS3{{ + {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, + {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_B}, + {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_X}, + {SDL_GAMEPAD_BUTTON_NORTH, PAD_BUTTON_Y}, + {SDL_GAMEPAD_BUTTON_START, PAD_BUTTON_START}, + {SDL_GAMEPAD_BUTTON_BACK, PAD_TRIGGER_Z}, + {SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, PAD_TRIGGER_L}, + {SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, PAD_TRIGGER_R}, + {SDL_GAMEPAD_BUTTON_DPAD_UP, PAD_BUTTON_UP}, + {SDL_GAMEPAD_BUTTON_DPAD_DOWN, PAD_BUTTON_DOWN}, + {SDL_GAMEPAD_BUTTON_DPAD_LEFT, PAD_BUTTON_LEFT}, + {SDL_GAMEPAD_BUTTON_DPAD_RIGHT, PAD_BUTTON_RIGHT}, }}; - -std::array g_defaultButtonsPS5 {{ - {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, - {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_B}, - {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_X}, - {SDL_GAMEPAD_BUTTON_NORTH, PAD_BUTTON_Y}, - {SDL_GAMEPAD_BUTTON_START, PAD_BUTTON_START}, - {SDL_GAMEPAD_BUTTON_BACK, PAD_TRIGGER_Z}, - {SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, PAD_TRIGGER_L}, - {SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, PAD_TRIGGER_R}, - {SDL_GAMEPAD_BUTTON_DPAD_UP, PAD_BUTTON_UP}, - {SDL_GAMEPAD_BUTTON_DPAD_DOWN, PAD_BUTTON_DOWN}, - {SDL_GAMEPAD_BUTTON_DPAD_LEFT, PAD_BUTTON_LEFT}, - {SDL_GAMEPAD_BUTTON_DPAD_RIGHT, PAD_BUTTON_RIGHT}, +std::array g_defaultButtonsPS4{{ + {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, + {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_B}, + {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_X}, + {SDL_GAMEPAD_BUTTON_NORTH, PAD_BUTTON_Y}, + {SDL_GAMEPAD_BUTTON_START, PAD_BUTTON_START}, + {SDL_GAMEPAD_BUTTON_BACK, PAD_TRIGGER_Z}, + {SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, PAD_TRIGGER_L}, + {SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, PAD_TRIGGER_R}, + {SDL_GAMEPAD_BUTTON_DPAD_UP, PAD_BUTTON_UP}, + {SDL_GAMEPAD_BUTTON_DPAD_DOWN, PAD_BUTTON_DOWN}, + {SDL_GAMEPAD_BUTTON_DPAD_LEFT, PAD_BUTTON_LEFT}, + {SDL_GAMEPAD_BUTTON_DPAD_RIGHT, PAD_BUTTON_RIGHT}, }}; -std::array g_defaultButtonsGamecube {{ - {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, - {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_X}, +std::array g_defaultButtonsPS5{{ + {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, + {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_B}, + {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_X}, + {SDL_GAMEPAD_BUTTON_NORTH, PAD_BUTTON_Y}, + {SDL_GAMEPAD_BUTTON_START, PAD_BUTTON_START}, + {SDL_GAMEPAD_BUTTON_BACK, PAD_TRIGGER_Z}, + {SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, PAD_TRIGGER_L}, + {SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, PAD_TRIGGER_R}, + {SDL_GAMEPAD_BUTTON_DPAD_UP, PAD_BUTTON_UP}, + {SDL_GAMEPAD_BUTTON_DPAD_DOWN, PAD_BUTTON_DOWN}, + {SDL_GAMEPAD_BUTTON_DPAD_LEFT, PAD_BUTTON_LEFT}, + {SDL_GAMEPAD_BUTTON_DPAD_RIGHT, PAD_BUTTON_RIGHT}, +}}; + +std::array g_defaultButtonsGamecube{{ + {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, + {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_X}, + {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_B}, + {SDL_GAMEPAD_BUTTON_NORTH, PAD_BUTTON_Y}, + {SDL_GAMEPAD_BUTTON_START, PAD_BUTTON_START}, + {SDL_GAMEPAD_BUTTON_BACK, PAD_TRIGGER_Z}, + {SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, PAD_TRIGGER_L}, + {SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, PAD_TRIGGER_R}, + {SDL_GAMEPAD_BUTTON_DPAD_UP, PAD_BUTTON_UP}, + {SDL_GAMEPAD_BUTTON_DPAD_DOWN, PAD_BUTTON_DOWN}, + {SDL_GAMEPAD_BUTTON_DPAD_LEFT, PAD_BUTTON_LEFT}, + {SDL_GAMEPAD_BUTTON_DPAD_RIGHT, PAD_BUTTON_RIGHT}, +}}; + +std::array g_defaultButtonsNSOGamecube{{ + {SDL_GAMEPAD_BUTTON_SOUTH, PAD_BUTTON_A}, + {SDL_GAMEPAD_BUTTON_EAST, PAD_BUTTON_X}, {SDL_GAMEPAD_BUTTON_WEST, PAD_BUTTON_B}, {SDL_GAMEPAD_BUTTON_NORTH, PAD_BUTTON_Y}, {SDL_GAMEPAD_BUTTON_START, PAD_BUTTON_START}, @@ -405,7 +417,11 @@ void __PADSetDefaultMapping(aurora::input::GameController* controller) { controller->m_buttonMapping = g_defaultButtonsPS5; break; case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO: - controller->m_buttonMapping = g_defaultButtonsProCon; + if (controller->m_pid == 0x2073) { + controller->m_buttonMapping = g_defaultButtonsNSOGamecube; + } else { + controller->m_buttonMapping = g_defaultButtonsProCon; + } break; case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT: controller->m_buttonMapping = g_defaultButtonsJoyConRight; @@ -1433,6 +1449,9 @@ void PADSetDefaultMapping(const PADDefaultMapping* mapping, const PADControllerT case PAD_TYPE_GAMECUBE: g_defaultButtonsGamecube = toStdArray(mapping->buttons); break; + case PAD_TYPE_NSO_GAMECUBE: + g_defaultButtonsNSOGamecube = toStdArray(mapping->buttons); + break; default: break; } @@ -1568,5 +1587,8 @@ PADControllerType PADGetControllerTypeForIndex(const u32 index) { } auto type = SDL_GetGamepadType(ctrl->m_controller); + if (type == SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO && ctrl->m_pid == 0x2073) { + return PAD_TYPE_NSO_GAMECUBE; + } return static_cast(type); } \ No newline at end of file