From b86ade712a1e35ad1821a9ecb956cb10fa47ff1b Mon Sep 17 00:00:00 2001 From: "James R." Date: Sun, 17 Sep 2023 20:15:35 -0700 Subject: [PATCH] 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 --- src/k_hud_track.cpp | 3 ++- src/k_objects.h | 1 + src/objects/emerald.c | 34 +++++++++++++++++++++++----------- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/k_hud_track.cpp b/src/k_hud_track.cpp index d6c108dc6..e7b38d06d 100644 --- a/src/k_hud_track.cpp +++ b/src/k_hud_track.cpp @@ -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; diff --git a/src/k_objects.h b/src/k_objects.h index 1ea1578a3..fe3e17783 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -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); diff --git a/src/objects/emerald.c b/src/objects/emerald.c index fdf7449f2..cc7105b54 100644 --- a/src/objects/emerald.c +++ b/src/objects/emerald.c @@ -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); }