Let Sneakers stack with each other endlessly.

PROBABLY REALLY CONTROVERSIAL, so it's in this other branch... but it's tamer than it sounds, and it's *really* fun.

https://cdn.discordapp.com/attachments/275750804227489794/718541704822784061/kart0158.gif

https://cdn.discordapp.com/attachments/275750804227489794/718545963408687155/kart0161.gif

https://cdn.discordapp.com/attachments/275750804227489794/718543467847876689/kart0160.gif
This commit is contained in:
Sally Coolatta 2020-06-05 15:29:08 -04:00
parent 820d1f3ac6
commit 25c3774dc1
7 changed files with 56 additions and 35 deletions

View file

@ -316,8 +316,8 @@ typedef enum
k_stealingtimer, // You are stealing an item, this is your timer
k_stolentimer, // You are being stolen from, this is your timer
k_superring, // Spawn rings on top of you every tic!
k_sneakertimer, // Duration of the Sneaker Boost itself
k_levelbooster, // Duration of a level booster's boost (same as sneaker, but separated for boost stacking)
k_sneakertimer, // Duration of a Sneaker Boost (from Sneakers or level boosters)
k_numsneakers, // Number of stacked sneaker effects
k_growshrinktimer, // > 0 = Big, < 0 = small
k_squishedtimer, // Squished frame timer
k_rocketsneakertimer, // Rocket Sneaker duration timer
@ -391,9 +391,6 @@ typedef enum
NUMKARTHUD
} karthudtype_t;
// QUICKLY GET EITHER SNEAKER OR LEVEL BOOSTER SINCE THEY ARE FUNCTIONALLY IDENTICAL
#define EITHERSNEAKER(p) (p->kartstuff[k_sneakertimer] || p->kartstuff[k_levelbooster])
// QUICKLY GET RING TOTAL, INCLUDING RINGS CURRENTLY IN THE PICKUP ANIMATION
#define RINGTOTAL(p) (p->kartstuff[k_rings] + p->kartstuff[k_pickuprings])

View file

@ -8389,7 +8389,7 @@ static const char *const KARTSTUFF_LIST[] = {
"STOLENTIMER",
"SUPERRING",
"SNEAKERTIMER",
"LEVELBOOSTER",
"NUMSNEAKERS",
"GROWSHRINKTIMER",
"SQUISHEDTIMER",
"ROCKETSNEAKERTIMER",

View file

@ -1430,7 +1430,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
{
// forward with key or button // SRB2kart - we use an accel/brake instead of forward/backward.
axis = JoyAxis(AXISMOVE, ssplayer);
if (InputDown(gc_accelerate, ssplayer) || (gamepadjoystickmove && axis > 0) || EITHERSNEAKER(player))
if (InputDown(gc_accelerate, ssplayer) || (gamepadjoystickmove && axis > 0) || player->kartstuff[k_sneakertimer])
{
cmd->buttons |= BT_ACCELERATE;
forward = forwardmove[1]; // 50
@ -5104,7 +5104,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|| (players[displayplayers[0]].respawn.state != RESPAWNST_NONE) // Respawning
|| (players[displayplayers[0]].spectator || objectplacing)) // Not a physical player
&& !(players[displayplayers[0]].kartstuff[k_spinouttimer]
&& (players[displayplayers[0]].kartstuff[k_sneakertimer] || players[displayplayers[0]].kartstuff[k_levelbooster]))) // Spinning and boosting cancels out spinout
&& players[displayplayers[0]].kartstuff[k_sneakertimer])) // Spinning and boosting cancels out spinout
localangle[0] += (cmd->angleturn<<16);
if (!(demoflags & DF_GHOST) && *demo_p == DEMOMARKER)

View file

