From a3d87cd770ffb9b5bcbf519683ec7f29d67794e6 Mon Sep 17 00:00:00 2001 From: notaz Date: Mon, 20 Nov 2023 23:06:31 +0200 Subject: [PATCH] libretro: add a few options for the analog combo like in the other core --- frontend/libretro.c | 38 +++++++++++++++++++++++--------- frontend/libretro_core_options.h | 14 +++++++----- libpcsxcore/database.c | 2 +- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/frontend/libretro.c b/frontend/libretro.c index 7f331574..80dc8a9d 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -146,8 +146,8 @@ int multitap1 = 0; int multitap2 = 0; int in_enable_vibration = 1; static int in_enable_crosshair[2] = { 0, 0 }; -static bool in_dualshock_toggle_enable = 0; -static bool in_dualshock_toggling = 0; +static int in_dualshock_analog_combo = 0; +static bool in_dualshock_toggling = false; // NegCon adjustment parameters // > The NegCon 'twist' action is somewhat awkward when mapped @@ -2014,11 +2014,27 @@ static void update_variables(bool in_flight) } var.value = NULL; - var.key = "pcsx_rearmed_analog_toggle"; + var.key = "pcsx_rearmed_analog_combo"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { - in_dualshock_toggle_enable = (strcmp(var.value, "enabled") == 0); + if (strcmp(var.value, "l1+r1+select") == 0) + in_dualshock_analog_combo = (1 << RETRO_DEVICE_ID_JOYPAD_L) | + (1 << RETRO_DEVICE_ID_JOYPAD_R) | (1 << RETRO_DEVICE_ID_JOYPAD_SELECT); + else if (strcmp(var.value, "l1+r1+start") == 0) + in_dualshock_analog_combo = (1 << RETRO_DEVICE_ID_JOYPAD_L) | + (1 << RETRO_DEVICE_ID_JOYPAD_R) | (1 << RETRO_DEVICE_ID_JOYPAD_START); + else if (strcmp(var.value, "l1+r1+l3") == 0) + in_dualshock_analog_combo = (1 << RETRO_DEVICE_ID_JOYPAD_L) | + (1 << RETRO_DEVICE_ID_JOYPAD_R) | (1 << RETRO_DEVICE_ID_JOYPAD_L3); + else if (strcmp(var.value, "l1+r1+r3") == 0) + in_dualshock_analog_combo = (1 << RETRO_DEVICE_ID_JOYPAD_L) | + (1 << RETRO_DEVICE_ID_JOYPAD_R) | (1 << RETRO_DEVICE_ID_JOYPAD_R3); + else if (strcmp(var.value, "l3+r3") == 0) + in_dualshock_analog_combo = (1 << RETRO_DEVICE_ID_JOYPAD_L3) | + (1 << RETRO_DEVICE_ID_JOYPAD_R3); + else + in_dualshock_analog_combo = 0; } var.value = NULL; @@ -2873,17 +2889,13 @@ static void update_input_mouse(int port, int ret) static void update_input(void) { - int16_t analog_combo = - (1 << RETRO_DEVICE_ID_JOYPAD_L) | - (1 << RETRO_DEVICE_ID_JOYPAD_R) | - (1 << RETRO_DEVICE_ID_JOYPAD_SELECT); int i; int j; // reset all keystate, query libretro for keystate for (i = 0; i < PORTS_NUMBER; i++) { - int16_t ret = 0; + int32_t ret = 0; int type = in_type[i]; in_keystate[i] = 0; @@ -2892,7 +2904,11 @@ static void update_input(void) continue; if (libretro_supports_bitmasks) + { ret = input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_MASK); + // undo int16 sign extension (why input_state_cb returns int16 in the first place?) + ret &= (1 << (RETRO_DEVICE_ID_JOYPAD_R3 + 1)) - 1; + } else { for (j = 0; j < (RETRO_DEVICE_ID_JOYPAD_R3 + 1); j++) @@ -2918,8 +2934,8 @@ static void update_input(void) break; default: // dualshock ANALOG toggle? - if (type == PSE_PAD_TYPE_ANALOGPAD && in_dualshock_toggle_enable - && (ret & analog_combo) == analog_combo) + if (type == PSE_PAD_TYPE_ANALOGPAD && in_dualshock_analog_combo != 0 + && ret == in_dualshock_analog_combo) { if (!in_dualshock_toggling) { diff --git a/frontend/libretro_core_options.h b/frontend/libretro_core_options.h index 85771e2c..69100c37 100644 --- a/frontend/libretro_core_options.h +++ b/frontend/libretro_core_options.h @@ -854,18 +854,22 @@ struct retro_core_option_v2_definition option_defs_us[] = { "enabled", }, { - "pcsx_rearmed_analog_toggle", - "DualShock Analog Mode Toggle", + "pcsx_rearmed_analog_combo", + "DualShock Analog Mode Toggle Key Combo", NULL, - "When the input device type is DualShock, this option allows the emulated DualShock to be toggled between DIGITAL and ANALOG mode like original hardware. The button combination is L1 + R1 + Select.", + "When the input device type is DualShock, this option allows the emulated DualShock to be toggled between DIGITAL and ANALOG mode like original hardware. You can select the button combination for this.", NULL, "input", { { "disabled", NULL }, - { "enabled", NULL }, + { "l1+r1+select", "L1 + R1 + Select" }, + { "l1+r1+start", "L1 + R1 + Start" }, + { "l1+r1+l3", "L1 + R1 + L3" }, + { "l1+r1+r3", "L1 + R1 + R3" }, + { "l3+r3", "L3 + R3" }, { NULL, NULL }, }, - "enabled", + "l1+r1+select" }, { "pcsx_rearmed_multitap", diff --git a/libpcsxcore/database.c b/libpcsxcore/database.c index 640f57a2..997b13fb 100644 --- a/libpcsxcore/database.c +++ b/libpcsxcore/database.c @@ -52,7 +52,7 @@ static const char * const dualshock_init_analog_hack_db[] = /* Formula 1 Championship Edition */ "SLUS00546", /* Gran Turismo 2 */ - "SCUS94455", "SCUS94488", "SCPS10116", "SCPS10117", "SCES02380", "SCES-12380", + "SCUS94455", "SCUS94488", "SCPS10116", "SCPS10117", "SCES02380", "SCES12380", }; #define HACK_ENTRY(var, list) \ -- 2.39.5