Allow Adventure Air Boosters to be chained with each other or dash rings

This commit is contained in:
Lach 2024-03-09 15:44:02 +11:00
parent 2f19582941
commit 99908c0700
3 changed files with 15 additions and 5 deletions

View file

@ -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);

View file

@ -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;
}

View file

@ -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);