diff --git a/src/d_main.cpp b/src/d_main.cpp index ad3e43469..16755739f 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 0x329e1e108ba0e570 +#define ASSET_HASH_MAIN_PK3 0x7c7002e1ab604171 #define ASSET_HASH_MAPPATCH_PK3 0x7d1f6b96dd119296 #define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461 #ifdef USE_PATCH_FILE diff --git a/src/d_player.h b/src/d_player.h index a7787ef0e..f0640dda3 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -701,9 +701,10 @@ struct player_t UINT8 bubblehealth; // Bubble Shield health UINT16 bubbleboost; // Bubble shield boost timer - UINT16 flamedash; // Flame Shield dash power - INT32 flametimer; // Flame Shield dash meter left - UINT8 flamestore; // Flame Shield reserve boost + UINT16 flamedash; // Flame Shield dash power + INT32 flametimer; // Flame Shield dash meter left + UINT8 flamestore; // Flame Shield reserve boost + tic_t flameoverheat; // Time the Flame Shield spends overheating UINT16 hyudorotimer; // Duration of the Hyudoro offroad effect itself SINT8 stealingtimer; // you are stealing diff --git a/src/k_hud.c b/src/k_hud.c index 79aaa00ff..038c5263f 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -155,8 +155,11 @@ static patch_t *kp_kartzspeedo_smol[25]; static patch_t *kp_driftgauge[14]; static patch_t *kp_driftgaugeparts[5]; -static patch_t *kp_flamometer[4]; -static patch_t *kp_flamefire[4]; +static patch_t *kp_flamometer[6]; +static patch_t *kp_flamefire[18]; + +// Frames of animation for the fire +#define MAXFLAMOFIRETICS 8 static patch_t *kp_rankbumper; static patch_t *kp_tinybumper[2]; @@ -440,14 +443,30 @@ void K_LoadKartHUDGraphics(void) HU_UpdatePatch(&kp_flamometer[1], "THERMOFUEL"); HU_UpdatePatch(&kp_flamometer[2], "THERMOTEMP"); HU_UpdatePatch(&kp_flamometer[3], "THERMOMETRE"); + HU_UpdatePatch(&kp_flamometer[4], "THERMCBACK"); + HU_UpdatePatch(&kp_flamometer[5], "THERMCMETRE"); //Flamometer Fire { const char* patchNames[] = { + "THFIREX", "THFIRE1", "THFIRE2", "THFIRE3", - "THFIRE4" + "THFIRE4", + "THFIRE5", + "THFIRE6", + "THFIRE7", + "THFIRE8", + "THFIRCX", + "THFIRC1", + "THFIRC2", + "THFIRC3", + "THFIRC4", + "THFIRC5", + "THFIRC6", + "THFIRC7", + "THFIRC8" }; for (size_t m = 0; m < sizeof(patchNames) / sizeof(patchNames[0]); ++m) @@ -6447,7 +6466,8 @@ void K_DrawFlamometer(void) INT32 basex, basey, barextraflags = 0; INT32 flags = V_SPLITSCREEN|V_HUDTRANS; INT32 fuelbarheight = 41; - INT32 tempbarheight = 48; + INT32 tempbarheight = 49; + UINT8 *colormap = NULL; K_ObjectTracking(&res, &pos, false); basex = res.x + (16<flamestore >= FLAMESTOREMAX-1) { - V_DrawFixedPatch(basex, basey, FRACUNIT, flags|V_ADD, kp_flamefire[CLAMP((leveltime / 3) % 4, 0, 4)], NULL); + UINT8 flamofiretic = CLAMP((leveltime / 3) % MAXFLAMOFIRETICS, 0, MAXFLAMOFIRETICS) + 1; + + if (stplyr->flameoverheat < 3) + { + // Fancy "explode" VFX + flamofiretic = 0; + } + + if (K_UseColorHud()) + { + flamofiretic += 9; + colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE); + } + + V_DrawFixedPatch(basex, basey, FRACUNIT, flags|V_ADD, kp_flamefire[flamofiretic], colormap); if (leveltime % 3 != 0) { @@ -6465,23 +6499,23 @@ void K_DrawFlamometer(void) } // back - V_DrawFixedPatch(basex, basey, FRACUNIT, flags, kp_flamometer[0], NULL); + V_DrawFixedPatch(basex, basey, FRACUNIT, flags, kp_flamometer[K_UseColorHud() ? 4 : 0], colormap); // bars // fuel fuelbarheight *= FixedDiv(stplyr->flametimer, itemtime*3); - V_SetClipRect(basex + 2*FRACUNIT, basey + 49*FRACUNIT - fuelbarheight, 2*FRACUNIT, fuelbarheight, flags); + V_SetClipRect(basex + 7*FRACUNIT, basey + 58*FRACUNIT - fuelbarheight, 4*FRACUNIT, fuelbarheight, flags); V_DrawFixedPatch(basex, basey, FRACUNIT, flags, kp_flamometer[1], NULL); V_ClearClipRect(); // temperature tempbarheight *= FixedDiv(stplyr->flamestore, FLAMESTOREMAX); - V_SetClipRect(basex + 5*FRACUNIT, basey + 53*FRACUNIT - tempbarheight, 5*FRACUNIT, tempbarheight, flags); + V_SetClipRect(basex + 10*FRACUNIT, basey + 62*FRACUNIT - tempbarheight, 32*FRACUNIT, tempbarheight, flags); V_DrawFixedPatch(basex, basey, FRACUNIT, flags|barextraflags, kp_flamometer[2], NULL); V_ClearClipRect(); // front - V_DrawFixedPatch(basex, basey, FRACUNIT, flags, kp_flamometer[3], NULL); + V_DrawFixedPatch(basex, basey, FRACUNIT, flags, kp_flamometer[K_UseColorHud() ? 5 : 3], colormap); } diff --git a/src/k_kart.c b/src/k_kart.c index f65493613..bc7874537 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7386,6 +7386,16 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->flametimer > 0) { + if (player->flamestore >= FLAMESTOREMAX-1) + { + // Overheating; mainly used for the Flamometer + player->flameoverheat++; + } + else + { + player->flameoverheat = 0; + } + if (player->stealingtimer == 0 && player->stolentimer == 0) player->flametimer--; @@ -7394,6 +7404,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } else { + player->flameoverheat = 0; + if (player->flamestore) K_FlameDashLeftoverSmoke(player->mo); }