Refactor some HUD elements and bring colorized hud support

This commit is contained in:
NepDisk 2025-05-05 17:13:19 -04:00
parent fea7aa001b
commit d8e1083429
11 changed files with 568 additions and 390 deletions

View file

@ -81,7 +81,7 @@
#include <tracy/tracy/Tracy.hpp>
// Put hashes here to get them out of header hell.
#define ASSET_HASH_MAIN_PK3 0x87b5b0f991dfa2bc
#define ASSET_HASH_MAIN_PK3 0x5279ddf80ca46f97
#define ASSET_HASH_SRB2_SRB 0xf3ec1ea4d0eca4a9
#define ASSET_HASH_GFX_KART 0xc91b0d43f5ba131f
#define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291

View file

@ -12,6 +12,7 @@
#include "deh_lua.h"
#include "deh_tables.h"
#include "k_hud.h"
// freeslot takes a name (string only!)
// and allocates it to the appropriate free slot.
@ -118,6 +119,7 @@ static inline int lib_freeslot(lua_State *L)
FREE_SKINCOLORS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
strcpy(FREE_SKINCOLORS[i],word);
M_AddMenuColor(numskincolors++);
K_ReloadHUDColorCvar();
lua_pushinteger(L, SKINCOLOR_FIRSTFREESLOT + i);
r++;
break;

View file

@ -52,6 +52,7 @@
// SRB2Kart
#include "filesrch.h" // refreshdirmenu
#include "k_follower.h"
#include "k_hud.h"
#include "doomstat.h" // MAXMUSNAMES
// Loops through every constant and operation in word and performs its calculations, returning the final value.
@ -471,6 +472,7 @@ void readfreeslots(MYFILE *f)
FREE_SKINCOLORS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
strcpy(FREE_SKINCOLORS[i],word);
M_AddMenuColor(numskincolors++);
K_ReloadHUDColorCvar();
break;
}
}

View file

