mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-27 04:21:47 +00:00
stickermedalinfo, UpdateTimeStickerMedals: A centralised struct for Medal info attached to the time sticker.
- K_drawKartTimestamp: Significantly less messy, no longer dependent on static variables, and no longer iterates over M_GetLevelEmblems every rendered frame(!!)
- TODO: Still handles playing sound in the drawer
- K_PrepareTimeAttack: Initial generation of a struct of emblems/text is handled on the menu
- G_UpdateRecords: Updated in-game if you unlock the next medal there
This commit was amended to centralise the new material in g_game.c and reduce the number of header additions required.
This commit is contained in:
parent
63fbdcfbc0
commit
4522ba3b4d
6 changed files with 144 additions and 102 deletions
90
src/g_game.c
90
src/g_game.c
|
|
@ -465,11 +465,6 @@ void G_ClearRecords(void)
|
||||||
Z_Free(mapheaderinfo[i]->mainrecord);
|
Z_Free(mapheaderinfo[i]->mainrecord);
|
||||||
mapheaderinfo[i]->mainrecord = NULL;
|
mapheaderinfo[i]->mainrecord = NULL;
|
||||||
}
|
}
|
||||||
/*if (nightsrecords[i])
|
|
||||||
{
|
|
||||||
Z_Free(nightsrecords[i]);
|
|
||||||
nightsrecords[i] = NULL;
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -495,6 +490,84 @@ tic_t G_GetBestLap(INT16 map)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
struct stickermedalinfo stickermedalinfo;
|
||||||
|
|
||||||
|
void G_UpdateTimeStickerMedals(UINT16 map)
|
||||||
|
{
|
||||||
|
emblem_t *emblem = M_GetLevelEmblems(map+1);
|
||||||
|
boolean gonnadrawtime = false;
|
||||||
|
|
||||||
|
stickermedalinfo.visiblecount = 0;
|
||||||
|
stickermedalinfo.targettext[0] = '\0';
|
||||||
|
stickermedalinfo.emblems[0] = stickermedalinfo.regenemblem = NULL;
|
||||||
|
stickermedalinfo.timetoreach = UINT32_MAX;
|
||||||
|
stickermedalinfo.canplaysound = true;
|
||||||
|
|
||||||
|
while (emblem != NULL)
|
||||||
|
{
|
||||||
|
UINT8 i = 0;
|
||||||
|
|
||||||
|
switch (emblem->type)
|
||||||
|
{
|
||||||
|
case ET_TIME:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
goto bademblem;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gamedata->collected[(emblem-emblemlocations)] && gonnadrawtime)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Simpler than having two checks
|
||||||
|
if (stickermedalinfo.visiblecount == MAXMEDALVISIBLECOUNT)
|
||||||
|
stickermedalinfo.visiblecount--;
|
||||||
|
|
||||||
|
// Shuffle along, so [0] is the "main focus"
|
||||||
|
for (i = stickermedalinfo.visiblecount; i > 0; i--)
|
||||||
|
{
|
||||||
|
stickermedalinfo.emblems[i] = stickermedalinfo.emblems[i-1];
|
||||||
|
}
|
||||||
|
stickermedalinfo.emblems[0] = emblem;
|
||||||
|
stickermedalinfo.visiblecount++;
|
||||||
|
|
||||||
|
if (!gamedata->collected[(emblem-emblemlocations)] || Playing())
|
||||||
|
gonnadrawtime = true;
|
||||||
|
|
||||||
|
bademblem:
|
||||||
|
emblem = M_GetLevelEmblems(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stickermedalinfo.visiblecount > 0)
|
||||||
|
{
|
||||||
|
if (emblem != NULL && emblem != stickermedalinfo.emblems[0])
|
||||||
|
{
|
||||||
|
// Regenerate the entire array if this is unlocked
|
||||||
|
stickermedalinfo.regenemblem = emblem;
|
||||||
|
}
|
||||||
|
emblem = stickermedalinfo.emblems[0];
|
||||||
|
|
||||||
|
if (gonnadrawtime)
|
||||||
|
{
|
||||||
|
stickermedalinfo.timetoreach = emblem->var;
|
||||||
|
if (emblem->tag > 0)
|
||||||
|
{
|
||||||
|
if (emblem->tag > mapheaderinfo[map]->ghostCount
|
||||||
|
|| mapheaderinfo[map]->ghostBrief[emblem->tag-1] == NULL)
|
||||||
|
goto bademblem;
|
||||||
|
|
||||||
|
stickermedalinfo.timetoreach = mapheaderinfo[map]->ghostBrief[emblem->tag-1]->time;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(stickermedalinfo.targettext, 9, "%i'%02i\"%02i",
|
||||||
|
G_TicsToMinutes(stickermedalinfo.timetoreach, false),
|
||||||
|
G_TicsToSeconds(stickermedalinfo.timetoreach),
|
||||||
|
G_TicsToCentiseconds(stickermedalinfo.timetoreach));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// G_UpdateRecords
|
// G_UpdateRecords
|
||||||
//
|
//
|
||||||
|
|
@ -534,7 +607,14 @@ void G_UpdateRecords(void)
|
||||||
|
|
||||||
// Check emblems when level data is updated
|
// Check emblems when level data is updated
|
||||||
if ((earnedEmblems = M_CheckLevelEmblems()))
|
if ((earnedEmblems = M_CheckLevelEmblems()))
|
||||||
|
{
|
||||||
CONS_Printf(M_GetText("\x82" "Earned %hu medal%s for Record Attack records.\n"), (UINT16)earnedEmblems, earnedEmblems > 1 ? "s" : "");
|
CONS_Printf(M_GetText("\x82" "Earned %hu medal%s for Record Attack records.\n"), (UINT16)earnedEmblems, earnedEmblems > 1 ? "s" : "");
|
||||||
|
if (stickermedalinfo.regenemblem != NULL
|
||||||
|
&& gamedata->collected[(stickermedalinfo.regenemblem-emblemlocations)])
|
||||||
|
{
|
||||||
|
G_UpdateTimeStickerMedals(gamemap-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
M_UpdateUnlockablesAndExtraEmblems(true);
|
M_UpdateUnlockablesAndExtraEmblems(true);
|
||||||
G_SaveGameData();
|
G_SaveGameData();
|
||||||
|
|
|
||||||
12
src/g_game.h
12
src/g_game.h
|
|
@ -201,6 +201,18 @@ void G_UseContinue(void);
|
||||||
void G_AfterIntermission(void);
|
void G_AfterIntermission(void);
|
||||||
void G_EndGame(void); // moved from y_inter.c/h and renamed
|
void G_EndGame(void); // moved from y_inter.c/h and renamed
|
||||||
|
|
||||||
|
#define MAXMEDALVISIBLECOUNT 3
|
||||||
|
extern struct stickermedalinfo
|
||||||
|
{
|
||||||
|
UINT8 visiblecount;
|
||||||
|
boolean canplaysound;
|
||||||
|
tic_t timetoreach;
|
||||||
|
emblem_t *emblems[MAXMEDALVISIBLECOUNT];
|
||||||
|
emblem_t *regenemblem;
|
||||||
|
char targettext[9];
|
||||||
|
} stickermedalinfo;
|
||||||
|
|
||||||
|
void G_UpdateTimeStickerMedals(UINT16 map);
|
||||||
void G_UpdateRecords(void);
|
void G_UpdateRecords(void);
|
||||||
|
|
||||||
void G_Ticker(boolean run);
|
void G_Ticker(boolean run);
|
||||||
|
|
|
||||||
133
src/k_hud.c
133
src/k_hud.c
|
|
@ -1466,14 +1466,11 @@ static void K_drawKartItem(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UINT8 mode)
|
void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, UINT8 mode)
|
||||||
{
|
{
|
||||||
// TIME_X = BASEVIDWIDTH-124; // 196
|
// TIME_X = BASEVIDWIDTH-124; // 196
|
||||||
// TIME_Y = 6; // 6
|
// TIME_Y = 6; // 6
|
||||||
|
|
||||||
static UINT8 prevmode = UINT8_MAX;
|
|
||||||
static emblem_t *maxemblem = NULL;
|
|
||||||
|
|
||||||
tic_t worktime;
|
tic_t worktime;
|
||||||
INT32 jitter = 0;
|
INT32 jitter = 0;
|
||||||
|
|
||||||
|
|
@ -1513,10 +1510,6 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode != prevmode)
|
|
||||||
maxemblem = NULL;
|
|
||||||
prevmode = mode;
|
|
||||||
|
|
||||||
V_DrawScaledPatch(TX, TY, splitflags, ((mode == 2) ? kp_lapstickerwide : kp_timestickerwide));
|
V_DrawScaledPatch(TX, TY, splitflags, ((mode == 2) ? kp_lapstickerwide : kp_timestickerwide));
|
||||||
|
|
||||||
TX += 33;
|
TX += 33;
|
||||||
|
|
@ -1557,105 +1550,57 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UI
|
||||||
V_DrawKartString(TX+84, TY+3-jitter, splitflags, va("%d", worktime%10));
|
V_DrawKartString(TX+84, TY+3-jitter, splitflags, va("%d", worktime%10));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (emblemmap && (modeattacking || (mode == 1)) && !demo.playback) // emblem time!
|
// Medal data!
|
||||||
|
if ((modeattacking || (mode == 1))
|
||||||
|
&& !demo.playback
|
||||||
|
&& stickermedalinfo.visiblecount > 0)
|
||||||
{
|
{
|
||||||
INT32 workx = TX + 96, worky = TY+18;
|
INT32 workx = TX + 96, worky = TY+18;
|
||||||
SINT8 curemb = 0;
|
UINT8 i = stickermedalinfo.visiblecount;
|
||||||
patch_t *emblempic[3] = {NULL, NULL, NULL};
|
|
||||||
UINT8 *emblemcol[3] = {NULL, NULL, NULL};
|
|
||||||
|
|
||||||
emblem_t *emblem = M_GetLevelEmblems(emblemmap);
|
if (stickermedalinfo.targettext[0] != '\0')
|
||||||
|
|
||||||
while (emblem)
|
|
||||||
{
|
{
|
||||||
char targettext[9];
|
if (!mode)
|
||||||
|
|
||||||
emblem_t *nextemblem = M_GetLevelEmblems(-1);
|
|
||||||
|
|
||||||
switch (emblem->type)
|
|
||||||
{
|
{
|
||||||
case ET_TIME:
|
if (stplyr->realtime > stickermedalinfo.timetoreach)
|
||||||
|
{
|
||||||
|
splitflags = (splitflags &~ V_HUDTRANS)|V_HUDTRANSHALF;
|
||||||
|
if (stickermedalinfo.canplaysound)
|
||||||
{
|
{
|
||||||
static boolean canplaysound = true;
|
S_StartSound(NULL, sfx_s3k72); //sfx_s26d); -- you STOLE fizzy lifting drinks
|
||||||
tic_t timetoreach = emblem->var;
|
stickermedalinfo.canplaysound = false;
|
||||||
|
|
||||||
if (gamedata->collected[(emblem-emblemlocations)])
|
|
||||||
{
|
|
||||||
emblempic[curemb] = W_CachePatchName(M_GetEmblemPatch(emblem, false), PU_CACHE);
|
|
||||||
emblemcol[curemb] = R_GetTranslationColormap(TC_DEFAULT, M_GetEmblemColor(emblem), GTC_CACHE);
|
|
||||||
curemb++;
|
|
||||||
|
|
||||||
if (emblem == maxemblem
|
|
||||||
&& nextemblem != NULL
|
|
||||||
&& nextemblem->type == emblem->type
|
|
||||||
&& gamedata->collected[(nextemblem-emblemlocations)])
|
|
||||||
maxemblem = NULL;
|
|
||||||
|
|
||||||
if (emblem != maxemblem)
|
|
||||||
goto bademblem;
|
|
||||||
}
|
|
||||||
|
|
||||||
maxemblem = emblem;
|
|
||||||
|
|
||||||
if (emblem->tag > 0)
|
|
||||||
{
|
|
||||||
if (emblem->tag > mapheaderinfo[emblemmap-1]->ghostCount
|
|
||||||
|| mapheaderinfo[emblemmap-1]->ghostBrief[emblem->tag-1] == NULL)
|
|
||||||
goto bademblem;
|
|
||||||
|
|
||||||
timetoreach = mapheaderinfo[emblemmap-1]->ghostBrief[emblem->tag-1]->time;
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(targettext, 9, "%i'%02i\"%02i",
|
|
||||||
G_TicsToMinutes(timetoreach, false),
|
|
||||||
G_TicsToSeconds(timetoreach),
|
|
||||||
G_TicsToCentiseconds(timetoreach));
|
|
||||||
|
|
||||||
if (!mode)
|
|
||||||
{
|
|
||||||
if (stplyr->realtime > timetoreach)
|
|
||||||
{
|
|
||||||
splitflags = (splitflags &~ V_HUDTRANS)|V_HUDTRANSHALF;
|
|
||||||
if (canplaysound)
|
|
||||||
{
|
|
||||||
S_StartSound(NULL, sfx_s3k72); //sfx_s26d); -- you STOLE fizzy lifting drinks
|
|
||||||
canplaysound = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!canplaysound)
|
|
||||||
canplaysound = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
targettext[8] = 0;
|
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
default:
|
|
||||||
goto bademblem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
workx -= V_ThinStringWidth(targettext, splitflags|V_6WIDTHSPACE);
|
workx -= V_ThinStringWidth(stickermedalinfo.targettext, splitflags|V_6WIDTHSPACE);
|
||||||
V_DrawThinString(workx, worky, splitflags|V_6WIDTHSPACE, targettext);
|
V_DrawThinString(workx, worky, splitflags|V_6WIDTHSPACE, stickermedalinfo.targettext);
|
||||||
|
|
||||||
if (emblem != maxemblem || !gamedata->collected[(emblem-emblemlocations)])
|
|
||||||
{
|
|
||||||
emblempic[curemb] = W_CachePatchName("NEEDIT", PU_CACHE);
|
|
||||||
curemb++;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
bademblem:
|
|
||||||
if (emblem == maxemblem || curemb == 3)
|
|
||||||
break;
|
|
||||||
emblem = nextemblem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
workx -= (6 + (i*5));
|
||||||
|
|
||||||
if (!mode)
|
if (!mode)
|
||||||
splitflags = (splitflags &~ V_HUDTRANSHALF)|V_HUDTRANS;
|
splitflags = (splitflags &~ V_HUDTRANSHALF)|V_HUDTRANS;
|
||||||
while (curemb--)
|
while (i > 0)
|
||||||
{
|
{
|
||||||
workx -= 11;
|
i--;
|
||||||
V_DrawSmallMappedPatch(workx, worky, splitflags, emblempic[curemb], emblemcol[curemb]);
|
|
||||||
|
if (gamedata->collected[(stickermedalinfo.emblems[i]-emblemlocations)])
|
||||||
|
{
|
||||||
|
V_DrawSmallMappedPatch(workx, worky, splitflags,
|
||||||
|
W_CachePatchName(M_GetEmblemPatch(stickermedalinfo.emblems[i], false), PU_CACHE),
|
||||||
|
R_GetTranslationColormap(TC_DEFAULT, M_GetEmblemColor(stickermedalinfo.emblems[i]), GTC_CACHE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
V_DrawSmallMappedPatch(workx, worky, splitflags,
|
||||||
|
W_CachePatchName("NEEDIT", PU_CACHE),
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
workx += 6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5089,7 +5034,7 @@ void K_drawKartHUD(void)
|
||||||
{
|
{
|
||||||
// Draw the timestamp
|
// Draw the timestamp
|
||||||
if (LUA_HudEnabled(hud_time))
|
if (LUA_HudEnabled(hud_time))
|
||||||
K_drawKartTimestamp(stplyr->realtime, TIME_X, TIME_Y, gamemap, 0);
|
K_drawKartTimestamp(stplyr->realtime, TIME_X, TIME_Y, 0);
|
||||||
|
|
||||||
islonesome = K_drawKartPositionFaces();
|
islonesome = K_drawKartPositionFaces();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ const char *K_GetItemPatch(UINT8 item, boolean tiny);
|
||||||
void K_LoadKartHUDGraphics(void);
|
void K_LoadKartHUDGraphics(void);
|
||||||
void K_drawKartHUD(void);
|
void K_drawKartHUD(void);
|
||||||
void K_drawKartFreePlay(void);
|
void K_drawKartFreePlay(void);
|
||||||
void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UINT8 mode);
|
void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, UINT8 mode);
|
||||||
void K_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol);
|
void K_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol);
|
||||||
void K_DrawMapThumbnail(INT32 x, INT32 y, INT32 width, UINT32 flags, UINT16 map, UINT8 *colormap);
|
void K_DrawMapThumbnail(INT32 x, INT32 y, INT32 width, UINT32 flags, UINT16 map, UINT8 *colormap);
|
||||||
void K_DrawLikeMapThumbnail(INT32 x, INT32 y, INT32 width, UINT32 flags, patch_t *patch, UINT8 *colormap);
|
void K_DrawLikeMapThumbnail(INT32 x, INT32 y, INT32 width, UINT32 flags, patch_t *patch, UINT8 *colormap);
|
||||||
|
|
|
||||||
|
|
@ -2266,7 +2266,7 @@ void M_DrawTimeAttack(void)
|
||||||
&& (mapheaderinfo[map]->numlaps != 1))
|
&& (mapheaderinfo[map]->numlaps != 1))
|
||||||
{
|
{
|
||||||
V_DrawRightAlignedString(rightedge-12, timeheight, highlightflags, "BEST LAP:");
|
V_DrawRightAlignedString(rightedge-12, timeheight, highlightflags, "BEST LAP:");
|
||||||
K_drawKartTimestamp(laprec, 162+t, timeheight+6, 0, 2);
|
K_drawKartTimestamp(laprec, 162+t, timeheight+6, 2);
|
||||||
timeheight += 30;
|
timeheight += 30;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -2275,7 +2275,7 @@ void M_DrawTimeAttack(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
V_DrawRightAlignedString(rightedge-12, timeheight, highlightflags, "BEST TIME:");
|
V_DrawRightAlignedString(rightedge-12, timeheight, highlightflags, "BEST TIME:");
|
||||||
K_drawKartTimestamp(timerec, 162+t, timeheight+6, map+1, 1);
|
K_drawKartTimestamp(timerec, 162+t, timeheight+6, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
opty = 80;
|
opty = 80;
|
||||||
|
|
|
||||||
|
|
@ -178,6 +178,7 @@ void M_PrepareTimeAttack(INT32 choice)
|
||||||
{
|
{
|
||||||
(void) choice;
|
(void) choice;
|
||||||
|
|
||||||
|
// Gametype guess
|
||||||
if (levellist.guessgt != MAXGAMETYPES)
|
if (levellist.guessgt != MAXGAMETYPES)
|
||||||
{
|
{
|
||||||
levellist.newgametype = levellist.guessgt;
|
levellist.newgametype = levellist.guessgt;
|
||||||
|
|
@ -189,6 +190,10 @@ void M_PrepareTimeAttack(INT32 choice)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Time-sticker Medals
|
||||||
|
G_UpdateTimeStickerMedals(levellist.choosemap);
|
||||||
|
|
||||||
|
// Menu options
|
||||||
{
|
{
|
||||||
// see also p_setup.c's P_LoadRecordGhosts
|
// see also p_setup.c's P_LoadRecordGhosts
|
||||||
char *gpath = Z_StrDup(va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s", srb2home, timeattackfolder, G_BuildMapName(levellist.choosemap+1)));
|
char *gpath = Z_StrDup(va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s", srb2home, timeattackfolder, G_BuildMapName(levellist.choosemap+1)));
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue