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
This commit is contained in:
minenice55 2026-02-09 21:05:03 -05:00
parent bfa0569815
commit fbbb3c543e
7 changed files with 47 additions and 29 deletions

View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -6713,7 +6713,7 @@ void K_DrawFlamometer(void)
K_ObjectTracking(&res, &pos, false);
basex = res.x + (16<<FRACBITS);
basey = res.y - (48<<FRACBITS);
basey = res.y - (52<<FRACBITS);
if (K_UseColorHud())
{

View file

@ -7792,6 +7792,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
player->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);

View file

@ -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;

View file

@ -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);