@ -101,7 +101,8 @@
extern "C" {
#endif
#define NOMD5
// Special Hashing.
//#define NOMD5
//#define NOFILEHASH
// Uncheck this to compile debugging code

View file

@ -786,209 +786,6 @@ _(kc6c)
_(kc6d)
_(kc6e)
// Mean Bean Machine sounds
_(mbs41)
_(mbs42)
_(mbs43)
_(mbs44)
_(mbs45)
_(mbs46)
_(mbs47)
_(mbs48)
_(mbs49)
_(mbs4a)
_(mbs4b)
_(mbs4c)
_(mbs4d)
_(mbs4e)
_(mbs4f)
_(mbs50)
_(mbs51)
_(mbs52)
_(mbs53)
_(mbs54)
_(mbs55)
_(mbs56)
_(mbs57)
_(mbs58)
_(mbs59)
_(mbs5a)
_(mbs5b)
_(mbs5c)
_(mbs5d)
_(mbs5e)
_(mbs5f)
_(mbs60)
_(mbs61)
_(mbs62)
_(mbs63)
_(mbs64)
_(mbs67)
_(mbs68)
_(mbs69)
_(mbs6a)
_(mbs6b)
_(mbs6d)
_(mbs6e)
_(mbs70)
_(mbs71)
_(mbs72)
_(mbv81)
_(mbv82)
_(mbv83)
_(mbv84)
_(mbv85)
_(mbv86)
_(mbv87)
_(mbv88)
_(mbv89)
_(mbv8a)
_(mbv8b)
_(mbv8c)
_(mbv8d)
_(mbv8e)
_(mbv8f)
_(mbv90)
_(mbv91)
_(mbv92)
_(mbv93)
_(mbv94)
_(mbv95)
_(mbv96)
_(mbv97)
// SegaSonic Arcade sounds
_(ssa001)
_(ssa002)
_(ssa003)
_(ssa004)
_(ssa005)
_(ssa006)
_(ssa007)
_(ssa008)
_(ssa009)
_(ssa010)
_(ssa011)
_(ssa012)
_(ssa013)
_(ssa014)
_(ssa015)
_(ssa016)
_(ssa017)
_(ssa018)
_(ssa019)
_(ssa020)
_(ssa021)
_(ssa022)
_(ssa023)
_(ssa024)
_(ssa025)
_(ssa026)
_(ssa027)
_(ssa028)
_(ssa029)
_(ssa030)
_(ssa031)
_(ssa032)
_(ssa033)
_(ssa034)
_(ssa035)
_(ssa036)
_(ssa037)
_(ssa038)
_(ssa039)
_(ssa040)
_(ssa041)
_(ssa042)
_(ssa043)
_(ssa044)
_(ssa045)
_(ssa046)
_(ssa047)
_(ssa048)
_(ssa049)
_(ssa050)
_(ssa051)
_(ssa052)
_(ssa053)
_(ssa054)
_(ssa055)
_(ssa056)
_(ssa057)
_(ssa058)
_(ssa059)
_(ssa060)
_(ssa061)
_(ssa062)
_(ssa063)
_(ssa064)
_(ssa065)
_(ssa066)
_(ssa067)
_(ssa068)
_(ssa069)
_(ssa070)
_(ssa071)
_(ssa072)
_(ssa073)
_(ssa074)
_(ssa075)
_(ssa076)
_(ssa077)
_(ssa078)
_(ssa079)
_(ssa080)
_(ssa081)
_(ssa082)
_(ssa083)
_(ssa084)
_(ssa085)
_(ssa086)
_(ssa087)
_(ssa088)
_(ssa089)
_(ssa090)
_(ssa091)
_(ssa092)
_(ssa093)
_(ssa094)
_(ssa095)
_(ssa096)
_(ssa097)
_(ssa098)
_(ssa099)
_(ssa100)
_(ssa101)
_(ssa102)
_(ssa103)
_(ssa104)
_(ssa105)
_(ssa106)
_(ssa107)
_(ssa108)
_(ssa109)
_(ssa110)
_(ssa111)
_(ssa112)
_(ssa113)
_(ssa114)
_(ssa115)
_(ssa116)
_(ssa117)
_(ssa118)
_(ssa119)
_(ssa120)
_(ssa121)
_(ssa122)
_(ssa123)
_(ssa124)
_(ssa125)
_(ssa126)
_(ssa127)
_(ssa128)
_(ssa129)
_(ssa130)
// SRB2kart
_(slip)
_(screec)
@ -1038,6 +835,7 @@ _(chain)
_(mkuma)
_(toada)
_(gemhit)
_(wrink)
_(bsnipe)
_(join)
_(leave)

View file

@ -71,7 +71,7 @@ void K_BossInfoTicker(void)
if (bossinfo.doweakspotsound != SPOT_NONE)
{
S_StartSound(NULL, sfx_mbs55); // may change for bump option
//S_StartSound(NULL, sfx_mbs55); // may change for bump option
bossinfo.doweakspotsound = SPOT_NONE;
}

View file

@ -58,7 +58,7 @@ IMPL_HUD_OFFSET_Y(name)
IMPL_HUD_OFFSET(item); // Item box
IMPL_HUD_OFFSET(time); // Time
IMPL_HUD_OFFSET(laps); // Number of laps
IMPL_HUD_OFFSET(rings); // Number of laps
IMPL_HUD_OFFSET(rings); // Number of rings
IMPL_HUD_OFFSET(dnft); // Countdown (did not finish timer)
IMPL_HUD_OFFSET(speed); // Speedometer
IMPL_HUD_OFFSET(acce); // Accessibility
@ -85,22 +85,31 @@ static CV_PossibleValue_t inputdisplay_cons_t[] = {{0, "Off"}, {1, "Wheel"}, {2,
consvar_t cv_showinput = CVAR_INIT ("showinput", "Off", CV_SAVE, inputdisplay_cons_t, NULL);
consvar_t cv_colorizedhud = CVAR_INIT ("colorizedhud", "On", CV_SAVE, CV_OnOff, NULL);
consvar_t cv_colorizeditembox = CVAR_INIT ("colorizeditembox", "On", CV_SAVE, CV_OnOff, NULL);
consvar_t cv_darkitembox = CVAR_INIT ("darkitembox", "On", CV_SAVE, CV_OnOff, NULL);
static CV_PossibleValue_t HudColor_cons_t[MAXSKINCOLORS+1];
consvar_t cv_colorizedhudcolor = CVAR_INIT ("colorizedhudcolor", "Skin Color", CV_SAVE, HudColor_cons_t, NULL);
//{ Patch Definitions
static patch_t *kp_nodraw;
static patch_t *kp_timesticker;
static patch_t *kp_timestickerwide;
static patch_t *kp_lapsticker;
static patch_t *kp_lapstickerbig;
static patch_t *kp_lapstickerbig2;
static patch_t *kp_lapstickerwide;
static patch_t *kp_lapstickernarrow;
// Stickers
static patch_t *kp_timesticker[2];
static patch_t *kp_timestickerwide[2];
static patch_t *kp_lapsticker[2];
static patch_t *kp_lapstickerbig[2];
static patch_t *kp_lapstickerbig2[2];
static patch_t *kp_lapstickerwide[2];
static patch_t *kp_lapstickernarrow[2];
static patch_t *kp_bumpersticker[2];
static patch_t *kp_bumperstickerwide[2];
static patch_t *kp_karmasticker[2];
static patch_t *kp_timeoutsticker[2];
static patch_t *kp_splitlapflag;
static patch_t *kp_bumpersticker;
static patch_t *kp_bumperstickerwide;
static patch_t *kp_karmasticker;
static patch_t *kp_splitkarmabomb;
static patch_t *kp_timeoutsticker;
static patch_t *kp_startcountdown[20];
static patch_t *kp_racefinish[6];
@ -115,12 +124,12 @@ static patch_t *kp_nocontestminimap;
static patch_t *kp_spbminimap;
static patch_t *kp_itemboxminimap;
static patch_t *kp_ringsticker[2];
static patch_t *kp_ringsticker[5];
static patch_t *kp_ringsplitscreen;
static patch_t *kp_ringdebtminus;
static patch_t *kp_ringdebtminussmall;
static patch_t *kp_speedometersticker;
static patch_t *kp_speedometersticker[2];
static patch_t *kp_speedometerlabel[4];
static patch_t *kp_kartzspeedo[25];
@ -139,9 +148,9 @@ static patch_t *kp_wantedsplit;
static patch_t *kp_wantedreticle;
static patch_t *kp_minimapdot;
static patch_t *kp_itembg[4];
static patch_t *kp_itembg[8];
static patch_t *kp_itemtimer[2];
static patch_t *kp_itemmulsticker[2];
static patch_t *kp_itemmulsticker[4];
static patch_t *kp_itemx;
static patch_t *kp_sadface[2];
@ -193,6 +202,7 @@ static patch_t *joyshadow;
void K_RegisterKartHUDStuff(void)
{
K_ReloadHUDColorCvar();
#define REG_HUD_OFFSET_X(name)\
CV_RegisterVar(&cv_##name##_xoffset);
@ -225,7 +235,9 @@ void K_RegisterKartHUDStuff(void)
CV_RegisterVar(&cv_newspeedometer);
CV_RegisterVar(&cv_showinput);
CV_RegisterVar(&cv_colorizedhud);
CV_RegisterVar(&cv_colorizedhudcolor);
CV_RegisterVar(&cv_colorizeditembox);
}
void K_LoadKartHUDGraphics(void)
@ -237,19 +249,34 @@ void K_LoadKartHUDGraphics(void)
HU_UpdatePatch(&kp_nodraw, "K_TRNULL");
// Stickers
HU_UpdatePatch(&kp_timesticker, "K_STTIME");
HU_UpdatePatch(&kp_timestickerwide, "K_STTIMW");
HU_UpdatePatch(&kp_lapsticker, "K_STLAPS");
HU_UpdatePatch(&kp_lapstickerbig, "K_STLAPB");
HU_UpdatePatch(&kp_lapstickerbig2, "K_STLA2B");
HU_UpdatePatch(&kp_lapstickerwide, "K_STLAPW");
HU_UpdatePatch(&kp_lapstickernarrow, "K_STLAPN");
HU_UpdatePatch(&kp_timesticker[0], "K_STTIME");
HU_UpdatePatch(&kp_timestickerwide[0], "K_STTIMW");
HU_UpdatePatch(&kp_lapsticker[0], "K_STLAPS");
HU_UpdatePatch(&kp_lapstickerbig[0], "K_STLAPB");
HU_UpdatePatch(&kp_lapstickerbig2[0], "K_STLA2B");
HU_UpdatePatch(&kp_lapstickerwide[0], "K_STLAPW");
HU_UpdatePatch(&kp_lapstickernarrow[0], "K_STLAPN");
HU_UpdatePatch(&kp_bumpersticker[0], "K_STBALN");
HU_UpdatePatch(&kp_bumperstickerwide[0], "K_STBALW");
HU_UpdatePatch(&kp_karmasticker[0], "K_STKARM");
HU_UpdatePatch(&kp_timeoutsticker[0], "K_STTOUT");
// Colored Stickers
HU_UpdatePatch(&kp_timesticker[1], "K_SCTIME");
HU_UpdatePatch(&kp_timestickerwide[1], "K_SCTIMW");
HU_UpdatePatch(&kp_lapsticker[1], "K_SCLAPS");
HU_UpdatePatch(&kp_lapstickerbig[1], "K_SCLAPB");
HU_UpdatePatch(&kp_lapstickerbig2[1], "K_SCLA2B");
HU_UpdatePatch(&kp_lapstickerwide[1], "K_SCLAPW");
HU_UpdatePatch(&kp_lapstickernarrow[1], "K_SCLAPN");
HU_UpdatePatch(&kp_bumpersticker[1], "K_SCBALN");
HU_UpdatePatch(&kp_bumperstickerwide[1], "K_SCBALW");
HU_UpdatePatch(&kp_karmasticker[1], "K_SCKARM");
HU_UpdatePatch(&kp_timeoutsticker[1], "K_SCTOUT");
// Splitscreen
HU_UpdatePatch(&kp_splitlapflag, "K_SPTLAP");
HU_UpdatePatch(&kp_bumpersticker, "K_STBALN");
HU_UpdatePatch(&kp_bumperstickerwide, "K_STBALW");
HU_UpdatePatch(&kp_karmasticker, "K_STKARM");
HU_UpdatePatch(&kp_splitkarmabomb, "K_SPTKRM");
HU_UpdatePatch(&kp_timeoutsticker, "K_STTOUT");
// Starting countdown
HU_UpdatePatch(&kp_startcountdown[0], "K_CNT3A");
@ -328,13 +355,19 @@ void K_LoadKartHUDGraphics(void)
// Rings & Lives
HU_UpdatePatch(&kp_ringsticker[0], "K_RNGHD");
HU_UpdatePatch(&kp_ringsticker[1], "K_RNGHL");
HU_UpdatePatch(&kp_ringsticker[2], "K_RNGHDC");
HU_UpdatePatch(&kp_ringsticker[3], "K_RNGHLC");
HU_UpdatePatch(&kp_ringsplitscreen, "K_RNGSS");
HU_UpdatePatch(&kp_ringdebtminus, "K_RNGDM");
HU_UpdatePatch(&kp_ringdebtminussmall, "K_RNGSM");
// Speedometer
HU_UpdatePatch(&kp_speedometersticker, "SP_SMSTC");
HU_UpdatePatch(&kp_speedometersticker[0], "SP_SMSTC");
// Speedometer Sticker Color
HU_UpdatePatch(&kp_speedometersticker[1], "SC_SMSTC");
// Speedometer labels
HU_UpdatePatch(&kp_speedometerlabel[0], "SP_MKMH");
HU_UpdatePatch(&kp_speedometerlabel[1], "SP_MMPH");
HU_UpdatePatch(&kp_speedometerlabel[2], "SP_MFRAC");
@ -376,8 +409,11 @@ void K_LoadKartHUDGraphics(void)
// Kart Item Windows
HU_UpdatePatch(&kp_itembg[0], "K_ITBG");
HU_UpdatePatch(&kp_itembg[1], "K_ITBGD");
HU_UpdatePatch(&kp_itembg[4], "K_ITBC");
HU_UpdatePatch(&kp_itembg[5], "K_ITBCD");
HU_UpdatePatch(&kp_itemtimer[0], "K_ITIMER");
HU_UpdatePatch(&kp_itemmulsticker[0], "K_ITMUL");
HU_UpdatePatch(&kp_itemmulsticker[2], "K_ITMULC");
HU_UpdatePatch(&kp_itemx, "K_ITX");
HU_UpdatePatch(&kp_sadface[0], "K_ITSAD");
@ -423,8 +459,11 @@ void K_LoadKartHUDGraphics(void)
// Splitscreen
HU_UpdatePatch(&kp_itembg[2], "K_ISBG");
HU_UpdatePatch(&kp_itembg[3], "K_ISBGD");
HU_UpdatePatch(&kp_itembg[6], "K_ISBC");
HU_UpdatePatch(&kp_itembg[7], "K_ISBCD");
HU_UpdatePatch(&kp_itemtimer[1], "K_ISIMER");
HU_UpdatePatch(&kp_itemmulsticker[1], "K_ISMUL");
HU_UpdatePatch(&kp_itemmulsticker[3], "K_ISMULC");
HU_UpdatePatch(&kp_sadface[1], "K_ISSAD");
HU_UpdatePatch(&kp_sneaker[3], "K_ISSHOE");
@ -676,19 +715,49 @@ INT32 LAPS2_X, LAPS2_Y;
INT32 RING2_X, RING2_Y;
INT32 POSI2_X, POSI2_Y;
void K_ReloadHUDColorCvar(void)
{
HudColor_cons_t[0].value = 0;
HudColor_cons_t[0].strvalue = "Skin Color";
for (INT32 i = 1; i < MAXSKINCOLORS; i++)
{
HudColor_cons_t[i].value = i;
HudColor_cons_t[i].strvalue = skincolors[i].name; // SRB2kart
}
HudColor_cons_t[MAXSKINCOLORS].value = 0;
HudColor_cons_t[MAXSKINCOLORS].strvalue = NULL;
}
boolean K_UseColorHud(void)
{
return cv_colorizedhud.value;
}
UINT8 K_GetHudColor(void)
{
//if (cv_colorizedhud.value && cv_colorizedhudcolor.value) return cv_colorizedhudcolor.value;
if (cv_colorizedhud.value && cv_colorizedhudcolor.value) return cv_colorizedhudcolor.value;
return ((stplyr && gamestate == GS_LEVEL) ? stplyr->skincolor : cv_playercolor[0].value);
}
static boolean K_BigLapSticker(void)
{
//if (K_UseColorHud())
//return ((cv_numlaps.value > 9) && (!stplyr->exiting));
//else
return ((cv_numlaps.value > 9) && (!stplyr->exiting));
return ((cv_numlaps.value > 9) && (!stplyr->exiting));
}
patch_t *K_getItemBoxPatch(boolean small, boolean dark)
{
UINT8 ofs = (cv_darkitembox.value && dark ? 1 : 0) + (small ? 2 : 0);
return (cv_colorizeditembox.value && K_UseColorHud()) ? kp_itembg[4+ofs] : kp_itembg[ofs];
}
patch_t *K_getItemMulPatch(boolean small)
{
UINT8 ofs = small ? 1 : 0;
return K_UseColorHud() ? kp_itemmulsticker[2+ofs] : kp_itemmulsticker[ofs];
}
// This version of the function was prototyped in Lua by Nev3r ... a HUGE thank you goes out to them!
@ -950,6 +1019,117 @@ static void K_initKartHUD(void)
}
}
void K_getItemBoxDrawinfo(drawinfo_t *out)
{
INT32 fx, fy, fflags;
boolean flipamount = false;
// pain and suffering defined below
if (r_splitscreen < 2) // don't change shit for THIS splitscreen.
{
fx = ITEM_X;
fy = ITEM_Y;
fflags = V_SNAPTOTOP|V_SNAPTOLEFT|V_SPLITSCREEN;
}
else // now we're having a fun game.
{
if (stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]]) // If we are P1 or P3...
{
fx = ITEM_X;
fy = ITEM_Y;
fflags = V_SNAPTOLEFT|V_SNAPTOTOP|V_SPLITSCREEN;
}
else // else, that means we're P2 or P4.
{
fx = ITEM2_X;
fy = ITEM2_Y;
fflags = V_SNAPTORIGHT|V_SNAPTOTOP|V_SPLITSCREEN;
flipamount = true;
}
}
out->x = fx;
out->y = fy;
out->flags = fflags;
out->flipamount = flipamount;
}
void K_getLapsDrawinfo(drawinfo_t *out)
{
INT32 fx, fy, splitflags = 0;
// pain and suffering defined below
if (r_splitscreen < 2) // don't change shit for THIS splitscreen.
{
fx = LAPS_X;
fy = LAPS_Y;
splitflags = V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANS|V_SPLITSCREEN;
}
else
{
if (stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]]) // If we are P1 or P3...
{
fx = LAPS_X;
fy = LAPS_Y;
splitflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
}
else // else, that means we're P2 or P4.
{
fx = LAPS2_X;
fy = LAPS2_Y;
splitflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
}
}
out->x = fx;
out->y = fy;
out->flags = splitflags;
}
void K_getRingsDrawinfo(drawinfo_t *out)
{
INT32 fx, fy, splitflags = 0;
// pain and suffering defined below
if (r_splitscreen < 2) // don't change shit for THIS splitscreen.
{
fx = RING_X;
fy = RING_Y;
splitflags = V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANS|V_SPLITSCREEN;
}
else
{
if (stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]]) // If we are P1 or P3...
{
fx = RING_X;
fy = RING_Y;
splitflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
}
else // else, that means we're P2 or P4.
{
fx = RING2_X;
fy = RING2_Y;
splitflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
}
}
out->x = fx;
out->y = fy;
out->flags = splitflags;
}
void K_getMinimapDrawinfo(drawinfo_t *out)
{
INT32 fx = MINI_X, fy = MINI_Y, fflags = (r_splitscreen < 2 ? V_SNAPTORIGHT : 0); // flags should only be 0 when it's centered (4p split)
fx -= SHORT(minimapinfo.minimap_pic->width)/2;
fy -= SHORT(minimapinfo.minimap_pic->height)/2;
out->x = fx;
out->y = fy;
out->flags = fflags;
}
// see also MT_PLAYERARROW mobjthinker in p_mobj.c
static void K_drawKartItem(void)
{
@ -960,8 +1140,9 @@ static void K_drawKartItem(void)
// Set to 'no item' just in case.
const UINT8 offset = ((r_splitscreen > 1) ? 1 : 0);
patch_t *localpatch = kp_nodraw;
patch_t *localbg = ((offset) ? kp_itembg[2] : kp_itembg[0]);
patch_t *localbg;
patch_t *localinv = ((offset) ? kp_invincibility[((leveltime % (6*3)) / 3) + 7] : kp_invincibility[(leveltime % (7*3)) / 3]);
boolean dark = false;
INT32 fx = 0, fy = 0, fflags = 0; // final coords for hud and flags...
INT32 numberdisplaymin = 2;
INT32 itembar = 0;
@ -972,6 +1153,7 @@ static void K_drawKartItem(void)
UINT16 localcolor = SKINCOLOR_NONE;
SINT8 colormode = TC_RAINBOW;
UINT8 *colmap = NULL;
UINT8 *colormap = NULL;
boolean flipamount = false; // Used for 3P/4P splitscreen to flip item amount stuff
if (stplyr->itemroulette)
@ -1121,7 +1303,7 @@ static void K_drawKartItem(void)
case KITEM_THUNDERSHIELD:
case KITEM_BUBBLESHIELD:
case KITEM_FLAMESHIELD:
localbg = kp_itembg[offset+1];
dark = true;
/*FALLTHRU*/
default:
@ -1155,41 +1337,27 @@ static void K_drawKartItem(void)
}
}
// pain and suffering defined below
if (r_splitscreen < 2) // don't change shit for THIS splitscreen.
{
fx = ITEM_X;
fy = ITEM_Y;
fflags = V_SNAPTOTOP|V_SNAPTOLEFT|V_SPLITSCREEN;
}
else // now we're having a fun game.
{
if (stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]]) // If we are P1 or P3...
{
fx = ITEM_X;
fy = ITEM_Y;
fflags = V_SNAPTOLEFT|V_SNAPTOTOP|V_SPLITSCREEN;
}
else // else, that means we're P2 or P4.
{
fx = ITEM2_X;
fy = ITEM2_Y;
fflags = V_SNAPTORIGHT|V_SNAPTOTOP|V_SPLITSCREEN;
flipamount = true;
}
}
localbg = K_getItemBoxPatch((boolean)offset, dark);
drawinfo_t info;
K_getItemBoxDrawinfo(&info);
fx = info.x;
fy = info.y;
fflags = info.flags;
flipamount = info.flipamount;
if (localcolor != SKINCOLOR_NONE)
colmap = R_GetTranslationColormap(colormode, localcolor, GTC_CACHE);
if (K_UseColorHud())
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
V_DrawScaledPatch(fx, fy, V_HUDTRANS|fflags, localbg);
V_DrawMappedPatch(fx, fy, V_HUDTRANS|fflags, localbg, colormap);
//V_SetClipRect((fx + 10) << FRACBITS, (fy + 10) << FRACBITS, 30 << FRACBITS, 30 << FRACBITS, V_HUDTRANS|V_SLIDEIN|fflags);
// Then, the numbers:
if (stplyr->itemamount >= numberdisplaymin && !stplyr->itemroulette)
{
V_DrawScaledPatch(fx + (flipamount ? 48 : 0), fy, V_HUDTRANS|fflags|(flipamount ? V_FLIP : 0), kp_itemmulsticker[offset]); // flip this graphic for p2 and p4 in split and shift it.
localbg = K_getItemMulPatch((boolean)offset);
V_DrawMappedPatch(fx + (flipamount ? 48 : 0), fy, V_HUDTRANS|fflags|(flipamount ? V_FLIP : 0), localbg, colormap); // flip this graphic for p2 and p4 in split and shift it.
V_DrawFixedPatch(fx<<FRACBITS, fy<<FRACBITS, FRACUNIT, V_HUDTRANS|fflags, localpatch, colmap);
if (offset)
if (flipamount) // reminder that this is for 3/4p's right end of the screen.
@ -1207,7 +1375,7 @@ static void K_drawKartItem(void)
//V_ClearClipRect();
// Extensible meter, currently only used for rocket sneaker...
// Extensible meter, currently used by Grow, Rocket Sneakers and Flame Shield
if (itembar)
{
const INT32 fill = ((itembar*barlength)/maxl);
@ -1291,7 +1459,13 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UI
}
}
V_DrawScaledPatch(TX, TY, splitflags, ((mode == 2) ? kp_lapstickerwide : kp_timestickerwide));
if (!K_UseColorHud())
V_DrawScaledPatch(TX, TY, splitflags, ((mode == 2) ? kp_lapstickerwide[0] : kp_timestickerwide[0]));
else //Colourized hud
{
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
V_DrawMappedPatch(TX, TY, splitflags, ((mode == 2) ? kp_lapstickerwide[1] : kp_timestickerwide[1]), colormap);
}
TX += 33;
@ -1959,33 +2133,17 @@ void K_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, IN
static void K_drawKartLaps(void)
{
const boolean uselives = G_GametypeUsesLives();
INT32 splitflags = V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANS|V_SPLITSCREEN;
INT32 fx = 0, fy = 0, splitflags = 0; // stuff for 3p / 4p splitscreen.
drawinfo_t info;
K_getLapsDrawinfo(&info);
fx = info.x;
fy = info.y;
splitflags = info.flags;
if (r_splitscreen > 1)
{
INT32 fx = 0, fy = 0, fr = 0;
// pain and suffering defined below
if (r_splitscreen < 2) // don't change shit for THIS splitscreen.
{
fx = LAPS_X;
fy = LAPS_Y;
}
else
{
if (stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]]) // If we are P1 or P3...
{
fx = LAPS_X;
fy = LAPS_Y;
splitflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
}
else // else, that means we're P2 or P4.
{
fx = LAPS2_X;
fy = LAPS2_Y;
splitflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
}
}
INT32 fr = 0;
fr = fx;
@ -2025,15 +2183,26 @@ static void K_drawKartLaps(void)
}
else
{
if (K_BigLapSticker())
V_DrawScaledPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, ((stplyr->laps > 9) ? kp_lapstickerbig2 : kp_lapstickerbig));
if (!K_UseColorHud())
{
if (K_BigLapSticker())
V_DrawScaledPatch(fx, fy, V_HUDTRANS|splitflags, ((stplyr->laps > 9) ? kp_lapstickerbig2[0] : kp_lapstickerbig[0]));
else
V_DrawScaledPatch(fx, fy, V_HUDTRANS|splitflags, kp_lapsticker[0]);
}
else
V_DrawScaledPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, kp_lapsticker);
{
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
if (K_BigLapSticker())
V_DrawMappedPatch(fx, fy, V_HUDTRANS|splitflags, ((stplyr->laps > 9) ? kp_lapstickerbig2[1] : kp_lapstickerbig[1]), colormap);
else
V_DrawMappedPatch(fx, fy, V_HUDTRANS|splitflags, kp_lapsticker[1], colormap);
}
if (stplyr->exiting)
V_DrawKartString(LAPS_X+33, LAPS_Y+3, V_HUDTRANS|V_SLIDEIN|splitflags, "FIN");
V_DrawKartString(fx+33, fy+3, V_HUDTRANS|V_SLIDEIN|splitflags, "FIN");
else
V_DrawKartString(LAPS_X+33, LAPS_Y+3, V_HUDTRANS|splitflags, va("%d/%d", min(stplyr->laps, numlaps), numlaps));
V_DrawKartString(fx+33, fy+3, V_HUDTRANS|splitflags, va("%d/%d", min(stplyr->laps, numlaps), numlaps));
// Lives
if (LUA_HudEnabled(hud_lives) && uselives)
@ -2052,9 +2221,9 @@ static void K_drawKartLaps(void)
}
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, K_GetHudColor(), GTC_CACHE);
V_DrawMappedPatch(LAPS_X+59+offsetx, LAPS_Y-16+offsety, V_HUDTRANS|splitflags, faceprefix[stplyr->skin][FACE_RANK], colormap);
V_DrawMappedPatch(fx+59+offsetx, fy-16+offsety, V_HUDTRANS|splitflags, faceprefix[stplyr->skin][FACE_RANK], colormap);
if (stplyr->lives >= 0)
V_DrawScaledPatch(LAPS_X+77+offsetx, LAPS_Y-11+offsety, V_HUDTRANS|splitflags, kp_facenum[(stplyr->lives % 10)]); // make sure this doesn't overflow OR underflow
V_DrawScaledPatch(fx+77+offsetx, fy-11+offsety, V_HUDTRANS|splitflags, kp_facenum[(stplyr->lives % 10)]); // make sure this doesn't overflow OR underflow
}
}
}
@ -2207,7 +2376,17 @@ static void K_drawKartSpeedometer(void)
numbers[1] = ((convSpeed / 10) % 10);
numbers[2] = (convSpeed % 10);
V_DrawScaledPatch(SPDM_X, SPDM_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_speedometersticker);
if (!K_UseColorHud())
{
V_DrawScaledPatch(SPDM_X, SPDM_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_speedometersticker[0]);
}
else
{
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
V_DrawMappedPatch(SPDM_X, SPDM_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_speedometersticker[1], colormap);
}
V_DrawScaledPatch(SPDM_X+7, SPDM_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_facenum[numbers[0]]);
V_DrawScaledPatch(SPDM_X+13, SPDM_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_facenum[numbers[1]]);
V_DrawScaledPatch(SPDM_X+19, SPDM_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_facenum[numbers[2]]);
@ -2248,12 +2427,17 @@ static void K_drawRingMeter(void)
UINT8 rn[2];
UINT8 *ringmap = NULL;
boolean colorring = false;
INT32 splitflags = V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANS|V_SPLITSCREEN;
SINT8 ringcount = stplyr->rings;
INT32 fx = 0, fy = 0, splitflags = 0; // stuff for 3p / 4p splitscreen.
rn[0] = ((abs(ringcount) / 10) % 10);
rn[1] = (abs(ringcount) % 10);
drawinfo_t info;
K_getRingsDrawinfo(&info);
fx = info.x;
fy = info.y;
splitflags = info.flags;
if (ringcount <= 0 && (leveltime/5 & 1)) // In debt
{
@ -2265,44 +2449,20 @@ static void K_drawRingMeter(void)
if (r_splitscreen > 1)
{
INT32 fx = 0, fy = 0, fr = 0;
// pain and suffering defined below
if (r_splitscreen < 2) // don't change shit for THIS splitscreen.
{
fx = RING_X;
fy = RING_Y;
}
else
{
if (stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]]) // If we are P1 or P3...
{
fx = RING_X;
fy = RING_Y;
splitflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
}
else // else, that means we're P2 or P4.
{
fx = RING2_X;
fy = RING2_Y;
splitflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
}
}
fr = fx;
V_DrawMappedPatch(fr, fy-10, V_HUDTRANS|splitflags, kp_ringsplitscreen, (colorring ? ringmap : NULL));
V_DrawMappedPatch(fx, fy-10, V_HUDTRANS|splitflags, kp_ringsplitscreen, (colorring ? ringmap : NULL));
if (ringcount < 0) // Draw the minus for ring debt
V_DrawMappedPatch(fr+7, fy-8, V_HUDTRANS|splitflags, kp_ringdebtminussmall, ringmap);
V_DrawMappedPatch(fx+7, fy-8, V_HUDTRANS|splitflags, kp_ringdebtminussmall, ringmap);
V_DrawMappedPatch(fr+11, fy-10, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[rn[0]], ringmap);
V_DrawMappedPatch(fr+15, fy-10, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[rn[1]], ringmap);
V_DrawMappedPatch(fx+11, fy-10, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[rn[0]], ringmap);
V_DrawMappedPatch(fx+15, fy-10, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[rn[1]], ringmap);
}
else
{
SINT8 i;
SINT8 ringoffsety = 0;
UINT8 *colormap = NULL;
SINT8 coloroffset = 0;
if (gametype == GT_BATTLE)
ringoffsety -= 4;
@ -2310,11 +2470,16 @@ static void K_drawRingMeter(void)
if (itembreaker)
ringoffsety -= 2;
V_DrawScaledPatch(RING_X, RING_Y-14 + ringoffsety, V_HUDTRANS|splitflags, kp_ringsticker[(stplyr->pflags & PF_RINGLOCK) ? 1 : 0]);
if (K_UseColorHud())
coloroffset = 2;
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
V_DrawMappedPatch(fx, fy-14 + ringoffsety, V_HUDTRANS|splitflags, kp_ringsticker[((stplyr->pflags & PF_RINGLOCK) ? 1 : 0) + coloroffset], colormap);
if (stplyr->rings < 0) // Draw the minus for ring debt
{
V_DrawMappedPatch(RING_X-5, RING_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_ringdebtminus, ringmap);
V_DrawMappedPatch(fx-5, fy-11 + ringoffsety, V_HUDTRANS|splitflags, kp_ringdebtminus, ringmap);
}
if (stplyr->rings < 0)
@ -2324,14 +2489,14 @@ static void K_drawRingMeter(void)
}
if (rn[1] == 1 && ringcount == 11)
V_DrawMappedPatch(RING_X+2, RING_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[0]], ringmap);
V_DrawMappedPatch(fx+2, fy-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[0]], ringmap);
else
V_DrawMappedPatch(RING_X+2, RING_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[0]], ringmap);
V_DrawMappedPatch(fx+2, fy-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[0]], ringmap);
if (rn[1] == 1 && ringcount == 11)
V_DrawMappedPatch(RING_X+7, RING_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[1]], ringmap);
V_DrawMappedPatch(fx+7, fy-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[1]], ringmap);
else
V_DrawMappedPatch(RING_X+8, RING_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[1]], ringmap);
V_DrawMappedPatch(fx+8, fy-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[1]], ringmap);
// Draw the fillbars
if (stplyr->rings)
@ -2353,10 +2518,10 @@ static void K_drawRingMeter(void)
for (i = 0; i != ringcount; i++)
{
V_DrawFill(RING_X+17+(2*i), RING_Y-10 + ringoffsety, 1, 1, barcolors[0]|splitflags);
V_DrawFill(RING_X+17+(2*i), RING_Y-9 + ringoffsety, 1, 4, barcolors[1]|splitflags);
V_DrawFill(RING_X+17+(2*i), RING_Y-8 + ringoffsety, 1, 1, barcolors[2]|splitflags);
V_DrawFill(RING_X+17+(2*i), RING_Y-7 + ringoffsety, 1, 1, barcolors[3]|splitflags);
V_DrawFill(fx+17+(2*i), fy-10 + ringoffsety, 1, 1, barcolors[0]|splitflags);
V_DrawFill(fx+17+(2*i), fy-9 + ringoffsety, 1, 4, barcolors[1]|splitflags);
V_DrawFill(fx+17+(2*i), fy-8 + ringoffsety, 1, 1, barcolors[2]|splitflags);
V_DrawFill(fx+17+(2*i), fy-7 + ringoffsety, 1, 1, barcolors[3]|splitflags);
}
}
}
@ -2366,33 +2531,16 @@ static void K_drawRingMeter(void)
static void K_drawKartBumpersOrKarma(void)
{
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
INT32 splitflags = V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_SPLITSCREEN;
INT32 fx = 0, fy = 0, splitflags = 0; // stuff for 3p / 4p splitscreen.
drawinfo_t info;
K_getLapsDrawinfo(&info);
fx = info.x;
fy = info.y;
splitflags = info.flags;
if (r_splitscreen > 1)
{
INT32 fx = 0, fy = 0;
// pain and suffering defined below
if (r_splitscreen < 2) // don't change shit for THIS splitscreen.
{
fx = LAPS_X;
fy = LAPS_Y;
}
else
{
if (stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]]) // If we are P1 or P3...
{
fx = LAPS_X;
fy = LAPS_Y;
splitflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
}
else // else, that means we're P2 or P4.
{
fx = LAPS2_X;
fy = LAPS2_Y;
splitflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
}
}
V_DrawScaledPatch(fx+22, fy, V_HUDTRANS|splitflags, frameslash);
@ -2462,28 +2610,37 @@ static void K_drawKartBumpersOrKarma(void)
{
patch_t *item = W_CachePatchName("RNDMA0", PU_PATCH);
UINT8 *itemcolormap = R_GetTranslationColormap(TC_BLINK, SKINCOLOR_BLACK, GTC_CACHE);
V_DrawMappedPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, kp_timesticker, NULL);
if (!K_UseColorHud())
{
V_DrawScaledPatch(fx, fy, V_HUDTRANS|splitflags, kp_timesticker[0]);
}
else //Colourized hud
{
V_DrawMappedPatch(fx, fy, V_HUDTRANS|splitflags, kp_timesticker[1], colormap);
}
V_DrawStretchyFixedPatch((29 + item->width/2/4)*FRACUNIT, 193*FRACUNIT, FRACUNIT/2, FRACUNIT/2, V_HUDTRANS|splitflags, item, itemcolormap);
V_DrawStretchyFixedPatch((29 + item->width/2/4)*FRACUNIT, 192*FRACUNIT, FRACUNIT/2, FRACUNIT/2, V_HUDTRANS|splitflags, item, NULL);
V_DrawKartString(LAPS_X+47, LAPS_Y+3, V_HUDTRANS|splitflags, va("%d/%d", numtargets, nummapboxes));
V_DrawKartString(fx+47, LAPS_Y+3, V_HUDTRANS|splitflags, va("%d/%d", numtargets, nummapboxes));
}
else
{
if (stplyr->bumper <= 0)
{
V_DrawMappedPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, kp_karmasticker, NULL);
V_DrawKartString(LAPS_X+47, LAPS_Y+3, V_HUDTRANS|splitflags, va("%d/2", stplyr->karmapoints));
V_DrawMappedPatch(fx, fy, V_HUDTRANS|splitflags, (K_UseColorHud() ? kp_karmasticker[1] : kp_karmasticker[0]), colormap);
V_DrawKartString(fx+47, fy+3, V_HUDTRANS|splitflags, va("%d/2", stplyr->karmapoints));
}
else
{
INT32 maxbumper = K_StartingBumperCount();
if (stplyr->bumper > 9 && maxbumper > 9)
V_DrawMappedPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, kp_bumperstickerwide, colormap);
V_DrawMappedPatch(fx, fy, V_HUDTRANS|splitflags, (K_UseColorHud() ? kp_bumperstickerwide[1] : kp_bumperstickerwide[0]), colormap);
else
V_DrawMappedPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, kp_bumpersticker, colormap);
V_DrawMappedPatch(fx, fy, V_HUDTRANS|splitflags, (K_UseColorHud() ? kp_bumpersticker[1] : kp_bumpersticker[0]), colormap);
V_DrawKartString(LAPS_X+47, LAPS_Y+3, V_HUDTRANS|splitflags, va("%d/%d", stplyr->bumper, maxbumper));
V_DrawKartString(fx+47, fy+3, V_HUDTRANS|splitflags, va("%d/%d", stplyr->bumper, maxbumper));
}
}
}
@ -3286,9 +3443,14 @@ static void K_drawKartMinimap(void)
return; // no pic, just get outta here
}
drawinfo_t info;
K_getMinimapDrawinfo(&info);
x = info.x;
y = info.y;
splitflags = info.flags;
if (r_splitscreen < 2) // 1/2P right aligned
{
splitflags = (V_SNAPTORIGHT);
const tic_t length = TICRATE/2;
if (!lt_exitticker)
@ -3311,9 +3473,6 @@ static void K_drawKartMinimap(void)
if (!minimaptrans)
return;
x = MINI_X - (SHORT(minimapinfo.minimap_pic->width)/2);
y = MINI_Y - (SHORT(minimapinfo.minimap_pic->height)/2);
minimaptrans = ((10-minimaptrans)<<FF_TRANSSHIFT);
if (encoremode)
@ -3321,16 +3480,6 @@ static void K_drawKartMinimap(void)
else
V_DrawScaledPatch(x, y, splitflags|minimaptrans, minimapinfo.minimap_pic);
// most icons will be rendered semi-ghostly.
splitflags |= V_HUDTRANSHALF;
// let offsets transfer to the heads, too!
if (encoremode)
x += SHORT(minimapinfo.minimap_pic->leftoffset);
else
x -= SHORT(minimapinfo.minimap_pic->leftoffset);
y -= SHORT(minimapinfo.minimap_pic->topoffset);
// initialize
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
localplayers[i] = -1;
@ -3811,7 +3960,13 @@ static void K_drawBattleFullscreen(void)
V_DrawString(x-txoff, ty, 0, va("%d", stplyr->karmadelay/TICRATE));
else
{
V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, 0, kp_timeoutsticker, NULL);
if (!K_UseColorHud())
V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, 0, kp_timeoutsticker[0], NULL);
else //Colourized hud
{
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, 0, kp_timeoutsticker[1], colormap);
}
V_DrawKartString(x-txoff, ty, 0, va("%d", stplyr->karmadelay/TICRATE));
}
}
@ -3989,6 +4144,9 @@ static void K_drawInput(void)
const INT32 accent2 = splitflags | skincolors[hudcolor].ramp[9];
const UINT8 *hudcolormap = R_GetTranslationColormap(0, hudcolor, GTC_CACHE);
if (r_splitscreen)
return;
#define BUTTW 8
#define BUTTH 11

