From 99908c0700302e5043e0560afa157ecc48b9e919 Mon Sep 17 00:00:00 2001 From: Lach Date: Sat, 9 Mar 2024 15:44:02 +1100 Subject: [PATCH] Allow Adventure Air Boosters to be chained with each other or dash rings --- src/k_objects.h | 1 + src/objects/adventure-air-booster.c | 2 +- src/objects/dash-rings.c | 17 +++++++++++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/k_objects.h b/src/k_objects.h index 3fd6776b8..746bccb0b 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -208,6 +208,7 @@ void Obj_RainbowDashRingThink(mobj_t *mobj); void Obj_DashRingTouch(mobj_t *mobj, player_t *player); void Obj_DashRingPlayerThink(player_t *player); boolean Obj_DashRingPlayerHasNoGravity(player_t *player); +boolean Obj_DashRingIsUsableByPlayer(mobj_t *mobj, player_t *player); /* Adventure Dash Ring */ void Obj_AdventureAirBoosterSetup(mobj_t *mobj, mapthing_t *mthing); diff --git a/src/objects/adventure-air-booster.c b/src/objects/adventure-air-booster.c index 23fcd8192..268de0835 100644 --- a/src/objects/adventure-air-booster.c +++ b/src/objects/adventure-air-booster.c @@ -128,7 +128,7 @@ void Obj_AdventureAirBoosterHitboxTouch(mobj_t *hitbox, player_t *player) fixed_t finalSpeed, playerSpeed, xPos, yPos; SINT8 i; - if (player->carry != CR_NONE || P_MobjWasRemoved(booster)) + if (P_MobjWasRemoved(booster) || !Obj_DashRingIsUsableByPlayer(booster, player)) { return; } diff --git a/src/objects/dash-rings.c b/src/objects/dash-rings.c index 5d1c68501..77abc44d8 100644 --- a/src/objects/dash-rings.c +++ b/src/objects/dash-rings.c @@ -120,18 +120,27 @@ static boolean DashRingsAreTooClose(mobj_t *ring1, mobj_t *ring2) return false; } -void Obj_DashRingTouch(mobj_t *ring, player_t *player) +boolean Obj_DashRingIsUsableByPlayer(mobj_t *ring, player_t *player) { if (player->carry != CR_NONE) { if (player->carry != CR_DASHRING) // being carried by something else - return; + return false; if (player->dashRingPullTics > 0) // being pulled into a dash ring already - return; + return false; if (player->dashRingPushTics > 0 && !P_MobjWasRemoved(player->mo->tracer) && DashRingsAreTooClose(player->mo->tracer, ring)) // dash ring is too close to recently used dash ring - return; + return false; + } + return true; +} + +void Obj_DashRingTouch(mobj_t *ring, player_t *player) +{ + if (!Obj_DashRingIsUsableByPlayer(ring, player)) + { + return; } P_SetTarget(&player->mo->tracer, ring);