From c299831737f58d211377a139db4457836151b49e Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 4 Mar 2024 19:29:37 +0000 Subject: [PATCH] Fade out characters you haven't unlocked yet in Time Attack demos exclusively - Objects - Minimap All other HUD items need to be done manually, but the lives icon doesn't show up in time attack so this minimum should be fine --- src/k_hud.cpp | 12 ++++++---- src/r_skins.c | 11 ++++++++-- src/r_skins.h | 1 + src/r_spritefx.cpp | 7 ++++++ src/r_things.cpp | 55 +++++++++++++++++++++++++--------------------- 5 files changed, 55 insertions(+), 31 deletions(-) diff --git a/src/k_hud.cpp b/src/k_hud.cpp index 87d1095ec..5cdef51e4 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -88,6 +88,7 @@ patch_t *kp_facenum[MAXPLAYERS+1]; static patch_t *kp_facehighlight[8]; static patch_t *kp_nocontestminimap; +static patch_t *kp_unknownminimap; static patch_t *kp_spbminimap; static patch_t *kp_wouldyoustillcatchmeifiwereaworm; static patch_t *kp_catcherminimap; @@ -386,7 +387,7 @@ void K_LoadKartHUDGraphics(void) // Special minimap icons HU_UpdatePatch(&kp_nocontestminimap, "MINIDEAD"); - + HU_UpdatePatch(&kp_unknownminimap, "HUHMAP"); HU_UpdatePatch(&kp_spbminimap, "SPBMMAP"); HU_UpdatePatch(&kp_wouldyoustillcatchmeifiwereaworm, "MINIPROG"); @@ -4401,6 +4402,9 @@ static void K_drawKartMinimap(void) skin = ((skin_t*)g->mo->skin)-skins; else skin = 0; + + workingPic = R_CanShowSkinInDemo(skin) ? faceprefix[skin][FACE_MINIMAP] : kp_unknownminimap; + if (g->mo->color) { if (g->mo->colorized) @@ -4414,7 +4418,7 @@ static void K_drawKartMinimap(void) interpx = R_InterpolateFixed(g->mo->old_x, g->mo->x); interpy = R_InterpolateFixed(g->mo->old_y, g->mo->y); - K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, faceprefix[skin][FACE_MINIMAP], colormap); + K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, workingPic, colormap); g = g->next; } } @@ -4470,7 +4474,7 @@ static void K_drawKartMinimap(void) { skin = ((skin_t*)mobj->skin)-skins; - workingPic = faceprefix[skin][FACE_MINIMAP]; + workingPic = R_CanShowSkinInDemo(skin) ? faceprefix[skin][FACE_MINIMAP] : kp_unknownminimap; if (mobj->color) { @@ -4666,7 +4670,7 @@ static void K_drawKartMinimap(void) { skin = ((skin_t*)mobj->skin)-skins; - workingPic = faceprefix[skin][FACE_MINIMAP]; + workingPic = R_CanShowSkinInDemo(skin) ? faceprefix[skin][FACE_MINIMAP] : kp_unknownminimap; if (mobj->color) { diff --git a/src/r_skins.c b/src/r_skins.c index d98577c60..89e5ff159 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -229,7 +229,7 @@ UINT8 *R_GetSkinAvailabilities(boolean demolock, INT32 botforcecharacter) boolean R_SkinUsable(INT32 playernum, INT32 skinnum, boolean demoskins) { boolean needsunlocked = false; - boolean useplayerstruct = ((Playing() || demo.playback) && playernum != -1); + boolean useplayerstruct = ((Playing() || demo.playback) && playernum >= 0); UINT16 i; INT32 skinid; @@ -299,6 +299,13 @@ boolean R_SkinUsable(INT32 playernum, INT32 skinnum, boolean demoskins) return (boolean)(gamedata->unlocked[i]); } +boolean R_CanShowSkinInDemo(INT32 skinnum) +{ + if (modeattacking == ATTACKING_NONE && !(demo.playback && demo.attract)) + return true; + return R_SkinUsable(-2, skinnum, false); +} + // Returns a random unlocked skin ID. UINT32 R_GetLocalRandomSkin(void) { @@ -307,7 +314,7 @@ UINT32 R_GetLocalRandomSkin(void) for (i = 0; i < numskins; i++) { - if (!R_SkinUsable(-1, i, false)) + if (!R_SkinUsable(-2, i, false)) continue; grabskins[usableskins++] = i; } diff --git a/src/r_skins.h b/src/r_skins.h index 57b12825f..03816d758 100644 --- a/src/r_skins.h +++ b/src/r_skins.h @@ -115,6 +115,7 @@ INT32 R_SkinAvailable(const char *name); INT32 R_SkinAvailableEx(const char *name, boolean demoskins); boolean R_SkinUsable(INT32 playernum, INT32 skinnum, boolean demoskins); UINT8 *R_GetSkinAvailabilities(boolean demolock, INT32 botforcecharacter); +boolean R_CanShowSkinInDemo(INT32 skinnum); // Setting void SetPlayerSkin(INT32 playernum,const char *skinname); diff --git a/src/r_spritefx.cpp b/src/r_spritefx.cpp index ae3edcf84..af34788ca 100644 --- a/src/r_spritefx.cpp +++ b/src/r_spritefx.cpp @@ -44,6 +44,13 @@ INT32 R_ThingLightLevel(mobj_t* thing) { lightlevel -= 255; } + + if (!R_CanShowSkinInDemo((skin_t*)thing->skin-skins) + && !thing->colorized + && !thing->hitlag) + { + lightlevel -= 128; + } } return lightlevel; diff --git a/src/r_things.cpp b/src/r_things.cpp index 52cb52521..a91eb128f 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -835,37 +835,42 @@ boolean R_ThingIsFlashing(mobj_t *thing) UINT8 *R_GetSpriteTranslation(vissprite_t *vis) { - if (!(vis->cut & SC_PRECIP) && - R_ThingIsFlashing(vis->mobj)) + if (vis->cut & SC_PRECIP) { - return R_GetTranslationColormap(TC_HITLAG, static_cast(0), GTC_CACHE); + // Simplified func, less safe properties to check + if (vis->mobj->color) + R_GetTranslationColormap(TC_DEFAULT, static_cast(vis->mobj->color), GTC_CACHE); + return NULL; } - /* - else if (R_SpriteIsFlashing(vis)) // Bosses "flash" + + size_t skinnum = TC_DEFAULT; + + if (vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // This thing is a player! { - if (vis->mobj->type == MT_CYBRAKDEMON || vis->mobj->colorized) - return R_GetTranslationColormap(TC_ALLWHITE, 0, GTC_CACHE); - else if (vis->mobj->type == MT_METALSONIC_BATTLE) - return R_GetTranslationColormap(TC_METALSONIC, 0, GTC_CACHE); - else - return R_GetTranslationColormap(TC_BOSS, 0, GTC_CACHE); - } - */ - else if (vis->mobj->color) - { - // New colormap stuff for skins Tails 06-07-2002 - if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized) - return R_GetTranslationColormap(TC_RAINBOW, static_cast(vis->mobj->color), GTC_CACHE); - else if (!(vis->cut & SC_PRECIP) && vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // This thing is a player! + skinnum = (skin_t*)vis->mobj->skin-skins; + + // Hide not-yet-unlocked characters in replays from other people + if (!R_CanShowSkinInDemo(skinnum)) { - size_t skinnum = (skin_t*)vis->mobj->skin-skins; - return R_GetTranslationColormap((INT32)skinnum, static_cast(vis->mobj->color), GTC_CACHE); + skinnum = TC_BLINK; } - else // Use the defaults - return R_GetTranslationColormap(TC_DEFAULT, static_cast(vis->mobj->color), GTC_CACHE); } - else if (vis->mobj->sprite == SPR_PLAY) // Looks like a player, but doesn't have a color? Get rid of green sonic syndrome. - return R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_BLUE, GTC_CACHE); + + if (R_ThingIsFlashing(vis->mobj)) + { + if (skinnum != (size_t)TC_BLINK) + skinnum = TC_HITLAG; + + return R_GetTranslationColormap(skinnum, static_cast(0), GTC_CACHE); + } + + if (vis->mobj->color) + { + if (skinnum != (size_t)TC_BLINK && vis->mobj->colorized) + skinnum = TC_RAINBOW; + + return R_GetTranslationColormap(skinnum, static_cast(vis->mobj->color), GTC_CACHE); + } return NULL; }