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
This commit is contained in:
toaster 2024-03-04 19:29:37 +00:00 committed by James R
parent 96a6fe85f1
commit c299831737
5 changed files with 55 additions and 31 deletions

View file

@ -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)
{

View file

@ -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;
}

View file

@ -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);

View file

@ -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;

View file

@ -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<skincolornum_t>(0), GTC_CACHE);
// Simplified func, less safe properties to check
if (vis->mobj->color)
R_GetTranslationColormap(TC_DEFAULT, static_cast<skincolornum_t>(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<skincolornum_t>(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<skincolornum_t>(vis->mobj->color), GTC_CACHE);
skinnum = TC_BLINK;
}
else // Use the defaults
return R_GetTranslationColormap(TC_DEFAULT, static_cast<skincolornum_t>(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<skincolornum_t>(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<skincolornum_t>(vis->mobj->color), GTC_CACHE);
}
return NULL;
}