@ -1925,7 +1925,7 @@ void K_MomentumToFacing(player_t *player)
boolean K_ApplyOffroad(player_t *player)
{
if (player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_hyudorotimer] || EITHERSNEAKER(player))
if (player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_hyudorotimer] || player->kartstuff[k_sneakertimer])
return false;
return true;
}
@ -1962,29 +1962,44 @@ static void K_GetKartBoostPower(player_t *player)
accelboost += (a) / numboosts; \
}
if (player->kartstuff[k_levelbooster]) // Level boosters
ADDBOOST(FRACUNIT/2, 8*FRACUNIT); // + 50% top speed, + 800% acceleration
if (player->kartstuff[k_sneakertimer]) // Sneaker
ADDBOOST(FRACUNIT/2, 8*FRACUNIT); // + 50% top speed, + 800% acceleration
{
UINT8 i;
for (i = 0; i < player->kartstuff[k_numsneakers]; i++)
{
ADDBOOST(FRACUNIT/2, 8*FRACUNIT); // + 50% top speed, + 800% acceleration
}
}
if (player->kartstuff[k_invincibilitytimer]) // Invincibility
ADDBOOST((3*FRACUNIT)/8, 3*FRACUNIT); // + 37.5% top speed, + 300% acceleration
{
ADDBOOST(3*FRACUNIT/8, 3*FRACUNIT); // + 37.5% top speed, + 300% acceleration
}
if (player->kartstuff[k_flamedash]) // Flame Shield dash
{
ADDBOOST(K_FlameShieldDashVar(player->kartstuff[k_flamedash]), 3*FRACUNIT); // + infinite top speed, + 300% acceleration
}
if (player->kartstuff[k_startboost]) // Startup Boost
{
ADDBOOST(FRACUNIT/4, 6*FRACUNIT); // + 25% top speed, + 600% acceleration
}
if (player->kartstuff[k_driftboost]) // Drift Boost
{
ADDBOOST(FRACUNIT/4, 4*FRACUNIT); // + 25% top speed, + 400% acceleration
}
if (player->kartstuff[k_ringboost]) // Ring Boost
{
ADDBOOST(FRACUNIT/5, 4*FRACUNIT); // + 20% top speed, + 400% acceleration
}
if (player->kartstuff[k_eggmanexplode]) // Ready-to-explode
ADDBOOST(FRACUNIT/5, FRACUNIT); // + 20% top speed, + 100% acceleration
{
ADDBOOST(3*FRACUNIT/20, FRACUNIT); // + 15% top speed, + 100% acceleration
}
if (player->kartstuff[k_draftpower] > 0) // Drafting
{
@ -1997,9 +2012,13 @@ static void K_GetKartBoostPower(player_t *player)
// value smoothing
if (speedboost > player->kartstuff[k_speedboost])
{
player->kartstuff[k_speedboost] = speedboost;
}
else
{
player->kartstuff[k_speedboost] += (speedboost - player->kartstuff[k_speedboost]) / (TICRATE/2);
}
player->kartstuff[k_accelboost] = accelboost;
player->kartstuff[k_numboosts] = numboosts;
@ -2122,7 +2141,7 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove
// 0 with no gas, and
// -25 when only braking.
if (EITHERSNEAKER(player))
if (player->kartstuff[k_sneakertimer])
forwardmove = 50;
finalspeed *= forwardmove/25;
@ -2206,7 +2225,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
K_PlayHitEmSound(source);
player->kartstuff[k_sneakertimer] = 0;
//player->kartstuff[k_levelbooster] = 0;
player->kartstuff[k_numsneakers] = 0;
player->kartstuff[k_driftboost] = 0;
player->kartstuff[k_ringboost] = 0;
@ -2353,7 +2372,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor)
#endif
player->kartstuff[k_sneakertimer] = 0;
player->kartstuff[k_levelbooster] = 0;
player->kartstuff[k_numsneakers] = 0;
player->kartstuff[k_driftboost] = 0;
player->kartstuff[k_ringboost] = 0;
@ -2480,7 +2499,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
player->mo->momx = player->mo->momy = 0;
player->kartstuff[k_sneakertimer] = 0;
player->kartstuff[k_levelbooster] = 0;
player->kartstuff[k_numsneakers] = 0;
player->kartstuff[k_driftboost] = 0;
player->kartstuff[k_ringboost] = 0;
@ -3924,7 +3943,7 @@ void K_DoSneaker(player_t *player, INT32 type)
player->karthud[khud_destboostcam] = FixedMul(FRACUNIT, FixedDiv((intendedboost - player->kartstuff[k_speedboost]), intendedboost));
}
if (!EITHERSNEAKER(player))
if (!player->kartstuff[k_sneakertimer])
{
if (type == 2)
{
@ -3958,10 +3977,11 @@ void K_DoSneaker(player_t *player, INT32 type)
{
player->pflags |= PF_ATTACKDOWN;
K_PlayBoostTaunt(player->mo);
player->kartstuff[k_sneakertimer] = sneakertime;
}
else
player->kartstuff[k_levelbooster] = sneakertime;
player->kartstuff[k_sneakertimer] = sneakertime;
player->kartstuff[k_numsneakers]++;
// set angle for spun out players:
player->kartstuff[k_boostangle] = (INT32)player->mo->angle;
@ -4067,7 +4087,7 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound)
thrust = 72<<FRACBITS;
if (mo->player->kartstuff[k_pogospring] != 2)
{
if (EITHERSNEAKER(mo->player))
if (mo->player->kartstuff[k_sneakertimer])
thrust = FixedMul(thrust, (5*FRACUNIT)/4);
else if (mo->player->kartstuff[k_invincibilitytimer])
thrust = FixedMul(thrust, (9*FRACUNIT)/8);
@ -5270,7 +5290,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
if (player->speed > 0)
{
// Speed lines
if (EITHERSNEAKER(player) || player->kartstuff[k_ringboost]
if (player->kartstuff[k_sneakertimer] || player->kartstuff[k_ringboost]
|| player->kartstuff[k_driftboost] || player->kartstuff[k_startboost]
|| player->kartstuff[k_eggmanexplode])
{
@ -5486,7 +5506,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
{
if ((P_IsObjectOnGround(player->mo)
|| (player->kartstuff[k_spinouttype] != 0))
&& (!EITHERSNEAKER(player)))
&& (!player->kartstuff[k_sneakertimer]))
{
player->kartstuff[k_spinouttimer]--;
if (player->kartstuff[k_wipeoutslow] > 1)
@ -5525,15 +5545,19 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
player->kartstuff[k_ringboost]--;
if (player->kartstuff[k_sneakertimer])
{
player->kartstuff[k_sneakertimer]--;
if (player->kartstuff[k_levelbooster])
player->kartstuff[k_levelbooster]--;
if (player->kartstuff[k_sneakertimer] <= 0)
{
player->kartstuff[k_numsneakers] = 0;
}
}
if (player->kartstuff[k_flamedash])
player->kartstuff[k_flamedash]--;
if (EITHERSNEAKER(player) && player->kartstuff[k_wipeoutslow] > 0 && player->kartstuff[k_wipeoutslow] < wipeoutslowtime+1)
if (player->kartstuff[k_sneakertimer] && player->kartstuff[k_wipeoutslow] > 0 && player->kartstuff[k_wipeoutslow] < wipeoutslowtime+1)
player->kartstuff[k_wipeoutslow] = wipeoutslowtime+1;
if (player->kartstuff[k_floorboost])
@ -6226,7 +6250,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
return turnvalue;
}
if (EITHERSNEAKER(player) || player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_growshrinktimer] > 0)
if (player->kartstuff[k_sneakertimer] || player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_growshrinktimer] > 0)
{
turnvalue = 5*turnvalue/4;
}
@ -6465,7 +6489,7 @@ static void K_KartDrift(player_t *player, boolean onground)
player->kartstuff[k_driftend] = 0;
}
if ((!EITHERSNEAKER(player))
if ((!player->kartstuff[k_sneakertimer])
|| (!player->cmd.driftturn)
|| (!player->kartstuff[k_aizdriftstrat])
|| (player->cmd.driftturn > 0) != (player->kartstuff[k_aizdriftstrat] > 0))

View file

@ -3153,6 +3153,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|| inflictor->type == MT_SMK_THWOMP || inflictor->player))
{
player->kartstuff[k_sneakertimer] = 0;
player->kartstuff[k_numsneakers] = 0;
K_SpinPlayer(player, source, 1, inflictor, false);
K_KartPainEnergyFling(player);

View file

@ -8348,10 +8348,9 @@ void P_MobjThinker(mobj_t *mobj)
if (p)
{
if (p->kartstuff[k_sneakertimer] > mobj->movecount
|| p->kartstuff[k_levelbooster] > mobj->movecount)
if (p->kartstuff[k_sneakertimer] > mobj->movecount)
P_SetMobjState(mobj, S_BOOSTFLAME);
mobj->movecount = max(p->kartstuff[k_sneakertimer], p->kartstuff[k_levelbooster]);
mobj->movecount = p->kartstuff[k_sneakertimer];
}
}

View file

@ -6251,7 +6251,7 @@ static void P_MovePlayer(player_t *player)
////////////////////////////
// SRB2kart - Drifting smoke and fire
if ((EITHERSNEAKER(player) || player->kartstuff[k_flamedash])
if ((player->kartstuff[k_sneakertimer] || player->kartstuff[k_flamedash])
&& onground && (leveltime & 1))
K_SpawnBoostTrail(player);