From c0b8d4498a93420b348c3e840dd0213547023c10 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 22 Dec 2023 05:40:32 -0800 Subject: [PATCH] Add justbumped exception to metal SA2 crates --- src/k_kart.c | 20 +++++++++++++++++--- src/k_objects.h | 1 + src/objects/crate.cpp | 5 +++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 546df2958..e16752612 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -822,6 +822,20 @@ static void K_PlayerJustBumped(player_t *player) } } +static boolean K_JustBumpedException(mobj_t *mobj) +{ + switch (mobj->type) + { + case MT_SA2_CRATE: + return Obj_SA2CrateIsMetal(mobj); + + default: + break; + } + + return false; +} + static fixed_t K_GetBounceForce(mobj_t *mobj1, mobj_t *mobj2, fixed_t distx, fixed_t disty) { const fixed_t forceMul = (4 * FRACUNIT) / 10; // Multiply by this value to make it feel like old bumps. @@ -918,13 +932,13 @@ boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2) } // Don't bump if you've recently bumped - if (mobj1->player && mobj1->player->justbumped) + if (mobj1->player && mobj1->player->justbumped && !K_JustBumpedException(mobj2)) { mobj1->player->justbumped = bumptime; return false; } - if (mobj2->player && mobj2->player->justbumped) + if (mobj2->player && mobj2->player->justbumped && !K_JustBumpedException(mobj1)) { mobj2->player->justbumped = bumptime; return false; @@ -1032,7 +1046,7 @@ boolean K_KartSolidBounce(mobj_t *bounceMobj, mobj_t *solidMobj) return false; // Don't bump if you've recently bumped - if (bounceMobj->player && bounceMobj->player->justbumped) + if (bounceMobj->player && bounceMobj->player->justbumped && !K_JustBumpedException(solidMobj)) { bounceMobj->player->justbumped = bumptime; return false; diff --git a/src/k_objects.h b/src/k_objects.h index 5de28981d..8e5d34014 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -327,6 +327,7 @@ void Obj_TryCrateInit(mobj_t *mo); boolean Obj_TryCrateThink(mobj_t *mo); void Obj_TryCrateTouch(mobj_t *special, mobj_t *toucher); void Obj_TryCrateDamage(mobj_t *target, mobj_t *inflictor); +boolean Obj_SA2CrateIsMetal(mobj_t *mo); /* Lavender Shrine Spears */ void Obj_SpearInit(mobj_t *mo); diff --git a/src/objects/crate.cpp b/src/objects/crate.cpp index dafa06b72..05c608ab0 100644 --- a/src/objects/crate.cpp +++ b/src/objects/crate.cpp @@ -389,3 +389,8 @@ void Obj_TryCrateDamage(mobj_t* target, mobj_t* inflictor) { static_cast(target)->visit([&](auto box) { box->damage(static_cast(inflictor)); }); } + +boolean Obj_SA2CrateIsMetal(mobj_t* mobj) +{ + return static_cast(mobj)->metal(); +}