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.
This commit is contained in:
James R 2023-08-12 18:54:05 -07:00
parent 1c2a2155c0
commit af26848cf9
5 changed files with 53 additions and 24 deletions

View file

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

View file

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

View file

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

View file

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

View file

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