From 2b6da538ac15fabeb50cf3053aa3c528c973c40b Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 2 Jul 2023 04:28:19 -0700 Subject: [PATCH] UFO not CBT --- src/objects/ufo.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/objects/ufo.c b/src/objects/ufo.c index dacce52e6..bf1857072 100644 --- a/src/objects/ufo.c +++ b/src/objects/ufo.c @@ -35,6 +35,9 @@ #define UFO_DAMAGED_SPEED (UFO_BASE_SPEED >> 1) // Speed to add when UFO takes damage. #define UFO_START_SPEED (UFO_BASE_SPEED << 1) // Speed when the map starts. +#define UFO_PITY_DIST (10000) // Let's aim for an exciting finish! Try to stick closer to the player once they're past this threshold. +#define UFO_PITY_BRAKES (600 * FRACUNIT) // Subtract this amount from UFO_SFACING, starting at UFO_PITY_DIST and ending at the finish line. + #define UFO_NUMARMS (3) #define UFO_ARMDELTA (ANGLE_MAX / UFO_NUMARMS) @@ -52,6 +55,8 @@ #define ufo_piece_next(o) ((o)->hnext) #define ufo_piece_prev(o) ((o)->hprev) +#define ufo_intangible(o) ((o)->cusval) + enum { UFO_PIECE_TYPE_POD, @@ -168,9 +173,11 @@ static void UFOUpdateDistanceToFinish(mobj_t *ufo) static void UFOUpdateSpeed(mobj_t *ufo) { const fixed_t baseSpeed = FixedMul(UFO_BASE_SPEED, K_GetKartGameSpeedScalar(gamespeed)); - const UINT32 spacing = FixedMul(FixedMul(UFO_SPACING, mapobjectscale), K_GetKartGameSpeedScalar(gamespeed)) >> FRACBITS; const UINT32 deadzone = FixedMul(FixedMul(UFO_DEADZONE, mapobjectscale), K_GetKartGameSpeedScalar(gamespeed)) >> FRACBITS; + UINT32 spacing = FixedMul(FixedMul(UFO_SPACING, mapobjectscale), K_GetKartGameSpeedScalar(gamespeed)) >> FRACBITS; + UINT32 distanceNerf = FixedMul(FixedMul(UFO_PITY_BRAKES, mapobjectscale), K_GetKartGameSpeedScalar(gamespeed)) >> FRACBITS; + // Best values of all of the players. UINT32 bestDist = UINT32_MAX; fixed_t bestSpeed = 0; @@ -223,6 +230,13 @@ static void UFOUpdateSpeed(mobj_t *ufo) { INT32 distDelta = 0; + if (bestDist < UFO_PITY_DIST && UFOEmeraldChase(ufo)) + { + INT32 brakeDelta = UFO_PITY_DIST - bestDist; + INT32 distPerNerf = UFO_PITY_DIST / distanceNerf; // Doing this in the sensible way integer overflows. Sorry. + spacing = spacing - (brakeDelta / distPerNerf); + } + if (bestDist > spacing) { wantedDist = bestDist - spacing; @@ -495,6 +509,9 @@ void Obj_SpecialUFOThinker(mobj_t *ufo) UFOUpdateSpeed(ufo); UFOUpdateSound(ufo); + if (ufo_intangible(ufo)) + ufo_intangible(ufo)--; + if (UFOEmeraldChase(ufo) == true) { // Spawn emerald sparkles @@ -768,6 +785,7 @@ boolean Obj_SpecialUFODamage(mobj_t *ufo, mobj_t *inflictor, mobj_t *source, UIN SetRandomFakePlayerSkin(source->player, true); } + ufo_intangible(ufo) = 30; // Speed up on damage! ufo_speed(ufo) += addSpeed; @@ -819,6 +837,11 @@ void Obj_PlayerUFOCollide(mobj_t *ufo, mobj_t *other) return; // underneath } + if (ufo_intangible(ufo)) + { + return; // We were just hit! + } + if ((other->player->sneakertimer > 0) && !P_PlayerInPain(other->player) && (other->player->flashing == 0))