diff --git a/src/d_main.cpp b/src/d_main.cpp index 102aee76b..ad3e43469 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -93,7 +93,7 @@ #define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291 #define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b #define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9 -#define ASSET_HASH_MAIN_PK3 0xa49f63046b23999e +#define ASSET_HASH_MAIN_PK3 0x329e1e108ba0e570 #define ASSET_HASH_MAPPATCH_PK3 0x7d1f6b96dd119296 #define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461 #ifdef USE_PATCH_FILE diff --git a/src/k_hud.c b/src/k_hud.c index a2eb4a812..c785674f6 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -65,8 +65,9 @@ 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(timers); // Drafting +IMPL_HUD_OFFSET(timers); // Timers IMPL_HUD_OFFSET(draft); // Drafting +IMPL_HUD_OFFSET(lives); // Lives and Stats IMPL_HUD_OFFSET(posi); // Position in race IMPL_HUD_OFFSET(face); // Mini rankings IMPL_HUD_OFFSET(stcd); // Starting countdown @@ -108,6 +109,8 @@ consvar_t cv_newtabranking = CVAR_INIT ("newtabranking", "On", CV_SAVE, CV_OnOff consvar_t cv_draftindicator = CVAR_INIT ("draftindicator", "On", CV_SAVE, CV_OnOff, NULL); +consvar_t cv_showstats = CVAR_INIT ("showstats", "On", CV_SAVE, CV_OnOff, NULL); + //{ Patch Definitions static patch_t *kp_nodraw; @@ -244,6 +247,7 @@ void K_RegisterKartHUDStuff(void) REG_HUD_OFFSET(acce); // Accessibility REG_HUD_OFFSET(timers); // Item Timers REG_HUD_OFFSET(draft); // Drafting + REG_HUD_OFFSET(lives); // Lives and Stats REG_HUD_OFFSET(posi); // Position in race REG_HUD_OFFSET(face); // Mini rankings REG_HUD_OFFSET(stcd); // Starting countdown @@ -270,6 +274,7 @@ void K_RegisterKartHUDStuff(void) CV_RegisterVar(&cv_driftgaugeoffset); CV_RegisterVar(&cv_newtabranking); CV_RegisterVar(&cv_draftindicator); + CV_RegisterVar(&cv_showstats); } // YOUR TOO TOO (try limit for NULL HUD patches) @@ -797,6 +802,7 @@ INT32 RING_X, RING_Y; // Player Rings INT32 SPDM_X, SPDM_Y; // Speedometer INT32 ACCE_X, ACCE_Y; // Accessibility INT32 DRAT_X, DRAT_Y; // Drafting +INT32 LIVE_X, LIVE_Y; // Stats and Lives INT32 POSI_X, POSI_Y; // Position Number INT32 FACE_X, FACE_Y; // Top-four Faces INT32 STCD_X, STCD_Y; // Starting countdown @@ -810,6 +816,7 @@ INT32 LAPS2_X, LAPS2_Y; INT32 RING2_X, RING2_Y; INT32 POSI2_X, POSI2_Y; INT32 DRAT2_X, DRAT2_Y; +INT32 LIVE2_X, LIVE2_Y; void K_ReloadHUDColorCvar(void) { @@ -1054,6 +1061,9 @@ static void K_initKartHUD(void) // Drafting DRAT_X = 172 + cv_draft_xoffset.value; // 172 DRAT_Y = BASEVIDHEIGHT - 41 + cv_draft_yoffset.value; // 159 + // Lives and Stats + LIVE_X = 9 + cv_lives_xoffset.value; // 9 + LIVE_Y = BASEVIDHEIGHT - 29 + cv_lives_yoffset.value; // 171 // Position Number POSI_X = BASEVIDWIDTH - 9 + cv_posi_xoffset.value; // 268 POSI_Y = BASEVIDHEIGHT - 9 + cv_posi_yoffset.value; // 138 @@ -1093,6 +1103,9 @@ static void K_initKartHUD(void) DRAT_X = 172; DRAT_Y = (BASEVIDHEIGHT/2)-34; + LIVE_X = 9; + LIVE_Y = (BASEVIDHEIGHT/2)-24; + STCD_X = BASEVIDWIDTH/2; STCD_Y = BASEVIDHEIGHT/4; @@ -1117,6 +1130,9 @@ static void K_initKartHUD(void) DRAT_X = 95; DRAT_Y = (BASEVIDHEIGHT/2)-32; + LIVE_X = 3; + LIVE_Y = (BASEVIDHEIGHT/2)-12; + // 2P (top right) ITEM2_X = (BASEVIDWIDTH/2)-39; ITEM2_Y = -8; @@ -1133,6 +1149,9 @@ static void K_initKartHUD(void) DRAT2_X = 95; DRAT2_Y = (BASEVIDHEIGHT/2)-32; + LIVE2_X = (BASEVIDWIDTH/2)-43; + LIVE2_Y = (BASEVIDHEIGHT/2)-12; + // Reminder that 3P and 4P are just 1P and 2P splitscreen'd to the bottom. STCD_X = BASEVIDWIDTH/4; @@ -2659,7 +2678,6 @@ void K_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, IN static void K_drawKartLaps(void) { - const boolean uselives = G_GametypeUsesLives(); INT32 fx = 0, fy = 0, splitflags = 0; // stuff for 3p / 4p splitscreen. drawinfo_t info; @@ -2670,10 +2688,6 @@ static void K_drawKartLaps(void) if (r_splitscreen > 1) { - INT32 fr = 0; - - fr = fx; - // Laps V_DrawScaledPatch(fx, fy, V_HUDTRANS|splitflags, kp_splitlapflag); V_DrawScaledPatch(fx+22, fy, V_HUDTRANS|splitflags, frameslash); @@ -2698,17 +2712,6 @@ static void K_drawKartLaps(void) V_DrawScaledPatch(fx+13, fy, V_HUDTRANS|splitflags, kp_facenum[(stplyr->laps) % 10]); V_DrawScaledPatch(fx+27, fy, V_HUDTRANS|splitflags, kp_facenum[(numlaps) % 10]); } - - // Lives - if (LUA_HudEnabled(hud_lives) && uselives) - { - UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, K_GetHudColor(), GTC_CACHE); - patch_t *mmappatch = faceprefix[stplyr->skin][FACE_MINIMAP]; - - V_DrawMappedPatch(fr+21+mmappatch->leftoffset, fy-13+mmappatch->topoffset, V_HUDTRANS|splitflags, mmappatch, colormap); - if (stplyr->lives >= 0) - V_DrawScaledPatch(fr+34, fy-10, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[(stplyr->lives % 10)]); // make sure this doesn't overflow OR underflow - } } else { @@ -2732,28 +2735,100 @@ static void K_drawKartLaps(void) V_DrawKartString(fx+33, fy+3, V_HUDTRANS|V_SLIDEIN|splitflags, "FIN"); else V_DrawKartString(fx+33, fy+3, V_HUDTRANS|splitflags, va("%d/%d", min(stplyr->laps, numlaps), numlaps)); + } +} +void K_getLivesnStatsDrawinfo(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 = LIVE_X; + fy = LIVE_Y; + splitflags = V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANS|V_SPLITSCREEN; + } + else + { + if (stplyrnum == 0 || stplyrnum == 2) // If we are P1 or P3... + { + fx = LIVE_X; + fy = LIVE_Y; + splitflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_SPLITSCREEN; + } + else // else, that means we're P2 or P4. + { + fx = LIVE2_X; + fy = LIVE2_Y; + splitflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM|V_SPLITSCREEN; + } + } + + out->x = fx; + out->y = fy; + out->flags = splitflags; +} + +static void K_drawKartStatsnLives(void) +{ + const boolean uselives = G_GametypeUsesLives(); + const boolean stats = cv_showstats.value; + + INT32 fx = 0, fy = 0, splitflags = 0; // stuff for 3p / 4p splitscreen. + + drawinfo_t info; + K_getLivesnStatsDrawinfo(&info); + fx = info.x; + fy = info.y; + splitflags = info.flags; + + if (r_splitscreen > 1) + { // Lives if (LUA_HudEnabled(hud_lives) && uselives) + { + UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, K_GetHudColor(), GTC_CACHE); + patch_t *mmappatch = faceprefix[stplyr->skin][FACE_MINIMAP]; + + V_DrawMappedPatch(fx+21+mmappatch->leftoffset, fy-13+mmappatch->topoffset, V_HUDTRANS|splitflags, mmappatch, colormap); + if (stplyr->lives >= 0 && uselives) + V_DrawScaledPatch(fx+34, fy-10, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[(stplyr->lives % 10)]); // make sure this doesn't overflow OR underflow + } + } + else + { + // Stats and Lives + if (LUA_HudEnabled(hud_lives) && (uselives || stats)) { INT32 offsetx = 0; INT32 offsety = 0; - if ((cv_newspeedometer.value == 0 || cv_newspeedometer.value == 2) && !K_RingsActive()) + if (cv_lives_xoffset.value != 0 || cv_lives_yoffset.value != 0) { - offsetx = 25; - offsety = 15; - } - else if (K_RingsActive()) - { - offsetx = 4; + if ((cv_newspeedometer.value == 0 || cv_newspeedometer.value == 2) && !K_RingsActive()) + { + offsetx = 25; + offsety = 15; + } + else if (K_RingsActive()) + { + offsetx = 4; + } } UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, K_GetHudColor(), 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); - if (stplyr->lives >= 0) + 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 + + // Draw stats + UINT8 *colormapstat = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_BLUE, GTC_CACHE); + UINT8 *colormapstat2 = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_ORANGE, 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); } } } @@ -5885,6 +5960,7 @@ void K_drawKartHUD(void) if (gametyperules & GTR_CIRCUIT) { K_drawKartLaps(); + K_drawKartStatsnLives(); } else if (gametyperules & GTR_BUMPERS) { diff --git a/src/k_hud.h b/src/k_hud.h index 0d93673ef..f330d950f 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -94,6 +94,7 @@ void K_getLapsDrawinfo(drawinfo_t *out); void K_getRingsDrawinfo(drawinfo_t *out); void K_getMinimapDrawinfo(drawinfo_t *out); void K_getSlipstreamDrawinfo(drawinfo_t *out); +void K_getLivesnStatsDrawinfo(drawinfo_t *out); const char *K_GetItemPatch(UINT8 item, boolean tiny); void K_ReloadHUDColorCvar(void); boolean K_UseColorHud(void); diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index ce2ccdf3d..e33b4fb73 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -1391,6 +1391,7 @@ enum huddrawinfo { huddrawinfo_minimap, huddrawinfo_timers, huddrawinfo_drafting, + huddrawinfo_lives, }; static const char *const hud_drawinfo_options[] = { @@ -1400,6 +1401,7 @@ static const char *const hud_drawinfo_options[] = { "minimap", "timers", "drafting", + "lives", NULL}; static int libd_getDrawInfo(lua_State *L) @@ -1409,12 +1411,13 @@ static int libd_getDrawInfo(lua_State *L) 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; - case huddrawinfo_timers: K_getSlipstreamDrawinfo(&info); break; - case huddrawinfo_drafting: K_getTimersDrawinfo(&info); break; + 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; + case huddrawinfo_timers: K_getSlipstreamDrawinfo(&info); break; + case huddrawinfo_drafting: K_getTimersDrawinfo(&info); break; + case huddrawinfo_lives: K_getLivesnStatsDrawinfo(&info); break; default: return 0; // unreachable }