From 03281c200541609b6230066bb55ffdb768eca042 Mon Sep 17 00:00:00 2001 From: Isaac0-dev <62234577+Isaac0-dev@users.noreply.github.com> Date: Thu, 17 Apr 2025 16:17:11 +1000 Subject: [PATCH] added some options for swapping analog stick axis [build] --- lang/Czech.ini | 9 +++++++++ lang/Dutch.ini | 9 +++++++++ lang/English.ini | 9 +++++++++ lang/French.ini | 9 +++++++++ lang/German.ini | 9 +++++++++ lang/Italian.ini | 9 +++++++++ lang/Japanese.ini | 11 +++++++++++ lang/Polish.ini | 9 +++++++++ lang/Portuguese.ini | 9 +++++++++ lang/Russian.ini | 9 +++++++++ lang/Spanish.ini | 9 +++++++++ src/pc/configfile.c | 10 +++++++++- src/pc/configfile.h | 10 ++++++++++ src/pc/controller/controller_sdl2.c | 20 ++++++++++++++++++++ src/pc/djui/djui_panel_controls.c | 22 ++++++++++++++++++++-- 15 files changed, 160 insertions(+), 3 deletions(-) diff --git a/lang/Czech.ini b/lang/Czech.ini index 5de09d308..0aa3600cb 100644 --- a/lang/Czech.ini +++ b/lang/Czech.ini @@ -132,6 +132,15 @@ C_DOWN = "C dolů" C_LEFT = "C vlevo" C_RIGHT = "C vpravo" +ANALOG_STICK_OPTIONS = "Možnosti analogové páčky" + +ROTATE_LEFT = "Otočení levé páčky o 90 stupňů" +INVERT_LEFT_X = "Inverze levé páčky osy X" +INVERT_LEFT_Y = "Inverze osy Y levé páčky" +ROTATE_RIGHT = "Otočení pravé tyče o 90 stupňů" +INVERT_RIGHT_X = "Inverze pravé páčky osy X" +INVERT_RIGHT_Y = "Inverze pravé páčky osy Y" + [DISPLAY] DISPLAY = "VIDEO" FULLSCREEN = "Celá obrazovka" diff --git a/lang/Dutch.ini b/lang/Dutch.ini index 08f8af180..ee10dd2a1 100644 --- a/lang/Dutch.ini +++ b/lang/Dutch.ini @@ -132,6 +132,15 @@ C_DOWN = "C Naar Beneden" C_LEFT = "C Links" C_RIGHT = "C Rechts" +ANALOG_STICK_OPTIONS = "Analoge stick-opties" + +ROTATE_LEFT = "Linker joystick 90 graden draaien" +INVERT_LEFT_X = "Linker joystick X-as omkeren" +INVERT_LEFT_Y = "Linker joystick Y-as omkeren" +ROTATE_RIGHT = "Rechter joystick 90 graden draaien" +INVERT_RIGHT_X = "Rechter joystick X-as omkeren" +INVERT_RIGHT_Y = "Rechter joystick Y-as omkeren" + [DISPLAY] DISPLAY = "WEERGAVE" FULLSCREEN = "Volledig scherm" diff --git a/lang/English.ini b/lang/English.ini index e9e40c151..187e92397 100644 --- a/lang/English.ini +++ b/lang/English.ini @@ -132,6 +132,15 @@ C_DOWN = "C-Down" C_LEFT = "C-Left" C_RIGHT = "C-Right" +ANALOG_STICK_OPTIONS = "Analog Stick Options" + +ROTATE_LEFT = "Rotate Left Stick 90 degrees" +INVERT_LEFT_X = "Invert Left Stick X axis" +INVERT_LEFT_Y = "Invert Left Stick Y axis" +ROTATE_RIGHT = "Rotate Right Stick 90 degrees" +INVERT_RIGHT_X = "Invert Right Stick X axis" +INVERT_RIGHT_Y = "Invert Right Stick Y axis" + [DISPLAY] DISPLAY = "DISPLAY" FULLSCREEN = "Fullscreen" diff --git a/lang/French.ini b/lang/French.ini index 6c09b6801..cf68676f2 100644 --- a/lang/French.ini +++ b/lang/French.ini @@ -132,6 +132,15 @@ C_DOWN = "C Bas" C_LEFT = "C Gauche" C_RIGHT = "C Droite" +ANALOG_STICK_OPTIONS = "Options du stick analogique" + +ROTATE_LEFT = "Rotation du bâton gauche de 90 degrés" +INVERT_LEFT_X = "Inverser l'axe X du stick gauche" +INVERT_LEFT_Y = "Inverser l'axe Y du stick gauche" +ROTATE_RIGHT = "Rotation du bâton droit de 90 degrés" +INVERT_RIGHT_X = "Inverser l'axe X du stick droit" +INVERT_RIGHT_Y = "Inverser l'axe Y du stick droit" + [DISPLAY] DISPLAY = "AFFICHAGE" FULLSCREEN = "Plein Écran" diff --git a/lang/German.ini b/lang/German.ini index e543ee769..37649c350 100644 --- a/lang/German.ini +++ b/lang/German.ini @@ -132,6 +132,15 @@ C_DOWN = "C-Unten" C_LEFT = "C-Links" C_RIGHT = "C-Rechts" +ANALOG_STICK_OPTIONS = "Analogstick-Optionen" + +ROTATE_LEFT = "Linken Stick um 90 Grad drehen" +INVERT_LEFT_X = "Linken Stick X-Achse invertieren" +INVERT_LEFT_Y = "Linker Stick Y-Achse invertieren" +ROTATE_RIGHT = "Rechten Stick um 90 Grad drehen" +INVERT_RIGHT_X = "Rechter Stick X-Achse invertieren" +INVERT_RIGHT_Y = "Rechter Stick Y-Achse invertieren" + [DISPLAY] DISPLAY = "ANZEIGE" FULLSCREEN = "Vollbildmodus" diff --git a/lang/Italian.ini b/lang/Italian.ini index 029a2bb54..76031d8be 100644 --- a/lang/Italian.ini +++ b/lang/Italian.ini @@ -130,6 +130,15 @@ C_DOWN = "C Giù" C_LEFT = "C Sinistra" C_RIGHT = "C Destra" +ANALOG_STICK_OPTIONS = "Opzioni dello stick analogico" + +ROTATE_LEFT = "Ruota lo stick sinistro di 90 gradi" +INVERT_LEFT_X = "Invertire l'asse X dello stick sinistro" +INVERT_LEFT_Y = "Invertire l'asse Y dello stick sinistro" +ROTATE_RIGHT = "Ruota lo stick destro di 90 gradi" +INVERT_RIGHT_X = "Invertire l'asse X dello stick destro" +INVERT_RIGHT_Y = "Invertire l'asse Y dello stick destro" + [DISPLAY] DISPLAY = "GRAFICA" FULLSCREEN = "Schermo intero" diff --git a/lang/Japanese.ini b/lang/Japanese.ini index ace8d3888..84f8cc4b1 100644 --- a/lang/Japanese.ini +++ b/lang/Japanese.ini @@ -92,6 +92,7 @@ Y_SENSITIVITY = "Y方向の感度" AGGRESSION = "かたさ" PAN_LEVEL = "カメラのずれ" DECELERATION = "カメラ減速" +ROMHACK_CAMERA_Off = "オフ" [CONTROLS] CONTROLS = "CONTROLS" @@ -132,6 +133,15 @@ C_DOWN = "Cボタン 下" C_LEFT = "Cボタン 左" C_RIGHT = "Cボタン 右" +ANALOG_STICK_OPTIONS = "アナログスティックのオプション" + +ROTATE_LEFT = "左スティックを90度回転させる" +INVERT_LEFT_X = "左スティックX軸の反転" +INVERT_LEFT_Y = "左スティックY軸の反転" +ROTATE_RIGHT = "右スティックを90度回転" +INVERT_RIGHT_X = "右スティックX軸の反転" +INVERT_RIGHT_Y = "右スティックY軸の反転" + [DISPLAY] DISPLAY = "DISPLAY" FULLSCREEN = "フルスクリーン" @@ -415,6 +425,7 @@ REFRESHING = "更新中…" ENTER_PASSWORD = "部屋のパスワードを入力してください:" SEARCH = "検索" NONE_FOUND = "部屋が見つかりませんでした" +NO_LOBBIES_FOUND = "ロビーは見つからなかった。" [CHANGELOG] CHANGELOG_TITLE = "CHANGELOG" diff --git a/lang/Polish.ini b/lang/Polish.ini index 4f181ff66..03dbc1d6f 100644 --- a/lang/Polish.ini +++ b/lang/Polish.ini @@ -132,6 +132,15 @@ C_DOWN = "Kamera w Dół" C_LEFT = "Kamera w Lewo" C_RIGHT = "Kamera w Prawo" +ANALOG_STICK_OPTIONS = "Opcje drążka analogowego" + +ROTATE_LEFT = "Obrót lewego drążka o 90 stopni" +INVERT_LEFT_X = "Odwrócenie osi X lewego drążka" +INVERT_LEFT_Y = "Odwrócenie osi Y lewego drążka" +ROTATE_RIGHT = "Obrót prawego drążka o 90 stopni" +INVERT_RIGHT_X = "Odwrócenie osi X prawego drążka" +INVERT_RIGHT_Y = "Odwrócenie osi Y prawego drążka" + [DISPLAY] DISPLAY = "WYŚWIETLANIE" FULLSCREEN = "Pełny Ekran" diff --git a/lang/Portuguese.ini b/lang/Portuguese.ini index 5052fe77f..43f3cdc31 100644 --- a/lang/Portuguese.ini +++ b/lang/Portuguese.ini @@ -132,6 +132,15 @@ C_DOWN = "C-Baixo" C_LEFT = "C-Esquerda" C_RIGHT = "C-Direita" +ANALOG_STICK_OPTIONS = "Opções do manípulo analógico" + +ROTATE_LEFT = "Rodar o manípulo esquerdo 90 graus" +INVERT_LEFT_X = "Inverter o eixo X do manípulo esquerdo" +INVERT_LEFT_Y = "Inverter o eixo Y do manípulo esquerdo" +ROTATE_RIGHT = "Rodar o manípulo direito 90 graus" +INVERT_RIGHT_X = "Inverter o eixo X do manípulo direito" +INVERT_RIGHT_Y = "Inverter o eixo Y do manípulo direito" + [DISPLAY] DISPLAY = "VÍDEO" FULLSCREEN = "Tela cheia" diff --git a/lang/Russian.ini b/lang/Russian.ini index 3ebe88253..eada85a34 100644 --- a/lang/Russian.ini +++ b/lang/Russian.ini @@ -131,6 +131,15 @@ C_DOWN = "C Вниз" C_LEFT = "C Влево" C_RIGHT = "C Вправо" +ANALOG_STICK_OPTIONS = "Варианты аналоговых стиков" + +ROTATE_LEFT = "Поверните левый стик на 90 градусов" +INVERT_LEFT_X = "Инвертировать левый стик по оси X" +INVERT_LEFT_Y = "Инвертировать ось Y левого стика" +ROTATE_RIGHT = "Поверните правый стик на 90 градусов" +INVERT_RIGHT_X = "Инвертировать правый стик оси X" +INVERT_RIGHT_Y = "Инвертировать правый стик по оси Y" + [DISPLAY] DISPLAY = "DISPLAY" FULLSCREEN = "Полноэкранный режим" diff --git a/lang/Spanish.ini b/lang/Spanish.ini index 562d90d94..2fbc43e99 100644 --- a/lang/Spanish.ini +++ b/lang/Spanish.ini @@ -132,6 +132,15 @@ C_DOWN = "C Abajo" C_LEFT = "C Izquierda" C_RIGHT = "C Derecha" +ANALOG_STICK_OPTIONS = "Opciones del mando analógico" + +ROTATE_LEFT = "Gira el stick izquierdo 90 grados" +INVERT_LEFT_X = "Invertir eje X del stick izquierdo" +INVERT_LEFT_Y = "Invertir eje Y del stick izquierdo" +ROTATE_RIGHT = "Gira el stick derecho 90 grados" +INVERT_RIGHT_X = "Invertir Stick derecho eje X" +INVERT_RIGHT_Y = "Invertir el eje Y del stick derecho" + [DISPLAY] DISPLAY = "PANTALLA" FULLSCREEN = "Pantalla completa" diff --git a/src/pc/configfile.c b/src/pc/configfile.c index 5387f2aeb..e5a7c457e 100644 --- a/src/pc/configfile.c +++ b/src/pc/configfile.c @@ -79,6 +79,8 @@ ConfigWindow configWindow = { .msaa = 0, }; +ConfigStick configStick = { 0 }; + // display settings unsigned int configFiltering = 2; // 0 = Nearest, 1 = Bilinear, 2 = Trilinear bool configShowFPS = false; @@ -268,6 +270,12 @@ static const struct ConfigOption options[] = { {.name = "disable_gamepads", .type = CONFIG_TYPE_BOOL, .boolValue = &configDisableGamepads}, #endif {.name = "use_standard_key_bindings_chat", .type = CONFIG_TYPE_BOOL, .boolValue = &configUseStandardKeyBindingsChat}, + {.name = "stick_rotate_left", .type = CONFIG_TYPE_BOOL, .boolValue = &configStick.rotateLeft}, + {.name = "stick_invert_left_x", .type = CONFIG_TYPE_BOOL, .boolValue = &configStick.invertLeftX}, + {.name = "stick_invert_left_y", .type = CONFIG_TYPE_BOOL, .boolValue = &configStick.invertLeftY}, + {.name = "stick_rotate_right", .type = CONFIG_TYPE_BOOL, .boolValue = &configStick.rotateRight}, + {.name = "stick_invert_right_x", .type = CONFIG_TYPE_BOOL, .boolValue = &configStick.invertRightX}, + {.name = "stick_invert_right_y", .type = CONFIG_TYPE_BOOL, .boolValue = &configStick.invertRightY}, // free camera settings {.name = "bettercam_enable", .type = CONFIG_TYPE_BOOL, .boolValue = &configEnableFreeCamera}, {.name = "bettercam_analog", .type = CONFIG_TYPE_BOOL, .boolValue = &configFreeCameraAnalog}, @@ -766,7 +774,7 @@ NEXT_OPTION: if (configFrameLimit < 30) { configFrameLimit = 30; } if (configFrameLimit > 3000) { configFrameLimit = 3000; } - + gMasterVolume = (f32)configMasterVolume / 127.0f; if (configPlayerModel >= CT_MAX) { configPlayerModel = 0; } diff --git a/src/pc/configfile.h b/src/pc/configfile.h index c9a43fb7d..02fa38ece 100644 --- a/src/pc/configfile.h +++ b/src/pc/configfile.h @@ -27,10 +27,20 @@ typedef struct { unsigned int msaa; } ConfigWindow; +typedef struct { + bool rotateLeft; + bool invertLeftX; + bool invertLeftY; + bool rotateRight; + bool invertRightX; + bool invertRightY; +} ConfigStick; + extern char configSaveNames[4][MAX_SAVE_NAME_STRING]; // display settings extern ConfigWindow configWindow; +extern ConfigStick configStick; extern unsigned int configFiltering; extern bool configShowFPS; extern bool configUncappedFramerate; diff --git a/src/pc/controller/controller_sdl2.c b/src/pc/controller/controller_sdl2.c index 6b7b4c575..8a52ac41f 100644 --- a/src/pc/controller/controller_sdl2.c +++ b/src/pc/controller/controller_sdl2.c @@ -53,6 +53,11 @@ static u32 last_mouse = VK_INVALID; static u32 last_joybutton = VK_INVALID; static u32 last_gamepad = 0; +static s16 invert_s16(s16 val) { + if (val == -0x8000) return 0x7FFF; + return (s16)(-(s32)val); +} + static inline void controller_add_binds(const u32 mask, const u32 *btns) { for (u32 i = 0; i < MAX_BINDS; ++i) { if (btns[i] >= VK_BASE_SDL_GAMEPAD && btns[i] <= VK_BASE_SDL_GAMEPAD + VK_SIZE) { @@ -260,6 +265,21 @@ static void controller_sdl_read(OSContPad *pad) { } } + if (configStick.rotateLeft) { + s16 tmp = leftx; + leftx = invert_s16(lefty); + lefty = tmp; + } + if (configStick.rotateRight) { + s16 tmp = rightx; + rightx = invert_s16(righty); + righty = tmp; + } + if (configStick.invertLeftX) { leftx = invert_s16(leftx); } + if (configStick.invertLeftY) { lefty = invert_s16(lefty); } + if (configStick.invertRightX) { rightx = invert_s16(rightx); } + if (configStick.invertRightY) { righty = invert_s16(righty); } + update_button(VK_LTRIGGER - VK_BASE_SDL_GAMEPAD, ltrig > AXIS_THRESHOLD); update_button(VK_RTRIGGER - VK_BASE_SDL_GAMEPAD, rtrig > AXIS_THRESHOLD); diff --git a/src/pc/djui/djui_panel_controls.c b/src/pc/djui/djui_panel_controls.c index e2f26b533..ddf6dad75 100644 --- a/src/pc/djui/djui_panel_controls.c +++ b/src/pc/djui/djui_panel_controls.c @@ -12,12 +12,30 @@ void djui_panel_controls_value_change(UNUSED struct DjuiBase* caller) { controller_reconfigure(); } +void djui_panel_controls_analog_stick_options_create(struct DjuiBase* caller) { + struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(CONTROLS, CONTROLS), false); + struct DjuiBase* body = djui_three_panel_get_body(panel); + { + djui_checkbox_create(body, DLANG(CONTROLS, ROTATE_LEFT), &configStick.rotateLeft, NULL); + djui_checkbox_create(body, DLANG(CONTROLS, INVERT_LEFT_X), &configStick.invertLeftX, NULL); + djui_checkbox_create(body, DLANG(CONTROLS, INVERT_LEFT_Y), &configStick.invertLeftY, NULL); + djui_checkbox_create(body, DLANG(CONTROLS, ROTATE_RIGHT), &configStick.rotateRight, NULL); + djui_checkbox_create(body, DLANG(CONTROLS, INVERT_RIGHT_X), &configStick.invertRightX, NULL); + djui_checkbox_create(body, DLANG(CONTROLS, INVERT_RIGHT_Y), &configStick.invertRightY, NULL); + + djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back); + } + + djui_panel_add(caller, panel, NULL); +} + void djui_panel_controls_create(struct DjuiBase* caller) { struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(CONTROLS, CONTROLS), false); struct DjuiBase* body = djui_three_panel_get_body(panel); { djui_button_create(body, DLANG(CONTROLS, N64_BINDS), DJUI_BUTTON_STYLE_NORMAL, djui_panel_controls_n64_create); djui_button_create(body, DLANG(CONTROLS, EXTRA_BINDS), DJUI_BUTTON_STYLE_NORMAL, djui_panel_controls_extra_create); + djui_button_create(body, DLANG(CONTROLS, ANALOG_STICK_OPTIONS), DJUI_BUTTON_STYLE_NORMAL, djui_panel_controls_analog_stick_options_create); djui_checkbox_create(body, DLANG(CONTROLS, BACKGROUND_GAMEPAD), &configBackgroundGamepad, NULL); #ifndef HANDHELD djui_checkbox_create(body, DLANG(CONTROLS, DISABLE_GAMEPADS), &configDisableGamepads, NULL); @@ -47,7 +65,7 @@ void djui_panel_controls_create(struct DjuiBase* caller) { if (strcmp(gamepadChoices[i], gamepadChoices[j]) == 0) { count++; char newName[256]; - + // If the name is bigger than 9 characters, we need to truncate it first // Then we can append the number so it fits in the slot @@ -57,7 +75,7 @@ void djui_panel_controls_create(struct DjuiBase* caller) { } else { snprintf(newName, sizeof(newName), "%s (%d)", gamepadChoices[i], count); } - + // Remove the old string and replace it with the new one free(gamepadChoices[i]); gamepadChoices[i] = strdup(newName);