Merge branch 'tumble-adjustment' into 'master'

Tumble adjustments

See merge request KartKrew/Kart!640
This commit is contained in:
Sal 2022-08-23 05:19:03 +00:00
commit 229e1a9c6f
6 changed files with 40 additions and 35 deletions

View file

@ -258,6 +258,7 @@ typedef enum
#define TRICKDELAY (TICRATE/4)
#define TUMBLEBOUNCES 3
#define TUMBLEGRAVITY (4*FRACUNIT)
//}

View file

@ -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)<<FRACBITS, 6); // funny earthquakes for the FEEL
@ -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
@ -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)

View file

@ -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);

View file

@ -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

View file

@ -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;

View file

@ -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