diff --git a/src/g_game.c b/src/g_game.c index 487fb71f8..5e9f7634e 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -848,6 +848,15 @@ static INT32 G_GetValueFromControlTable(INT32 deviceID, INT32 deadzone, INT32 *c return failret; } +static void G_SetGamepadPrompts(UINT8 p, boolean prompts) +{ + if (showgamepadprompts[p] != prompts) + { + // CONS_Printf("Setting player %d to gamepadprompts %d\n", p, prompts); + showgamepadprompts[p] = prompts; + } +} + INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, UINT8 menuPlayers) { const INT32 deadzone = (JOYAXISRANGE * cv_deadzone[p].value) / FRACUNIT; @@ -879,7 +888,7 @@ INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, UINT8 menuPlayers) // This is only intended for P1. if (main_player == true) { - showgamepadprompts[p] = false; + G_SetGamepadPrompts(p, false); return value; } else @@ -899,7 +908,7 @@ INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, UINT8 menuPlayers) value = G_GetValueFromControlTable(deviceID, deadzone, &(gamecontrol[p][gc][0])); if (value > 0) { - showgamepadprompts[p] = (deviceID != KEYBOARD_MOUSE_DEVICE); + G_SetGamepadPrompts(p, (deviceID != KEYBOARD_MOUSE_DEVICE)); return value; } if (value != NO_BINDS_REACHABLE) @@ -913,7 +922,7 @@ INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, UINT8 menuPlayers) value = G_GetValueFromControlTable(KEYBOARD_MOUSE_DEVICE, deadzone, &(gamecontrol[p][gc][0])); if (value > 0) { - showgamepadprompts[p] = true; + G_SetGamepadPrompts(p, false); return value; } if (value != NO_BINDS_REACHABLE) @@ -954,7 +963,7 @@ INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, UINT8 menuPlayers) value = G_GetValueFromControlTable(tryDevice, deadzone, &(gamecontrol[p][gc][0])); if (value > 0) { - showgamepadprompts[p] = (tryDevice != KEYBOARD_MOUSE_DEVICE); + G_SetGamepadPrompts(p, (tryDevice != KEYBOARD_MOUSE_DEVICE)); return value; } if (value != NO_BINDS_REACHABLE) @@ -971,7 +980,7 @@ INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, UINT8 menuPlayers) value = G_GetValueFromControlTable(deviceID, deadzone, &(gamecontroldefault[gc][0])); if (value > 0) { - showgamepadprompts[p] = (deviceID != KEYBOARD_MOUSE_DEVICE); + G_SetGamepadPrompts(p, (deviceID != KEYBOARD_MOUSE_DEVICE)); return value; } } diff --git a/src/g_input.c b/src/g_input.c index 068008dbc..2859ff500 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1271,27 +1271,19 @@ INT32 G_CheckDoubleUsage(INT32 keynum, INT32 playernum, boolean modify) INT32 G_FindPlayerBindForGameControl(INT32 player, gamecontrols_e control) { - UINT8 targetplayer = MAXSPLITSCREENPLAYERS; - for (UINT8 i = 0; i < MAXSPLITSCREENPLAYERS; i++) - { - if (g_localplayers[i] == player) - targetplayer = i; - } - - if (targetplayer == MAXSPLITSCREENPLAYERS) - targetplayer = 0; - - INT32 device = showgamepadprompts[targetplayer] ? 1 : KEYBOARD_MOUSE_DEVICE; + INT32 device = showgamepadprompts[player] ? 1 : KEYBOARD_MOUSE_DEVICE; INT32 bestbind = -1; // Bind that matches our input device INT32 anybind = -1; // Bind that doesn't match, but is at least for this control INT32 bindindex = MAXINPUTMAPPING-1; + // CONS_Printf("Check bind %d for player %d device %d\n", control, player, device); + // PASS 1: Binds that are directly in our active control mapping. while (bindindex >= 0) // Prefer earlier binds { - INT32 possiblecontrol = gamecontrol[targetplayer][control][bindindex]; + INT32 possiblecontrol = gamecontrol[player][control][bindindex]; bindindex--; @@ -1301,11 +1293,13 @@ INT32 G_FindPlayerBindForGameControl(INT32 player, gamecontrols_e control) // if (device is gamepad) == (bound control is in gamepad range) - e.g. if bind matches device if ((device != KEYBOARD_MOUSE_DEVICE) == (possiblecontrol >= KEY_JOY1 && possiblecontrol < JOYINPUTEND)) { + // CONS_Printf("PASS1 found %s\n", G_KeynumToShortString(possiblecontrol)); bestbind = possiblecontrol; anybind = possiblecontrol; } else { + // CONS_Printf("PASS1 considering %s\n", G_KeynumToShortString(possiblecontrol)); anybind = possiblecontrol; } } @@ -1326,11 +1320,13 @@ INT32 G_FindPlayerBindForGameControl(INT32 player, gamecontrols_e control) if ((device != KEYBOARD_MOUSE_DEVICE) == (possiblecontrol >= KEY_JOY1 && possiblecontrol < JOYINPUTEND)) { + // CONS_Printf("PASS2 found %s\n", G_KeynumToShortString(possiblecontrol)); bestbind = possiblecontrol; anybind = possiblecontrol; } else { + // CONS_Printf("PASS2 considering %s\n", G_KeynumToShortString(possiblecontrol)); anybind = possiblecontrol; } } diff --git a/src/v_draw.cpp b/src/v_draw.cpp index 46b3cf1b2..b387a2fa8 100644 --- a/src/v_draw.cpp +++ b/src/v_draw.cpp @@ -168,12 +168,19 @@ Draw::TextElement& Draw::TextElement::parse(std::string_view raw) { if (auto id = inputdefinition.find(it->second & (~0xF0)); id != inputdefinition.end()) // This is a game control, do descriptive input translation! { - // Grab our local controls - UINT8 targetplayer = as_.value_or(stplyr - players); // If not set in the call to parse(), use stplyr's controls - if (targetplayer >= MAXPLAYERS) - targetplayer = 0; + // Grab our local controls - if pid set in the call to parse(), use stplyr's controls + UINT8 localplayer = 0; + UINT8 indexedplayer = as_.value_or(stplyr - players); + for (UINT8 i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { + if (g_localplayers[i] == indexedplayer) + { + localplayer = i; + break; + } + } - INT32 bind = G_FindPlayerBindForGameControl(targetplayer, id->second); + INT32 bind = G_FindPlayerBindForGameControl(localplayer, id->second); if (auto pretty = prettyinputs.find(bind); pretty != prettyinputs.end()) // Gamepad direction or keyboard arrow, use something nice-looking {