From b1597174de1c1f038382e8839431d4177809bc0a Mon Sep 17 00:00:00 2001 From: notaz Date: Fri, 15 Dec 2023 00:24:38 +0200 Subject: [PATCH] standalone: update gun support --- frontend/menu.c | 11 +++++++---- frontend/pl_gun_ts.c | 4 ++-- frontend/plugin_lib.c | 46 ++++++++++++++++++++++++++++++++++++------- frontend/plugin_lib.h | 1 - 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/frontend/menu.c b/frontend/menu.c index 6f74d451..2b0d2cfd 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -316,14 +316,16 @@ static void menu_sync_config(void) switch (in_type_sel1) { case 1: in_type[0] = PSE_PAD_TYPE_ANALOGPAD; break; - case 2: in_type[0] = PSE_PAD_TYPE_NEGCON; break; - case 3: in_type[0] = PSE_PAD_TYPE_NONE; break; + case 2: in_type[0] = PSE_PAD_TYPE_GUNCON; break; + case 3: in_type[0] = PSE_PAD_TYPE_GUN; break; + case 4: in_type[0] = PSE_PAD_TYPE_NONE; break; default: in_type[0] = PSE_PAD_TYPE_STANDARD; } switch (in_type_sel2) { case 1: in_type[1] = PSE_PAD_TYPE_ANALOGPAD; break; - case 2: in_type[1] = PSE_PAD_TYPE_NEGCON; break; - case 3: in_type[1] = PSE_PAD_TYPE_NONE; break; + case 2: in_type[1] = PSE_PAD_TYPE_GUNCON; break; + case 3: in_type[1] = PSE_PAD_TYPE_GUN; break; + case 4: in_type[1] = PSE_PAD_TYPE_NONE; break; default: in_type[1] = PSE_PAD_TYPE_STANDARD; } if (in_evdev_allow_abs_only != allow_abs_only_old) { @@ -1217,6 +1219,7 @@ static const char *men_in_type_sel[] = { "Standard (SCPH-1080)", "Analog (SCPH-1150)", "GunCon", + "Konami Gun", "None", NULL }; diff --git a/frontend/pl_gun_ts.c b/frontend/pl_gun_ts.c index 6c05b7c3..6e7fa940 100644 --- a/frontend/pl_gun_ts.c +++ b/frontend/pl_gun_ts.c @@ -54,7 +54,7 @@ int pl_gun_ts_update_raw(struct tsdev *ts, int *x, int *y, int *p) gun_y = (sy - ts_offs_y) * ts_multiplier_y >> 10; limit(gun_x, 0, 1023); limit(gun_y, 0, 1023); - if (sp && !(g_opts & OPT_TSGUN_NOTRIGGER)) + if (sp) gun_in |= 1; else gun_in &= ~1; @@ -78,7 +78,7 @@ void pl_gun_ts_update(struct tsdev *ts, int *x, int *y, int *in) *x = gun_x; *y = gun_y; - *in = gun_in | in_state_gun; + *in = gun_in; } void pl_set_gun_rect(int x, int y, int w, int h) diff --git a/frontend/plugin_lib.c b/frontend/plugin_lib.c index 1cbfdb0e..0deab157 100644 --- a/frontend/plugin_lib.c +++ b/frontend/plugin_lib.c @@ -34,6 +34,7 @@ #include "../libpcsxcore/new_dynarec/new_dynarec.h" #include "../libpcsxcore/psxmem_map.h" #include "../libpcsxcore/gpu.h" +#include "../libpcsxcore/r3000a.h" #define HUD_HEIGHT 10 @@ -46,7 +47,6 @@ int in_adev[2] = { -1, -1 }, in_adev_axis[2][2] = {{ 0, 1 }, { 0, 1 }}; int in_adev_is_nublike[2]; unsigned short in_keystate[8]; int in_mouse[8][2]; -int in_state_gun; int in_enable_vibration; void *tsdev; void *pl_vout_buf; @@ -613,12 +613,14 @@ static void update_input(void) { int actions[IN_BINDTYPE_COUNT] = { 0, }; unsigned int emu_act; + int in_state_gun; + int i; in_update(actions); if (in_type[0] == PSE_PAD_TYPE_ANALOGJOY || in_type[0] == PSE_PAD_TYPE_ANALOGPAD) update_analogs(); emu_act = actions[IN_BINDTYPE_EMU]; - in_state_gun = (emu_act & SACTION_GUN_MASK) >> SACTION_GUN_TRIGGER; + in_state_gun = emu_act & SACTION_GUN_MASK; emu_act &= ~SACTION_GUN_MASK; if (emu_act) { @@ -629,12 +631,35 @@ static void update_input(void) } emu_set_action(emu_act); - in_keystate[0] = actions[IN_BINDTYPE_PLAYER12]; + in_keystate[0] = actions[IN_BINDTYPE_PLAYER12] & 0xffff; + in_keystate[1] = (actions[IN_BINDTYPE_PLAYER12] >> 16) & 0xffff; - // fixme - //if (in_type[0] == PSE_PAD_TYPE_GUNCON && tsdev) - // pl_gun_ts_update(tsdev, xn, yn, in); - // in_analog_left[0][0] = xn + if (tsdev) for (i = 0; i < 2; i++) { + int in = 0, x = 0, y = 0, trigger;; + if (in_type[i] != PSE_PAD_TYPE_GUN + && in_type[i] != PSE_PAD_TYPE_GUNCON) + continue; + trigger = in_type[i] == PSE_PAD_TYPE_GUN + ? (1 << DKEY_SQUARE) : (1 << DKEY_CIRCLE); + + pl_gun_ts_update(tsdev, &x, &y, &in); + in_analog_left[i][0] = 65536; + in_analog_left[i][1] = 65536; + if (in && !(in_state_gun & (1 << SACTION_GUN_TRIGGER2))) { + in_analog_left[i][0] = x; + in_analog_left[i][1] = y; + if (!(g_opts & OPT_TSGUN_NOTRIGGER)) + in_state_gun |= (1 << SACTION_GUN_TRIGGER); + } + in_keystate[i] = 0; + if (in_state_gun & ((1 << SACTION_GUN_TRIGGER) + | (1 << SACTION_GUN_TRIGGER2))) + in_keystate[i] |= trigger; + if (in_state_gun & (1 << SACTION_GUN_A)) + in_keystate[i] |= (1 << DKEY_START); + if (in_state_gun & (1 << SACTION_GUN_B)) + in_keystate[i] |= (1 << DKEY_CROSS); + } } #else /* MAEMO */ extern void update_input(void); @@ -642,6 +667,13 @@ extern void update_input(void); void pl_gun_byte2(int port, unsigned char byte) { + if (!tsdev || in_type[port] != PSE_PAD_TYPE_GUN || !(byte & 0x10)) + return; + if (in_analog_left[port][0] == 65536) + return; + + psxScheduleIrq10(4, in_analog_left[port][0] * 1629 / 1024, + in_analog_left[port][1] * psx_h / 1024); } #define MAX_LAG_FRAMES 3 diff --git a/frontend/plugin_lib.h b/frontend/plugin_lib.h index 5b4af659..4eab8660 100644 --- a/frontend/plugin_lib.h +++ b/frontend/plugin_lib.h @@ -23,7 +23,6 @@ enum { DKEY_CROSS, DKEY_SQUARE, }; -extern int in_state_gun; extern int in_type[8]; extern int multitap1; extern int multitap2; -- 2.39.5