From 7a3a74a08b952a16b46554c9cd889a764607b5b8 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 22 Aug 2022 07:24:47 -0400 Subject: [PATCH 1/6] Don't scale tumble height with tumble gravity It was taking into account the tumble gravity, which meant that tumble has been actually lasting for much longer than originally designed. --- src/d_player.h | 1 + src/k_kart.c | 41 +++++++++++++++++++---------------------- src/p_mobj.c | 2 +- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index e1971cf1c..3bbd16f66 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 (5*FRACUNIT/2) //} diff --git a/src/k_kart.c b/src/k_kart.c index becb9f56c..477eac771 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; @@ -3711,16 +3716,8 @@ static void K_HandleTumbleBounce(player_t *player) player->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 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 From 44a7e1653599205f778a19df74c777fd743435db Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 22 Aug 2022 07:25:17 -0400 Subject: [PATCH 2/6] Increase tumble gravity Makes it snappier --- src/d_player.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_player.h b/src/d_player.h index 3bbd16f66..33e7026e3 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -258,7 +258,7 @@ typedef enum #define TRICKDELAY (TICRATE/4) #define TUMBLEBOUNCES 3 -#define TUMBLEGRAVITY (5*FRACUNIT/2) +#define TUMBLEGRAVITY (4*FRACUNIT) //} From afdb2908f24a0dfca39ff73f0167d0ae76d64b39 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 22 Aug 2022 23:53:32 -0400 Subject: [PATCH 3/6] Interrupt tumble when hitting springs --- src/k_kart.c | 15 +++++++++++++++ src/k_kart.h | 1 + src/k_respawn.c | 12 +----------- src/p_map.c | 1 + 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 477eac771..5671b6d64 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3734,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 = (3*TICRATE/2)+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; From 3304e2404e9bc3dfb9f8eac7e1a0cc0c90b27a24 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 22 Aug 2022 23:54:45 -0400 Subject: [PATCH 4/6] Reduce spinout time on interrupted tumble --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 5671b6d64..52b6e39a7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3745,7 +3745,7 @@ void K_TumbleInterrupt(player_t *player) players->mo->rollangle = 0; player->spinouttype = KSPIN_WIPEOUT; - player->spinouttimer = player->wipeoutslow = (3*TICRATE/2)+2; + player->spinouttimer = player->wipeoutslow = (2*TICRATE)+2; } } From ea92309cbda9b2dfca99d62ed6eee765573d340f Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 23 Aug 2022 00:19:57 -0400 Subject: [PATCH 5/6] Reduce hitlag on bounce by half --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 52b6e39a7..88870cba9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3706,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)< Date: Tue, 23 Aug 2022 01:16:51 -0400 Subject: [PATCH 6/6] Reduce spinout time from tumble interruption more --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 88870cba9..d9c348513 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3745,7 +3745,7 @@ void K_TumbleInterrupt(player_t *player) players->mo->rollangle = 0; player->spinouttype = KSPIN_WIPEOUT; - player->spinouttimer = player->wipeoutslow = (2*TICRATE)+2; + player->spinouttimer = player->wipeoutslow = TICRATE+2; } }