mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Force shrink can be toggled individually online
In preparation for a "make yourself small by default" cheat on the char select like SMK.
This commit is contained in:
parent
7e76366fe8
commit
c606e1e96b
12 changed files with 135 additions and 42 deletions
|
|
@ -423,7 +423,7 @@ consvar_t cv_kartallowgiveitem = CVAR_INIT ("kartallowgiveitem",
|
|||
#endif
|
||||
CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_YesNo, NULL
|
||||
);
|
||||
consvar_t cv_kartdebugshrink = CVAR_INIT ("kartdebugshrink", "Off", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_OnOff, NULL);
|
||||
|
||||
consvar_t cv_kartdebugdistribution = CVAR_INIT ("kartdebugdistribution", "Off", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_OnOff, NULL);
|
||||
consvar_t cv_kartdebughuddrop = CVAR_INIT ("kartdebughuddrop", "Off", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_OnOff, NULL);
|
||||
static CV_PossibleValue_t kartdebugwaypoint_cons_t[] = {{0, "Off"}, {1, "Forwards"}, {2, "Backwards"}, {0, NULL}};
|
||||
|
|
@ -935,6 +935,7 @@ void D_RegisterClientCommands(void)
|
|||
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||
{
|
||||
CV_RegisterVar(&cv_kickstartaccel[i]);
|
||||
CV_RegisterVar(&cv_shrinkme[i]);
|
||||
CV_RegisterVar(&cv_turnaxis[i]);
|
||||
CV_RegisterVar(&cv_moveaxis[i]);
|
||||
CV_RegisterVar(&cv_brakeaxis[i]);
|
||||
|
|
@ -1636,10 +1637,13 @@ void SendWeaponPref(UINT8 n)
|
|||
UINT8 buf[1];
|
||||
|
||||
buf[0] = 0;
|
||||
// Player option cvars that need to be synched go HERE
|
||||
|
||||
if (cv_kickstartaccel[n].value)
|
||||
buf[0] |= 1;
|
||||
|
||||
if (cv_shrinkme[n].value)
|
||||
buf[0] |= 2;
|
||||
|
||||
SendNetXCmdForPlayer(n, XD_WEAPONPREF, buf, 1);
|
||||
}
|
||||
|
||||
|
|
@ -1647,11 +1651,22 @@ static void Got_WeaponPref(UINT8 **cp,INT32 playernum)
|
|||
{
|
||||
UINT8 prefs = READUINT8(*cp);
|
||||
|
||||
// Player option cvars that need to be synched go HERE
|
||||
players[playernum].pflags &= ~(PF_KICKSTARTACCEL);
|
||||
players[playernum].pflags &= ~(PF_KICKSTARTACCEL|PF_SHRINKME);
|
||||
|
||||
if (prefs & 1)
|
||||
players[playernum].pflags |= PF_KICKSTARTACCEL;
|
||||
|
||||
if (prefs & 2)
|
||||
players[playernum].pflags |= PF_SHRINKME;
|
||||
|
||||
if (leveltime < 2)
|
||||
{
|
||||
// BAD HACK: No other place I tried to slot this in
|
||||
// made it work for the host when they initally host,
|
||||
// so this will have to do.
|
||||
K_UpdateShrinkCheat(&players[playernum]);
|
||||
}
|
||||
|
||||
// SEE ALSO g_demo.c
|
||||
demo_extradata[playernum] |= DXD_WEAPONPREF;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ extern consvar_t cv_kartusepwrlv;
|
|||
|
||||
extern consvar_t cv_votetime;
|
||||
|
||||
extern consvar_t cv_kartdebugitem, cv_kartdebugamount, cv_kartallowgiveitem, cv_kartdebugshrink, cv_kartdebugdistribution, cv_kartdebughuddrop;
|
||||
extern consvar_t cv_kartdebugitem, cv_kartdebugamount, cv_kartallowgiveitem, cv_kartdebugdistribution, cv_kartdebughuddrop;
|
||||
extern consvar_t cv_kartdebugcheckpoint, cv_kartdebugnodes, cv_kartdebugcolorize;
|
||||
extern consvar_t cv_kartdebugwaypoints, cv_kartdebugbotpredict;
|
||||
|
||||
|
|
|
|||
|
|
@ -59,10 +59,10 @@ typedef enum
|
|||
typedef enum
|
||||
{
|
||||
// True if button down last tic.
|
||||
PF_ATTACKDOWN = 1,
|
||||
PF_ACCELDOWN = 1<<1,
|
||||
PF_BRAKEDOWN = 1<<2,
|
||||
PF_LOOKDOWN = 1<<3,
|
||||
PF_ATTACKDOWN = 1,
|
||||
PF_ACCELDOWN = 1<<1,
|
||||
PF_BRAKEDOWN = 1<<2,
|
||||
PF_LOOKDOWN = 1<<3,
|
||||
|
||||
// Accessibility and cheats
|
||||
PF_KICKSTARTACCEL = 1<<4, // Is accelerate in kickstart mode?
|
||||
|
|
@ -99,6 +99,9 @@ typedef enum
|
|||
PF_HITFINISHLINE = 1<<26, // Already hit the finish line this tic
|
||||
PF_WRONGWAY = 1<<27, // Moving the wrong way with respect to waypoints?
|
||||
|
||||
PF_SHRINKME = 1<<28, // "Shrink me" cheat preference
|
||||
PF_SHRINKACTIVE = 1<<29, // "Shrink me" cheat is in effect. (Can't be disabled mid-race)
|
||||
|
||||
// up to 1<<31 is free
|
||||
} pflags_t;
|
||||
|
||||
|
|
|
|||
|
|
@ -5912,6 +5912,10 @@ const char *const PLAYERFLAG_LIST[] = {
|
|||
|
||||
"HITFINISHLINE", // Already hit the finish line this tic
|
||||
"WRONGWAY", // Moving the wrong way with respect to waypoints?
|
||||
|
||||
"SHRINKME",
|
||||
"SHRINKACTIVE",
|
||||
|
||||
NULL // stop loop here.
|
||||
};
|
||||
|
||||
|
|
|
|||
59
src/g_demo.c
59
src/g_demo.c
|
|
@ -122,8 +122,9 @@ demoghost *ghosts = NULL;
|
|||
#define DF_ENCORE 0x40
|
||||
#define DF_MULTIPLAYER 0x80 // This demo was recorded in multiplayer mode!
|
||||
|
||||
#define DEMO_SPECTATOR 0x40
|
||||
#define DEMO_KICKSTART 0x20
|
||||
#define DEMO_SPECTATOR 0x01
|
||||
#define DEMO_KICKSTART 0x02
|
||||
#define DEMO_SHRINKME 0x04
|
||||
|
||||
// For demos
|
||||
#define ZT_FWD 0x01
|
||||
|
|
@ -351,9 +352,20 @@ void G_ReadDemoExtraData(void)
|
|||
if (extradata & DXD_WEAPONPREF)
|
||||
{
|
||||
i = READUINT8(demo_p);
|
||||
players[p].pflags &= ~(PF_KICKSTARTACCEL);
|
||||
players[p].pflags &= ~(PF_KICKSTARTACCEL|PF_SHRINKME);
|
||||
if (i & 1)
|
||||
players[p].pflags |= PF_KICKSTARTACCEL;
|
||||
if (i & 2)
|
||||
players[p].pflags |= PF_SHRINKME;
|
||||
|
||||
if (leveltime < 2)
|
||||
{
|
||||
// BAD HACK: No other place I tried to slot this in
|
||||
// made it work for the host when they initally host,
|
||||
// so this will have to do.
|
||||
K_UpdateShrinkCheat(&players[p]);
|
||||
}
|
||||
|
||||
//CONS_Printf("weaponpref is %d for player %d\n", i, p);
|
||||
}
|
||||
|
||||
|
|
@ -466,6 +478,8 @@ void G_WriteDemoExtraData(void)
|
|||
UINT8 prefs = 0;
|
||||
if (players[i].pflags & PF_KICKSTARTACCEL)
|
||||
prefs |= 1;
|
||||
if (players[i].pflags & PF_SHRINKME)
|
||||
prefs |= 2;
|
||||
WRITEUINT8(demo_p, prefs);
|
||||
}
|
||||
}
|
||||
|
|
@ -2015,12 +2029,15 @@ void G_BeginRecording(void)
|
|||
for (p = 0; p < MAXPLAYERS; p++) {
|
||||
if (playeringame[p]) {
|
||||
player = &players[p];
|
||||
WRITEUINT8(demo_p, p);
|
||||
|
||||
i = p;
|
||||
if (player->pflags & PF_KICKSTARTACCEL)
|
||||
i |= DEMO_KICKSTART;
|
||||
i = 0;
|
||||
if (player->spectator)
|
||||
i |= DEMO_SPECTATOR;
|
||||
if (player->pflags & PF_KICKSTARTACCEL)
|
||||
i |= DEMO_KICKSTART;
|
||||
if (player->pflags & PF_SHRINKME)
|
||||
i |= DEMO_SHRINKME;
|
||||
WRITEUINT8(demo_p, i);
|
||||
|
||||
// Name
|
||||
|
|
@ -2672,7 +2689,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
UINT32 randseed;
|
||||
char msg[1024];
|
||||
|
||||
boolean spectator, kickstart;
|
||||
boolean spectator, kickstart, shrinkme;
|
||||
UINT8 slots[MAXPLAYERS], kartspeed[MAXPLAYERS], kartweight[MAXPLAYERS], numslots = 0;
|
||||
|
||||
#if defined(SKIPERRORS) && !defined(DEVELOP)
|
||||
|
|
@ -2943,9 +2960,13 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
|
||||
while (p != 0xFF)
|
||||
{
|
||||
if ((spectator = !!(p & DEMO_SPECTATOR)))
|
||||
UINT8 flags = READUINT8(demo_p);
|
||||
|
||||
spectator = kickstart = shrinkme = false;
|
||||
|
||||
if ((spectator = !!(flags & DEMO_SPECTATOR)) == true)
|
||||
{
|
||||
p &= ~DEMO_SPECTATOR;
|
||||
flags &= ~DEMO_SPECTATOR;
|
||||
|
||||
if (modeattacking)
|
||||
{
|
||||
|
|
@ -2960,10 +2981,14 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
}
|
||||
}
|
||||
|
||||
if ((kickstart = (p & DEMO_KICKSTART)))
|
||||
p &= ~DEMO_KICKSTART;
|
||||
if ((kickstart = !!(flags & DEMO_KICKSTART)) == true)
|
||||
flags &= ~DEMO_KICKSTART;
|
||||
|
||||
slots[numslots] = p; numslots++;
|
||||
if ((shrinkme = !!(flags & DEMO_SHRINKME)) == true)
|
||||
flags &= ~DEMO_SHRINKME;
|
||||
|
||||
slots[numslots] = p;
|
||||
numslots++;
|
||||
|
||||
if (modeattacking && numslots > 1)
|
||||
{
|
||||
|
|
@ -2982,11 +3007,19 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
|
||||
playeringame[p] = true;
|
||||
players[p].spectator = spectator;
|
||||
|
||||
if (kickstart)
|
||||
players[p].pflags |= PF_KICKSTARTACCEL;
|
||||
else
|
||||
players[p].pflags &= ~PF_KICKSTARTACCEL;
|
||||
|
||||
if (shrinkme)
|
||||
players[p].pflags |= PF_SHRINKME;
|
||||
else
|
||||
players[p].pflags &= ~PF_SHRINKME;
|
||||
|
||||
K_UpdateShrinkCheat(&players[p]);
|
||||
|
||||
// Name
|
||||
M_Memcpy(player_names[p],demo_p,16);
|
||||
demo_p += 16;
|
||||
|
|
@ -3245,7 +3278,7 @@ void G_AddGhost(char *defdemoname)
|
|||
return;
|
||||
}
|
||||
|
||||
if ((READUINT8(p) & ~DEMO_KICKSTART) != 0)
|
||||
if ((READUINT8(p) & ~(DEMO_KICKSTART|DEMO_SHRINKME)) != 0)
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("Failed to add ghost %s: Invalid player slot.\n"), pdemoname);
|
||||
Z_Free(pdemoname);
|
||||
|
|
|
|||
34
src/g_game.c
34
src/g_game.c
|
|
@ -342,10 +342,10 @@ INT16 prevmap, nextmap;
|
|||
|
||||
static UINT8 *savebuffer;
|
||||
|
||||
static void kickstartaccel_OnChange(void);
|
||||
static void kickstartaccel2_OnChange(void);
|
||||
static void kickstartaccel3_OnChange(void);
|
||||
static void kickstartaccel4_OnChange(void);
|
||||
static void weaponPrefChange(void);
|
||||
static void weaponPrefChange2(void);
|
||||
static void weaponPrefChange3(void);
|
||||
static void weaponPrefChange4(void);
|
||||
|
||||
static CV_PossibleValue_t joyaxis_cons_t[] = {{0, "None"},
|
||||
{1, "X-Axis"}, {2, "Y-Axis"}, {-1, "X-Axis-"}, {-2, "Y-Axis-"},
|
||||
|
|
@ -406,10 +406,17 @@ consvar_t cv_resetspecialmusic = CVAR_INIT ("resetspecialmusic", "Yes", CV_SAVE,
|
|||
consvar_t cv_resume = CVAR_INIT ("resume", "Yes", CV_SAVE, CV_YesNo, NULL);
|
||||
|
||||
consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS] = {
|
||||
CVAR_INIT ("kickstartaccel", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel_OnChange),
|
||||
CVAR_INIT ("kickstartaccel2", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel2_OnChange),
|
||||
CVAR_INIT ("kickstartaccel3", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel3_OnChange),
|
||||
CVAR_INIT ("kickstartaccel4", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel4_OnChange)
|
||||
CVAR_INIT ("kickstartaccel", "Off", CV_SAVE|CV_CALL, CV_OnOff, weaponPrefChange),
|
||||
CVAR_INIT ("kickstartaccel2", "Off", CV_SAVE|CV_CALL, CV_OnOff, weaponPrefChange2),
|
||||
CVAR_INIT ("kickstartaccel3", "Off", CV_SAVE|CV_CALL, CV_OnOff, weaponPrefChange3),
|
||||
CVAR_INIT ("kickstartaccel4", "Off", CV_SAVE|CV_CALL, CV_OnOff, weaponPrefChange4)
|
||||
};
|
||||
|
||||
consvar_t cv_shrinkme[MAXSPLITSCREENPLAYERS] = {
|
||||
CVAR_INIT ("shrinkme", "Off", CV_CALL, CV_OnOff, weaponPrefChange),
|
||||
CVAR_INIT ("shrinkme2", "Off", CV_CALL, CV_OnOff, weaponPrefChange2),
|
||||
CVAR_INIT ("shrinkme3", "Off", CV_CALL, CV_OnOff, weaponPrefChange3),
|
||||
CVAR_INIT ("shrinkme4", "Off", CV_CALL, CV_OnOff, weaponPrefChange4)
|
||||
};
|
||||
|
||||
consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS] = {
|
||||
|
|
@ -1183,22 +1190,22 @@ ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n)
|
|||
return dest;
|
||||
}
|
||||
|
||||
static void kickstartaccel_OnChange(void)
|
||||
static void weaponPrefChange(void)
|
||||
{
|
||||
SendWeaponPref(0);
|
||||
}
|
||||
|
||||
static void kickstartaccel2_OnChange(void)
|
||||
static void weaponPrefChange2(void)
|
||||
{
|
||||
SendWeaponPref(1);
|
||||
}
|
||||
|
||||
static void kickstartaccel3_OnChange(void)
|
||||
static void weaponPrefChange3(void)
|
||||
{
|
||||
SendWeaponPref(2);
|
||||
}
|
||||
|
||||
static void kickstartaccel4_OnChange(void)
|
||||
static void weaponPrefChange4(void)
|
||||
{
|
||||
SendWeaponPref(3);
|
||||
}
|
||||
|
|
@ -2164,7 +2171,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
|
|||
botdiffincrease = players[player].botvars.diffincrease;
|
||||
botrival = players[player].botvars.rival;
|
||||
|
||||
pflags = (players[player].pflags & (PF_WANTSTOJOIN|PF_KICKSTARTACCEL));
|
||||
pflags = (players[player].pflags & (PF_WANTSTOJOIN|PF_KICKSTARTACCEL|PF_SHRINKME|PF_SHRINKACTIVE));
|
||||
|
||||
// SRB2kart
|
||||
if (betweenmaps || leveltime < introtime)
|
||||
|
|
@ -2235,7 +2242,6 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
|
|||
if (!(netgame || multiplayer))
|
||||
pflags |= (players[player].pflags & (PF_GODMODE|PF_NOCLIP));
|
||||
|
||||
|
||||
// Obliterate follower from existence
|
||||
P_SetTarget(&players[player].follower, NULL);
|
||||
|
||||
|
|
|
|||
|
|
@ -55,6 +55,8 @@ extern consvar_t cv_pauseifunfocused;
|
|||
extern consvar_t cv_invertmouse;
|
||||
|
||||
extern consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_shrinkme[MAXSPLITSCREENPLAYERS];
|
||||
|
||||
extern consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_moveaxis[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_brakeaxis[MAXSPLITSCREENPLAYERS];
|
||||
|
|
|
|||
35
src/k_kart.c
35
src/k_kart.c
|
|
@ -250,7 +250,6 @@ void K_RegisterKartStuff(void)
|
|||
|
||||
CV_RegisterVar(&cv_kartdebugitem);
|
||||
CV_RegisterVar(&cv_kartdebugamount);
|
||||
CV_RegisterVar(&cv_kartdebugshrink);
|
||||
CV_RegisterVar(&cv_kartallowgiveitem);
|
||||
CV_RegisterVar(&cv_kartdebugdistribution);
|
||||
CV_RegisterVar(&cv_kartdebughuddrop);
|
||||
|
|
@ -3018,6 +3017,34 @@ UINT16 K_GetKartFlashing(player_t *player)
|
|||
return tics;
|
||||
}
|
||||
|
||||
boolean K_PlayerShrinkCheat(player_t *player)
|
||||
{
|
||||
return (
|
||||
(player->pflags & PF_SHRINKACTIVE)
|
||||
&& (player->bot == false)
|
||||
&& (modeattacking == false) // Anyone want to make another record attack category?
|
||||
);
|
||||
}
|
||||
|
||||
void K_UpdateShrinkCheat(player_t *player)
|
||||
{
|
||||
const boolean mobjValid = (player->mo != NULL && P_MobjWasRemoved(player->mo) == false);
|
||||
|
||||
if (player->pflags & PF_SHRINKME)
|
||||
{
|
||||
player->pflags |= PF_SHRINKACTIVE;
|
||||
}
|
||||
else
|
||||
{
|
||||
player->pflags &= ~PF_SHRINKACTIVE;
|
||||
}
|
||||
|
||||
if (mobjValid == true && K_PlayerShrinkCheat(player) == true)
|
||||
{
|
||||
player->mo->destscale = FixedMul(mapobjectscale, SHRINK_SCALE);
|
||||
}
|
||||
}
|
||||
|
||||
boolean K_KartKickstart(player_t *player)
|
||||
{
|
||||
return ((player->pflags & PF_KICKSTARTACCEL)
|
||||
|
|
@ -3289,7 +3316,7 @@ static void K_RemoveGrowShrink(player_t *player)
|
|||
player->mo->scalespeed = mapobjectscale/TICRATE;
|
||||
player->mo->destscale = mapobjectscale;
|
||||
|
||||
if (cv_kartdebugshrink.value && !modeattacking && !player->bot)
|
||||
if (K_PlayerShrinkCheat(player) == true)
|
||||
{
|
||||
player->mo->destscale = FixedMul(player->mo->destscale, SHRINK_SCALE);
|
||||
}
|
||||
|
|
@ -5276,7 +5303,7 @@ static void K_DoShrink(player_t *user)
|
|||
players[i].mo->scalespeed = mapobjectscale/TICRATE;
|
||||
players[i].mo->destscale = FixedMul(mapobjectscale, SHRINK_SCALE);
|
||||
|
||||
if (cv_kartdebugshrink.value && !modeattacking && !players[i].bot)
|
||||
if (K_PlayerShrinkCheat(&players[i]) == true)
|
||||
{
|
||||
players[i].mo->destscale = FixedMul(players[i].mo->destscale, SHRINK_SCALE);
|
||||
}
|
||||
|
|
@ -9167,7 +9194,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||
player->mo->scalespeed = mapobjectscale/TICRATE;
|
||||
player->mo->destscale = FixedMul(mapobjectscale, GROW_SCALE);
|
||||
|
||||
if (cv_kartdebugshrink.value && !modeattacking && !player->bot)
|
||||
if (K_PlayerShrinkCheat(player) == true)
|
||||
{
|
||||
player->mo->destscale = FixedMul(player->mo->destscale, SHRINK_SCALE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -126,6 +126,8 @@ fixed_t K_GetKartSpeedFromStat(UINT8 kartspeed);
|
|||
fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower);
|
||||
fixed_t K_GetKartAccel(player_t *player);
|
||||
UINT16 K_GetKartFlashing(player_t *player);
|
||||
boolean K_PlayerShrinkCheat(player_t *player);
|
||||
void K_UpdateShrinkCheat(player_t *player);
|
||||
boolean K_KartKickstart(player_t *player);
|
||||
UINT16 K_GetKartButtons(player_t *player);
|
||||
SINT8 K_GetForwardMove(player_t *player);
|
||||
|
|
|
|||
|
|
@ -674,7 +674,7 @@ static void K_HandleDropDash(player_t *player)
|
|||
player->mo->scalespeed = mapobjectscale/TICRATE;
|
||||
player->mo->destscale = FixedMul(mapobjectscale, SHRINK_SCALE);
|
||||
|
||||
if (cv_kartdebugshrink.value && !modeattacking && !player->bot)
|
||||
if (K_PlayerShrinkCheat(player) == true)
|
||||
{
|
||||
player->mo->destscale = FixedMul(player->mo->destscale, SHRINK_SCALE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10843,7 +10843,7 @@ void P_SpawnPlayer(INT32 playernum)
|
|||
|
||||
P_SetTarget(&p->follower, NULL); // cleanse follower from existence
|
||||
|
||||
if (cv_kartdebugshrink.value && !modeattacking && !p->bot)
|
||||
if (K_PlayerShrinkCheat(p) == true)
|
||||
{
|
||||
mobj->destscale = FixedMul(mobj->destscale, SHRINK_SCALE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3462,6 +3462,7 @@ static void P_InitLevelSettings(void)
|
|||
players[i].lives = 3;
|
||||
|
||||
G_PlayerReborn(i, true);
|
||||
K_UpdateShrinkCheat(&players[i]);
|
||||
}
|
||||
|
||||
racecountdown = exitcountdown = exitfadestarted = 0;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue