From fbbb3c543e7f19554a4ea54ee5445a6b1da97d3f Mon Sep 17 00:00:00 2001 From: minenice55 Date: Mon, 9 Feb 2026 21:05:03 -0500 Subject: [PATCH] make non-overheating flame shield unable to damage players and tweak visuals to convey overheating a bit more also raises the flamometer up a bit --- src/d_main.cpp | 2 +- src/d_player.h | 3 ++- src/k_collide.c | 9 +++++++-- src/k_hud.c | 2 +- src/k_kart.c | 43 +++++++++++++++++++++---------------------- src/p_mobj.c | 15 +++++++++++++-- src/p_saveg.c | 2 ++ 7 files changed, 47 insertions(+), 29 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index a75caaff6..6de83d927 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 0x87b47ede26ba6c0d +#define ASSET_HASH_MAIN_PK3 0xecfcc8dea28426e9 #define ASSET_HASH_MAPPATCH_PK3 0xbbc2c6a7a685da3a #define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461 #ifdef USE_PATCH_FILE diff --git a/src/d_player.h b/src/d_player.h index f8e50bb68..5dd11b9ec 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -211,6 +211,7 @@ typedef enum khud_timeovercam, // Camera timer for leaving behind or not khud_heavydropcam, // Camera timer for heavy air drop khud_postdropcam, // Camera timer for landing after heavy air drop (both timers superposition for feel) + khud_flamecamtime, // Timer for flame shield usage camera effect // Sounds khud_enginesnd, // Engine sound offset this player is using. @@ -706,8 +707,8 @@ struct player_t UINT16 flamedash; // Flame Shield dash power INT32 flametimer; // Flame Shield dash meter left ("fuel") UINT8 flamestore; // Flame Shield reserve boost ("temperature") + UINT8 flameburnstop; // Time Flame Shield can't increase temperature for tic_t flameoverheat; // Time the Flame Shield spends overheating - tic_t flamecamtime; // Timer for flame shield usage camera effect UINT16 hyudorotimer; // Duration of the Hyudoro offroad effect itself SINT8 stealingtimer; // you are stealing diff --git a/src/k_collide.c b/src/k_collide.c index 62659913a..ecafb38ec 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -102,6 +102,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) // and cut temperature and fuel by 10% of max t2->player->flamestore -= min(FLAMESTOREMAX/10, t2->player->flamestore); t2->player->flametimer -= min((itemtime*3)/10, t2->player->flametimer - 1); + t2->player->flameburnstop = TICRATE/4; } else { @@ -194,6 +195,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) // and cut temperature and fuel by 10% of max t2->player->flamestore -= min(FLAMESTOREMAX/10, t2->player->flamestore); t2->player->flametimer -= min((itemtime*3)/10, t2->player->flametimer - 1); + t2->player->flameburnstop = TICRATE/4; } else { @@ -270,6 +272,7 @@ boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2) // and cut temperature and fuel by 10% of max t2->player->flamestore -= min(FLAMESTOREMAX/10, t2->player->flamestore); t2->player->flametimer -= min((itemtime*3)/10, t2->player->flametimer - 1); + t2->player->flameburnstop = TICRATE/4; return true; } else @@ -359,6 +362,7 @@ boolean K_EggMineCollide(mobj_t *t1, mobj_t *t2) // and cut temperature and fuel by 10% of max t2->player->flamestore -= min(FLAMESTOREMAX/10, t2->player->flamestore); t2->player->flametimer -= min((itemtime*3)/10, t2->player->flametimer - 1); + t2->player->flameburnstop = TICRATE/4; return true; } @@ -525,6 +529,7 @@ boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2) // and cut temperature and fuel by 10% of max t2->player->flamestore -= min(FLAMESTOREMAX/10, t2->player->flamestore); t2->player->flametimer -= min((itemtime*3)/10, t2->player->flametimer - 1); + t2->player->flameburnstop = TICRATE/4; } else { @@ -933,8 +938,8 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) if (P_MobjWasRemoved(t1) || P_MobjWasRemoved(t2) || !t1->player || !t2->player) return false; - const boolean flameT1 = ((t1->player->flamestore > 0) && (t1->player->flametimer > 0)); - const boolean flameT2 = ((t2->player->flamestore > 0) && (t2->player->flametimer > 0)); + const boolean flameT1 = ((t1->player->flamestore >= FLAMESTOREMAX-1) && (t1->player->flametimer > 0)); + const boolean flameT2 = ((t2->player->flamestore >= FLAMESTOREMAX-1) && (t2->player->flametimer > 0)); const boolean hyudoroT1 = (t1->player->hyudorotimer > 0); const boolean hyudoroT2 = (t2->player->hyudorotimer > 0); diff --git a/src/k_hud.c b/src/k_hud.c index 72d633af8..0e9e6bec3 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -6713,7 +6713,7 @@ void K_DrawFlamometer(void) K_ObjectTracking(&res, &pos, false); basex = res.x + (16<flameoverheat -= 1; } + if (player->flameburnstop) + player->flameburnstop--; + if (player->stealingtimer == 0 && player->stolentimer == 0) player->flametimer--; @@ -7801,15 +7804,17 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) else { player->flameoverheat = 0; + player->flameburnstop = 0; if (player->flamestore) K_FlameDashLeftoverSmoke(player->mo); } - if (player->flamecamtime > 0) + + if (player->karthud[khud_flamecamtime] > 0) { - player->karthud[khud_destboostcam] = FixedMul(FRACUNIT*3/4, FixedDiv(player->flamecamtime, TICRATE/2)); - player->flamecamtime -= 1; + player->karthud[khud_destboostcam] = FixedMul(FRACUNIT*3/4, FixedDiv(player->karthud[khud_flamecamtime], TICRATE/2)); + player->karthud[khud_flamecamtime] -= 1; } if (player->driftmode != DRIFTMODE_INSTANT) @@ -9463,7 +9468,7 @@ boolean K_InterceptArrowBullet(player_t *player) if (!player) return false; - return ((player->invincibilitytimer && !K_IsKartItemAlternate(KITEM_INVINCIBILITY)) || (player->growshrinktimer > 0) || (player->flamestore)); + return ((player->invincibilitytimer && !K_IsKartItemAlternate(KITEM_INVINCIBILITY)) || (player->growshrinktimer > 0) || (player->flamestore >= FLAMESTOREMAX-1)); } // 0.25 fracunits @@ -11350,13 +11355,17 @@ void K_MoveKartPlayer(player_t *player, boolean onground) SINT8 metincr = (gametyperules & GTR_CLOSERPLAYERS) ? 4 : 3; SINT8 comincr = (gametyperules & GTR_CLOSERPLAYERS) ? 10 : 4; - // experiment: uses fuel faster, but raises temperature faster - if (cv_kartflame_fastfuel.value) + // uses fuel faster, but raises temperature faster + if (cv_kartflame_fastfuel.value && (!player->flameburnstop)) { incr = incr * 2; - metincr = metincr * 2; comincr = comincr * 2; + metincr = metincr * 3 / 2; } + + // burning a trap / missile stops you from raising temperature for a tiny bit + if (player->flameburnstop) + metincr = 0; if (onground) { @@ -11365,28 +11374,18 @@ void K_MoveKartPlayer(player_t *player, boolean onground) S_StartSound(player->mo, sfx_s3k9b); K_PlayBoostTaunt(player->mo); - if (player->flamecamtime == 0) - player->flamecamtime = TICRATE/2; + if (player->karthud[khud_flamecamtime] == 0) + player->karthud[khud_flamecamtime] = TICRATE/2; if (!S_SoundPlaying(player->mo, sfx_s3kd3l)) S_StartSound(player->mo, sfx_s3kd3l); } player->flamedash += incr; - player->flamestore = min(player->flamestore + metincr, FLAMESTOREMAX); - player->flametimer -= comincr; } - /*else - { - player->flamedash += incr; - player->flamestore = min(player->flamestore + metincr, FLAMESTOREMAX); - player->flametimer -= comincr; - - P_Thrust( - player->mo, player->mo->angle, - FixedMul(player->mo->scale, K_GetKartGameSpeedScalar(gamespeed))/4 - ); - }*/ + // allow burning in the air + player->flamestore = min(player->flamestore + metincr, FLAMESTOREMAX); + player->flametimer -= comincr; if (player->flametimer <= 0) K_PopPlayerShield(player); diff --git a/src/p_mobj.c b/src/p_mobj.c index d84b09d9c..aff9a6427 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9384,15 +9384,17 @@ static boolean P_MobjRegularThink(mobj_t *mobj) case MT_FLAMESHIELD: { statenum_t curstate; + UINT8 flamestore = mobj->target->player->flamestore; if (!mobj->target || !mobj->target->health || !mobj->target->player || K_GetShieldFromPlayer(mobj->target->player) != KSHIELD_FLAME) { P_RemoveMobj(mobj); return false; } - P_SetScale(mobj, (mobj->destscale = (5*mobj->target->scale)>>2)); + // P_SetScale(mobj, (mobj->destscale = ((flamestore >= FLAMESTOREMAX-1) ? (2*mobj->target->scale) : (5*mobj->target->scale)>>2))); + mobj->destscale = ((flamestore >= FLAMESTOREMAX-1) ? (7*mobj->target->scale/4) : (5*mobj->target->scale)>>2); curstate = ((mobj->tics == 1) ? (mobj->state->nextstate) : ((statenum_t)(mobj->state-states))); - if (mobj->target->player->flamestore) + if (flamestore) { if (curstate != S_FLAMESHIELDDASH) P_SetMobjState(mobj, S_FLAMESHIELDDASH); @@ -9404,6 +9406,15 @@ static boolean P_MobjRegularThink(mobj_t *mobj) P_SetMobjState(mobj, S_FLAMESHIELD1); mobj->renderflags &= ~RF_DONTDRAW; } + + if (flamestore >= FLAMESTOREMAX-1) + { + mobj->renderflags |= RF_ADD; + } + else + { + mobj->renderflags &= ~RF_ADD; + } // Don't sloperoll Shields mobj->pitch = 0; diff --git a/src/p_saveg.c b/src/p_saveg.c index 0610ffe05..3a4d428cb 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -730,6 +730,8 @@ static void P_NetSyncPlayers(savebuffer_t *save) SYNC(players[i].flamedash); SYNC(players[i].flametimer); SYNC(players[i].flamestore); + SYNC(players[i].flameburnstop); + SYNC(players[i].flameoverheat); SYNC(players[i].hyudorotimer); SYNC(players[i].stealingtimer);