diff --git a/src/d_player.h b/src/d_player.h index 08a0f1cde..a245bf096 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -597,6 +597,7 @@ typedef struct player_s fixed_t speed; // Player's speed (distance formula of MOMX and MOMY values) fixed_t lastspeed; + fixed_t lastmomz; UINT8 secondjump; // Jump counter UINT8 fly1; // Tails flying diff --git a/src/k_kart.c b/src/k_kart.c index 280916f57..bf8065e49 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2288,6 +2288,7 @@ void K_KartMoveAnimation(player_t *player) // Update lastspeed value -- we use to display slow driving frames instead of fast driving when slowing down. player->lastspeed = player->speed; + player->lastmomz = player->mo->momz; } static void K_TauntVoiceTimers(player_t *player) diff --git a/src/p_user.c b/src/p_user.c index 0ea75e3bf..9c3c7a30f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1845,6 +1845,41 @@ static void P_DoBubbleBreath(player_t *player) } } +static void squish(player_t *player) +{ + const fixed_t maxstretch = 2*FRACUNIT; + const fixed_t factor = 3 * player->mo->height / 2; + const fixed_t threshold = factor / 6; + + const fixed_t old3dspeed = abs(player->lastmomz); + const fixed_t new3dspeed = abs(player->mo->momz); + + const fixed_t delta = abs(old3dspeed - new3dspeed); + + if (delta > threshold) + { + player->mo->spritexscale = + FRACUNIT + FixedDiv(delta, factor); + + if (player->mo->spritexscale > maxstretch) + player->mo->spritexscale = maxstretch; + + if (abs(new3dspeed) > abs(old3dspeed)) + { + player->mo->spritexscale = + FixedDiv(FRACUNIT, player->mo->spritexscale); + } + } + else + { + player->mo->spritexscale -= + (player->mo->spritexscale - FRACUNIT) / 8; + } + + player->mo->spriteyscale = + FixedDiv(FRACUNIT, player->mo->spritexscale); +} + //#define OLD_MOVEMENT_CODE 1 static void P_3dMovement(player_t *player) { @@ -2031,6 +2066,8 @@ static void P_3dMovement(player_t *player) } } } + + squish(player); } //