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:
parent
bfa0569815
commit
fbbb3c543e
7 changed files with 47 additions and 29 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
43
src/k_kart.c
43
src/k_kart.c
|
|
@ -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);
|
||||
|
|
|
|||
15
src/p_mobj.c
15
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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue