From 7684f5980adafe400cbd975fa9d2ba4ebaa9502b Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 25 Dec 2021 08:58:21 -0500 Subject: [PATCH] Almost multiplayer char select For some reason gamepads have not been registering buttons for a while, which makes this pretty hard to continue. Not sure if it's to do with how the menu cmd is generated, or something deeper in the SDL code. --- src/g_game.c | 47 +++++++++++++++++++-------------- src/g_input.c | 68 +++++++++++++++++++++++++----------------------- src/g_input.h | 5 ++-- src/k_menufunc.c | 25 ++++++++++-------- 4 files changed, 81 insertions(+), 64 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index affffcd88..481822d07 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -652,21 +652,38 @@ INT16 G_SoftwareClipAimingPitch(INT32 *aiming) return (INT16)((*aiming)>>16); } -static INT32 KeyValue(UINT8 p, INT32 key) +static INT32 KeyValue(UINT8 p, INT32 key, boolean menu) { + INT32 deviceID; + if (key <= 0 || key >= NUMINPUTS) { return 0; } - return gamekeydown[p][key]; + if (menu == false) + { + deviceID = cv_usejoystick[p].value; + if (deviceID < 0 || deviceID >= MAXDEVICES) + { + return 0; + } + + return gamekeydown[deviceID][key]; + } + else + { + // Use keyboard as alternative for P1 menu. + return gamekeydown[0][key]; + } + + return 0; } INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, boolean menu) { INT32 i; INT32 deadzone = 0; - boolean bound = false; if (p >= MAXSPLITSCREENPLAYERS) { @@ -676,6 +693,11 @@ INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, boolean menu) return 0; } + if (p > splitscreen) + { + return 0; + } + deadzone = (JOYAXISRANGE * cv_deadzone[p].value) / FRACUNIT; for (i = 0; i < MAXINPUTMAPPING; i++) @@ -688,14 +710,7 @@ INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, boolean menu) continue; } - value = KeyValue(p, key); - bound = true; - - if (gc == gc_a || gc == gc_b || gc == gc_c) - { - // Handle spindash key - value = max(value, KeyValue(p, gamecontrol[p][gc_abc][i])); - } + value = KeyValue(p, key, false); if (value >= deadzone) { @@ -703,7 +718,7 @@ INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, boolean menu) } } - if (menu == true && bound == false) + if (p == 0 && menu == true) { // We don't want menus to become unnavigable if people unbind // all of their controls, so use the default control scheme in @@ -719,13 +734,7 @@ INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, boolean menu) continue; } - value = KeyValue(p, key); - - if (gc == gc_a || gc == gc_b || gc == gc_c) - { - // Handle spindash key - value = max(value, KeyValue(p, gamecontroldefault[gc_abc][i])); - } + value = KeyValue(p, key, true); if (value >= deadzone) { diff --git a/src/g_input.c b/src/g_input.c index 5b4fe8675..00f6ac5a0 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -33,7 +33,7 @@ consvar_t cv_controlperkey = CVAR_INIT ("controlperkey", "One", CV_SAVE, onecont // current state of the keys // FRACUNIT for fully pressed, 0 for not pressed -INT32 gamekeydown[MAXSPLITSCREENPLAYERS][NUMINPUTS]; +INT32 gamekeydown[MAXDEVICES][NUMINPUTS]; boolean deviceResponding[MAXDEVICES]; // two key codes (or virtual key) per game control @@ -67,6 +67,21 @@ const INT32 gcl_full[num_gcl_full] = { }; */ +INT32 G_GetDevicePlayer(INT32 deviceID) +{ + INT32 i; + + for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { + if (deviceID == cv_usejoystick[i].value) + { + return i; + } + } + + return -1; +} + // // Remaps the inputs to game controls. // @@ -77,18 +92,8 @@ const INT32 gcl_full[num_gcl_full] = { void G_MapEventsToControls(event_t *ev) { INT32 i; - INT32 devicePlayer = INT32_MAX; - for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) - { - if (ev->device == cv_usejoystick[i].value) - { - devicePlayer = i; - break; - } - } - - if (ev->device >= 0 && ev->device <= MAXGAMEPADS) + if (ev->device >= 0 && ev->device < MAXDEVICES) { switch (ev->type) { @@ -103,8 +108,7 @@ void G_MapEventsToControls(event_t *ev) break; } } - - if (devicePlayer == INT32_MAX) + else { return; } @@ -114,7 +118,7 @@ void G_MapEventsToControls(event_t *ev) case ev_keydown: if (ev->data1 < NUMINPUTS) { - gamekeydown[devicePlayer][ev->data1] = FRACUNIT; + gamekeydown[ev->device][ev->data1] = FRACUNIT; } #ifdef PARANOIA else @@ -127,7 +131,7 @@ void G_MapEventsToControls(event_t *ev) case ev_keyup: if (ev->data1 < NUMINPUTS) { - gamekeydown[devicePlayer][ev->data1] = 0; + gamekeydown[ev->device][ev->data1] = 0; } #ifdef PARANOIA else @@ -147,28 +151,28 @@ void G_MapEventsToControls(event_t *ev) if (ev->data2 < 0) { // Left - gamekeydown[devicePlayer][KEY_MOUSEMOVE + 2] = abs(ev->data2); - gamekeydown[devicePlayer][KEY_MOUSEMOVE + 3] = 0; + gamekeydown[ev->device][KEY_MOUSEMOVE + 2] = abs(ev->data2); + gamekeydown[ev->device][KEY_MOUSEMOVE + 3] = 0; } else { // Right - gamekeydown[devicePlayer][KEY_MOUSEMOVE + 2] = 0; - gamekeydown[devicePlayer][KEY_MOUSEMOVE + 3] = abs(ev->data2); + gamekeydown[ev->device][KEY_MOUSEMOVE + 2] = 0; + gamekeydown[ev->device][KEY_MOUSEMOVE + 3] = abs(ev->data2); } // Y axis if (ev->data3 < 0) { // Up - gamekeydown[devicePlayer][KEY_MOUSEMOVE] = abs(ev->data3); - gamekeydown[devicePlayer][KEY_MOUSEMOVE + 1] = 0; + gamekeydown[ev->device][KEY_MOUSEMOVE] = abs(ev->data3); + gamekeydown[ev->device][KEY_MOUSEMOVE + 1] = 0; } else { // Down - gamekeydown[devicePlayer][KEY_MOUSEMOVE] = 0; - gamekeydown[devicePlayer][KEY_MOUSEMOVE + 1] = abs(ev->data3); + gamekeydown[ev->device][KEY_MOUSEMOVE] = 0; + gamekeydown[ev->device][KEY_MOUSEMOVE + 1] = abs(ev->data3); } break; @@ -200,14 +204,14 @@ void G_MapEventsToControls(event_t *ev) if (ev->data2 < 0) { // Left - gamekeydown[devicePlayer][KEY_AXIS1 + i] = abs(ev->data2); - gamekeydown[devicePlayer][KEY_AXIS1 + i + 1] = 0; + gamekeydown[ev->device][KEY_AXIS1 + i] = abs(ev->data2); + gamekeydown[ev->device][KEY_AXIS1 + i + 1] = 0; } else { // Right - gamekeydown[devicePlayer][KEY_AXIS1 + i] = 0; - gamekeydown[devicePlayer][KEY_AXIS1 + i + 1] = abs(ev->data2); + gamekeydown[ev->device][KEY_AXIS1 + i] = 0; + gamekeydown[ev->device][KEY_AXIS1 + i + 1] = abs(ev->data2); } } @@ -217,14 +221,14 @@ void G_MapEventsToControls(event_t *ev) if (ev->data3 < 0) { // Up - gamekeydown[devicePlayer][KEY_AXIS1 + i + 2] = abs(ev->data3); - gamekeydown[devicePlayer][KEY_AXIS1 + i + 3] = 0; + gamekeydown[ev->device][KEY_AXIS1 + i + 2] = abs(ev->data3); + gamekeydown[ev->device][KEY_AXIS1 + i + 3] = 0; } else { // Down - gamekeydown[devicePlayer][KEY_AXIS1 + i + 2] = 0; - gamekeydown[devicePlayer][KEY_AXIS1 + i + 3] = abs(ev->data3); + gamekeydown[ev->device][KEY_AXIS1 + i + 2] = 0; + gamekeydown[ev->device][KEY_AXIS1 + i + 3] = abs(ev->data3); } } diff --git a/src/g_input.h b/src/g_input.h index 8a41267c5..5739e097e 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -84,9 +84,8 @@ extern consvar_t cv_controlperkey; // current state of the keys: JOYAXISRANGE or 0 when boolean. // Or anything inbetween for analog values -extern INT32 gamekeydown[MAXSPLITSCREENPLAYERS][NUMINPUTS]; - #define MAXDEVICES (MAXGAMEPADS + 1) // Gamepads + keyboard & mouse +extern INT32 gamekeydown[MAXDEVICES][NUMINPUTS]; extern boolean deviceResponding[MAXDEVICES]; // several key codes (or virtual key) per game control @@ -114,6 +113,8 @@ extern const INT32 gcl_full[num_gcl_full]; // peace to my little coder fingers! // check a gamecontrol being active or not +INT32 G_GetDevicePlayer(INT32 deviceID); + // remaps the input event to a game control. void G_MapEventsToControls(event_t *ev); diff --git a/src/k_menufunc.c b/src/k_menufunc.c index f408fea3f..472e3a09e 100644 --- a/src/k_menufunc.c +++ b/src/k_menufunc.c @@ -1931,7 +1931,8 @@ void M_CharacterSelectInit(INT32 choice) for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) { // Un-set all devices upon entering this menu. - cv_usejoystick[i].value = -1; + CV_SetValue(&cv_usejoystick[i], -1); + CONS_Printf("Device for %d set to %d\n", i, -1); } PLAY_CharSelectDef.prevMenu = currentMenu; @@ -2047,14 +2048,16 @@ static void M_HandlePressStart(setup_player_t *p, UINT8 num) if (M_DeviceAvailable(i, setup_numplayers) == true) { // Available!! Let's use this one!! - cv_usejoystick[setup_numplayers].value = i; + CV_SetValue(&cv_usejoystick[setup_numplayers], i); + CONS_Printf("Device for %d set to %d\n", setup_numplayers, i); for (j = setup_numplayers+1; j < MAXSPLITSCREENPLAYERS; j++) { if (cv_usejoystick[j].value == i) { // Un-set devices for other players. - cv_usejoystick[j].value = -1; + CV_SetValue(&cv_usejoystick[j], -1); + CONS_Printf("Device for %d set to %d\n", j, -1); } } @@ -2144,7 +2147,7 @@ static void M_HandleCharRotate(setup_player_t *p, UINT8 num) { UINT8 numclones = setup_chargrid[p->gridx][p->gridy].numskins; - if (G_PlayerInputDown(num, gc_right, true) == true) + if (menucmd[num].dpad_lr > 0) { p->clonenum++; if (p->clonenum >= numclones) @@ -2153,7 +2156,7 @@ static void M_HandleCharRotate(setup_player_t *p, UINT8 num) p->delay = CSROTATETICS; S_StartSound(NULL, sfx_s3kc3s); } - else if (G_PlayerInputDown(num, gc_left, true) == true) + else if (menucmd[num].dpad_lr < 0) { p->clonenum--; if (p->clonenum < 0) @@ -2163,13 +2166,13 @@ static void M_HandleCharRotate(setup_player_t *p, UINT8 num) S_StartSound(NULL, sfx_s3kc3s); } - if (G_PlayerInputDown(num, gc_a, true) == true || G_PlayerInputDown(num, gc_start, true) == true) + if ((menucmd[num].buttons & MBT_A) || (menucmd[num].buttons & MBT_X) /*|| (menucmd[num].buttons & MBT_START)*/) { p->mdepth = CSSTEP_COLORS; S_StartSound(NULL, sfx_s3k63); M_SetMenuDelay(num); } - else if (G_PlayerInputDown(num, gc_b, true) == true) + else if ((menucmd[num].buttons & MBT_B) || (menucmd[num].buttons & MBT_Y)) { p->mdepth = CSSTEP_CHARS; S_StartSound(NULL, sfx_s3k5b); @@ -2179,7 +2182,7 @@ static void M_HandleCharRotate(setup_player_t *p, UINT8 num) static void M_HandleColorRotate(setup_player_t *p, UINT8 num) { - if (G_PlayerInputDown(num, gc_right, true) == true) + if (menucmd[num].dpad_lr > 0) { p->color++; if (p->color >= numskincolors) @@ -2188,7 +2191,7 @@ static void M_HandleColorRotate(setup_player_t *p, UINT8 num) M_SetMenuDelay(num); //CSROTATETICS S_StartSound(NULL, sfx_s3k5b); //sfx_s3kc3s } - else if (G_PlayerInputDown(num, gc_left, true) == true) + else if (menucmd[num].dpad_lr < 0) { p->color--; if (p->color < 1) @@ -2198,7 +2201,7 @@ static void M_HandleColorRotate(setup_player_t *p, UINT8 num) S_StartSound(NULL, sfx_s3k5b); //sfx_s3kc3s } - if (G_PlayerInputDown(num, gc_a, true) == true || G_PlayerInputDown(num, gc_start, true) == true) + if ((menucmd[num].buttons & MBT_A) || (menucmd[num].buttons & MBT_X) /*|| (menucmd[num].buttons & MBT_START)*/) { p->mdepth = CSSTEP_READY; p->delay = TICRATE; @@ -2206,7 +2209,7 @@ static void M_HandleColorRotate(setup_player_t *p, UINT8 num) S_StartSound(NULL, sfx_s3k4e); M_SetMenuDelay(num); } - else if (G_PlayerInputDown(num, gc_b, true) == true) + else if ((menucmd[num].buttons & MBT_B) || (menucmd[num].buttons & MBT_Y)) { if (setup_chargrid[p->gridx][p->gridy].numskins == 1) p->mdepth = CSSTEP_CHARS; // Skip clones menu