standalone: update gun support
authornotaz <notasas@gmail.com>
Thu, 14 Dec 2023 22:24:38 +0000 (00:24 +0200)
committernotaz <notasas@gmail.com>
Thu, 14 Dec 2023 23:49:02 +0000 (01:49 +0200)
frontend/main.c
frontend/main.h
frontend/menu.c
frontend/pl_gun_ts.c
frontend/plugin_lib.c
frontend/plugin_lib.h

index 019835d..53f31b0 100644 (file)
@@ -288,6 +288,10 @@ do_state_slot:
                                SysMessage("GPU_open returned %d", ret);
                }
                return;
+       case SACTION_ANALOG_TOGGLE:
+               ret = padToggleAnalog(0);
+               snprintf(hud_msg, sizeof(hud_msg), "ANALOG %s", ret ? "ON" : "OFF");
+               break;
 #endif
        default:
                return;
index 22053bb..98b0f37 100644 (file)
@@ -79,6 +79,7 @@ enum sched_action {
        SACTION_GUN_A,
        SACTION_GUN_B,
        SACTION_GUN_TRIGGER2,
+       SACTION_ANALOG_TOGGLE,
 };
 
 #define SACTION_GUN_MASK (0x0f << SACTION_GUN_TRIGGER)
index 6f74d45..e6c1540 100644 (file)
@@ -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) {
@@ -901,6 +903,7 @@ me_bind_action emuctrl_actions[] =
        { "Volume Up        ", 1 << SACTION_VOLUME_UP },
        { "Volume Down      ", 1 << SACTION_VOLUME_DOWN },
 #endif
+       { "Analog toggle    ", 1 << SACTION_ANALOG_TOGGLE },
        { NULL,                0 }
 };
 
@@ -1217,6 +1220,7 @@ static const char *men_in_type_sel[] = {
        "Standard (SCPH-1080)",
        "Analog (SCPH-1150)",
        "GunCon",
+       "Konami Gun",
        "None",
        NULL
 };
index 6c05b7c..6e7fa94 100644 (file)
@@ -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)
index 1cbfdb0..0deab15 100644 (file)
@@ -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
index 6cfe596..4e5ad8b 100644 (file)
@@ -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;