diff --git a/src/g_game.c b/src/g_game.c index 18605d9fa..4a4d25f1a 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2879,7 +2879,7 @@ mapthing_t *G_FindMapStart(INT32 playernum) // -- DM/Tag/CTF-spectator/etc -- // Order: DM->CTF->Race - else if (gametyperules & GTR_BATTLESTARTS) + else if ((gametyperules & GTR_BATTLESTARTS) && !battleprisons) spawnpoint = G_FindBattleStartOrFallback(playernum); // -- Other game modes -- diff --git a/src/k_kart.c b/src/k_kart.c index 3804235c5..5cb6235c9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -125,11 +125,6 @@ void K_TimerReset(void) g_pointlimit = 0; } -boolean K_ShouldSpawnDuelItems(void) -{ - return (inDuel == true || (grandprixinfo.gp && grandprixinfo.eventmode == GPEVENT_BONUS)); -} - static void K_SpawnItemCapsules(void) { mapthing_t *mt = mapthings; @@ -281,7 +276,10 @@ void K_TimerInit(void) timelimitintics = K_TimeLimitForGametype(); g_pointlimit = K_PointLimitForGametype(); - if (K_ShouldSpawnDuelItems()) + // K_TimerInit is called after all mapthings are spawned, + // so they didn't know if it's supposed to be a duel + // (inDuel is always false before K_TimerInit is called). + if (inDuel) { K_SpawnDuelOnlyItems(); } diff --git a/src/k_kart.h b/src/k_kart.h index 3224e1256..ec4fe9fa1 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -233,8 +233,6 @@ void K_KartEbrakeVisuals(player_t *p); void K_HandleDirectionalInfluence(player_t *player); fixed_t K_DefaultPlayerRadius(player_t *player); -boolean K_ShouldSpawnDuelItems(void); - // sound stuff for lua void K_PlayAttackTaunt(mobj_t *source); void K_PlayBoostTaunt(mobj_t *source); diff --git a/src/p_mobj.c b/src/p_mobj.c index ce279a0d4..497275b93 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12486,12 +12486,18 @@ static boolean P_AllowMobjSpawn(mapthing_t* mthing, mobjtype_t i) break; } - if (!K_ShouldSpawnDuelItems()) + // This duel check is tricky. + // At map load, inDuel is always false, because + // K_TimerInit is called afterward. K_TimerInit will then + // spawn all the duel mode objects itself, which ends up + // calling this function again. + // So that's why this check is even here. + if (inDuel == false && (grandprixinfo.gp == false || grandprixinfo.eventmode != GPEVENT_BONUS)) { if (K_IsDuelItem(i) == true && K_DuelItemAlwaysSpawns(mthing) == false) { - // Only spawns in Duels. + // Only spawns in Duels or GP bonus rounds. return false; } } diff --git a/src/p_tick.c b/src/p_tick.c index 3e1e2bb1c..9f0b33da7 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -1081,7 +1081,8 @@ void P_Ticker(boolean run) ACS_RunPositionScript(); } - if (timelimitintics > 0 && leveltime == (timelimitintics + starttime + 1)) + if ((gametyperules & GTR_OVERTIME) && !battleprisons && + timelimitintics > 0 && leveltime == (timelimitintics + starttime + 1)) { ACS_RunOvertimeScript(); }