mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-12-10 01:52:33 +00:00
Try out boost stacking
This commit is contained in:
parent
5507a41d64
commit
0f4fd73533
6 changed files with 94 additions and 79 deletions
|
|
@ -333,6 +333,7 @@ typedef enum
|
|||
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 )
|
||||
k_growshrinktimer, // > 0 = Big, < 0 = small
|
||||
k_squishedtimer, // Squished frame timer
|
||||
k_rocketsneakertimer, // Rocket Sneaker duration timer
|
||||
|
|
@ -365,6 +366,10 @@ typedef enum
|
|||
|
||||
NUMKARTSTUFF
|
||||
} kartstufftype_t;
|
||||
|
||||
// QUICKLY GET EITHER SNEAKER OR LEVEL BOOSTER SINCE THEY ARE FUNCTIONALLY IDENTICAL
|
||||
#define EITHERSNEAKER(p) (p->kartstuff[k_sneakertimer] || p->kartstuff[k_levelbooster])
|
||||
|
||||
//}
|
||||
|
||||
#define WEP_AUTO 1
|
||||
|
|
|
|||
|
|
@ -1404,7 +1404,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) || player->kartstuff[k_sneakertimer])
|
||||
if (InputDown(gc_accelerate, ssplayer) || (gamepadjoystickmove && axis > 0) || EITHERSNEAKER(player))
|
||||
{
|
||||
cmd->buttons |= BT_ACCELERATE;
|
||||
forward = forwardmove[1]; // 50
|
||||
|
|
@ -1557,7 +1557,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
|||
|| (leveltime > starttime && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn
|
||||
|| (player->kartstuff[k_respawn]) // Respawning
|
||||
|| (player->spectator || objectplacing)) // Not a physical player
|
||||
&& !(player->kartstuff[k_spinouttimer] && player->kartstuff[k_sneakertimer])) // Spinning and boosting cancels out turning
|
||||
&& !(player->kartstuff[k_spinouttimer] && EITHERSNEAKER(player))) // Spinning and boosting cancels out turning
|
||||
lang += (cmd->angleturn<<16);
|
||||
|
||||
cmd->angleturn = (INT16)(lang >> 16);
|
||||
|
|
@ -4606,7 +4606,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
|||
|| (leveltime > starttime && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn
|
||||
|| (players[displayplayer].kartstuff[k_respawn]) // Respawning
|
||||
|| (players[displayplayer].spectator || objectplacing)) // Not a physical player
|
||||
&& !(players[displayplayer].kartstuff[k_spinouttimer] && players[displayplayer].kartstuff[k_sneakertimer])) // Spinning and boosting cancels out spinout
|
||||
&& !(players[displayplayer].kartstuff[k_spinouttimer] && (players[displayplayer].kartstuff[k_sneakertimer] || players[displayplayer].kartstuff[k_levelbooster]))) // Spinning and boosting cancels out spinout
|
||||
localangle += (cmd->angleturn<<16);
|
||||
|
||||
if (!(demoflags & DF_GHOST) && *demo_p == DEMOMARKER)
|
||||
|
|
|
|||
147
src/k_kart.c
147
src/k_kart.c
|
|
@ -1943,8 +1943,10 @@ void K_MomentumToFacing(player_t *player)
|
|||
// sets k_boostpower, k_speedboost, and k_accelboost to whatever we need it to be
|
||||
static void K_GetKartBoostPower(player_t *player)
|
||||
{
|
||||
fixed_t sneaker = 0;
|
||||
fixed_t boostpower = FRACUNIT;
|
||||
fixed_t speedboost = 0, accelboost = 0;
|
||||
UINT8 boostfactor = 1;
|
||||
|
||||
if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow] == 1) // Slow down after you've been bumped
|
||||
{
|
||||
|
|
@ -1952,81 +1954,66 @@ static void K_GetKartBoostPower(player_t *player)
|
|||
return;
|
||||
}
|
||||
|
||||
// LOVELY magic numbers...
|
||||
switch (gamespeed)
|
||||
{
|
||||
case 0:
|
||||
sneaker = 53740+768;
|
||||
break;
|
||||
case 2:
|
||||
sneaker = 17294+768;
|
||||
break;
|
||||
default:
|
||||
sneaker = 32768;
|
||||
break;
|
||||
}
|
||||
|
||||
// Offroad is separate, it's difficult to factor it in with a variable value anyway.
|
||||
if (!(player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_hyudorotimer] || player->kartstuff[k_sneakertimer])
|
||||
if (!(player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_hyudorotimer] || EITHERSNEAKER(player))
|
||||
&& player->kartstuff[k_offroad] >= 0)
|
||||
boostpower = FixedDiv(boostpower, player->kartstuff[k_offroad] + FRACUNIT);
|
||||
|
||||
if (player->kartstuff[k_bananadrag] > TICRATE)
|
||||
boostpower = (4*boostpower)/5;
|
||||
|
||||
// Banana drag/offroad dust
|
||||
if (boostpower < FRACUNIT
|
||||
&& player->mo && P_IsObjectOnGround(player->mo)
|
||||
&& player->speed > 0
|
||||
&& !player->spectator)
|
||||
{
|
||||
K_SpawnWipeoutTrail(player->mo, true);
|
||||
if (leveltime % 6 == 0)
|
||||
S_StartSound(player->mo, sfx_cdfm70);
|
||||
}
|
||||
#define ADDBOOST(s,a) { \
|
||||
speedboost += (s) / boostfactor; \
|
||||
accelboost += (a) / boostfactor; \
|
||||
boostfactor++; \
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_levelbooster]) // Level boosters
|
||||
ADDBOOST(sneaker, 8*FRACUNIT); // + 800% acceleration, varying top speed
|
||||
|
||||
if (player->kartstuff[k_sneakertimer]) // Sneaker
|
||||
{
|
||||
switch (gamespeed)
|
||||
{
|
||||
case 0:
|
||||
speedboost = max(speedboost, 53740+768);
|
||||
break;
|
||||
case 2:
|
||||
speedboost = max(speedboost, 17294+768);
|
||||
break;
|
||||
default:
|
||||
speedboost = max(speedboost, 32768);
|
||||
break;
|
||||
}
|
||||
accelboost = max(accelboost, 8*FRACUNIT); // + 800%
|
||||
}
|
||||
ADDBOOST(sneaker, 8*FRACUNIT); // + 800% acceleration, varying top speed
|
||||
|
||||
if (player->kartstuff[k_invincibilitytimer]) // Invincibility
|
||||
{
|
||||
speedboost = max(speedboost, (3*FRACUNIT)/8); // + 37.5%
|
||||
accelboost = max(accelboost, 3*FRACUNIT); // + 300%
|
||||
}
|
||||
ADDBOOST((3*FRACUNIT)/8, 3*FRACUNIT); // + 37.5% 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/4, 4*FRACUNIT); // + 20% top speed, + 200% acceleration
|
||||
|
||||
if (player->kartstuff[k_growshrinktimer] > 0) // Grow
|
||||
{
|
||||
speedboost = max(speedboost, FRACUNIT/5); // + 20%
|
||||
// Grow's design is weird with booster stacking.
|
||||
// We'll see how to replace its design BEFORE v2 gets released.
|
||||
speedboost += (FRACUNIT/5); // + 20%
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_ringboost]) // Ring Boost
|
||||
{
|
||||
speedboost = max(speedboost, FRACUNIT/5); // + 20%
|
||||
accelboost = max(accelboost, 2*FRACUNIT); // + 200%
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_driftboost]) // Drift Boost
|
||||
{
|
||||
speedboost = max(speedboost, FRACUNIT/4); // + 25%
|
||||
accelboost = max(accelboost, 4*FRACUNIT); // + 400%
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_startboost]) // Startup Boost
|
||||
{
|
||||
speedboost = max(speedboost, FRACUNIT/4); // + 25%
|
||||
accelboost = max(accelboost, 6*FRACUNIT); // + 300%
|
||||
}
|
||||
|
||||
// don't average them anymore, this would make a small boost and a high boost less useful
|
||||
// just take the highest we want instead
|
||||
|
||||
player->kartstuff[k_boostpower] = boostpower;
|
||||
|
||||
// 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_speedboost] += (speedboost - player->kartstuff[k_speedboost]) / (TICRATE/2);
|
||||
|
||||
player->kartstuff[k_accelboost] = accelboost;
|
||||
}
|
||||
|
|
@ -2235,7 +2222,8 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
|
|||
if (source && source != player->mo && source->player)
|
||||
K_PlayHitEmSound(source);
|
||||
|
||||
//player->kartstuff[k_sneakertimer] = 0;
|
||||
player->kartstuff[k_sneakertimer] = 0;
|
||||
//player->kartstuff[k_levelbooster] = 0;
|
||||
player->kartstuff[k_driftboost] = 0;
|
||||
player->kartstuff[k_ringboost] = 0;
|
||||
|
||||
|
|
@ -2378,6 +2366,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_driftboost] = 0;
|
||||
player->kartstuff[k_ringboost] = 0;
|
||||
|
||||
|
|
@ -2504,6 +2493,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_driftboost] = 0;
|
||||
player->kartstuff[k_ringboost] = 0;
|
||||
|
||||
|
|
@ -3673,7 +3663,7 @@ void K_DoSneaker(player_t *player, INT32 type)
|
|||
player->kartstuff[k_destboostcam] = FixedMul(FRACUNIT, FixedDiv((intendedboost - player->kartstuff[k_speedboost]), intendedboost));
|
||||
}
|
||||
|
||||
if (!player->kartstuff[k_sneakertimer])
|
||||
if (!EITHERSNEAKER(player))
|
||||
{
|
||||
if (type == 2)
|
||||
{
|
||||
|
|
@ -3701,14 +3691,15 @@ void K_DoSneaker(player_t *player, INT32 type)
|
|||
}
|
||||
}
|
||||
|
||||
player->kartstuff[k_sneakertimer] = sneakertime;
|
||||
|
||||
if (type != 0)
|
||||
{
|
||||
player->pflags |= PF_ATTACKDOWN;
|
||||
K_PlayBoostTaunt(player->mo);
|
||||
player->powers[pw_flashing] = 0; // Stop flashing after boosting
|
||||
player->kartstuff[k_sneakertimer] = sneakertime;
|
||||
}
|
||||
else
|
||||
player->kartstuff[k_levelbooster] = sneakertime;
|
||||
}
|
||||
|
||||
static void K_DoShrink(player_t *user)
|
||||
|
|
@ -3787,10 +3778,10 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound)
|
|||
thrust = 72<<FRACBITS;
|
||||
if (mo->player->kartstuff[k_pogospring] != 2)
|
||||
{
|
||||
if (mo->player->kartstuff[k_sneakertimer])
|
||||
thrust = FixedMul(thrust, 5*FRACUNIT/4);
|
||||
if (EITHERSNEAKER(mo->player))
|
||||
thrust = FixedMul(thrust, (5*FRACUNIT)/4);
|
||||
else if (mo->player->kartstuff[k_invincibilitytimer])
|
||||
thrust = FixedMul(thrust, 9*FRACUNIT/8);
|
||||
thrust = FixedMul(thrust, (9*FRACUNIT)/8);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -4634,8 +4625,20 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
K_UpdateEngineSounds(player, cmd); // Thanks, VAda!
|
||||
K_GetKartBoostPower(player);
|
||||
|
||||
// Banana drag/offroad dust
|
||||
if (player->mo && !player->spectator
|
||||
&& P_IsObjectOnGround(player->mo) && player->speed > 0
|
||||
&& player->kartstuff[k_boostpower] < FRACUNIT)
|
||||
{
|
||||
K_SpawnWipeoutTrail(player->mo, true);
|
||||
if (leveltime % 6 == 0)
|
||||
S_StartSound(player->mo, sfx_cdfm70);
|
||||
}
|
||||
|
||||
// Speed lines
|
||||
if ((player->kartstuff[k_sneakertimer] || player->kartstuff[k_ringboost] || player->kartstuff[k_driftboost] || player->kartstuff[k_startboost]) && player->speed > 0)
|
||||
if ((EITHERSNEAKER(player) || player->kartstuff[k_ringboost]
|
||||
|| player->kartstuff[k_driftboost] || player->kartstuff[k_startboost])
|
||||
&& player->speed > 0)
|
||||
{
|
||||
mobj_t *fast = P_SpawnMobj(player->mo->x + (P_RandomRange(-36,36) * player->mo->scale),
|
||||
player->mo->y + (P_RandomRange(-36,36) * player->mo->scale),
|
||||
|
|
@ -4755,7 +4758,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
{
|
||||
if ((P_IsObjectOnGround(player->mo)
|
||||
|| (player->kartstuff[k_spinouttype] != 0))
|
||||
&& (player->kartstuff[k_sneakertimer] == 0))
|
||||
&& (!EITHERSNEAKER(player)))
|
||||
{
|
||||
player->kartstuff[k_spinouttimer]--;
|
||||
if (player->kartstuff[k_wipeoutslow] > 1)
|
||||
|
|
@ -4797,11 +4800,13 @@ 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_wipeoutslow] > 0 && player->kartstuff[k_wipeoutslow] < wipeoutslowtime+1)
|
||||
player->kartstuff[k_wipeoutslow] = wipeoutslowtime+1;
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_levelbooster])
|
||||
player->kartstuff[k_levelbooster]--;
|
||||
|
||||
if (EITHERSNEAKER(player) && player->kartstuff[k_wipeoutslow] > 0 && player->kartstuff[k_wipeoutslow] < wipeoutslowtime+1)
|
||||
player->kartstuff[k_wipeoutslow] = wipeoutslowtime+1;
|
||||
|
||||
if (player->kartstuff[k_floorboost])
|
||||
player->kartstuff[k_floorboost]--;
|
||||
|
|
@ -5084,7 +5089,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
|
|||
|
||||
turnvalue = FixedMul(turnvalue, adjustangle); // Weight has a small effect on turning
|
||||
|
||||
if (player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_sneakertimer] || player->kartstuff[k_growshrinktimer] > 0)
|
||||
if (EITHERSNEAKER(player) || player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_growshrinktimer] > 0)
|
||||
turnvalue = FixedMul(turnvalue, FixedDiv(5*FRACUNIT, 4*FRACUNIT));
|
||||
|
||||
return turnvalue;
|
||||
|
|
@ -5212,7 +5217,11 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||
}
|
||||
|
||||
// Disable drift-sparks until you're going fast enough
|
||||
if (player->kartstuff[k_getsparks] == 0 || (player->kartstuff[k_offroad] && !player->kartstuff[k_invincibilitytimer] && !player->kartstuff[k_hyudorotimer] && !player->kartstuff[k_sneakertimer]))
|
||||
if (player->kartstuff[k_getsparks] == 0
|
||||
|| (player->kartstuff[k_offroad]
|
||||
&& !player->kartstuff[k_invincibilitytimer]
|
||||
&& !player->kartstuff[k_hyudorotimer]
|
||||
&& !EITHERSNEAKER(player)))
|
||||
driftadditive = 0;
|
||||
if (player->speed > minspeed*2)
|
||||
player->kartstuff[k_getsparks] = 1;
|
||||
|
|
@ -5243,7 +5252,7 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||
player->kartstuff[k_getsparks] = 0;
|
||||
}
|
||||
|
||||
if ((!player->kartstuff[k_sneakertimer])
|
||||
if ((!EITHERSNEAKER(player))
|
||||
|| (!player->cmd.driftturn)
|
||||
|| (player->cmd.driftturn > 0) != (player->kartstuff[k_aizdriftstrat] > 0))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -8270,9 +8270,10 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
|
||||
if (p)
|
||||
{
|
||||
if (p->kartstuff[k_sneakertimer] > mobj->movecount)
|
||||
if (p->kartstuff[k_sneakertimer] > mobj->movecount
|
||||
|| p->kartstuff[k_levelbooster] > mobj->movecount)
|
||||
P_SetMobjState(mobj, S_BOOSTFLAME);
|
||||
mobj->movecount = p->kartstuff[k_sneakertimer];
|
||||
mobj->movecount = max(p->kartstuff[k_sneakertimer], p->kartstuff[k_levelbooster]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7303,7 +7303,7 @@ void T_Friction(friction_t *f)
|
|||
// (or at least MF_PUSHABLEs, which is all I care about anyway)
|
||||
if ((!(thing->flags & (MF_NOGRAVITY | MF_NOCLIP)) && thing->z == thing->floorz) && (thing->player
|
||||
&& (thing->player->kartstuff[k_invincibilitytimer] == 0 && thing->player->kartstuff[k_hyudorotimer] == 0
|
||||
&& thing->player->kartstuff[k_sneakertimer] == 0 && thing->player->kartstuff[k_growshrinktimer] <= 0)))
|
||||
&& !EITHERSNEAKER(thing->player) && thing->player->kartstuff[k_growshrinktimer] <= 0)))
|
||||
{
|
||||
if (f->roverfriction)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -4762,7 +4762,7 @@ static void P_3dMovement(player_t *player)
|
|||
if ((player->exiting || mapreset) || player->pflags & PF_STASIS || player->kartstuff[k_spinouttimer]) // pw_introcam?
|
||||
{
|
||||
cmd->forwardmove = cmd->sidemove = 0;
|
||||
if (player->kartstuff[k_sneakertimer])
|
||||
if (EITHERSNEAKER(player))
|
||||
cmd->forwardmove = 50;
|
||||
}
|
||||
|
||||
|
|
@ -6596,7 +6596,7 @@ static void P_MovePlayer(player_t *player)
|
|||
|| (leveltime > starttime && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn
|
||||
|| (player->kartstuff[k_respawn]) // Respawning
|
||||
|| (player->spectator || objectplacing)) // Not a physical player
|
||||
&& !(player->kartstuff[k_spinouttimer] && player->kartstuff[k_sneakertimer])) // Spinning and boosting cancels out turning
|
||||
&& !(player->kartstuff[k_spinouttimer] && EITHERSNEAKER(player))) // Spinning and boosting cancels out turning
|
||||
{
|
||||
player->lturn_max[leveltime%MAXPREDICTTICS] = K_GetKartTurnValue(player, KART_FULLTURN)+1;
|
||||
player->rturn_max[leveltime%MAXPREDICTTICS] = K_GetKartTurnValue(player, -KART_FULLTURN)-1;
|
||||
|
|
@ -6993,7 +6993,7 @@ static void P_MovePlayer(player_t *player)
|
|||
////////////////////////////
|
||||
|
||||
// SRB2kart - Drifting smoke and fire
|
||||
if (player->kartstuff[k_sneakertimer] > 0 && onground && (leveltime & 1))
|
||||
if (EITHERSNEAKER(player) && onground && (leveltime & 1))
|
||||
K_SpawnBoostTrail(player);
|
||||
|
||||
if (player->kartstuff[k_invincibilitytimer] > 0)
|
||||
|
|
@ -9251,7 +9251,7 @@ void P_PlayerThink(player_t *player)
|
|||
#if 1
|
||||
// "Blur" a bit when you have speed shoes and are going fast enough
|
||||
if ((player->powers[pw_super] || player->powers[pw_sneakers]
|
||||
|| player->kartstuff[k_driftboost] || player->kartstuff[k_ringboost] || player->kartstuff[k_sneakertimer] || player->kartstuff[k_startboost])
|
||||
|| EITHERSNEAKER(player) || player->kartstuff[k_driftboost] || player->kartstuff[k_ringboost] || player->kartstuff[k_startboost])
|
||||
&& !player->kartstuff[k_invincibilitytimer] // SRB2kart
|
||||
&& (player->speed + abs(player->mo->momz)) > FixedMul(20*FRACUNIT,player->mo->scale))
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue