diff --git a/src/d_player.h b/src/d_player.h index e1971cf1c..33e7026e3 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -258,6 +258,7 @@ typedef enum #define TRICKDELAY (TICRATE/4) #define TUMBLEBOUNCES 3 +#define TUMBLEGRAVITY (4*FRACUNIT) //} diff --git a/src/k_kart.c b/src/k_kart.c index becb9f56c..d9c348513 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3612,9 +3612,25 @@ static void K_RemoveGrowShrink(player_t *player) P_RestoreMusic(player); } +static fixed_t K_TumbleZ(mobj_t *mo, fixed_t input) +{ + // Scales base tumble gravity to FRACUNIT + const fixed_t baseGravity = FixedMul(DEFAULT_GRAVITY, TUMBLEGRAVITY); + + // Adapt momz w/ gravity + fixed_t gravityAdjust = FixedDiv(P_GetMobjGravity(mo), baseGravity); + + if (mo->eflags & MFE_UNDERWATER) + { + // Reverse doubled falling speed. + gravityAdjust /= 2; + } + + return FixedMul(input, -gravityAdjust); +} + void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source) { - fixed_t gravityadjust; (void)source; K_DirectorFollowAttack(player, inflictor, source); @@ -3643,16 +3659,7 @@ void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source) S_StartSound(player->mo, sfx_s3k9b); - // adapt momz w/ gravity? - // as far as kart goes normal gravity is 2 (FRACUNIT*2) - - gravityadjust = P_GetMobjGravity(player->mo)/2; // so we'll halve it for our calculations. - - if (player->mo->eflags & MFE_UNDERWATER) - gravityadjust /= 2; // halve "gravity" underwater - - // and then modulate momz like that... - player->mo->momz = -gravityadjust * player->tumbleHeight; + player->mo->momz = K_TumbleZ(player->mo, player->tumbleHeight * FRACUNIT); P_SetPlayerMobjState(player->mo, S_KART_SPINOUT); @@ -3667,8 +3674,6 @@ static boolean K_LastTumbleBounceCondition(player_t *player) static void K_HandleTumbleBounce(player_t *player) { - fixed_t gravityadjust; - player->tumbleBounces++; player->tumbleHeight = (player->tumbleHeight * ((player->tumbleHeight > 100) ? 3 : 4)) / 5; player->pflags &= ~PF_TUMBLESOUND; @@ -3701,7 +3706,7 @@ static void K_HandleTumbleBounce(player_t *player) // A bit of damage hitlag. // This gives a window for DI!! - K_AddHitLag(player->mo, 6, true); + K_AddHitLag(player->mo, 3, true); if (P_IsDisplayPlayer(player) && player->tumbleHeight >= 40) P_StartQuake((player->tumbleHeight*3/2)<mo->momx = player->mo->momx / 2; player->mo->momy = player->mo->momy / 2; - // adapt momz w/ gravity? - // as far as kart goes normal gravity is 2 (FRACUNIT*2) - - gravityadjust = P_GetMobjGravity(player->mo)/2; // so we'll halve it for our calculations. - - if (player->mo->eflags & MFE_UNDERWATER) - gravityadjust /= 2; // halve "gravity" underwater - // and then modulate momz like that... - player->mo->momz = -gravityadjust * player->tumbleHeight; + player->mo->momz = K_TumbleZ(player->mo, player->tumbleHeight * FRACUNIT); } // Play a falling sound when you start falling while tumbling and you're nowhere near done bouncing @@ -3737,6 +3734,21 @@ static void K_HandleTumbleSound(player_t *player) } } +void K_TumbleInterrupt(player_t *player) +{ + // If player was tumbling, set variables so that they don't tumble like crazy after they're done respawning + if (player->tumbleBounces > 0) + { + player->tumbleBounces = 0; // MAXBOUNCES-1; + player->pflags &= ~PF_TUMBLELASTBOUNCE; + //players->tumbleHeight = 20; + + players->mo->rollangle = 0; + player->spinouttype = KSPIN_WIPEOUT; + player->spinouttimer = player->wipeoutslow = TICRATE+2; + } +} + void K_ApplyTripWire(player_t *player, tripwirestate_t state) { if (state == TRIP_PASSED) diff --git a/src/k_kart.h b/src/k_kart.h index 767f7e3ca..797899cea 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -73,6 +73,7 @@ void K_DoPowerClash(player_t *t1, player_t *t2); void K_BattleAwardHit(player_t *player, player_t *victim, mobj_t *inflictor, UINT8 bumpersRemoved); void K_SpinPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 type); void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source); +void K_TumbleInterrupt(player_t *player); INT32 K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source); void K_DebtStingPlayer(player_t *player, mobj_t *source); void K_HandleBumperChanges(player_t *player, UINT8 prevBumpers); diff --git a/src/k_respawn.c b/src/k_respawn.c index 1132f182b..9a8cc38e8 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -151,18 +151,8 @@ void K_DoIngameRespawn(player_t *player) player->ringboost = 0; player->driftboost = player->strongdriftboost = 0; - - // If player was tumbling, set variables so that they don't tumble like crazy after they're done respawning - if (player->tumbleBounces > 0) - { - player->tumbleBounces = 0; // MAXBOUNCES-1; - player->pflags &= ~PF_TUMBLELASTBOUNCE; - //players->tumbleHeight = 20; - players->mo->rollangle = 0; - player->spinouttype = KSPIN_WIPEOUT; - player->spinouttimer = player->wipeoutslow = (3*TICRATE/2)+2; - } + K_TumbleInterrupt(player); P_ResetPlayer(player); // Set up respawn position if invalid diff --git a/src/p_map.c b/src/p_map.c index 9bab04a97..3d6938ed2 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -417,6 +417,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object) P_SetTarget(&spring->target, object); } + K_TumbleInterrupt(object->player); P_ResetPlayer(object->player); object->player->springstars = max(vertispeed, horizspeed) / FRACUNIT / 2; diff --git a/src/p_mobj.c b/src/p_mobj.c index 63af474e4..5a184fe9c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1130,7 +1130,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) if (mo->player->tumbleBounces > 0) { - gravityadd = (5*gravityadd)/2; + gravityadd = FixedMul(TUMBLEGRAVITY, gravityadd); } } else