Add spindash launch, prevent charging while flashing

Used a timed buff instead of thrust due to friction issues, as a result I had to rebalance some values
This commit is contained in:
Sally Coolatta 2020-07-23 21:31:10 -04:00
parent 4a9a33130a
commit db230e4d3d
3 changed files with 57 additions and 15 deletions

View file

@ -287,7 +287,9 @@ typedef enum
k_jmp, // In Mario Kart, letting go of the jump button stops the drift
k_offroad, // In Super Mario Kart, going offroad has lee-way of about 1 second before you start losing speed
k_pogospring, // Pogo spring bounce effect
k_spindash, // Spindash charge
k_spindash, // Spindash charge timer
k_spindashspeed, // Spindash release speed
k_spindashboost, // Spindash release boost timer
k_waterskip, // Water skipping counter
k_dashpadcooldown, // Separate the vanilla SA-style dash pads from using pw_flashing
k_numboosts, // Count of how many boosts are being stacked, for after image spawning

View file

@ -8838,6 +8838,8 @@ static const char *const KARTSTUFF_LIST[] = {
"OFFROAD",
"POGOSPRING",
"SPINDASH",
"SPINDASHSPEED",
"SPINDASHBOOST",
"WATERSKIP",
"DASHPADCOOLDOWN",
"NUMBOOSTS",

View file

@ -2028,6 +2028,16 @@ static fixed_t K_FlameShieldDashVar(INT32 val)
return (3*FRACUNIT/4) + (((val * FRACUNIT) / TICRATE) / 2);
}
static tic_t K_GetSpindashChargeTime(player_t *player)
{
return (player->kartspeed + 4) * (TICRATE/3); // more charge time for higher speed: Tails = 2s, Mighty = 3s, Fang = 4s
}
static fixed_t K_GetSpindashChargeSpeed(player_t *player)
{
return player->kartweight * (FRACUNIT/12); // more speed for higher weight: Tails = 116%, Fang = 142%, Mighty = 166%
}
// Light weights have stronger boost stacking -- aka, better metabolism than heavies XD
#define METABOLISM
@ -2093,6 +2103,16 @@ static void K_GetKartBoostPower(player_t *player)
ADDBOOST(K_FlameShieldDashVar(player->kartstuff[k_flamedash]), 3*FRACUNIT); // + infinite top speed, + 300% acceleration
}
if (player->kartstuff[k_spindashboost]) // Spindash boost
{
const fixed_t MAXCHARGESPEED = K_GetSpindashChargeSpeed(player);
ADDBOOST(
FixedMul(player->kartstuff[k_spindashspeed], MAXCHARGESPEED),
(8*FRACUNIT) + (24*player->kartstuff[k_spindashspeed])
); // character & charge time dependent
}
if (player->kartstuff[k_startboost]) // Startup Boost
{
ADDBOOST(FRACUNIT/4, 6*FRACUNIT); // + 25% top speed, + 600% acceleration
@ -2267,7 +2287,7 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove
// 0 with no gas, and
// -25 when only braking.
if (player->kartstuff[k_sneakertimer])
if (player->kartstuff[k_sneakertimer] || player->kartstuff[k_spindashboost])
forwardmove = 50;
finalspeed *= forwardmove/25;
@ -5701,6 +5721,17 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
if (player->kartstuff[k_startboost])
player->kartstuff[k_startboost]--;
if (player->kartstuff[k_spindashboost])
{
player->kartstuff[k_spindashboost]--;
if (player->kartstuff[k_spindashboost] <= 0)
{
player->kartstuff[k_spindashspeed] = FRACUNIT;
player->kartstuff[k_spindashboost] = 0;
}
}
if (player->kartstuff[k_invincibilitytimer])
player->kartstuff[k_invincibilitytimer]--;
@ -6825,20 +6856,11 @@ boolean K_PlayerEBrake(player_t *player)
&& !player->kartstuff[k_spinouttimer]
&& !player->kartstuff[k_boostcharge]
&& !(player->kartstuff[k_spindash] < 0)
&& !player->kartstuff[k_spindashboost]
&& !player->powers[pw_nocontrol]
&& leveltime > starttime;
}
static tic_t K_GetSpindashChargeTime(player_t *player)
{
return (player->kartspeed + 4)*TICRATE/3; // more charge time for higher speed: Tails = 2s, Mighty = 3s, Fang = 4s
}
static fixed_t K_GetSpindashChargeSpeed(player_t *player)
{
return FixedMul(FRACUNIT + (player->kartweight - 5)*FRACUNIT/12, K_GetKartSpeed(player, false)); // more speed for higher weight: Tails = 75%, Fang = 100%, Mighty = 125%
}
static void K_KartSpindash(player_t *player)
{
ticcmd_t *cmd = &player->cmd;
@ -6850,10 +6872,9 @@ static void K_KartSpindash(player_t *player)
return;
}
if (player->speed < 6*mapobjectscale)
if (player->speed < 6*mapobjectscale && player->powers[pw_flashing] == 0)
{
const tic_t MAXCHARGETIME = K_GetSpindashChargeTime(player);
const fixed_t MAXCHARGESPEED = K_GetSpindashChargeSpeed(player);
if (cmd->driftturn != 0 && leveltime % 8 == 0)
S_StartSound(player->mo, sfx_ruburn);
@ -6885,7 +6906,24 @@ static void K_KartSpindash(player_t *player)
}
else if (player->kartstuff[k_spindash])
{
fixed_t speed = player->kartstuff[k_spindash]*MAXCHARGESPEED/MAXCHARGETIME;
player->kartstuff[k_spindashspeed] = (player->kartstuff[k_spindash] * FRACUNIT) / MAXCHARGETIME;
player->kartstuff[k_spindashboost] = TICRATE;
if (!player->kartstuff[k_tiregrease])
{
UINT8 i;
for (i = 0; i < 2; i++)
{
mobj_t *grease;
grease = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_TIREGREASE);
P_SetTarget(&grease->target, player->mo);
grease->angle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy);
grease->extravalue1 = i;
}
}
player->kartstuff[k_tiregrease] = 2*TICRATE;
player->kartstuff[k_spindash] = 0;
S_StartSound(player->mo, sfx_s23c);
}