diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 84f514411..e4440b008 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -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 diff --git a/src/d_player.h b/src/d_player.h index 261054ebd..e164e1afe 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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 diff --git a/src/deh_tables.c b/src/deh_tables.c index e627cec06..d77a47cab 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -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 diff --git a/src/g_game.c b/src/g_game.c index a3f436cc2..679407869 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -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)); diff --git a/src/g_input.c b/src/g_input.c index 2af3174ab..279cae0f3 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -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]) diff --git a/src/g_input.h b/src/g_input.h index f149d01bc..84d9df55f 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -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];