mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
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:
parent
1c2a2155c0
commit
af26848cf9
5 changed files with 53 additions and 24 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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--;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue