From af26848cf9ea361ac189027027ab9662ba2a827c Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 12 Aug 2023 18:54:05 -0700 Subject: [PATCH] Spawn literal MT_EMERALD for UFO Catcher, remove MT_SPECIAL_UFO tracking Side effects: - HUD tracking icon now uses emerald's color in Sealed Stars. - UFO emerald doesn't disappear when collected. This is WIP because the emerald is intended to orbit the player. --- src/k_hud_track.cpp | 6 ++--- src/k_objects.h | 1 + src/objects/emerald.c | 15 ++++++++++++ src/objects/ufo.c | 54 ++++++++++++++++++++++++++++--------------- src/p_mobj.c | 1 - 5 files changed, 53 insertions(+), 24 deletions(-) diff --git a/src/k_hud_track.cpp b/src/k_hud_track.cpp index a9c6eb4b0..138658bec 100644 --- a/src/k_hud_track.cpp +++ b/src/k_hud_track.cpp @@ -8,6 +8,7 @@ #include "k_hud.h" #include "k_kart.h" #include "k_objects.h" +#include "k_specialstage.h" #include "m_fixed.h" #include "p_local.h" #include "p_mobj.h" @@ -374,9 +375,6 @@ bool is_object_tracking_target(const mobj_t* mobj) case MT_CDUFO: return battleprisons; - case MT_SPECIAL_UFO: - return true; - case MT_PLAYER: return is_player_tracking_target(mobj->player); @@ -384,7 +382,7 @@ bool is_object_tracking_target(const mobj_t* mobj) return inDuel == false && battleovertime.enabled; case MT_EMERALD: - return is_player_tracking_target(); + return specialstageinfo.valid || is_player_tracking_target(); case MT_MONITOR: return is_player_tracking_target() && Obj_MonitorGetEmerald(mobj) != 0; diff --git a/src/k_objects.h b/src/k_objects.h index cba2f4618..e0ae037f0 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -82,6 +82,7 @@ void Obj_UFOPieceDead(mobj_t *piece); void Obj_UFOPieceRemoved(mobj_t *piece); mobj_t *Obj_CreateSpecialUFO(void); UINT32 K_GetSpecialUFODistance(void); +void Obj_UFOEmeraldThink(mobj_t *emerald); /* Monitors */ mobj_t *Obj_SpawnMonitor(mobj_t *origin, UINT8 numItemTypes, UINT8 emerald); diff --git a/src/objects/emerald.c b/src/objects/emerald.c index 9ab42c75a..a6502ec41 100644 --- a/src/objects/emerald.c +++ b/src/objects/emerald.c @@ -26,6 +26,21 @@ void Obj_SpawnEmeraldSparks(mobj_t *mobj) void Obj_EmeraldThink(mobj_t *emerald) { + if (!P_MobjWasRemoved(emerald->target)) + { + switch (emerald->target->type) + { + case MT_SPECIAL_UFO: + Obj_UFOEmeraldThink(emerald); + break; + + default: + break; + } + + return; + } + if (emerald->threshold > 0) { emerald->threshold--; diff --git a/src/objects/ufo.c b/src/objects/ufo.c index 9ed38ca74..4dc2ce153 100644 --- a/src/objects/ufo.c +++ b/src/objects/ufo.c @@ -459,15 +459,15 @@ static void UFOMove(mobj_t *ufo) } } -static void UFOEmeraldVFX(mobj_t *ufo) +static void UFOEmeraldVFX(mobj_t *emerald) { const INT32 bobS = 32; const angle_t bobA = (leveltime & (bobS - 1)) * (ANGLE_MAX / bobS); - const fixed_t bobH = 16 * ufo->scale; + const fixed_t bobH = 16 * emerald->scale; - ufo->sprzoff = FixedMul(bobH, FINESINE(bobA >> ANGLETOFINESHIFT)); + emerald->sprzoff = FixedMul(bobH, FINESINE(bobA >> ANGLETOFINESHIFT)); - Obj_SpawnEmeraldSparks(ufo); + Obj_SpawnEmeraldSparks(emerald); } static boolean UFOHumPlaying(mobj_t *ufo) { @@ -504,8 +504,6 @@ void Obj_SpecialUFOThinker(mobj_t *ufo) if (UFOEmeraldChase(ufo) == true) { - // Spawn emerald sparkles - UFOEmeraldVFX(ufo); ufo_collectdelay(ufo)--; } else @@ -1014,43 +1012,48 @@ static mobj_t *InitSpecialUFO(waypoint_t *start) // Adjustable Special Stage emerald color/shape { - overlay = P_SpawnMobjFromMobj(ufo, 0, 0, 0, MT_OVERLAY); + mobj_t *emerald = P_SpawnMobjFromMobj(ufo, 0, 0, 0, MT_EMERALD); - ufo->color = SKINCOLOR_CHAOSEMERALD1; + emerald->flags |= MF_NOGRAVITY | MF_NOCLIP | MF_NOCLIPTHING | MF_NOCLIPHEIGHT; + + overlay = P_SpawnMobjFromMobj(emerald, 0, 0, 0, MT_OVERLAY); + + emerald->color = SKINCOLOR_CHAOSEMERALD1; i = ufo_emeraldnum(ufo) = P_GetNextEmerald(); if (i > 0) { - ufo->color += (i - 1) % 7; + emerald->color += (i - 1) % 7; if (i > 7) { // Super Emeralds - P_SetMobjState(ufo, S_SUPEREMERALD1); + P_SetMobjState(emerald, S_SUPEREMERALD1); P_SetMobjState(overlay, S_SUPEREMERALD_UNDER); } else { // Chaos Emerald - P_SetMobjState(ufo, S_CHAOSEMERALD1); + P_SetMobjState(emerald, S_CHAOSEMERALD1); P_SetMobjState(overlay, S_CHAOSEMERALD_UNDER); } } else { // Prize -- todo, currently using standard Emerald - P_SetMobjState(ufo, S_CHAOSEMERALD1); + P_SetMobjState(emerald, S_CHAOSEMERALD1); P_SetMobjState(overlay, S_CHAOSEMERALD_UNDER); } - if (P_MobjWasRemoved(ufo)) // uh oh ! - { - // Attempted crash prevention with custom SOC - return NULL; - } + P_SetTarget(&emerald->target, ufo); - overlay->color = ufo->color; - P_SetTarget(&overlay->target, ufo); + ufo->color = emerald->color; // for minimap + overlay->color = emerald->color; + P_SetTarget(&overlay->target, emerald); + + // UFO needs this so Jawz reticle lines up! ufo->sprzoff = 32 * mapobjectscale; + + emerald->sprzoff = ufo->sprzoff; } // Create UFO pieces. @@ -1172,3 +1175,16 @@ UINT32 K_GetSpecialUFODistance(void) return UINT32_MAX; } + +void Obj_UFOEmeraldThink(mobj_t *emerald) +{ + mobj_t *ufo = emerald->target; + + P_MoveOrigin(emerald, ufo->x, ufo->y, ufo->z); + + if (UFOEmeraldChase(ufo) == true) + { + // Spawn emerald sparkles + UFOEmeraldVFX(emerald); + } +} diff --git a/src/p_mobj.c b/src/p_mobj.c index d3723e77a..003c481a9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5325,7 +5325,6 @@ static boolean P_IsTrackerType(INT32 type) case MT_SPB: case MT_BATTLECAPSULE: case MT_CDUFO: - case MT_SPECIAL_UFO: return true; // Players sometimes get targeted with HUD tracking