View file

@ -23,10 +23,45 @@ extern "C" {
#define RINGANIM_NUMFRAMES 10
#define RINGANIM_DELAYMAX 5
// Hud offset cvars
#define IMPL_HUD_OFFSET_X(name)\
extern consvar_t cv_##name##_xoffset;
#define IMPL_HUD_OFFSET_Y(name)\
extern consvar_t cv_##name##_yoffset;
#define IMPL_HUD_OFFSET(name)\
IMPL_HUD_OFFSET_X(name)\
IMPL_HUD_OFFSET_Y(name)
IMPL_HUD_OFFSET(item); // Item box
IMPL_HUD_OFFSET(time); // Time
IMPL_HUD_OFFSET(laps); // Number of laps
IMPL_HUD_OFFSET(rings); // Number of rings
IMPL_HUD_OFFSET(dnft); // Countdown (did not finish timer)
IMPL_HUD_OFFSET(speed); // Speedometer
IMPL_HUD_OFFSET(acce); // Accessibility
IMPL_HUD_OFFSET(posi); // Position in race
IMPL_HUD_OFFSET(face); // Mini rankings
IMPL_HUD_OFFSET(stcd); // Starting countdown
IMPL_HUD_OFFSET_Y(chek); // Check gfx
IMPL_HUD_OFFSET(mini); // Minimap
IMPL_HUD_OFFSET(want); // Wanted
//IMPL_HUD_OFFSET(stat); // Stats
#undef IMPL_HUD_OFFSET
#undef IMPL_HUD_OFFSET_X
#undef IMPL_HUD_OFFSET_Y
extern consvar_t cv_newspeedometer;
extern consvar_t cv_showinput;
extern consvar_t cv_colorizedhud;
extern consvar_t cv_colorizeditembox;
extern consvar_t cv_darkitembox;
extern consvar_t cv_colorizedhudcolor;
struct trackingResult_t
{
fixed_t x, y;
@ -38,7 +73,23 @@ void K_RegisterKartHUDStuff(void);
void K_ObjectTracking(trackingResult_t *result, vector3_t *point, boolean reverse);
typedef struct
{
INT32 x;
INT32 y;
INT32 flags;
boolean flipamount;
} drawinfo_t;
patch_t *K_getItemBoxPatch(boolean small, boolean dark);
patch_t *K_getItemMulPatch(boolean small);
void K_getItemBoxDrawinfo(drawinfo_t *out);
void K_getLapsDrawinfo(drawinfo_t *out);
void K_getRingsDrawinfo(drawinfo_t *out);
void K_getMinimapDrawinfo(drawinfo_t *out);
const char *K_GetItemPatch(UINT8 item, boolean tiny);
void K_ReloadHUDColorCvar(void);
boolean K_UseColorHud(void);
UINT8 K_GetHudColor(void);
void K_LoadKartHUDGraphics(void);
void K_drawKartHUD(void);

View file

@ -4148,7 +4148,7 @@ void K_ApplyTripWire(player_t *player, tripwirestate_t state)
if (state == TRIPSTATE_PASSED)
{
S_StartSound(player->mo, sfx_ssa015);
//S_StartSound(player->mo, sfx_ssa015);
player->tripwireLeniency += TICRATE/2;
}
else if (state == TRIPSTATE_BLOCKED)

View file

@ -33,6 +33,8 @@
#include "lua_hud.h"
#include "lua_hook.h"
#include "k_hud.h"
#define HUDONLY if (!hud_running) return luaL_error(L, "HUD rendering code should not be called outside of rendering hooks!");
boolean hud_running = false;
@ -169,6 +171,50 @@ static const char *const camera_opt[] = {
"pnum",
NULL};
enum hudpatch {
hudpatch_item = 0,
hudpatch_itemmul
};
static const char *const hud_patch_options[] = {
"item",
"itemmul",
NULL};
enum hudoffsets {
hudoffsets_item = 0,
hudoffsets_time,
hudoffsets_gametypeinfo,
hudoffsets_rings,
hudoffsets_countdown,
hudoffsets_speedometer,
hudoffsets_accessibility,
hudoffsets_position,
hudoffsets_minirankings,
hudoffsets_startcountdown,
hudoffsets_check,
hudoffsets_minimap,
hudoffsets_wanted,
//hudoffsets_statdisplay,
};
static const char *const hud_offsets_options[] = {
"item",
"time",
"gametypeinfo",
"rings",
"countdown",
"speedometer",
"accessibility",
"position",
"minirankings",
"startcountdown",
"check",
"minimap",
"wanted",
//"statdisplay",
NULL};
static int colormap_get(lua_State *L)
{
const UINT8 *colormap = *((UINT8 **)luaL_checkudata(L, 1, META_COLORMAP));
@ -1093,6 +1139,53 @@ static int libd_getColormap(lua_State *L)
return 1;
}
static int libd_getColorHudPatch(lua_State *L)
{
HUDONLY
enum hudpatch option = luaL_checkoption(L, 1, NULL, hud_patch_options);
patch_t *patch;
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
boolean small, dark;
switch (option) {
case hudpatch_item:
small = lua_optboolean(L, 2);
dark = lua_optboolean(L, 3);
patch = K_getItemBoxPatch(small, dark);
if (!cv_colorizeditembox.value)
colormap = NULL;
break;
case hudpatch_itemmul:
small = lua_optboolean(L, 2);
patch = K_getItemMulPatch(small);
break;
default:
return 0; // you shouldn't be here
}
LUA_PushUserdata(L, patch, META_PATCH);
if (colormap && K_UseColorHud())
LUA_PushUserdata(L, colormap, META_COLORMAP);
else
lua_pushnil(L);
return 2;
}
static int libd_getHudColor(lua_State *L)
{
HUDONLY
lua_pushinteger(L, K_GetHudColor());
return 1;
}
static int libd_useColorHud(lua_State *L)
{
HUDONLY
lua_pushboolean(L, K_UseColorHud());
return 1;
}
static int libd_getStringColormap(lua_State *L)
{
INT32 flags = luaL_checkinteger(L, 1);
@ -1252,6 +1345,41 @@ static int libd_getlocaltransflag(lua_State *L)
return 1;
}
enum huddrawinfo {
huddrawinfo_item = 0,
huddrawinfo_gametypeinfo,
huddrawinfo_rings,
huddrawinfo_minimap
};
static const char *const hud_drawinfo_options[] = {
"item",
"gametypeinfo",
"rings",
"minimap",
NULL};
static int libd_getDrawInfo(lua_State *L)
{
HUDONLY
enum huddrawinfo option = luaL_checkoption(L, 1, NULL, hud_drawinfo_options);
drawinfo_t info;
switch(option) {
case huddrawinfo_item: K_getItemBoxDrawinfo(&info); break;
case huddrawinfo_gametypeinfo: K_getLapsDrawinfo(&info); break;
case huddrawinfo_rings: K_getRingsDrawinfo(&info); break;
case huddrawinfo_minimap: K_getMinimapDrawinfo(&info); break;
default:
return 0; // unreachable
}
lua_pushinteger(L, info.x);
lua_pushinteger(L, info.y);
lua_pushinteger(L, info.flags);
return 3;
}
// Get cv_translucenthud's value for HUD rendering as a normal V_xxTRANS int
static int libd_getusertransflag(lua_State *L)
{
@ -1342,6 +1470,10 @@ static luaL_Reg lib_draw[] = {
{"renderer", libd_renderer},
{"localTransFlag", libd_getlocaltransflag},
{"drawOnMinimap", libd_drawOnMinimap},
{"getColorHudPatch", libd_getColorHudPatch},
{"getDrawInfo", libd_getDrawInfo},
{"getHudColor", libd_getHudColor},
{"useColorHud", libd_useColorHud},
{"userTransFlag", libd_getusertransflag},
{"getDeltaTime", libd_getDeltaTime},
// interpolation
@ -1418,6 +1550,38 @@ static int lib_hudsetvotebackground(lua_State *L)
return 0;
}
static int lib_hudgetoffsets(lua_State *L)
{
enum hudoffsets option = luaL_checkoption(L, 1, NULL, hud_offsets_options);
INT32 ofx, ofy;
#define OFS(it) ofx = cv_##it##_xoffset.value; ofy = cv_##it##_yoffset.value; break;
#define OFY(it) ofx = 0; ofy = cv_##it##_yoffset.value; break;
switch(option) {
case hudoffsets_item: OFS(item)
case hudoffsets_time: OFS(time)
case hudoffsets_gametypeinfo: OFS(laps)
case hudoffsets_rings: OFS(rings)
case hudoffsets_countdown: OFS(dnft)
case hudoffsets_speedometer: OFS(speed)
case hudoffsets_position: OFS(posi)
case hudoffsets_minirankings: OFS(face)
case hudoffsets_startcountdown: OFS(stcd)
case hudoffsets_check: OFY(chek)
case hudoffsets_minimap: OFS(mini)
case hudoffsets_wanted: OFS(want)
//case hudoffsets_statdisplay: OFS(stat)
default:
return 0; // unreachable
}
#undef OFS
#undef OFY
lua_pushinteger(L, ofx);
lua_pushinteger(L, ofy);
return 2;
}
// add a HUD element for rendering
extern int lib_hudadd(lua_State *L);
@ -1427,6 +1591,7 @@ static luaL_Reg lib_hud[] = {
{"enabled", lib_hudenabled},
{"add", lib_hudadd},
{"setVoteBackground", lib_hudsetvotebackground},
{"getOffsets", lib_hudgetoffsets},
{NULL, NULL}
};

View file

@ -93,6 +93,7 @@ extern lua_State *gL;
#define META_BBOX "BOUNDING_BOX"
#define META_HUDINFO "HUDINFO_T*"
#define META_PATCH "PATCH_T*"
#define META_COLORMAP "COLORMAP"
#define META_CAMERA "CAMERA_T*"