changes to the delay, boost when doing upwards trick

This commit is contained in:
Latapostrophe 2021-04-22 15:11:15 +02:00
parent dcee9269dd
commit 29e11a0378
5 changed files with 51 additions and 6 deletions

View file

@ -241,6 +241,7 @@ typedef enum
// CONSTANTS FOR TRICK PANELS // CONSTANTS FOR TRICK PANELS
#define TRICKMOMZRAMP (30) #define TRICKMOMZRAMP (30)
#define TRICKLAG (9) #define TRICKLAG (9)
#define TRICKDELAY (TICRATE/2)
#define TUMBLEBOUNCES 3 #define TUMBLEBOUNCES 3
@ -450,9 +451,14 @@ typedef struct player_s
UINT8 jawztargetdelay; // (0 to 5) - Delay for Jawz target switching, to make it less twitchy UINT8 jawztargetdelay; // (0 to 5) - Delay for Jawz target switching, to make it less twitchy
UINT8 trickpanel; // Trick panel state UINT8 trickpanel; // Trick panel state
tic_t tricktime; // Increases while you're tricking. You can't input any trick until it's reached a certain threshold
fixed_t trickmomx; fixed_t trickmomx;
fixed_t trickmomy; fixed_t trickmomy;
fixed_t trickmomz; fixed_t trickmomz;
fixed_t trickboostpower; // Save the rough speed multiplier. Used for upwards tricks.
tic_t trickboostdecay; // used to know how long you've waited
tic_t trickboost; // Trick boost. This one is weird and has variable speed. Dear god.
UINT32 roundscore; // battle score this round UINT32 roundscore; // battle score this round
UINT8 emeralds; UINT8 emeralds;

View file

@ -2546,6 +2546,11 @@ static void K_GetKartBoostPower(player_t *player)
} }
} }
if (player->trickboost) // Trick pannel up-boost
{
ADDBOOST(player->trickboostpower, 5*FRACUNIT, 0); // <trickboostpower>% speed, 500% accel, 0% handling
}
if (player->ringboost) // Ring Boost if (player->ringboost) // Ring Boost
{ {
ADDBOOST(FRACUNIT/5, 4*FRACUNIT, 0); // + 20% top speed, + 400% acceleration, +0% handling ADDBOOST(FRACUNIT/5, 4*FRACUNIT, 0); // + 20% top speed, + 400% acceleration, +0% handling
@ -4868,7 +4873,10 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound)
thrust = FixedMul(thrust, 9*FRACUNIT/8); thrust = FixedMul(thrust, 9*FRACUNIT/8);
} }
mo->player->trickmomx = mo->player->trickmomy = mo->player->trickmomz = 0; // Reset post-hitlag momentums. mo->player->trickmomx = mo->player->trickmomy = mo->player->trickmomz = mo->player->tricktime = 0; // Reset post-hitlag momentums and timer
// Setup the boost for potential upwards trick, at worse, make it your regular max speed.
mo->player->trickboostpower = max(FixedDiv(mo->player->speed, K_GetKartSpeed(mo->player, false)) - FRACUNIT, 0);
//CONS_Printf("Got boost: %d%\n", mo->player->trickboostpower*100 / FRACUNIT);
} }
mo->momz = FixedMul(thrust, vscale); mo->momz = FixedMul(thrust, vscale);
@ -6284,7 +6292,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
// Speed lines // Speed lines
if (player->sneakertimer || player->ringboost if (player->sneakertimer || player->ringboost
|| player->driftboost || player->startboost || player->driftboost || player->startboost
|| player->eggmanexplode) || player->eggmanexplode || player->trickboost)
{ {
if (player->invincibilitytimer) if (player->invincibilitytimer)
K_SpawnInvincibilitySpeedLines(player->mo); K_SpawnInvincibilitySpeedLines(player->mo);
@ -6525,6 +6533,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
} }
} }
if (player->trickboost)
player->trickboost--;
if (player->flamedash) if (player->flamedash)
player->flamedash--; player->flamedash--;
@ -8787,6 +8798,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
fixed_t basespeed = P_AproxDistance(player->mo->momx, player->mo->momy); // at WORSE, keep your normal speed when tricking. fixed_t basespeed = P_AproxDistance(player->mo->momx, player->mo->momy); // at WORSE, keep your normal speed when tricking.
fixed_t speed = FixedMul(speedmult, P_AproxDistance(player->mo->momx, player->mo->momy)); fixed_t speed = FixedMul(speedmult, P_AproxDistance(player->mo->momx, player->mo->momy));
if (!cmd->turning && !player->throwdir) // increment this counter while your inputs are neutral
player->tricktime++;
// debug shit // debug shit
//CONS_Printf("%d\n", player->mo->momz / mapobjectscale); //CONS_Printf("%d\n", player->mo->momz / mapobjectscale);
if (momz < -10*FRACUNIT) // :youfuckedup: if (momz < -10*FRACUNIT) // :youfuckedup:
@ -8858,6 +8872,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
relative = false; relative = false;
} }
// Calculate speed boost decay:
// Base speed boost duration is 35 tics.
// At most, lose 3/4th of your boost.
player->trickboostdecay = min(TICRATE*3/4, abs(momz/FRACUNIT));
//CONS_Printf("decay: %d\n", player->trickboostdecay);
P_SetObjectMomZ(player->mo, 48*FRACUNIT, relative); P_SetObjectMomZ(player->mo, 48*FRACUNIT, relative);
player->trickmomx = player->mo->momx; player->trickmomx = player->mo->momx;
@ -8866,7 +8886,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
P_InstaThrust(player->mo, 0, 0); // Sike, you have no speed :) P_InstaThrust(player->mo, 0, 0); // Sike, you have no speed :)
player->mo->momz = 0; player->mo->momz = 0;
player->trickpanel = 3; player->trickpanel = 4;
player->mo->hitlag = TRICKLAG; player->mo->hitlag = TRICKLAG;
} }
} }
@ -8882,8 +8902,19 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
} }
else if (player->trickpanel == 4 && P_IsObjectOnGround(player->mo)) // Upwards trick landed!
{
//CONS_Printf("apply boost\n");
S_StartSound(player->mo, sfx_s23c);
K_SpawnDashDustRelease(player);
player->trickboost = TICRATE - player->trickboostdecay;
player->trickpanel = player->trickboostdecay = 0;
}
// Wait until we let go off the control stick to remove the delay // Wait until we let go off the control stick to remove the delay
if ((player->pflags & PF_TRICKDELAY) && !player->throwdir && !cmd->turning) // buttons must be neutral after the initial trick delay. This prevents weirdness where slight nudges after blast off would send you flying.
if ((player->pflags & PF_TRICKDELAY) && !player->throwdir && !cmd->turning && (player->tricktime >= TRICKDELAY))
{ {
player->pflags &= ~PF_TRICKDELAY; player->pflags &= ~PF_TRICKDELAY;
} }

