High Res rank toggle

This commit is contained in:
NepDisk 2026-05-02 13:39:29 -04:00
parent b5e9e1e4da
commit d5529f8458
6 changed files with 54 additions and 20 deletions

View file

@ -103,7 +103,7 @@
#define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291
#define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b
#define ASSET_HASH_MAPS_KART 0x2be29dfb3a146dfa
#define ASSET_HASH_MAIN_PK3 0x4ea7e79e2d5d0d63
#define ASSET_HASH_MAIN_PK3 0x2b05ed51a1fcbe18
#define ASSET_HASH_MAPPATCH_PK3 0x1745690024efbaf8
#define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461
#ifdef USE_PATCH_FILE

View file

@ -115,6 +115,9 @@ consvar_t cv_draftindicator = CVAR_INIT ("draftindicator", "On", CV_SAVE, CV_OnO
consvar_t cv_showstats = CVAR_INIT ("showstats", "On", CV_SAVE, CV_OnOff, NULL);
// make char potraits use their high-res version instead
consvar_t cv_highresportrait = CVAR_INIT ("highresportrait", "Off", CV_SAVE, CV_OnOff, NULL);
typedef enum
{
NT_OFF = 0,
@ -292,6 +295,7 @@ void K_RegisterKartHUDStuff(void)
CV_RegisterVar(&cv_newtabranking);
CV_RegisterVar(&cv_draftindicator);
CV_RegisterVar(&cv_showstats);
CV_RegisterVar(&cv_highresportrait);
// k_items.c
CV_RegisterVar(&cv_fancyroulette);
@ -818,6 +822,16 @@ skincolornum_t K_GetHudColor(void)
return ((stplyr && gamestate == GS_LEVEL) ? stplyr->skincolor : cv_playercolor[0].value);
}
static boolean K_IsHighResolution(void)
{
return (vid.width >= 640 && vid.height >= 400);
}
boolean K_UseHighResPortraits(void)
{
return (cv_highresportrait.value && K_IsHighResolution());
}
static boolean K_BigLapSticker(void)
{
return ((cv_numlaps.value > 9) && (!stplyr->exiting));
@ -2295,7 +2309,9 @@ static boolean K_drawKartPositionFaces(void)
else
colormap = R_GetTranslationColormap(players[rankplayer[i]].skin, players[rankplayer[i]].mo->color, GTC_CACHE);
patch_t *facerank = faceprefix[players[rankplayer[i]].skin][FACE_RANK];
boolean hires = K_UseHighResPortraits();
patch_t *facerank = faceprefix[players[rankplayer[i]].skin][hires ? FACE_WANTED : FACE_RANK];
offsets.x = facerank->leftoffset;
offsets.y = facerank->topoffset;
@ -2314,14 +2330,14 @@ static boolean K_drawKartPositionFaces(void)
}
#endif
V_DrawMappedPatch(FACE_X + offsets.x, Y + offsets.y, V_HUDTRANS|V_SNAPTOLEFT, facerank, colormap);
V_DrawFixedPatch((FACE_X + offsets.x)<<FRACBITS, (Y + offsets.y)<<FRACBITS, hires ? FRACUNIT / 2 : FRACUNIT, V_HUDTRANS|V_SNAPTOLEFT, facerank, colormap);
if (players[rankplayer[i]].smonitortimer)
{
colormap = R_GetTranslationColormap(TC_BLINK, K_SMonitorColor(leveltime / 2), GTC_CACHE);
smntrhudtrans = K_SMonitorHUDVisibility(players[rankplayer[i]].smonitortimer);
V_DrawMappedPatch(FACE_X + offsets.x, Y + offsets.y, smntrhudtrans|V_SNAPTOLEFT|V_ADD, facerank, colormap);
V_DrawFixedPatch((FACE_X + offsets.x)<<FRACBITS, (Y + offsets.y)<<FRACBITS, hires ? FRACUNIT / 2 : FRACUNIT, smntrhudtrans|V_SNAPTOLEFT|V_ADD, facerank, colormap);
}
if (LUA_HudEnabled(hud_battlebumpers))
@ -2852,9 +2868,12 @@ void K_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, IN
else
V_DrawString(x + 20, y2, ((tab[i].num == whiteplayer) ? hightlightcolor : 0)|V_ALLOWLOWERCASE, playername);
patch_t *facerank = faceprefix[players[tab[i].num].skin][FACE_RANK];
boolean hires = K_UseHighResPortraits();
patch_t *facerank = faceprefix[players[tab[i].num].skin][hires ? FACE_WANTED : FACE_RANK];
INT16 leftoffset = facerank->leftoffset;
INT16 topoffset = facerank->topoffset;
V_DrawMappedPatch(x+facerank->leftoffset, y-4+facerank->topoffset, 0, facerank, colormap);
V_DrawFixedPatch((x+leftoffset)<<FRACBITS, (y-4+topoffset)<<FRACBITS, hires ? FRACUNIT/2 : FRACUNIT, 0, facerank, colormap);
/*if ((gametypes[gametype]->rules & GTR_BUMPERS) && players[tab[i].num].bumper > 0) -- not enough space for this
{
@ -3041,8 +3060,11 @@ static void K_drawKartStatsnLives(void)
// We specify stplyr->skincolor since we want it to match the player and not the hud color.
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, stplyr->skincolor, GTC_CACHE);
patch_t *facerank = faceprefix[stplyr->skin][FACE_RANK];
V_DrawMappedPatch(fx+59+offsetx+facerank->leftoffset, fy-16+offsety+facerank->topoffset, V_HUDTRANS|splitflags, facerank, colormap);
boolean hires = K_UseHighResPortraits();
patch_t *facerank = faceprefix[stplyr->skin][hires ? FACE_WANTED : FACE_RANK];
INT16 topoffset = hires ? facerank->topoffset / 2 : facerank->topoffset;
INT16 leftoffset = hires ? facerank->leftoffset / 2 : facerank->leftoffset;
V_DrawFixedPatch((fx+59+offsetx+leftoffset)<<FRACBITS, (fy-16+offsety+topoffset)<<FRACBITS, hires ? FRACUNIT/2 : FRACUNIT, V_HUDTRANS|splitflags, facerank, colormap);
if (stplyr->lives >= 0 && uselives)
V_DrawScaledPatch(fx+77+offsetx, fy-11+offsety, V_HUDTRANS|splitflags, kp_facenum[(stplyr->lives % 10)]); // make sure this doesn't overflow OR underflow
@ -3059,8 +3081,8 @@ static void K_drawKartStatsnLives(void)
colormapstat2 = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_MUSTARD, GTC_CACHE);
}
V_DrawFixedPatch((fx+56+offsetx+facerank->leftoffset)<< FRACBITS, (fy-19+offsety+facerank->topoffset)<< FRACBITS, FRACUNIT, V_HUDTRANS|splitflags, kp_facenum[(stplyr->kartspeed % 10)], colormapstat);
V_DrawFixedPatch((fx+69+offsetx+facerank->leftoffset)<< FRACBITS, (fy-4+offsety+facerank->topoffset)<< FRACBITS, FRACUNIT, V_HUDTRANS|splitflags, kp_facenum[(stplyr->kartweight % 10)], colormapstat2);
V_DrawFixedPatch((fx+56+offsetx+leftoffset)<< FRACBITS, (fy-19+offsety+topoffset)<< FRACBITS, FRACUNIT, V_HUDTRANS|splitflags, kp_facenum[(stplyr->kartspeed % 10)], colormapstat);
V_DrawFixedPatch((fx+69+offsetx+leftoffset)<< FRACBITS, (fy-4+offsety+topoffset)<< FRACBITS, FRACUNIT, V_HUDTRANS|splitflags, kp_facenum[(stplyr->kartweight % 10)], colormapstat2);
}
}
}

View file

@ -73,6 +73,8 @@ extern consvar_t cv_newtabranking;
extern consvar_t cv_kartdebughudtracker;
extern consvar_t cv_highresportrait;
extern patch_t *kp_facenum[MAXPLAYERS+1];
extern patch_t *kp_itemboxminimap;
extern patch_t *kp_minimapdot;
@ -189,6 +191,8 @@ extern patch_t *kp_itemtarget_far[2][2];
extern patch_t *kp_itemtarget_far_text[2];
extern patch_t *kp_itemtarget_near[2][8];
boolean K_UseHighResPortraits(void);
#ifdef __cplusplus
} // extern "C"
#endif

View file

@ -37,6 +37,7 @@
#include "console.h" // cons_menuhighlight
#include "k_itemlist.hpp"
#include "k_vote.h"
#include "k_hud.h"
static INT32 votetimer;
@ -601,9 +602,11 @@ void Y_VoteDrawer(void)
if (players[i].skincolor)
{
UINT8 *colormap = R_GetTranslationColormap(players[i].skin, players[i].skincolor, GTC_CACHE);
patch_t *facerank = faceprefix[players[i].skin][FACE_RANK];
boolean hires = K_UseHighResPortraits();
patch_t *facerank = faceprefix[players[i].skin][hires ? FACE_WANTED : FACE_RANK];
fixed_t hiresscale = hires ? FRACUNIT/2 : FRACUNIT;
V_DrawMappedPatch(x+24+facerank->leftoffset, y+(highplayers ? smallfaceheight : bigfaceheight)+facerank->topoffset, V_SNAPTOLEFT, facerank, colormap);
V_DrawFixedPatch((x+24+facerank->leftoffset)<<FRACBITS, (y+(highplayers ? smallfaceheight : bigfaceheight)+facerank->topoffset)<<FRACBITS, hiresscale, V_SNAPTOLEFT, facerank, colormap);
}
if (!splitscreen && i == consoleplayer)

View file

@ -190,7 +190,7 @@ void ST_LoadGraphics(void)
static boolean ST_IconCanSpinout(UINT8 icon)
{
return ((icon == FACE_MINIMAP)||(icon == FACE_RANK));
return ((icon == FACE_MINIMAP)||(icon == FACE_RANK)||(icon == FACE_WANTED));
}
// made separate so that skins code can reload custom face graphics
@ -215,7 +215,7 @@ void ST_LoadFaceGraphics(INT32 skinnum)
if ((ST_IconCanSpinout(i)) && (!alreadycentered))
{
// Auto-center the pivots of all minimap and rank patches with
// Auto-center the pivots of all minimap ,rank and wanted patches with
// the ability to spinout.
// This is a shitty, hacky solution... but it's less work for spinout
// rotations!

View file

@ -547,9 +547,12 @@ void Y_IntermissionDrawer(void)
UINT8 *colormap = R_GetTranslationColormap(*data.character[i], *data.color[i], GTC_CACHE);
patch_t *facerank;
facerank = faceprefix[*data.character[i]][FACE_RANK];
boolean hires = K_UseHighResPortraits() && !manyplayers16 && !displayitemrolls;
facerank = faceprefix[*data.character[i]][hires ? FACE_WANTED : FACE_RANK];
SINT8 hiresoffsetx = hires ? 8: 0;
SINT8 hiresoffsety = hires ? 2: 0;
fixed_t scale = FRACUNIT;
fixed_t scale = hires ? FRACUNIT / 2 : FRACUNIT;
if (manyplayers16)
{
@ -560,8 +563,10 @@ void Y_IntermissionDrawer(void)
else
{
INT32 xoffs, yoffs;
INT16 leftoffset = hires ? facerank->leftoffset / 2 : facerank->leftoffset;
INT16 topoffset = hires ? facerank->topoffset / 2 :facerank->topoffset;
scale = (displayitemrolls) ? FRACUNIT/2 : FRACUNIT;
scale = (hires || displayitemrolls) ? FRACUNIT/2 : FRACUNIT;
xoffs = FixedMul(16, scale);
yoffs = FixedMul(4, scale);
@ -569,8 +574,8 @@ void Y_IntermissionDrawer(void)
if (displayitemrolls)
{
V_DrawFixedPatch(
((x+11-xscroll_px)*FRACUNIT) + ((facerank->leftoffset) * scale),
((y+1)*FRACUNIT) + ((facerank->topoffset) * scale),
((x+11-xscroll_px)*FRACUNIT) + ((leftoffset) * scale),
((y+1)*FRACUNIT) + ((topoffset) * scale),
scale,
0,
facerank,
@ -587,7 +592,7 @@ void Y_IntermissionDrawer(void)
}
else
{
V_DrawFixedPatch((x+xoffs)<<FRACBITS, ((y-yoffs)<<FRACBITS), scale, 0, facerank, colormap);
V_DrawFixedPatch((x+xoffs+hiresoffsetx)<<FRACBITS, ((y-yoffs- +hiresoffsety)<<FRACBITS), scale, 0, facerank, colormap);
}
}
}