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; return inDuel == false && battleovertime.enabled;
case MT_EMERALD: 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: case MT_MONITOR:
return is_player_tracking_target() && Obj_MonitorGetEmerald(mobj) != 0; 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_EmeraldFlareThink(mobj_t *flare);
void Obj_BeginEmeraldOrbit(mobj_t *emerald, mobj_t *target, fixed_t radius, INT32 revolution_time, tic_t fuse); 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_GiveEmerald(mobj_t *emerald);
void Obj_SetEmeraldAwardee(mobj_t *emerald, mobj_t *awardee);
/* Fake Shadow */ /* Fake Shadow */
mobj_t *Obj_SpawnFakeShadow(mobj_t *from); mobj_t *Obj_SpawnFakeShadow(mobj_t *from);

View file

@ -15,6 +15,8 @@
#define emerald_target_radius(o) ((o)->extravalue2) #define emerald_target_radius(o) ((o)->extravalue2)
#define emerald_z_shift(o) ((o)->reactiontime) #define emerald_z_shift(o) ((o)->reactiontime)
#define emerald_scale_rate(o) ((o)->movefactor) #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 // Think of this like EMERALD_SPEED_UP / EMERALD_SPEED_UP_RATE
#define EMERALD_SPEED_UP (1) // speed up by this much... #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)); 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) static void speed_up(mobj_t *emerald)
@ -116,8 +118,8 @@ static void Obj_EmeraldOrbitPlayer(mobj_t *emerald)
P_MoveOrigin( P_MoveOrigin(
emerald, emerald,
emerald->target->x + x, emerald_orbit(emerald)->x + x,
emerald->target->y + y, emerald_orbit(emerald)->y + y,
get_target_z(emerald) get_target_z(emerald)
); );
@ -133,9 +135,9 @@ static void Obj_EmeraldOrbitPlayer(mobj_t *emerald)
void Obj_EmeraldThink(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: case MT_SPECIAL_UFO:
Obj_UFOEmeraldThink(emerald); 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); mobj_t *flare = P_SpawnMobjFromMobj(emerald, 0, 0, 0, MT_EMERALDFLARE);
P_SetTarget(&flare->target, emerald); P_SetTarget(&flare->target, emerald);
P_InstaScale(flare, emerald->target->scale); P_InstaScale(flare, emerald_orbit(emerald)->scale);
flare->color = emerald->color; flare->color = emerald->color;
flare->colorized = true; 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) // FIXME: linkdraw doesn't work consistently, so I drew it on top of everyting (and through walls)
#if 0 #if 0
P_SetTarget(&flare->tracer, emerald->target); P_SetTarget(&flare->tracer, emerald_orbit(emerald));
flare->flags2 |= MF2_LINKDRAW; flare->flags2 |= MF2_LINKDRAW;
flare->dispoffset = 1000; flare->dispoffset = 1000;
#endif #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) 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_anim_start(emerald) = leveltime;
emerald_revolution_time(emerald) = revolution_time; 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) void Obj_GiveEmerald(mobj_t *emerald)
{ {
if (P_MobjWasRemoved(emerald->target)) if (P_MobjWasRemoved(emerald_orbit(emerald)) || P_MobjWasRemoved(emerald_award(emerald)))
{ {
return; return;
} }
player_t *player = emerald->target->player; player_t *player = emerald_award(emerald)->player;
if (!player) if (!player)
{ {
@ -314,5 +321,10 @@ void Obj_GiveEmerald(mobj_t *emerald)
player->emeralds |= emerald_type(emerald); player->emeralds |= emerald_type(emerald);
K_CheckEmeralds(player); 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);
} }