Add PF_ANALOGSTICK, tells if this player has bound analog stick to d-pad

This commit is contained in:
James R 2024-02-24 21:24:11 -08:00
parent abaa237b08
commit b452232974
6 changed files with 52 additions and 3 deletions

View file

@ -1235,6 +1235,7 @@ enum {
WP_KICKSTARTACCEL = 1<<0,
WP_SHRINKME = 1<<1,
WP_AUTOROULETTE = 1<<2,
WP_ANALOGSTICK = 1<<3,
};
void WeaponPref_Send(UINT8 ssplayer)
@ -1250,6 +1251,9 @@ void WeaponPref_Send(UINT8 ssplayer)
if (cv_shrinkme[ssplayer].value)
prefs |= WP_SHRINKME;
if (gamecontrolflags[ssplayer] & GCF_ANALOGSTICK)
prefs |= WP_ANALOGSTICK;
SendNetXCmdForPlayer(ssplayer, XD_WEAPONPREF, &prefs, 1);
}
@ -1268,6 +1272,9 @@ void WeaponPref_Save(UINT8 **cp, INT32 playernum)
if (player->pflags & PF_SHRINKME)
prefs |= WP_SHRINKME;
if (player->pflags & PF_ANALOGSTICK)
prefs |= WP_ANALOGSTICK;
WRITEUINT8(*cp, prefs);
}
@ -1289,6 +1296,11 @@ size_t WeaponPref_Parse(const UINT8 *bufstart, INT32 playernum)
if (prefs & WP_SHRINKME)
player->pflags |= PF_SHRINKME;
if (prefs & WP_ANALOGSTICK)
player->pflags |= PF_ANALOGSTICK;
else
player->pflags &= ~PF_ANALOGSTICK;
if (leveltime < 2)
{
// BAD HACK: No other place I tried to slot this in

View file

@ -103,7 +103,9 @@ typedef enum
PF_RINGLOCK = 1<<13, // Prevent picking up rings while SPB is locked on
//14-17 free, was previously itemflags stuff
PF_ANALOGSTICK = 1<<14, // This player is using an analog joystick
//15-17 free, was previously itemflags stuff
PF_DRIFTINPUT = 1<<18, // Drifting!
PF_GETSPARKS = 1<<19, // Can get sparks

View file

@ -3994,7 +3994,7 @@ const char *const PLAYERFLAG_LIST[] = {
"RINGLOCK", // Prevent picking up rings while SPB is locked on
"\x01", // Free
"ANALOGSTICK", // This player is using an analog joystick
"\x01", // Free
"\x01", // Free
"\x01", // Free

View file

@ -2189,7 +2189,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
totalring = players[player].totalring;
xtralife = players[player].xtralife;
pflags = (players[player].pflags & (PF_WANTSTOJOIN|PF_KICKSTARTACCEL|PF_SHRINKME|PF_SHRINKACTIVE|PF_AUTOROULETTE));
pflags = (players[player].pflags & (PF_WANTSTOJOIN|PF_KICKSTARTACCEL|PF_SHRINKME|PF_SHRINKACTIVE|PF_AUTOROULETTE|PF_ANALOGSTICK));
// SRB2kart
memcpy(&itemRoulette, &players[player].itemRoulette, sizeof (itemRoulette));

View file

@ -31,6 +31,7 @@ INT32 gamekeydown[MAXDEVICES][NUMINPUTS];
// two key codes (or virtual key) per game control
INT32 gamecontrol[MAXSPLITSCREENPLAYERS][num_gamecontrols][MAXINPUTMAPPING];
UINT8 gamecontrolflags[MAXSPLITSCREENPLAYERS];
INT32 gamecontroldefault[num_gamecontrols][MAXINPUTMAPPING]; // default control storage
INT32 menucontrolreserved[num_gamecontrols][MAXINPUTMAPPING];
@ -963,9 +964,37 @@ void G_DefineDefaultControls(void)
menucontrolreserved[gc_start][0] = KEY_ESCAPE; // Handled special
}
static boolean G_ControlUsesAxis(INT32 map[MAXINPUTMAPPING])
{
for (INT32 i = 0; i < MAXINPUTMAPPING; i++)
{
INT32 key = map[i];
if (key >= KEY_AXIS1 && key < JOYINPUTEND)
{
return true;
}
}
return false;
}
void G_ApplyControlScheme(UINT8 splitplayer, INT32 (*fromcontrols)[MAXINPUTMAPPING])
{
UINT8 flags = 0;
if (G_ControlUsesAxis(fromcontrols[gc_up]) ||
G_ControlUsesAxis(fromcontrols[gc_down]) ||
G_ControlUsesAxis(fromcontrols[gc_left]) ||
G_ControlUsesAxis(fromcontrols[gc_right]))
{
flags |= GCF_ANALOGSTICK;
}
memcpy(gamecontrol[splitplayer], fromcontrols, sizeof gamecontrol[splitplayer]);
gamecontrolflags[splitplayer] = flags;
if (Playing())
WeaponPref_Send(splitplayer); // update PF_ANALOGSTICK
}
void G_SaveKeySetting(FILE *f, INT32 (*fromcontrolsa)[MAXINPUTMAPPING], INT32 (*fromcontrolsb)[MAXINPUTMAPPING], INT32 (*fromcontrolsc)[MAXINPUTMAPPING], INT32 (*fromcontrolsd)[MAXINPUTMAPPING])

View file

@ -100,6 +100,11 @@ typedef enum
gc_drift = gc_r,
} gamecontrols_e;
typedef enum
{
GCF_ANALOGSTICK = 1 << 0,
} gamecontrol_flags_e;
// mouse values are used once
extern consvar_t cv_controlperkey;
@ -113,6 +118,7 @@ extern INT32 gamekeydown[MAXDEVICES][NUMINPUTS];
// several key codes (or virtual key) per game control
extern INT32 gamecontrol[MAXSPLITSCREENPLAYERS][num_gamecontrols][MAXINPUTMAPPING];
extern UINT8 gamecontrolflags[MAXSPLITSCREENPLAYERS];
extern INT32 gamecontroldefault[num_gamecontrols][MAXINPUTMAPPING]; // default control storage
extern INT32 menucontrolreserved[num_gamecontrols][MAXINPUTMAPPING];