diff --git a/src/d_player.h b/src/d_player.h index 166927be9..1eb5ba6aa 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -578,6 +578,15 @@ struct altview_t INT32 tics; }; +// enum for saved lap times +typedef enum +{ + LAP_CUR, + LAP_BEST, + LAP_LAST, + LAP__MAX +} laptime_e; + extern altview_t titlemapcam; // ======================================================================== @@ -897,6 +906,7 @@ struct player_t INT16 totalring; // Total number of rings obtained for GP tic_t realtime; // integer replacement for leveltime + tic_t laptime[LAP__MAX]; UINT8 laps; // Number of laps (optional) UINT8 latestlap; UINT32 lapPoints; // Points given from laps diff --git a/src/doomstat.h b/src/doomstat.h index 20f0531ba..38902b1d1 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -871,7 +871,6 @@ extern boolean inDuel; extern tic_t bombflashtimer; // Used to avoid causing seizures if multiple mines explode close to you :) extern boolean legitimateexit; extern boolean comebackshowninfo; -extern tic_t curlap, bestlap; #define VOTE_SPECIAL (MAXPLAYERS) #define VOTE_TOTAL (MAXPLAYERS+1) diff --git a/src/g_game.c b/src/g_game.c index 56b3538a9..484f432e8 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -322,8 +322,6 @@ boolean inDuel; // Boolean, keeps track of if it is a 1v1 tic_t bombflashtimer = 0; // Cooldown before another FlashPal can be intialized by a bomb exploding near a displayplayer. Avoids seizures. boolean legitimateexit; // Did this client actually finish the match? boolean comebackshowninfo; // Have you already seen the "ATTACK OR PROTECT" message? -tic_t curlap; // Current lap time -tic_t bestlap; // Best lap time boolean precache = true; // if true, load all graphics at start @@ -561,8 +559,8 @@ void G_UpdateRecords(void) if (modeattacking & ATTACKING_LAP) { - if ((record->lap == 0) || (bestlap < record->lap)) - record->lap = bestlap; + if ((record->lap == 0) || (players[consoleplayer].laptime[LAP_BEST] < record->lap)) + record->lap = players[consoleplayer].laptime[LAP_BEST]; } // Check emblems when level data is updated @@ -606,7 +604,7 @@ static void G_UpdateRecordReplays(void) // Save demo! bestdemo[255] = '\0'; lastdemo[255] = '\0'; - G_SetDemoTime(players[consoleplayer].realtime, bestlap); + G_SetDemoTime(players[consoleplayer].realtime, players[consoleplayer].laptime[LAP_BEST]); G_CheckDemoStatus(); gpath = va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s", @@ -2179,6 +2177,10 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) level_tally_t tally; boolean tallyactive; + tic_t laptime[LAP__MAX]; + + INT32 i; + // This needs to be first, to permit it to wipe extra information jointime = players[player].jointime; if (jointime <= 1) @@ -2206,6 +2208,11 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) kartspeed = skins[players[player].skin].kartspeed; kartweight = skins[players[player].skin].kartweight; charflags = skins[players[player].skin].flags; + + for (i = 0; i < LAP__MAX; i++) + { + laptime[i] = 0; + } } else { @@ -2218,6 +2225,11 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) kartweight = players[player].kartweight; charflags = (skinflags & SF_IRONMAN) ? skinflags : players[player].charflags; + + for (i = 0; i < LAP__MAX; i++) + { + laptime[i] = players[player].laptime[i]; + } } lastfakeskin = players[player].lastfakeskin; @@ -2456,6 +2468,11 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) p->lapPoints = lapPoints; p->totalring = totalring; + for (i = 0; i < LAP__MAX; i++) + { + p->laptime[i] = laptime[i]; + } + p->bot = bot; p->botvars.difficulty = botdifficulty; p->rings = rings; @@ -2519,8 +2536,6 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) // Check to make sure their color didn't change somehow... if (G_GametypeHasTeams()) { - UINT8 i; - if (p->ctfteam == 1 && p->skincolor != skincolor_redteam) { for (i = 0; i <= splitscreen; i++) diff --git a/src/k_hud.cpp b/src/k_hud.cpp index 62e26ab6c..77fdb9c1b 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -6089,7 +6089,26 @@ void K_drawKartHUD(void) { bool ta = modeattacking && !demo.playback; INT32 flags = V_HUDTRANS|V_SLIDEIN|V_SNAPTOTOP|V_SNAPTORIGHT; - K_drawKartTimestamp(stplyr->realtime, TIME_X, TIME_Y + (ta ? 2 : 0), flags, 0); + + if (stplyr->karthud[khud_lapanimation] + && !stplyr->exiting + && stplyr->laptime[LAP_LAST] != 0 + && stplyr->laptime[LAP_LAST] != UINT32_MAX) + { + if ((stplyr->karthud[khud_lapanimation] / 5) & 1) + { + K_drawKartTimestamp(stplyr->laptime[LAP_LAST], TIME_X, TIME_Y + (ta ? 2 : 0), flags, 0); + } + else + { + V_DrawScaledPatch(TIME_X, TIME_Y + (ta ? 2 : 0), flags, kp_timestickerwide); + } + } + else + { + K_drawKartTimestamp(stplyr->realtime, TIME_X, TIME_Y + (ta ? 2 : 0), flags, 0); + } + if (modeattacking) { if (ta) diff --git a/src/p_saveg.c b/src/p_saveg.c index 90e575b19..a9a22ac14 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -274,6 +274,10 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEINT16(save->p, players[i].totalring); WRITEUINT32(save->p, players[i].realtime); + for (j = 0; j < LAP__MAX; j++) + { + WRITEUINT32(save->p, players[i].laptime[j]); + } WRITEUINT8(save->p, players[i].laps); WRITEUINT8(save->p, players[i].latestlap); WRITEUINT32(save->p, players[i].lapPoints); @@ -910,6 +914,10 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].totalring = READINT16(save->p); // Total number of rings obtained for GP players[i].realtime = READUINT32(save->p); // integer replacement for leveltime + for (j = 0; j < LAP__MAX; j++) + { + players[i].laptime[j] = READUINT32(save->p); + } players[i].laps = READUINT8(save->p); // Number of laps (optional) players[i].latestlap = READUINT8(save->p); players[i].lapPoints = READUINT32(save->p); diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 5b78c9b80..548bdf914 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -7675,7 +7675,6 @@ static void P_InitLevelSettings(void) } racecountdown = exitcountdown = musiccountdown = exitfadestarted = 0; - curlap = bestlap = 0; // SRB2Kart g_exit.losing = false; g_exit.retry = false; diff --git a/src/p_spec.c b/src/p_spec.c index 68356d7ca..f7f46b4e0 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2094,16 +2094,14 @@ static void K_HandleLapIncrement(player_t *player) if (player->laps > 1) { // save best lap for record attack - if (modeattacking && player == &players[consoleplayer]) + if (player->laptime[LAP_CUR] < player->laptime[LAP_BEST] || player->laptime[LAP_BEST] == 0) { - if (curlap < bestlap || bestlap == 0) - { - bestlap = curlap; - } - - curlap = 0; + player->laptime[LAP_BEST] = player->laptime[LAP_CUR]; } + player->laptime[LAP_LAST] = player->laptime[LAP_CUR]; + player->laptime[LAP_CUR] = 0; + // Update power levels for this lap. K_UpdatePowerLevels(player, player->laps, false); @@ -2223,7 +2221,7 @@ static void K_HandleLapDecrement(player_t *player) player->cheatchecknum = numcheatchecks; player->laps--; K_UpdateAllPlayerPositions(); - curlap = UINT32_MAX; + player->laptime[LAP_CUR] = UINT32_MAX; } } } diff --git a/src/p_user.c b/src/p_user.c index 94451957b..1741f36f8 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4322,19 +4322,16 @@ void P_PlayerThink(player_t *player) if (leveltime >= starttime) { player->realtime = leveltime - starttime; - if (player == &players[consoleplayer]) - { - if (player->spectator) - curlap = 0; - else if (curlap != UINT32_MAX) - curlap++; // This is too complicated to sync to realtime, just sorta hope for the best :V - } + + if (player->spectator) + player->laptime[LAP_CUR] = 0; + else if (player->laptime[LAP_CUR] != UINT32_MAX) + player->laptime[LAP_CUR]++; // This is too complicated to sync to realtime, just sorta hope for the best :V } else { player->realtime = 0; - if (player == &players[consoleplayer]) - curlap = 0; + player->laptime[LAP_CUR] = 0; } }