mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-23 19:31:05 +00:00
Check double usage per-player, remove 2.1 code
This commit is contained in:
parent
a85876d0c2
commit
7abdab09bd
3 changed files with 13 additions and 107 deletions
116
src/g_input.c
116
src/g_input.c
|
@ -1475,7 +1475,7 @@ void G_SaveKeySetting(FILE *f, INT32 (*fromcontrols)[2], INT32 (*fromcontrolsbis
|
|||
}
|
||||
}
|
||||
|
||||
INT32 G_CheckDoubleUsage(INT32 keynum, boolean modify)
|
||||
INT32 G_CheckDoubleUsage(INT32 keynum, boolean modify, UINT8 player)
|
||||
{
|
||||
INT32 result = GC_NULL;
|
||||
if (cv_controlperkey.value == 1)
|
||||
|
@ -1483,22 +1483,22 @@ INT32 G_CheckDoubleUsage(INT32 keynum, boolean modify)
|
|||
INT32 i;
|
||||
for (i = 0; i < NUM_GAMECONTROLS; i++)
|
||||
{
|
||||
if (gamecontrol[i][0] == keynum)
|
||||
if (gamecontrol[i][0] == keynum && player != 2)
|
||||
{
|
||||
result = i;
|
||||
if (modify) gamecontrol[i][0] = KEY_NULL;
|
||||
}
|
||||
if (gamecontrol[i][1] == keynum)
|
||||
if (gamecontrol[i][1] == keynum && player != 2)
|
||||
{
|
||||
result = i;
|
||||
if (modify) gamecontrol[i][1] = KEY_NULL;
|
||||
}
|
||||
if (gamecontrolbis[i][0] == keynum)
|
||||
if (gamecontrolbis[i][0] == keynum && player != 1)
|
||||
{
|
||||
result = i;
|
||||
if (modify) gamecontrolbis[i][0] = KEY_NULL;
|
||||
}
|
||||
if (gamecontrolbis[i][1] == keynum)
|
||||
if (gamecontrolbis[i][1] == keynum && player != 1)
|
||||
{
|
||||
result = i;
|
||||
if (modify) gamecontrolbis[i][1] = KEY_NULL;
|
||||
|
@ -1510,7 +1510,7 @@ INT32 G_CheckDoubleUsage(INT32 keynum, boolean modify)
|
|||
return result;
|
||||
}
|
||||
|
||||
static INT32 G_FilterKeyByVersion(INT32 numctrl, INT32 keyidx, INT32 player, INT32 *keynum1, INT32 *keynum2, boolean *nestedoverride)
|
||||
static INT32 G_FilterSpecialKeys(INT32 keyidx, INT32 player, INT32 *keynum1, INT32 *keynum2)
|
||||
{
|
||||
// Special case: ignore KEY_PAUSE because it's hardcoded
|
||||
if (keyidx == 0 && *keynum1 == KEY_PAUSE)
|
||||
|
@ -1526,99 +1526,6 @@ static INT32 G_FilterKeyByVersion(INT32 numctrl, INT32 keyidx, INT32 player, INT
|
|||
else if (keyidx == 1 && *keynum2 == KEY_PAUSE)
|
||||
return -1; // skip setting control
|
||||
|
||||
if (GETMAJOREXECVERSION(cv_execversion.value) < 27 && ( // v2.1.22
|
||||
numctrl == GC_WEAPONNEXT || numctrl == GC_WEAPONPREV || numctrl == GC_TOSSFLAG ||
|
||||
numctrl == GC_SPIN || 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_CENTERVIEW
|
||||
))
|
||||
{
|
||||
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);
|
||||
|
||||
// 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
|
||||
// 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, 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.
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
// All's good, so pass the keynum as-is
|
||||
if (keyidx == 1)
|
||||
return *keynum2;
|
||||
|
@ -1632,7 +1539,6 @@ static void setcontrol(INT32 (*gc)[2])
|
|||
const char *namectrl;
|
||||
INT32 keynum, keynum1, keynum2;
|
||||
INT32 player = ((void*)gc == (void*)&gamecontrolbis ? 1 : 0);
|
||||
boolean nestedoverride = false;
|
||||
|
||||
// Update me for 2.3
|
||||
namectrl = (stricmp(COM_Argv(1), "use")) ? COM_Argv(1) : "spin";
|
||||
|
@ -1647,20 +1553,20 @@ static void setcontrol(INT32 (*gc)[2])
|
|||
}
|
||||
keynum1 = G_KeyNameToNum(COM_Argv(2));
|
||||
keynum2 = G_KeyNameToNum(COM_Argv(3));
|
||||
keynum = G_FilterKeyByVersion(numctrl, 0, player, &keynum1, &keynum2, &nestedoverride);
|
||||
keynum = G_FilterSpecialKeys(0, player, &keynum1, &keynum2);
|
||||
|
||||
if (keynum >= 0)
|
||||
{
|
||||
(void)G_CheckDoubleUsage(keynum, true);
|
||||
(void)G_CheckDoubleUsage(keynum, true, player+1);
|
||||
|
||||
// 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, &nestedoverride);
|
||||
keynum = G_FilterSpecialKeys(0, player, &keynum1, &keynum2);
|
||||
if (keynum >= 0)
|
||||
(void)G_CheckDoubleUsage(keynum, true);
|
||||
(void)G_CheckDoubleUsage(keynum, true, player+1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1669,7 +1575,7 @@ static void setcontrol(INT32 (*gc)[2])
|
|||
|
||||
if (keynum2)
|
||||
{
|
||||
keynum = G_FilterKeyByVersion(numctrl, 1, player, &keynum1, &keynum2, &nestedoverride);
|
||||
keynum = G_FilterSpecialKeys(1, player, &keynum1, &keynum2);
|
||||
if (keynum >= 0)
|
||||
{
|
||||
if (keynum != gc[numctrl][0])
|
||||
|
|
|
@ -355,7 +355,7 @@ void G_DefineDefaultControls(void);
|
|||
INT32 G_GetControlScheme(INT32 (*fromcontrols)[2], const INT32 *gclist, INT32 gclen);
|
||||
void G_CopyControls(INT32 (*setupcontrols)[2], INT32 (*fromcontrols)[2], const INT32 *gclist, INT32 gclen);
|
||||
void G_SaveKeySetting(FILE *f, INT32 (*fromcontrols)[2], INT32 (*fromcontrolsbis)[2]);
|
||||
INT32 G_CheckDoubleUsage(INT32 keynum, boolean modify);
|
||||
INT32 G_CheckDoubleUsage(INT32 keynum, boolean modify, UINT8 player);
|
||||
|
||||
// sets the members of a mouse_t given position deltas
|
||||
void G_SetMouseDeltas(INT32 dx, INT32 dy, UINT8 ssplayer);
|
||||
|
|
|
@ -12969,7 +12969,7 @@ static void M_ChangeControlResponse(event_t *ev)
|
|||
setupcontrols[control][1] = KEY_NULL; //replace key 1,clear key2
|
||||
}
|
||||
|
||||
G_CheckDoubleUsage(ch, true);
|
||||
G_CheckDoubleUsage(ch, true, setupcontrols_secondaryplayer ? 2 : 1);
|
||||
setupcontrols[control][found] = ch;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue