added some options for swapping analog stick axis [build]

This commit is contained in:
Isaac0-dev 2025-04-17 16:17:11 +10:00
parent 915655d75e
commit 03281c2005
15 changed files with 160 additions and 3 deletions

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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 = "Полноэкранный режим"

View file

@ -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"

View file

@ -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; }

View file

@ -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;

View file

@ -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);

View file

@ -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);