From b35a05ad618b6e71e7dc606ca7470fcc67d4808f Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 5 Apr 2024 00:38:58 +0100 Subject: [PATCH 1/3] M_CountMedals: Don't count Platinums towards the overall counter, they're explicitly 101% (This func isn't used by Challenges - M_GotEnoughMedals is, and that doesn't care about AUTOMEDAL_PLATINUM) --- src/m_cond.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/m_cond.c b/src/m_cond.c index 3bfdc6b65..3deba3a63 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -3441,16 +3441,31 @@ INT32 M_CountMedals(boolean all, boolean extraonly) { for (i = 0; i < numemblems; ++i) { + // Not init in SOC if (emblemlocations[i].type == ET_NONE) continue; + + // Not explicitly a medal if ((emblemlocations[i].type == ET_GLOBAL) && (emblemlocations[i].flags & GE_NOTMEDAL)) continue; + + // Not getting the counter, and not collected if (!all && !gamedata->collected[i]) continue; + + // Don't count Platinums in the overall count, so you can get 101% going for them + if (all + && (emblemlocations[i].type == ET_TIME) + && (emblemlocations[i].tag == AUTOMEDAL_PLATINUM)) + continue; + + // Relevant, add to da counter found++; } } + + // Above but for extramedals for (i = 0; i < MAXUNLOCKABLES; ++i) { if (unlockables[i].type != SECRET_EXTRAMEDAL) @@ -3459,6 +3474,7 @@ INT32 M_CountMedals(boolean all, boolean extraonly) continue; found++; } + return found; } @@ -3473,14 +3489,28 @@ boolean M_GotEnoughMedals(INT32 number) INT32 i, gottenmedals = 0; for (i = 0; i < numemblems; ++i) { + // Not init in SOC if (emblemlocations[i].type == ET_NONE) continue; + + // Not explicitly a medal + if ((emblemlocations[i].type == ET_GLOBAL) + && (emblemlocations[i].flags & GE_NOTMEDAL)) + continue; + + // Not collected if (!gamedata->collected[i]) continue; + + // Add to counter. Hit our threshold? if (++gottenmedals < number) continue; + + // We did! return true; } + + // Above but for extramedals for (i = 0; i < MAXUNLOCKABLES; ++i) { if (unlockables[i].type != SECRET_EXTRAMEDAL) @@ -3491,6 +3521,8 @@ boolean M_GotEnoughMedals(INT32 number) continue; return true; } + + // Didn't hit our counter! return false; } From 0427f7f3ff9d29ff45eabba6bc965834607a8ade Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 5 Apr 2024 00:45:12 +0100 Subject: [PATCH 2/3] Don't show uncollected Platinum medals You'll see the Platinum time to reach as a guiding star when Time Attacking the specific course, but with no accompanying empty medal icon. Also - fixes an x coordinate issue for higher medal quantity on the version that draws under the timestamp - cache SECRET_ENCORE and SECRET_SPBATTACK availability in the statistics drawer too --- src/g_game.c | 10 ++++++++-- src/g_game.h | 1 + src/k_hud.cpp | 13 +++++++++---- src/k_menudraw.c | 43 +++++++++++++++++++++++++++---------------- 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index fa2ca0839..f983a070c 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -440,8 +440,14 @@ void G_UpdateTimeStickerMedals(UINT16 map, boolean showownrecord) if (cv_dummyspbattack.value && !(emblem->flags & (ME_SPBATTACK|ME_ENCORE))) return; - if (!gamedata->collected[(emblem-emblemlocations)] && gonnadrawtime) - break; + if (!gamedata->collected[(emblem-emblemlocations)]) + { + if (gonnadrawtime) + break; + + if (emblem->type == ET_TIME && emblem->tag == AUTOMEDAL_PLATINUM) + stickermedalinfo.platinumcount++; + } // Simpler than having two checks if (stickermedalinfo.visiblecount == MAXMEDALVISIBLECOUNT) diff --git a/src/g_game.h b/src/g_game.h index 8d3ea37b8..232ba411f 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -213,6 +213,7 @@ void G_EndGame(void); // moved from y_inter.c/h and renamed extern struct stickermedalinfo { UINT8 visiblecount; + UINT8 platinumcount; UINT8 jitter; boolean norecord; tic_t timetoreach; diff --git a/src/k_hud.cpp b/src/k_hud.cpp index 4b3f1f079..d02285c96 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -2015,7 +2015,7 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT32 splitflags, U Draw(workx, worky).text(text); } - workx -= (6 + (i*5)); + workx -= (((1 + i - stickermedalinfo.platinumcount)*6) - 1); if (!mode) splitflags = (splitflags &~ V_HUDTRANSHALF)|V_HUDTRANS; @@ -2029,16 +2029,21 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT32 splitflags, U static_cast(W_CachePatchName(M_GetEmblemPatch(stickermedalinfo.emblems[i], false), PU_CACHE)), R_GetTranslationColormap(TC_DEFAULT, M_GetEmblemColor(stickermedalinfo.emblems[i]), GTC_CACHE) ); + + workx += 6; } - else + else if ( + stickermedalinfo.emblems[i]->type != ET_TIME + || stickermedalinfo.emblems[i]->tag != AUTOMEDAL_PLATINUM + ) { V_DrawMappedPatch(workx, worky, splitflags, static_cast(W_CachePatchName("NEEDIT", PU_CACHE)), NULL ); - } - workx += 6; + workx += 6; + } } } diff --git a/src/k_menudraw.c b/src/k_menudraw.c index 5fd50d562..c311e86b6 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -7952,24 +7952,32 @@ challengedesc: #define STATSSTEP 10 -static void M_DrawMapMedals(INT32 mapnum, INT32 x, INT32 y) +static void M_DrawMapMedals(INT32 mapnum, INT32 x, INT32 y, boolean allowtime, boolean allowencore, boolean allowspb) { UINT8 lasttype = UINT8_MAX, curtype; // M_GetLevelEmblems is ONE-indexed, urgh - mapnum++; + emblem_t *emblem = M_GetLevelEmblems(mapnum+1); - emblem_t *emblem = M_GetLevelEmblems(mapnum); - - boolean hasmedals = (emblem != NULL); + const boolean hasmedals = (emblem != NULL); + boolean collected = false; while (emblem) { + collected = gamedata->collected[emblem-emblemlocations]; switch (emblem->type) { case ET_TIME: + { + if (!allowtime + || (!collected && emblem->tag == AUTOMEDAL_PLATINUM)) + { + emblem = M_GetLevelEmblems(-1); + continue; + } curtype = 1; break; + } case ET_GLOBAL: { if (emblem->flags & GE_NOTMEDAL) @@ -7982,8 +7990,8 @@ static void M_DrawMapMedals(INT32 mapnum, INT32 x, INT32 y) } case ET_MAP: { - if (((emblem->flags & ME_ENCORE) && !M_SecretUnlocked(SECRET_ENCORE, true)) - || ((emblem->flags & ME_SPBATTACK) && !M_SecretUnlocked(SECRET_SPBATTACK, true))) + if (((emblem->flags & ME_ENCORE) && !allowencore) + || ((emblem->flags & ME_SPBATTACK) && !allowspb)) { emblem = M_GetLevelEmblems(-1); continue; @@ -7992,8 +8000,10 @@ static void M_DrawMapMedals(INT32 mapnum, INT32 x, INT32 y) break; } default: + { curtype = 0; break; + } } // Shift over if emblem is of a different discipline @@ -8001,7 +8011,7 @@ static void M_DrawMapMedals(INT32 mapnum, INT32 x, INT32 y) x -= 4; lasttype = curtype; - if (gamedata->collected[emblem-emblemlocations]) + if (collected) V_DrawMappedPatch(x, y, 0, W_CachePatchName(M_GetEmblemPatch(emblem, false), PU_CACHE), R_GetTranslationColormap(TC_DEFAULT, M_GetEmblemColor(emblem), GTC_MENUCACHE)); else @@ -8011,9 +8021,6 @@ static void M_DrawMapMedals(INT32 mapnum, INT32 x, INT32 y) x -= 8; } - // Undo offset - mapnum--; - if (hasmedals) x -= 4; @@ -8107,6 +8114,10 @@ static void M_DrawStatsMaps(void) i = -1; + const boolean allowencore = M_SecretUnlocked(SECRET_ENCORE, true); + const boolean allowspb = M_SecretUnlocked(SECRET_SPBATTACK, true); + boolean allowtime = false; + while ((mnum = statisticsmenu.maplist[++i]) != NEXTMAP_INVALID) { if (location) @@ -8157,13 +8168,13 @@ static void M_DrawStatsMaps(void) V_DrawFadeFill(24, y + 5, (BASEVIDWIDTH - 24) - 24, 3, 0, 31, 8 - (i & 1)*2); - if (!(mapheaderinfo[mnum]->menuflags & LF2_NOTIMEATTACK) - && ( + allowtime = ( (timeattack[0] && (mapheaderinfo[mnum]->typeoflevel & TOL_RACE)) || (timeattack[1] && (mapheaderinfo[mnum]->typeoflevel & TOL_BATTLE)) || (timeattack[2] && (mapheaderinfo[mnum]->typeoflevel & (TOL_SPECIAL|TOL_VERSUS))) - ) - ) + ); + + if (!(mapheaderinfo[mnum]->menuflags & LF2_NOTIMEATTACK) && allowtime) { besttime = mapheaderinfo[mnum]->records.timeattack.time; @@ -8183,7 +8194,7 @@ static void M_DrawStatsMaps(void) } } - M_DrawMapMedals(mnum, medalspos - 8, y); + M_DrawMapMedals(mnum, medalspos - 8, y, allowtime, allowencore, allowspb); if (mapheaderinfo[mnum]->menuttl[0]) { From e3a22019ab3377c9b545e423b02d030ffc6caf3a Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 5 Apr 2024 00:46:19 +0100 Subject: [PATCH 3/3] Update Statistics menu to use the same font as the micro version of the Timestamp --- src/k_hud.cpp | 21 ++++++++++++++------- src/k_hud.h | 1 + src/k_menudraw.c | 23 +++++++++++++---------- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/k_hud.cpp b/src/k_hud.cpp index d02285c96..7053e2f25 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -1930,6 +1930,19 @@ tic_t K_TranslateTimer(tic_t drawtime, UINT8 mode, INT32 *return_jitter) return drawtime; } +INT32 K_drawKartMicroTime(const char *todrawtext, INT32 workx, INT32 worky, INT32 splitflags) +{ + using srb2::Draw; + Draw::TextElement text(todrawtext); + text.flags(splitflags); + text.font(Draw::Font::kZVote); + + INT32 result = text.width(); + Draw(workx - result, worky).text(text); + + return result; +} + void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT32 splitflags, UINT8 mode) { // TIME_X = BASEVIDWIDTH-124; // 196 @@ -2006,13 +2019,7 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT32 splitflags, U } } - using srb2::Draw; - Draw::TextElement text(stickermedalinfo.targettext); - text.flags(splitflags); - text.font(Draw::Font::kZVote); - - workx -= text.width(); - Draw(workx, worky).text(text); + workx -= K_drawKartMicroTime(stickermedalinfo.targettext, workx, worky, splitflags); } workx -= (((1 + i - stickermedalinfo.platinumcount)*6) - 1); diff --git a/src/k_hud.h b/src/k_hud.h index 24adfa195..1eefc155e 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -45,6 +45,7 @@ void K_drawKartFreePlay(void); void K_drawKartPowerUps(void); void K_drawSpectatorHUD(boolean director); void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT32 splitflags, UINT8 mode); +INT32 K_drawKartMicroTime(const char *todrawtext, INT32 workx, INT32 worky, INT32 splitflags); void K_drawKart2PTimestamp(void); void K_drawKart4PTimestamp(void); void K_drawEmeraldWin(boolean overlay); diff --git a/src/k_menudraw.c b/src/k_menudraw.c index c311e86b6..f3c9ead4e 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -8178,20 +8178,23 @@ static void M_DrawStatsMaps(void) { besttime = mapheaderinfo[mnum]->records.timeattack.time; + const char *todrawtext = "--'--\"--"; + if (besttime) { - V_DrawRightAlignedString((BASEVIDWIDTH-24), y+1, 0, - va("%02d'%02d\"%02d", - G_TicsToMinutes(besttime, true), - G_TicsToSeconds(besttime), - G_TicsToCentiseconds(besttime) - ) + todrawtext = va("%02d'%02d\"%02d", + G_TicsToMinutes(besttime, true), + G_TicsToSeconds(besttime), + G_TicsToCentiseconds(besttime) ); } - else - { - V_DrawRightAlignedString((BASEVIDWIDTH-24), y+1, V_GRAYMAP, "--'--\"--"); - } + + K_drawKartMicroTime( + todrawtext, + (BASEVIDWIDTH-24), + y, + (besttime ? 0 : V_TRANSLUCENT) + ); } M_DrawMapMedals(mnum, medalspos - 8, y, allowtime, allowencore, allowspb);