From 6471ab07bfba8048bc0217a355b91efd3a120672 Mon Sep 17 00:00:00 2001 From: lachablock Date: Mon, 19 Jul 2021 20:45:54 +1000 Subject: [PATCH] Add P_GetMobjZMovement and apply it to various vfx --- src/k_kart.c | 28 +++++++++++++++------------- src/p_local.h | 1 + src/p_mobj.c | 24 +++++++++++++++++++++++- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 7074fe42a..44d02c0eb 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1967,7 +1967,7 @@ void K_SpawnDashDustRelease(player_t *player) dust->momx = 3*player->mo->momx/5; dust->momy = 3*player->mo->momy/5; - //dust->momz = 3*player->mo->momz/5; + dust->momz = 3*P_GetMobjZMovement(player->mo)/5; K_MatchGenericExtraFlags(dust, player->mo); } @@ -1994,6 +1994,7 @@ void K_SpawnDriftBoostClip(player_t *player) { mobj_t *clip; fixed_t scale = 115*FRACUNIT/100; + fixed_t momz = P_GetMobjZMovement(player->mo); fixed_t z; if (( player->mo->eflags & MFE_VERTICALFLIP )) @@ -2010,8 +2011,8 @@ void K_SpawnDriftBoostClip(player_t *player) clip->fuse = 105; clip->momz = 7 * P_MobjFlip(clip) * clip->scale; - if (player->mo->momz > 0) - clip->momz += player->mo->momz; + if (momz > 0) + clip->momz += momz; P_InstaThrust(clip, player->mo->angle + P_RandomFlip(P_RandomRange(FRACUNIT/2, FRACUNIT)), @@ -2043,7 +2044,7 @@ void K_SpawnNormalSpeedLines(player_t *player) fast->angle = K_MomentumAngle(player->mo); fast->momx = 3*player->mo->momx/4; fast->momy = 3*player->mo->momy/4; - fast->momz = 3*player->mo->momz/4; + fast->momz = 3*P_GetMobjZMovement(player->mo)/4; K_MatchGenericExtraFlags(fast, player->mo); @@ -2065,7 +2066,7 @@ void K_SpawnInvincibilitySpeedLines(mobj_t *mo) fast->momx = 3*mo->momx/4; fast->momy = 3*mo->momy/4; - fast->momz = 3*mo->momz/4; + fast->momz = 3*P_GetMobjZMovement(mo)/4; P_SetTarget(&fast->target, mo); fast->angle = K_MomentumAngle(mo); @@ -3928,6 +3929,7 @@ void K_SpawnDriftElectricSparks(player_t *player) P_SetObjectMomZ(spark, vspeed, false); spark->momx += mo->momx; // copy player speed spark->momy += mo->momy; + spark->momz += P_GetMobjZMovement(mo); sparkangle += ANGLE_90; } @@ -3978,7 +3980,7 @@ static void K_SpawnDriftSparks(player_t *player) spark->momx = player->mo->momx/2; spark->momy = player->mo->momy/2; - //spark->momz = player->mo->momz/2; + spark->momz = P_GetMobjZMovement(player->mo)/2; spark->color = K_DriftSparkColor(player, player->driftcharge); @@ -4121,7 +4123,7 @@ static void K_SpawnAIZDust(player_t *player) spark->momx = (6*player->mo->momx)/5; spark->momy = (6*player->mo->momy)/5; - //spark->momz = player->mo->momz/2; + spark->momz = P_GetMobjZMovement(player->mo); K_MatchGenericExtraFlags(spark, player->mo); } @@ -4279,7 +4281,7 @@ void K_SpawnWipeoutTrail(mobj_t *mo, boolean offroad) { dust->momx = mo->momx/2; dust->momy = mo->momy/2; - dust->momz = mo->momz/2; + dust->momz = P_GetMobjZMovement(mo)/2; } } @@ -4350,7 +4352,7 @@ void K_SpawnDraftDust(mobj_t *mo) dust->momx = (4*mo->momx)/5; dust->momy = (4*mo->momy)/5; - //dust->momz = (4*mo->momz)/5; + dust->momz = (4*P_GetMobjZMovement(mo))/5; P_Thrust(dust, dust->angle, 4*mo->scale); @@ -4839,7 +4841,7 @@ static void K_FlameDashLeftoverSmoke(mobj_t *src) smoke->momx = 3*src->momx/4; smoke->momy = 3*src->momy/4; - smoke->momz = 3*src->momz/4; + smoke->momz = 3*P_GetMobjZMovement(src)/4; P_Thrust(smoke, src->angle + FixedAngle(P_RandomRange(135, 225)<scale); smoke->momz += P_RandomRange(0, 4) * src->scale; @@ -6576,7 +6578,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (gametype == GT_RACE && player->rings <= 0) // spawn ring debt indicator { mobj_t *debtflag = P_SpawnMobj(player->mo->x + player->mo->momx, player->mo->y + player->mo->momy, - player->mo->z + player->mo->momz + player->mo->height + (24*player->mo->scale), MT_THOK); + player->mo->z + P_GetMobjZMovement(player->mo) + player->mo->height + (24*player->mo->scale), MT_THOK); P_SetMobjState(debtflag, S_RINGDEBT); P_SetScale(debtflag, (debtflag->destscale = player->mo->scale)); @@ -6608,7 +6610,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) star->flags |= MF_NOGRAVITY; star->momx = player->mo->momx / 2; star->momy = player->mo->momy / 2; - star->momz = player->mo->momz / 2; + star->momz = P_GetMobjZMovement(player->mo) / 2; star->fuse = 12; star->scale = player->mo->scale; star->destscale = star->scale / 2; @@ -8159,7 +8161,7 @@ static void K_KartSpindashWind(mobj_t *parent) wind->momx = 3 * parent->momx / 4; wind->momy = 3 * parent->momy / 4; - wind->momz = 3 * parent->momz / 4; + wind->momz = 3 * P_GetMobjZMovement(parent) / 4; K_MatchGenericExtraFlags(wind, parent); } diff --git a/src/p_local.h b/src/p_local.h index 9c282499f..9ade55ce1 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -522,5 +522,6 @@ fixed_t P_ScaleFromMap(fixed_t n, fixed_t scale); fixed_t P_GetMobjHead(const mobj_t *); fixed_t P_GetMobjFeet(const mobj_t *); fixed_t P_GetMobjGround(const mobj_t *); +fixed_t P_GetMobjZMovement(mobj_t *mo); #endif // __P_LOCAL__ diff --git a/src/p_mobj.c b/src/p_mobj.c index 91f8c9403..17f526063 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7074,7 +7074,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) fast->angle = mobj->angle; fast->momx = 3*mobj->target->momx/4; fast->momy = 3*mobj->target->momy/4; - fast->momz = 3*mobj->target->momz/4; + fast->momz = 3*P_GetMobjZMovement(mobj->target)/4; K_MatchGenericExtraFlags(fast, mobj); P_SetMobjState(fast, S_FLAMESHIELDLINE1 + i); @@ -12796,3 +12796,25 @@ fixed_t P_GetMobjGround(const mobj_t *mobj) { return P_IsObjectFlipped(mobj) ? mobj->ceilingz : mobj->floorz; } + +// +// P_GetMobjZMovement +// Returns the Z momentum of the object, accounting for slopes if the object is grounded +// +fixed_t P_GetMobjZMovement(mobj_t *mo) +{ + pslope_t *slope = mo->standingslope; + angle_t angDiff; + fixed_t speed; + + if (!P_IsObjectOnGround(mo)) + return mo->momz; + + if (!slope) + return 0; + + angDiff = R_PointToAngle2(0, 0, mo->momx, mo->momy) - slope->xydirection; + speed = FixedHypot(mo->momx, mo->momy); + + return P_ReturnThrustY(mo, slope->zangle, P_ReturnThrustX(mo, angDiff, speed)); +} \ No newline at end of file