diff --git a/src/doomstat.h b/src/doomstat.h index ffac81726..4e102277a 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -534,6 +534,7 @@ extern tic_t hyubgone; extern tic_t mapreset; extern boolean thwompsactive; extern SINT8 spbplace; +extern boolean rainbowstartavailable; extern tic_t bombflashtimer; // Used to avoid causing seizures if multiple mines explode close to you :) extern boolean legitimateexit; diff --git a/src/g_game.c b/src/g_game.c index f359b28f4..64e69276c 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -289,6 +289,7 @@ tic_t hyubgone; // Cooldown before hyudoro is allowed to be rerolled tic_t mapreset; // Map reset delay when enough players have joined an empty game boolean thwompsactive; // Thwomps activate on lap 2 SINT8 spbplace; // SPB exists, give the person behind better items +boolean rainbowstartavailable; // Boolean, keeps track of if the rainbow start was gotten // Client-sided, unsynched variables (NEVER use in anything that needs to be synced with other players) tic_t bombflashtimer = 0; // Cooldown before another FlashPal can be intialized by a bomb exploding near a displayplayer. Avoids seizures. diff --git a/src/k_kart.c b/src/k_kart.c index 79e5e355f..d6f678527 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6488,7 +6488,7 @@ Stage 1: red sparks Stage 2: blue sparks Stage 3: big large rainbow sparks */ -static void K_SpawnDriftBoostExplosion(player_t *player, int stage) +void K_SpawnDriftBoostExplosion(player_t *player, int stage) { mobj_t *overlay = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_DRIFTEXPLODE); diff --git a/src/k_kart.h b/src/k_kart.h index d03dd35f7..c06f2bef3 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -63,6 +63,7 @@ void K_UpdateDistanceFromFinishLine(player_t *const player); boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y); INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue); INT32 K_GetKartDriftSparkValue(player_t *player); +void K_SpawnDriftBoostExplosion(player_t *player, int stage); void K_KartUpdatePosition(player_t *player); void K_DropItems(player_t *player); void K_StripItems(player_t *player); diff --git a/src/p_saveg.c b/src/p_saveg.c index 82affdd4b..58fe82174 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -3472,6 +3472,7 @@ static void P_NetArchiveMisc(void) WRITEUINT8(save_p, thwompsactive); WRITESINT8(save_p, spbplace); + WRITEUINT8(save_p, rainbowstartavailable); // Is it paused? if (paused) @@ -3597,6 +3598,7 @@ static inline boolean P_NetUnArchiveMisc(void) thwompsactive = (boolean)READUINT8(save_p); spbplace = READSINT8(save_p); + rainbowstartavailable = (boolean)READUINT8(save_p); // Is it paused? if (READUINT8(save_p) == 0x2f) diff --git a/src/p_setup.c b/src/p_setup.c index 0f9e98702..406ed347c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2368,6 +2368,7 @@ lumpnum_t lastloadedmaplumpnum; // for comparative savegame static void P_LevelInitStuff(void) { INT32 i; + UINT8 p = 0; leveltime = 0; @@ -2414,6 +2415,9 @@ static void P_LevelInitStuff(void) for (i = 0; i < MAXPLAYERS; i++) { + if (playeringame[i] && !players[i].spectator) + p++; + if (grandprixinfo.gp == false) { players[i].lives = 3; @@ -2463,6 +2467,11 @@ static void P_LevelInitStuff(void) players[i].follower = NULL; } + rainbowstartavailable = false; + + if (p >= 2) + rainbowstartavailable = true; + // SRB2Kart: map load variables if (grandprixinfo.gp == true) { @@ -2505,6 +2514,10 @@ static void P_LevelInitStuff(void) memset(&battleovertime, 0, sizeof(struct battleovertime)); speedscramble = encorescramble = -1; + + + + } // diff --git a/src/p_spec.c b/src/p_spec.c index 6d1df0ef0..ea96ab268 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2194,6 +2194,13 @@ static void K_HandleLapIncrement(player_t *player) player->karthud[khud_fault] = 1; player->mo->momx = player->mo->momy = 0; } + else if (rainbowstartavailable == true) + { + S_StartSound(player->mo, sfx_s23c); + player->kartstuff[k_driftboost] = 125; + K_SpawnDriftBoostExplosion(player, 3); + rainbowstartavailable = false; + } } }