From 6f8b12658690834b64499f40d6bd34a3a6585752 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Thu, 20 Dec 2018 04:04:49 -0500 Subject: [PATCH 1/4] Add G_FilterKeyByVersion() to setcontrol --- src/g_input.c | 169 +++++++++++++++++++++++++++++++++++++++++++------- src/g_input.h | 2 +- src/m_menu.c | 2 +- 3 files changed, 147 insertions(+), 26 deletions(-) diff --git a/src/g_input.c b/src/g_input.c index 44d9f2b2..954a2a58 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1300,30 +1300,152 @@ void G_SaveKeySetting(FILE *f) } } -void G_CheckDoubleUsage(INT32 keynum) +INT32 G_CheckDoubleUsage(INT32 keynum, boolean modify) { + INT32 result = gc_null; if (cv_controlperkey.value == 1) { INT32 i; for (i = 0; i < num_gamecontrols; i++) { if (gamecontrol[i][0] == keynum) - gamecontrol[i][0] = KEY_NULL; + { + result = i; + if (modify) gamecontrol[i][0] = KEY_NULL; + } if (gamecontrol[i][1] == keynum) - gamecontrol[i][1] = KEY_NULL; + { + result = i; + if (modify) gamecontrol[i][1] = KEY_NULL; + } if (gamecontrolbis[i][0] == keynum) - gamecontrolbis[i][0] = KEY_NULL; + { + result = i; + if (modify) gamecontrolbis[i][0] = KEY_NULL; + } if (gamecontrolbis[i][1] == keynum) - gamecontrolbis[i][1] = KEY_NULL; + { + result = i; + if (modify) gamecontrolbis[i][1] = KEY_NULL; + } + if (result && !modify) + return result; } } + return result; } -static void setcontrol(INT32 (*gc)[2], INT32 na) +static INT32 G_FilterKeyByVersion(INT32 numctrl, INT32 keyidx, INT32 player, INT32 *keynum1, INT32 *keynum2) +{ + // Special case: ignore KEY_PAUSE because it's hardcoded + if (keyidx == 0 && *keynum1 == KEY_PAUSE) + { + if (*keynum2 != KEY_PAUSE) + { + *keynum1 = *keynum2; // shift down keynum2 and continue + *keynum2 = 0; + } + else + return 0; + } + else if (keyidx == 1 && *keynum2 == KEY_PAUSE) + return 0; + +#if !defined (DC) && !defined (_PSP) && !defined (GP2X) && !defined (_NDS) && !defined(WMINPUT) && !defined(_WII) + if (GETMAJOREXECVERSION(cv_execversion.value) < 27 && ( // v2.1.22 + numctrl == gc_weaponnext || numctrl == gc_weaponprev || numctrl == gc_tossflag || + numctrl == gc_use || numctrl == gc_camreset || numctrl == gc_jump || + numctrl == gc_pause || numctrl == gc_systemmenu || numctrl == gc_camtoggle || + numctrl == gc_screenshot || numctrl == gc_talkkey || numctrl == gc_scores + )) + { + INT32 keynum = 0, existingctrl = 0; + INT32 defaultkey; + boolean defaultoverride = false; + + // get the default gamecontrol + if (player == 0 && numctrl == gc_systemmenu) + defaultkey = gamecontrol[numctrl][0]; + else + defaultkey = (player == 1 ? gamecontrolbis[numctrl][0] : gamecontrol[numctrl][1]); + + // Assign joypad button defaults if there is an open slot. + // At this point, gamecontrol/bis should have the default controls + // (unless LOADCONFIG is being run) + // + // If the player runs SETCONTROL in-game, this block should not be reached + // because EXECVERSION is locked onto the latest version. + if (keyidx == 0 && !*keynum1) + { + if (*keynum2) // push keynum2 down; this is an edge case + { + *keynum1 = *keynum2; + *keynum2 = 0; + keynum = *keynum1; + } + else + { + keynum = defaultkey; + defaultoverride = true; + } + } + else if (keyidx == 1 && (!*keynum2 || (!*keynum1 && *keynum2))) // last one is the same edge case as above + { + keynum = defaultkey; + defaultoverride = true; + } + else // default to the specified keynum + keynum = (keyidx == 1 ? *keynum2 : *keynum1); + + // Fill keynum2 with the default control + if (keyidx == 0 && !*keynum2) + { + *keynum2 = defaultkey; + + // if keynum2 already matches keynum1, we probably recursed + // so unset it + if (*keynum1 == *keynum2) + *keynum2 = 0; + } + + // check if the key is being used somewhere else before passing it + // pass it through if it's the same numctrl. This is an edge case -- when using + // LOADCONFIG, gamecontrol is not reset with default. + // + // Also, only check if we're actually overriding, to preserve behavior where + // config'd keys overwrite default keys. + if (defaultoverride) + existingctrl = G_CheckDoubleUsage(keynum, false); + + if (keynum && (!existingctrl || existingctrl == numctrl)) + return keynum; + else if (keyidx == 0 && *keynum2) + { + // try it again and push down keynum2 + *keynum1 = *keynum2; + *keynum2 = 0; + return G_FilterKeyByVersion(numctrl, keyidx, player, keynum1, keynum2); + // recursion *should* be safe because we only assign keynum2 to a joy default + // and then clear it if we find that keynum1 already has the joy default. + } + else + return 0; + } +#endif + + // All's good, so pass the keynum as-is + if (keyidx == 1) + return *keynum2; + else //if (keyidx == 0) + return *keynum1; +} + +static void setcontrol(INT32 (*gc)[2]) { INT32 numctrl; const char *namectrl; - INT32 keynum; + INT32 keynum, keynum1, keynum2; + INT32 player = ((void*)gc == (void*)&gamecontrolbis ? 1 : 0); namectrl = COM_Argv(1); for (numctrl = 0; numctrl < num_gamecontrols && stricmp(namectrl, gamecontrolname[numctrl]); @@ -1334,28 +1456,27 @@ static void setcontrol(INT32 (*gc)[2], INT32 na) CONS_Printf(M_GetText("Control '%s' unknown\n"), namectrl); return; } - keynum = G_KeyStringtoNum(COM_Argv(2)); + keynum1 = G_KeyStringtoNum(COM_Argv(2)); + keynum2 = G_KeyStringtoNum(COM_Argv(3)); + keynum = G_FilterKeyByVersion(numctrl, 0, player, &keynum1, &keynum2); - if (keynum == KEY_PAUSE) // fail silently; pause is hardcoded + (void)G_CheckDoubleUsage(keynum, true); + + // if keynum was rejected, try it again with keynum2 + if (!keynum && keynum2) { - if (na == 4) - { - na--; - keynum = G_KeyStringtoNum(COM_Argv(3)); - if (keynum == KEY_PAUSE) - return; - } - else - return; + keynum1 = keynum2; // push down keynum2 + keynum2 = 0; + keynum = G_FilterKeyByVersion(numctrl, 0, player, &keynum1, &keynum2); + (void)G_CheckDoubleUsage(keynum, true); } - G_CheckDoubleUsage(keynum); gc[numctrl][0] = keynum; - if (na == 4) + if (keynum2) { - keynum = G_KeyStringtoNum(COM_Argv(3)); - if (keynum != KEY_PAUSE) + keynum = G_FilterKeyByVersion(numctrl, 1, player, &keynum1, &keynum2); + if (keynum != gc[numctrl][0]) gc[numctrl][1] = keynum; else gc[numctrl][1] = 0; @@ -1376,7 +1497,7 @@ void Command_Setcontrol_f(void) return; } - setcontrol(gamecontrol, na); + setcontrol(gamecontrol); } void Command_Setcontrol2_f(void) @@ -1391,5 +1512,5 @@ void Command_Setcontrol2_f(void) return; } - setcontrol(gamecontrolbis, na); + setcontrol(gamecontrolbis); } diff --git a/src/g_input.h b/src/g_input.h index 557fb3bf..1fe5a6c1 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -164,6 +164,6 @@ void Command_Setcontrol_f(void); void Command_Setcontrol2_f(void); void G_Controldefault(void); void G_SaveKeySetting(FILE *f); -void G_CheckDoubleUsage(INT32 keynum); +INT32 G_CheckDoubleUsage(INT32 keynum, boolean modify); #endif diff --git a/src/m_menu.c b/src/m_menu.c index 1e1b1e69..3403f934 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -6955,7 +6955,7 @@ static void M_ChangecontrolResponse(event_t *ev) found = 0; setupcontrols[control][1] = KEY_NULL; //replace key 1,clear key2 } - G_CheckDoubleUsage(ch); + (void)G_CheckDoubleUsage(ch, true); setupcontrols[control][found] = ch; } S_StartSound(NULL, sfx_strpst); From e20c70d5fb3c521f4deabac3525aa1126ffd771e Mon Sep 17 00:00:00 2001 From: mazmazz Date: Thu, 20 Dec 2018 18:27:44 -0500 Subject: [PATCH 2/4] Skip setting control if keynum is -1 (for KEY_PAUSE) handling --- src/g_input.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/g_input.c b/src/g_input.c index 954a2a58..62a4f5aa 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1346,10 +1346,10 @@ static INT32 G_FilterKeyByVersion(INT32 numctrl, INT32 keyidx, INT32 player, INT *keynum2 = 0; } else - return 0; + return -1; // skip setting control } else if (keyidx == 1 && *keynum2 == KEY_PAUSE) - return 0; + return -1; // skip setting control #if !defined (DC) && !defined (_PSP) && !defined (GP2X) && !defined (_NDS) && !defined(WMINPUT) && !defined(_WII) if (GETMAJOREXECVERSION(cv_execversion.value) < 27 && ( // v2.1.22 @@ -1460,26 +1460,34 @@ static void setcontrol(INT32 (*gc)[2]) keynum2 = G_KeyStringtoNum(COM_Argv(3)); keynum = G_FilterKeyByVersion(numctrl, 0, player, &keynum1, &keynum2); - (void)G_CheckDoubleUsage(keynum, true); - - // if keynum was rejected, try it again with keynum2 - if (!keynum && keynum2) + if (keynum >= 0) { - keynum1 = keynum2; // push down keynum2 - keynum2 = 0; - keynum = G_FilterKeyByVersion(numctrl, 0, player, &keynum1, &keynum2); (void)G_CheckDoubleUsage(keynum, true); + + // if keynum was rejected, try it again with keynum2 + if (!keynum && keynum2) + { + keynum1 = keynum2; // push down keynum2 + keynum2 = 0; + keynum = G_FilterKeyByVersion(numctrl, 0, player, &keynum1, &keynum2); + if (keynum >= 0) + (void)G_CheckDoubleUsage(keynum, true); + } } - gc[numctrl][0] = keynum; + if (keynum >= 0) + gc[numctrl][0] = keynum; if (keynum2) { keynum = G_FilterKeyByVersion(numctrl, 1, player, &keynum1, &keynum2); - if (keynum != gc[numctrl][0]) - gc[numctrl][1] = keynum; - else - gc[numctrl][1] = 0; + if (keynum >= 0) + { + if (keynum != gc[numctrl][0]) + gc[numctrl][1] = keynum; + else + gc[numctrl][1] = 0; + } } else gc[numctrl][1] = 0; From dd4c7b539f386fe5c64eeafeebc0220ab35eb664 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 23 Dec 2018 14:27:28 -0500 Subject: [PATCH 3/4] Fix joy button default override when filling keynum2 with default --- src/g_input.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/g_input.c b/src/g_input.c index 62a4f5aa..55f49614 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1335,7 +1335,7 @@ INT32 G_CheckDoubleUsage(INT32 keynum, boolean modify) return result; } -static INT32 G_FilterKeyByVersion(INT32 numctrl, INT32 keyidx, INT32 player, INT32 *keynum1, INT32 *keynum2) +static INT32 G_FilterKeyByVersion(INT32 numctrl, INT32 keyidx, INT32 player, INT32 *keynum1, INT32 *keynum2, boolean *nestedoverride) { // Special case: ignore KEY_PAUSE because it's hardcoded if (keyidx == 0 && *keynum1 == KEY_PAUSE) @@ -1397,15 +1397,27 @@ static INT32 G_FilterKeyByVersion(INT32 numctrl, INT32 keyidx, INT32 player, INT else // default to the specified keynum keynum = (keyidx == 1 ? *keynum2 : *keynum1); + // Did our last call override keynum2? + if (*nestedoverride) + { + defaultoverride = true; + *nestedoverride = false; + } + // Fill keynum2 with the default control if (keyidx == 0 && !*keynum2) { *keynum2 = defaultkey; + // Tell the next call that this is an override + *nestedoverride = true; // if keynum2 already matches keynum1, we probably recursed // so unset it if (*keynum1 == *keynum2) + { *keynum2 = 0; + *nestedoverride = false; + } } // check if the key is being used somewhere else before passing it @@ -1424,7 +1436,7 @@ static INT32 G_FilterKeyByVersion(INT32 numctrl, INT32 keyidx, INT32 player, INT // try it again and push down keynum2 *keynum1 = *keynum2; *keynum2 = 0; - return G_FilterKeyByVersion(numctrl, keyidx, player, keynum1, keynum2); + return G_FilterKeyByVersion(numctrl, keyidx, player, keynum1, keynum2, nestedoverride); // recursion *should* be safe because we only assign keynum2 to a joy default // and then clear it if we find that keynum1 already has the joy default. } @@ -1446,6 +1458,7 @@ static void setcontrol(INT32 (*gc)[2]) const char *namectrl; INT32 keynum, keynum1, keynum2; INT32 player = ((void*)gc == (void*)&gamecontrolbis ? 1 : 0); + boolean nestedoverride = false; namectrl = COM_Argv(1); for (numctrl = 0; numctrl < num_gamecontrols && stricmp(namectrl, gamecontrolname[numctrl]); @@ -1458,7 +1471,7 @@ static void setcontrol(INT32 (*gc)[2]) } keynum1 = G_KeyStringtoNum(COM_Argv(2)); keynum2 = G_KeyStringtoNum(COM_Argv(3)); - keynum = G_FilterKeyByVersion(numctrl, 0, player, &keynum1, &keynum2); + keynum = G_FilterKeyByVersion(numctrl, 0, player, &keynum1, &keynum2, &nestedoverride); if (keynum >= 0) { @@ -1469,7 +1482,7 @@ static void setcontrol(INT32 (*gc)[2]) { keynum1 = keynum2; // push down keynum2 keynum2 = 0; - keynum = G_FilterKeyByVersion(numctrl, 0, player, &keynum1, &keynum2); + keynum = G_FilterKeyByVersion(numctrl, 0, player, &keynum1, &keynum2, &nestedoverride); if (keynum >= 0) (void)G_CheckDoubleUsage(keynum, true); } @@ -1480,7 +1493,7 @@ static void setcontrol(INT32 (*gc)[2]) if (keynum2) { - keynum = G_FilterKeyByVersion(numctrl, 1, player, &keynum1, &keynum2); + keynum = G_FilterKeyByVersion(numctrl, 1, player, &keynum1, &keynum2, &nestedoverride); if (keynum >= 0) { if (keynum != gc[numctrl][0]) From 3277cf6976819804452bdae630b85e464eb10515 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 23 Dec 2018 14:27:49 -0500 Subject: [PATCH 4/4] Add JOY10 default to gc_centerview --- src/g_input.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/g_input.c b/src/g_input.c index 55f49614..6d610ddd 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1188,6 +1188,7 @@ void G_Controldefault(void) gamecontrol[gc_lookup ][0] = KEY_UPARROW; gamecontrol[gc_lookdown ][0] = KEY_DOWNARROW; gamecontrol[gc_centerview ][0] = KEY_END; + gamecontrol[gc_centerview ][1] = KEY_JOY1+9; // Right Stick gamecontrol[gc_talkkey ][0] = 't'; gamecontrol[gc_teamkey ][0] = 'y'; gamecontrol[gc_scores ][0] = KEY_TAB; @@ -1198,6 +1199,19 @@ void G_Controldefault(void) gamecontrol[gc_recordgif ][0] = KEY_F9; gamecontrol[gc_viewpoint ][0] = KEY_F12; gamecontrol[gc_systemmenu ][0] = KEY_JOY1+7; // Start + gamecontrolbis[gc_weaponnext][0] = KEY_2JOY1+1; // B + gamecontrolbis[gc_weaponprev][0] = KEY_2JOY1+2; // X + gamecontrolbis[gc_tossflag ][0] = KEY_2JOY1+0; // A + gamecontrolbis[gc_use ][0] = KEY_2JOY1+4; // LB + gamecontrolbis[gc_camreset ][0] = KEY_2JOY1+3; // Y + gamecontrolbis[gc_centerview][0] = KEY_2JOY1+9; // Right Stick + gamecontrolbis[gc_jump ][0] = KEY_2JOY1+5; // RB + //gamecontrolbis[gc_pause ][0] = KEY_2JOY1+6; // Back + //gamecontrolbis[gc_systemmenu][0] = KEY_2JOY1+7; // Start + gamecontrolbis[gc_camtoggle ][0] = KEY_2HAT1+0; // D-Pad Up + gamecontrolbis[gc_screenshot][0] = KEY_2HAT1+1; // D-Pad Down + //gamecontrolbis[gc_talkkey ][0] = KEY_2HAT1+2; // D-Pad Left + //gamecontrolbis[gc_scores ][0] = KEY_2HAT1+3; // D-Pad Right #ifdef WMINPUT gamecontrol[gc_forward ][0] = KEY_JOY1+02; //UP gamecontrol[gc_backward ][0] = KEY_JOY1+03; //DOWN @@ -1356,7 +1370,8 @@ static INT32 G_FilterKeyByVersion(INT32 numctrl, INT32 keyidx, INT32 player, INT numctrl == gc_weaponnext || numctrl == gc_weaponprev || numctrl == gc_tossflag || numctrl == gc_use || numctrl == gc_camreset || numctrl == gc_jump || numctrl == gc_pause || numctrl == gc_systemmenu || numctrl == gc_camtoggle || - numctrl == gc_screenshot || numctrl == gc_talkkey || numctrl == gc_scores + numctrl == gc_screenshot || numctrl == gc_talkkey || numctrl == gc_scores || + numctrl == gc_centerview )) { INT32 keynum = 0, existingctrl = 0;