UFO not CBT

This commit is contained in:
AJ Martinez 2023-07-02 04:28:19 -07:00
parent d9915ca471
commit 2b6da538ac

View file

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