View file

@ -1109,7 +1109,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
gravityadd = (4*gravityadd)/3; gravityadd = (4*gravityadd)/3;
} }
if (mo->player->trickpanel == 2 || mo->player->trickpanel == 3) if (mo->player->trickpanel >= 2)
{ {
gravityadd = (5*gravityadd)/2; gravityadd = (5*gravityadd)/2;
} }

View file

@ -305,9 +305,13 @@ static void P_NetArchivePlayers(void)
WRITEUINT8(save_p, players[i].jawztargetdelay); WRITEUINT8(save_p, players[i].jawztargetdelay);
WRITEUINT8(save_p, players[i].trickpanel); WRITEUINT8(save_p, players[i].trickpanel);
WRITEUINT32(save_p, players[i].tricktime);
WRITEUINT32(save_p, players[i].trickmomx); WRITEUINT32(save_p, players[i].trickmomx);
WRITEUINT32(save_p, players[i].trickmomy); WRITEUINT32(save_p, players[i].trickmomy);
WRITEUINT32(save_p, players[i].trickmomz); WRITEUINT32(save_p, players[i].trickmomz);
WRITEUINT32(save_p, players[i].trickboostpower);
WRITEUINT32(save_p, players[i].trickboostdecay);
WRITEUINT32(save_p, players[i].trickboost);
WRITEUINT32(save_p, players[i].roundscore); WRITEUINT32(save_p, players[i].roundscore);
WRITEUINT8(save_p, players[i].emeralds); WRITEUINT8(save_p, players[i].emeralds);
@ -557,9 +561,13 @@ static void P_NetUnArchivePlayers(void)
players[i].jawztargetdelay = READUINT8(save_p); players[i].jawztargetdelay = READUINT8(save_p);
players[i].trickpanel = READUINT8(save_p); players[i].trickpanel = READUINT8(save_p);
players[i].tricktime = (tic_t)READUINT32(save_p);
players[i].trickmomx = READUINT32(save_p); players[i].trickmomx = READUINT32(save_p);
players[i].trickmomy = READUINT32(save_p); players[i].trickmomy = READUINT32(save_p);
players[i].trickmomz = READUINT32(save_p); players[i].trickmomz = READUINT32(save_p);
players[i].trickboostpower = READUINT32(save_p);
players[i].trickboostdecay = (tic_t)READUINT32(save_p);
players[i].trickboost = (tic_t)READUINT32(save_p);
players[i].roundscore = READUINT32(save_p); players[i].roundscore = READUINT32(save_p);
players[i].emeralds = READUINT8(save_p); players[i].emeralds = READUINT8(save_p);

View file

@ -2030,7 +2030,7 @@ void P_MovePlayer(player_t *player)
{ {
player->drawangle += ANGLE_22h; player->drawangle += ANGLE_22h;
} }
else if (player->trickpanel == 3) else if (player->trickpanel >= 3)
{ {
player->drawangle -= ANGLE_22h; player->drawangle -= ANGLE_22h;
} }