From b5451bf0a6dec6d31caccf8f223e528b67fddb26 Mon Sep 17 00:00:00 2001 From: Bobby Smith <33353403+bslenul@users.noreply.github.com> Date: Fri, 22 May 2026 14:59:57 +0200 Subject: [PATCH] Add a core option for opposite directions --- libretro.cpp | 29 +++++++++++++++++++++++++++++ libretro_core_options.h | 11 +++++++++++ 2 files changed, 40 insertions(+) diff --git a/libretro.cpp b/libretro.cpp index bbdcb4f..9353dc6 100644 --- a/libretro.cpp +++ b/libretro.cpp @@ -80,11 +80,23 @@ static const uint32 AnaglyphPreset_Colors[][2] = }; #define STICK_DEADZONE 0x4000 +#define LEFT_DPAD_LEFT 0x0080 +#define LEFT_DPAD_RIGHT 0x0040 +#define LEFT_DPAD_UP 0x0200 +#define LEFT_DPAD_DOWN 0x0100 #define RIGHT_DPAD_LEFT 0x1000 #define RIGHT_DPAD_RIGHT 0x0020 #define RIGHT_DPAD_UP 0x0010 #define RIGHT_DPAD_DOWN 0x2000 +// D-Pads opposite directions +#define LEFT_DPAD_LEFT_RIGHT (LEFT_DPAD_LEFT | LEFT_DPAD_RIGHT) +#define LEFT_DPAD_UP_DOWN (LEFT_DPAD_UP | LEFT_DPAD_DOWN) +#define RIGHT_DPAD_LEFT_RIGHT (RIGHT_DPAD_LEFT | RIGHT_DPAD_RIGHT) +#define RIGHT_DPAD_UP_DOWN (RIGHT_DPAD_UP | RIGHT_DPAD_DOWN) + +static bool opposite_directions = false; + static uint32 VB3DMode; static Blip_Buffer sbuf[2]; @@ -2213,6 +2225,11 @@ static void check_variables(void) setting_vb_right_analog_to_digital = false; } + var.key = "vb_opposite_directions"; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + opposite_directions = !strcmp(var.value, "enabled"); + var.key = "vb_cpu_emulation"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) @@ -2409,6 +2426,18 @@ static void update_input(void) input_buf[j] |= (analog_y < 0) ^ !setting_vb_right_invert_y ? RIGHT_DPAD_DOWN : RIGHT_DPAD_UP; } + if (!opposite_directions) + { + if ((input_buf[j] & LEFT_DPAD_LEFT_RIGHT) == LEFT_DPAD_LEFT_RIGHT) + input_buf[j] &= ~LEFT_DPAD_LEFT_RIGHT; + if ((input_buf[j] & LEFT_DPAD_UP_DOWN) == LEFT_DPAD_UP_DOWN) + input_buf[j] &= ~LEFT_DPAD_UP_DOWN; + if ((input_buf[j] & RIGHT_DPAD_LEFT_RIGHT) == RIGHT_DPAD_LEFT_RIGHT) + input_buf[j] &= ~RIGHT_DPAD_LEFT_RIGHT; + if ((input_buf[j] & RIGHT_DPAD_UP_DOWN) == RIGHT_DPAD_UP_DOWN) + input_buf[j] &= ~RIGHT_DPAD_UP_DOWN; + } + #ifdef MSB_FIRST union { uint8_t b[2]; diff --git a/libretro_core_options.h b/libretro_core_options.h index f97014b..4fd3eee 100644 --- a/libretro_core_options.h +++ b/libretro_core_options.h @@ -183,6 +183,17 @@ struct retro_core_option_definition option_defs_us[] = { }, "disabled", }, + { + "vb_opposite_directions", + "Allow Opposite Directions", + "Allow pressing up and down or left and right directions at the same time. This may cause glitches.", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { "vb_cpu_emulation", "CPU emulation (Restart)",