Show last lap time on HUD

Inspired by RoyKirbs' Joypolis journey
This commit is contained in:
Sally Coolatta 2024-04-11 03:05:11 -04:00
parent a27c41b23d
commit f1f7edbe9a
8 changed files with 72 additions and 27 deletions

View file

@ -578,6 +578,15 @@ struct altview_t
INT32 tics; INT32 tics;
}; };
// enum for saved lap times
typedef enum
{
LAP_CUR,
LAP_BEST,
LAP_LAST,
LAP__MAX
} laptime_e;
extern altview_t titlemapcam; extern altview_t titlemapcam;
// ======================================================================== // ========================================================================
@ -897,6 +906,7 @@ struct player_t
INT16 totalring; // Total number of rings obtained for GP INT16 totalring; // Total number of rings obtained for GP
tic_t realtime; // integer replacement for leveltime tic_t realtime; // integer replacement for leveltime
tic_t laptime[LAP__MAX];
UINT8 laps; // Number of laps (optional) UINT8 laps; // Number of laps (optional)
UINT8 latestlap; UINT8 latestlap;
UINT32 lapPoints; // Points given from laps UINT32 lapPoints; // Points given from laps

View file

@ -871,7 +871,6 @@ extern boolean inDuel;
extern tic_t bombflashtimer; // Used to avoid causing seizures if multiple mines explode close to you :) extern tic_t bombflashtimer; // Used to avoid causing seizures if multiple mines explode close to you :)
extern boolean legitimateexit; extern boolean legitimateexit;
extern boolean comebackshowninfo; extern boolean comebackshowninfo;
extern tic_t curlap, bestlap;
#define VOTE_SPECIAL (MAXPLAYERS) #define VOTE_SPECIAL (MAXPLAYERS)
#define VOTE_TOTAL (MAXPLAYERS+1) #define VOTE_TOTAL (MAXPLAYERS+1)

View file

