From 10319386c2469cb881b4fbd978a3b2868e4a1886 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Thu, 11 Feb 2021 20:25:22 -0500 Subject: [PATCH] Do starttime calculation on second tick instead Attempts to fix replays & adding bots. --- src/k_kart.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/k_kart.h | 1 + src/p_setup.c | 50 ++++++++++++-------------------------------------- src/p_tick.c | 7 +++++++ 4 files changed, 71 insertions(+), 38 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 2f01f2dc0..026ac665f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -43,6 +43,57 @@ // indirectitemcooldown is timer before anyone's allowed another Shrink/SPB // mapreset is set when enough players fill an empty server +void K_TimerInit(void) +{ + UINT8 i; + UINT8 numPlayers = 0; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i]) + { + continue; + } + + if (players[i].spectator == true) + { + continue; + } + + numPlayers++; + } + + if (numPlayers >= 2) + { + rainbowstartavailable = true; + } + else + { + rainbowstartavailable = false; + } + + if (numPlayers <= 2) + { + introtime = 0; // No intro in Record Attack / 1v1 + } + else + { + introtime = (108) + 5; // 108 for rotation, + 5 for white fade + } + + numbulbs = 5; + + if (numPlayers > 2) + { + numbulbs += (numPlayers-2); + } + + starttime = (introtime + (3*TICRATE)) + ((2*TICRATE) + (numbulbs * bulbtime)); // Start countdown time, + buffer time + + // NOW you can try to spawn in the Battle capsules, if there's not enough players for a match + K_SpawnBattleCapsules(); +} + UINT16 K_GetPlayerDontDrawFlag(player_t *player) { UINT16 flag = 0; diff --git a/src/k_kart.h b/src/k_kart.h index 9b92fff7c..71073587e 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -17,6 +17,7 @@ angle_t K_ReflectAngle(angle_t angle, angle_t against, fixed_t maxspeed, fixed_t void K_RegisterKartStuff(void); +void K_TimerInit(void); UINT16 K_GetPlayerDontDrawFlag(player_t *player); boolean K_IsPlayerLosing(player_t *player); fixed_t K_GetKartGameSpeedScalar(SINT8 value); diff --git a/src/p_setup.c b/src/p_setup.c index 6cd4ffd72..a9e05f6f8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3427,29 +3427,6 @@ static void P_InitLevelSettings(void) players[i].follower = NULL; } - rainbowstartavailable = false; - - if (p >= 2) - rainbowstartavailable = true; - - if (p <= 2) - { - introtime = 0; // No intro in Record Attack / 1v1 - } - else - { - introtime = (108) + 5; // 108 for rotation, + 5 for white fade - } - - numbulbs = 5; - - if (p > 2) - { - numbulbs += (p-2); - } - - starttime = (introtime + (3*TICRATE)) + ((2*TICRATE) + (numbulbs * bulbtime)); // Start countdown time, + buffer time - // SRB2Kart: map load variables if (grandprixinfo.gp == true) { @@ -4149,21 +4126,6 @@ boolean P_LoadLevel(boolean fromnetsave) lastmaploaded = gamemap; // HAS to be set after saving!! } - if (!fromnetsave) // uglier hack - { // to make a newly loaded level start on the second frame. - INT32 buf = gametic % TICQUEUE; - for (i = 0; i < MAXPLAYERS; i++) - { - if (playeringame[i]) - G_CopyTiccmd(&players[i].cmd, &netcmds[buf][i], 1); - } - P_PreTicker(2); - LUAh_MapLoad(); - } - - // NOW you can try to spawn in the Battle capsules, if there's not enough players for a match - K_SpawnBattleCapsules(); - if (grandprixinfo.gp == true) { if (grandprixinfo.initalize == true) @@ -4183,6 +4145,18 @@ boolean P_LoadLevel(boolean fromnetsave) K_UpdateMatchRaceBots(); } + if (!fromnetsave) // uglier hack + { // to make a newly loaded level start on the second frame. + INT32 buf = gametic % TICQUEUE; + for (i = 0; i < MAXPLAYERS; i++) + { + if (playeringame[i]) + G_CopyTiccmd(&players[i].cmd, &netcmds[buf][i], 1); + } + P_PreTicker(2); + LUAh_MapLoad(); + } + // No render mode, stop here. if (rendermode == render_none) return true; diff --git a/src/p_tick.c b/src/p_tick.c index 71ded772c..85ee844dd 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -705,6 +705,13 @@ void P_Ticker(boolean run) if (demo.playback) G_StoreRewindInfo(); + if (leveltime == 2) + { + // The values needed to set this properly are not correct at map load, + // so we have to do it at the second tick instead... + K_TimerInit(); + } + // Z_CheckMemCleanup(); }