MT_EMERALD: prepartion to let orbiting physics be used in a general-purpose manner

- Add Obj_SetEmeraldAwardee
  - Separate object receiving emerald from object being
    orbited
  - Obj_BeginEmeraldOrbit sets both, if the awardee isn't
    explicitly set
- Don't HUD track emeralds without emerald flag set
This commit is contained in:
James R. 2023-09-17 20:15:35 -07:00
parent eb477365a4
commit b86ade712a
3 changed files with 26 additions and 12 deletions

View file

@ -448,7 +448,8 @@ bool is_object_tracking_target(const mobj_t* mobj)
return inDuel == false && battleovertime.enabled;
case MT_EMERALD:
return (specialstageinfo.valid && specialstageinfo.ufo) || is_player_tracking_target();
// extravalue1: emerald flag must be set
return mobj->extravalue1 && ((specialstageinfo.valid && specialstageinfo.ufo) || is_player_tracking_target());
case MT_MONITOR:
return is_player_tracking_target() && Obj_MonitorGetEmerald(mobj) != 0;

View file

@ -213,6 +213,7 @@ void Obj_EmeraldThink(mobj_t *emerald);
void Obj_EmeraldFlareThink(mobj_t *flare);
void Obj_BeginEmeraldOrbit(mobj_t *emerald, mobj_t *target, fixed_t radius, INT32 revolution_time, tic_t fuse);
void Obj_GiveEmerald(mobj_t *emerald);
void Obj_SetEmeraldAwardee(mobj_t *emerald, mobj_t *awardee);
/* Fake Shadow */
mobj_t *Obj_SpawnFakeShadow(mobj_t *from);

View file

@ -15,6 +15,8 @@
#define emerald_target_radius(o) ((o)->extravalue2)
#define emerald_z_shift(o) ((o)->reactiontime)
#define emerald_scale_rate(o) ((o)->movefactor)
#define emerald_orbit(o) ((o)->target)
#define emerald_award(o) ((o)->tracer)
// Think of this like EMERALD_SPEED_UP / EMERALD_SPEED_UP_RATE
#define EMERALD_SPEED_UP (1) // speed up by this much...
@ -84,7 +86,7 @@ static fixed_t get_target_z(mobj_t *emerald)
{
fixed_t shift = FixedMul(emerald_z_shift(emerald), FRACUNIT - get_suck_factor(emerald));
return center_of(emerald->target) + get_bob(emerald) + shift;
return center_of(emerald_orbit(emerald)) + get_bob(emerald) + shift;
}
static void speed_up(mobj_t *emerald)
@ -116,8 +118,8 @@ static void Obj_EmeraldOrbitPlayer(mobj_t *emerald)
P_MoveOrigin(
emerald,
emerald->target->x + x,
emerald->target->y + y,
emerald_orbit(emerald)->x + x,
emerald_orbit(emerald)->y + y,
get_target_z(emerald)
);
@ -133,9 +135,9 @@ static void Obj_EmeraldOrbitPlayer(mobj_t *emerald)
void Obj_EmeraldThink(mobj_t *emerald)
{
if (!P_MobjWasRemoved(emerald->target))
if (!P_MobjWasRemoved(emerald_orbit(emerald)))
{
switch (emerald->target->type)
switch (emerald_orbit(emerald)->type)
{
case MT_SPECIAL_UFO:
Obj_UFOEmeraldThink(emerald);
@ -256,7 +258,7 @@ static void spawn_lens_flare(mobj_t *emerald)
mobj_t *flare = P_SpawnMobjFromMobj(emerald, 0, 0, 0, MT_EMERALDFLARE);
P_SetTarget(&flare->target, emerald);
P_InstaScale(flare, emerald->target->scale);
P_InstaScale(flare, emerald_orbit(emerald)->scale);
flare->color = emerald->color;
flare->colorized = true;
@ -265,7 +267,7 @@ static void spawn_lens_flare(mobj_t *emerald)
// FIXME: linkdraw doesn't work consistently, so I drew it on top of everyting (and through walls)
#if 0
P_SetTarget(&flare->tracer, emerald->target);
P_SetTarget(&flare->tracer, emerald_orbit(emerald));
flare->flags2 |= MF2_LINKDRAW;
flare->dispoffset = 1000;
#endif
@ -273,7 +275,12 @@ static void spawn_lens_flare(mobj_t *emerald)
void Obj_BeginEmeraldOrbit(mobj_t *emerald, mobj_t *target, fixed_t radius, INT32 revolution_time, tic_t fuse)
{
P_SetTarget(&emerald->target, target);
P_SetTarget(&emerald_orbit(emerald), target);
if (P_MobjWasRemoved(emerald_award(emerald)))
{
P_SetTarget(&emerald_award(emerald), target);
}
emerald_anim_start(emerald) = leveltime;
emerald_revolution_time(emerald) = revolution_time;
@ -299,12 +306,12 @@ void Obj_BeginEmeraldOrbit(mobj_t *emerald, mobj_t *target, fixed_t radius, INT3
void Obj_GiveEmerald(mobj_t *emerald)
{
if (P_MobjWasRemoved(emerald->target))
if (P_MobjWasRemoved(emerald_orbit(emerald)) || P_MobjWasRemoved(emerald_award(emerald)))
{
return;
}
player_t *player = emerald->target->player;
player_t *player = emerald_award(emerald)->player;
if (!player)
{
@ -314,5 +321,10 @@ void Obj_GiveEmerald(mobj_t *emerald)
player->emeralds |= emerald_type(emerald);
K_CheckEmeralds(player);
S_StartSound(emerald->target, emerald->info->deathsound);
S_StartSound(emerald_award(emerald), emerald->info->deathsound);
}
void Obj_SetEmeraldAwardee(mobj_t *emerald, mobj_t *awardee)
{
P_SetTarget(&emerald_award(emerald), awardee);
}