From 661d8818d698bf76711bf6efe57fe71e8151dc67 Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 10 Apr 2021 19:37:20 -0700 Subject: [PATCH 1/5] Squash and stretch player sprite with sudden changes in vertical momentum Stretch with a sudden increase of momentum, squash with a decrease. --- src/d_player.h | 1 + src/k_kart.c | 1 + src/p_user.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) 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); } // From 9771a6405320ab5f02293648cf9641dd2fca91c3 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 11 Apr 2021 01:04:33 -0700 Subject: [PATCH 2/5] Unsquash the player more quickly Also don't apply squashing/stretching on slope launches. --- src/p_user.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 9c3c7a30f..0cba996ff 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1873,7 +1873,8 @@ static void squish(player_t *player) else { player->mo->spritexscale -= - (player->mo->spritexscale - FRACUNIT) / 8; + (player->mo->spritexscale - FRACUNIT) + / (player->mo->spritexscale < FRACUNIT ? 8 : 2); } player->mo->spriteyscale = @@ -2067,7 +2068,10 @@ static void P_3dMovement(player_t *player) } } - squish(player); + if (!player->powers[pw_justlaunched]) + { + squish(player); + } } // From 696ca049d89609078eb23b0983d2f0f3ad3478f4 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 28 Nov 2021 22:43:48 -0800 Subject: [PATCH 3/5] Apply momentum based squash and stretch to every object Also netsave. --- src/d_player.h | 1 - src/k_kart.c | 37 ++++++++++++++++++++++++++++++++++++- src/k_kart.h | 1 + src/p_mobj.c | 7 ++++++- src/p_mobj.h | 3 +++ src/p_saveg.c | 13 ++++++++++++- src/p_slopes.c | 2 ++ src/p_user.c | 41 ----------------------------------------- 8 files changed, 60 insertions(+), 45 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index f5808a166..be16320cd 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -487,7 +487,6 @@ typedef struct player_s fixed_t speed; // Player's speed (distance formula of MOMX and MOMY values) fixed_t lastspeed; - fixed_t lastmomz; INT32 deadtimer; // End game if game over lasts too long tic_t exiting; // Exitlevel timer diff --git a/src/k_kart.c b/src/k_kart.c index bb709a850..85b62c4c2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2536,7 +2536,6 @@ 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) @@ -4509,6 +4508,42 @@ void K_DriftDustHandling(mobj_t *spawner) } } +void K_Squish(mobj_t *mo) +{ + const fixed_t maxstretch = 2*FRACUNIT; + const fixed_t factor = 3 * mo->height / 2; + const fixed_t threshold = factor / 6; + + const fixed_t old3dspeed = abs(mo->lastmomz); + const fixed_t new3dspeed = abs(mo->momz); + + const fixed_t delta = abs(old3dspeed - new3dspeed); + + if (delta > threshold) + { + mo->spritexscale = + FRACUNIT + FixedDiv(delta, factor); + + if (mo->spritexscale > maxstretch) + mo->spritexscale = maxstretch; + + if (abs(new3dspeed) > abs(old3dspeed)) + { + mo->spritexscale = + FixedDiv(FRACUNIT, mo->spritexscale); + } + } + else + { + mo->spritexscale -= + (mo->spritexscale - FRACUNIT) + / (mo->spritexscale < FRACUNIT ? 8 : 2); + } + + mo->spriteyscale = + FixedDiv(FRACUNIT, mo->spritexscale); +} + static mobj_t *K_FindLastTrailMobj(player_t *player) { mobj_t *trail; diff --git a/src/k_kart.h b/src/k_kart.h index b8e74539b..9a07fe609 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -76,6 +76,7 @@ void K_SpawnSparkleTrail(mobj_t *mo); void K_SpawnWipeoutTrail(mobj_t *mo, boolean offroad); void K_SpawnDraftDust(mobj_t *mo); void K_DriftDustHandling(mobj_t *spawner); +void K_Squish(mobj_t *mo); mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, INT32 defaultDir, INT32 altthrow); void K_PuntMine(mobj_t *mine, mobj_t *punter); void K_DoSneaker(player_t *player, INT32 type); diff --git a/src/p_mobj.c b/src/p_mobj.c index 2b2cfc251..ee1fa0890 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8616,7 +8616,7 @@ void P_MobjThinker(mobj_t *mobj) return; } - mobj->eflags &= ~(MFE_PUSHED|MFE_SPRUNG|MFE_JUSTBOUNCEDWALL|MFE_DAMAGEHITLAG); + mobj->eflags &= ~(MFE_PUSHED|MFE_SPRUNG|MFE_JUSTBOUNCEDWALL|MFE_DAMAGEHITLAG|MFE_SLOPELAUNCHED); tmfloorthing = tmhitthing = NULL; @@ -8867,6 +8867,11 @@ void P_MobjThinker(mobj_t *mobj) default: break; } + + if (!(mobj->eflags & MFE_SLOPELAUNCHED)) + K_Squish(mobj); + + mobj->lastmomz = mobj->momz; } // Quick, optimized function for the Rail Rings diff --git a/src/p_mobj.h b/src/p_mobj.h index 16055907b..28395f85a 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -249,6 +249,8 @@ typedef enum MFE_JUSTBOUNCEDWALL = 1<<12, // SRB2Kart: In damage hitlag (displays different visual efx) MFE_DAMAGEHITLAG = 1<<13, + // Slope physics sent you airborne + MFE_SLOPELAUNCHED = 1<<14, // free: to and including 1<<15 } mobjeflag_t; @@ -360,6 +362,7 @@ typedef struct mobj_s fixed_t friction; fixed_t movefactor; + fixed_t lastmomz; INT32 fuse; // Does something in P_MobjThinker on reaching 0. fixed_t watertop; // top of the water FOF the mobj is in diff --git a/src/p_saveg.c b/src/p_saveg.c index ce1093061..83625026d 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1534,7 +1534,8 @@ typedef enum MD2_HITLAG = 1<<24, MD2_WAYPOINTCAP = 1<<25, MD2_KITEMCAP = 1<<26, - MD2_ITNEXT = 1<<27 + MD2_ITNEXT = 1<<27, + MD2_LASTMOMZ = 1<<28, } mobj_diff2_t; typedef enum @@ -1775,6 +1776,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) diff2 |= MD2_KITEMCAP; if (mobj->itnext) diff2 |= MD2_ITNEXT; + if (mobj->lastmomz) + diff2 |= MD2_LASTMOMZ; if (diff2 != 0) diff |= MD_MORE; @@ -1968,6 +1971,10 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) { WRITEINT32(save_p, mobj->hitlag); } + if (diff2 & MD2_LASTMOMZ) + { + WRITEINT32(save_p, mobj->lastmomz); + } WRITEUINT32(save_p, mobj->mobjnum); } @@ -3062,6 +3069,10 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) { mobj->hitlag = READINT32(save_p); } + if (diff2 & MD2_LASTMOMZ) + { + mobj->lastmomz = READINT32(save_p); + } if (diff & MD_REDFLAG) { diff --git a/src/p_slopes.c b/src/p_slopes.c index d1e8f5f54..1bde8f4ee 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -844,6 +844,8 @@ void P_SlopeLaunch(mobj_t *mo) mo->momy = slopemom.y; mo->momz = slopemom.z; #endif + + mo->eflags |= MFE_SLOPELAUNCHED; } //CONS_Printf("Launched off of slope.\n"); diff --git a/src/p_user.c b/src/p_user.c index 63bd09c96..c58e61b4d 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1658,42 +1658,6 @@ 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) - / (player->mo->spritexscale < FRACUNIT ? 8 : 2); - } - - player->mo->spriteyscale = - FixedDiv(FRACUNIT, player->mo->spritexscale); -} - //#define OLD_MOVEMENT_CODE 1 static void P_3dMovement(player_t *player) { @@ -1890,11 +1854,6 @@ static void P_3dMovement(player_t *player) } } } - - if (!player->powers[pw_justlaunched]) - { - squish(player); - } } // From 1e73c842e2132ac23c46516c2e252cfa174640c6 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 28 Nov 2021 23:14:31 -0800 Subject: [PATCH 4/5] Run squish effect for players too This is ironic. --- src/p_mobj.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index ee1fa0890..27b668a46 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3511,6 +3511,16 @@ static void P_CheckFloatbobPlatforms(mobj_t *mobj) } } +static void P_SquishThink(mobj_t *mobj) +{ + if (!(mobj->eflags & MFE_SLOPELAUNCHED)) + { + K_Squish(mobj); + } + + mobj->lastmomz = mobj->momz; +} + static void P_PlayerMobjThinker(mobj_t *mobj) { I_Assert(mobj != NULL); @@ -3576,6 +3586,8 @@ static void P_PlayerMobjThinker(mobj_t *mobj) mobj->eflags &= ~MFE_JUSTHITFLOOR; } + P_SquishThink(mobj); + animonly: P_CyclePlayerMobjState(mobj); } @@ -8805,6 +8817,8 @@ void P_MobjThinker(mobj_t *mobj) P_ButteredSlope(mobj); } + P_SquishThink(mobj); + if (mobj->flags & (MF_ENEMY|MF_BOSS) && mobj->health && P_CheckDeathPitCollide(mobj)) // extra pit check in case these didn't have momz { @@ -8867,11 +8881,6 @@ void P_MobjThinker(mobj_t *mobj) default: break; } - - if (!(mobj->eflags & MFE_SLOPELAUNCHED)) - K_Squish(mobj); - - mobj->lastmomz = mobj->momz; } // Quick, optimized function for the Rail Rings From 6457ab0a9cdd6f50d815e6d31a8f7918f21145f8 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 29 Nov 2021 19:56:33 -0800 Subject: [PATCH 5/5] Raise squish max --- 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 85b62c4c2..bd2f33220 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4510,7 +4510,7 @@ void K_DriftDustHandling(mobj_t *spawner) void K_Squish(mobj_t *mo) { - const fixed_t maxstretch = 2*FRACUNIT; + const fixed_t maxstretch = 4*FRACUNIT; const fixed_t factor = 3 * mo->height / 2; const fixed_t threshold = factor / 6;