@ -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. 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 legitimateexit; // Did this client actually finish the match?
boolean comebackshowninfo; // Have you already seen the "ATTACK OR PROTECT" message? 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 boolean precache = true; // if true, load all graphics at start
@ -561,8 +559,8 @@ void G_UpdateRecords(void)
if (modeattacking & ATTACKING_LAP) if (modeattacking & ATTACKING_LAP)
{ {
if ((record->lap == 0) || (bestlap < record->lap)) if ((record->lap == 0) || (players[consoleplayer].laptime[LAP_BEST] < record->lap))
record->lap = bestlap; record->lap = players[consoleplayer].laptime[LAP_BEST];
} }
// Check emblems when level data is updated // Check emblems when level data is updated
@ -606,7 +604,7 @@ static void G_UpdateRecordReplays(void)
// Save demo! // Save demo!
bestdemo[255] = '\0'; bestdemo[255] = '\0';
lastdemo[255] = '\0'; lastdemo[255] = '\0';
G_SetDemoTime(players[consoleplayer].realtime, bestlap); G_SetDemoTime(players[consoleplayer].realtime, players[consoleplayer].laptime[LAP_BEST]);
G_CheckDemoStatus(); G_CheckDemoStatus();
gpath = va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s", gpath = va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s",
@ -2179,6 +2177,10 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
level_tally_t tally; level_tally_t tally;
boolean tallyactive; boolean tallyactive;
tic_t laptime[LAP__MAX];
INT32 i;
// This needs to be first, to permit it to wipe extra information // This needs to be first, to permit it to wipe extra information
jointime = players[player].jointime; jointime = players[player].jointime;
if (jointime <= 1) if (jointime <= 1)
@ -2206,6 +2208,11 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
kartspeed = skins[players[player].skin].kartspeed; kartspeed = skins[players[player].skin].kartspeed;
kartweight = skins[players[player].skin].kartweight; kartweight = skins[players[player].skin].kartweight;
charflags = skins[players[player].skin].flags; charflags = skins[players[player].skin].flags;
for (i = 0; i < LAP__MAX; i++)
{
laptime[i] = 0;
}
} }
else else
{ {
@ -2218,6 +2225,11 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
kartweight = players[player].kartweight; kartweight = players[player].kartweight;
charflags = (skinflags & SF_IRONMAN) ? skinflags : players[player].charflags; 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; lastfakeskin = players[player].lastfakeskin;
@ -2456,6 +2468,11 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
p->lapPoints = lapPoints; p->lapPoints = lapPoints;
p->totalring = totalring; p->totalring = totalring;
for (i = 0; i < LAP__MAX; i++)
{
p->laptime[i] = laptime[i];
}
p->bot = bot; p->bot = bot;
p->botvars.difficulty = botdifficulty; p->botvars.difficulty = botdifficulty;
p->rings = rings; p->rings = rings;
@ -2519,8 +2536,6 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
// Check to make sure their color didn't change somehow... // Check to make sure their color didn't change somehow...
if (G_GametypeHasTeams()) if (G_GametypeHasTeams())
{ {
UINT8 i;
if (p->ctfteam == 1 && p->skincolor != skincolor_redteam) if (p->ctfteam == 1 && p->skincolor != skincolor_redteam)
{ {
for (i = 0; i <= splitscreen; i++) for (i = 0; i <= splitscreen; i++)

View file

@ -6089,7 +6089,26 @@ void K_drawKartHUD(void)
{ {
bool ta = modeattacking && !demo.playback; bool ta = modeattacking && !demo.playback;
INT32 flags = V_HUDTRANS|V_SLIDEIN|V_SNAPTOTOP|V_SNAPTORIGHT; INT32 flags = V_HUDTRANS|V_SLIDEIN|V_SNAPTOTOP|V_SNAPTORIGHT;
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); K_drawKartTimestamp(stplyr->realtime, TIME_X, TIME_Y + (ta ? 2 : 0), flags, 0);
}
if (modeattacking) if (modeattacking)
{ {
if (ta) if (ta)

View file

@ -274,6 +274,10 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEINT16(save->p, players[i].totalring); WRITEINT16(save->p, players[i].totalring);
WRITEUINT32(save->p, players[i].realtime); 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].laps);
WRITEUINT8(save->p, players[i].latestlap); WRITEUINT8(save->p, players[i].latestlap);
WRITEUINT32(save->p, players[i].lapPoints); 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].totalring = READINT16(save->p); // Total number of rings obtained for GP
players[i].realtime = READUINT32(save->p); // integer replacement for leveltime 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].laps = READUINT8(save->p); // Number of laps (optional)
players[i].latestlap = READUINT8(save->p); players[i].latestlap = READUINT8(save->p);
players[i].lapPoints = READUINT32(save->p); players[i].lapPoints = READUINT32(save->p);

View file

@ -7675,7 +7675,6 @@ static void P_InitLevelSettings(void)
} }
racecountdown = exitcountdown = musiccountdown = exitfadestarted = 0; racecountdown = exitcountdown = musiccountdown = exitfadestarted = 0;
curlap = bestlap = 0; // SRB2Kart
g_exit.losing = false; g_exit.losing = false;
g_exit.retry = false; g_exit.retry = false;

View file

@ -2094,15 +2094,13 @@ static void K_HandleLapIncrement(player_t *player)
if (player->laps > 1) if (player->laps > 1)
{ {
// save best lap for record attack // 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) player->laptime[LAP_BEST] = player->laptime[LAP_CUR];
{
bestlap = curlap;
} }
curlap = 0; player->laptime[LAP_LAST] = player->laptime[LAP_CUR];
} player->laptime[LAP_CUR] = 0;
// Update power levels for this lap. // Update power levels for this lap.
K_UpdatePowerLevels(player, player->laps, false); K_UpdatePowerLevels(player, player->laps, false);
@ -2223,7 +2221,7 @@ static void K_HandleLapDecrement(player_t *player)
player->cheatchecknum = numcheatchecks; player->cheatchecknum = numcheatchecks;
player->laps--; player->laps--;
K_UpdateAllPlayerPositions(); K_UpdateAllPlayerPositions();
curlap = UINT32_MAX; player->laptime[LAP_CUR] = UINT32_MAX;
} }
} }
} }

View file

@ -4322,19 +4322,16 @@ void P_PlayerThink(player_t *player)
if (leveltime >= starttime) if (leveltime >= starttime)
{ {
player->realtime = leveltime - starttime; player->realtime = leveltime - starttime;
if (player == &players[consoleplayer])
{
if (player->spectator) if (player->spectator)
curlap = 0; player->laptime[LAP_CUR] = 0;
else if (curlap != UINT32_MAX) else if (player->laptime[LAP_CUR] != UINT32_MAX)
curlap++; // This is too complicated to sync to realtime, just sorta hope for the best :V player->laptime[LAP_CUR]++; // This is too complicated to sync to realtime, just sorta hope for the best :V
}
} }
else else
{ {
player->realtime = 0; player->realtime = 0;
if (player == &players[consoleplayer]) player->laptime[LAP_CUR] = 0;
curlap = 0;
} }
} }