From fac5abf69e92c397cb005cd19bcb34294755c80b Mon Sep 17 00:00:00 2001 From: "James R." Date: Sun, 17 Sep 2023 19:06:55 -0700 Subject: [PATCH] MT_SHADOW: move code to objects/shadow.cpp; copy whiteshadow from followed object --- src/k_objects.h | 4 +++ src/objects/CMakeLists.txt | 1 + src/objects/hyudoro.c | 16 +---------- src/objects/shadow.cpp | 59 ++++++++++++++++++++++++++++++++++++++ src/p_mobj.c | 12 ++------ 5 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 src/objects/shadow.cpp diff --git a/src/k_objects.h b/src/k_objects.h index 7050ddff4..1ea1578a3 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -214,6 +214,10 @@ 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); +/* Fake Shadow */ +mobj_t *Obj_SpawnFakeShadow(mobj_t *from); +void Obj_FakeShadowThink(mobj_t *shadow); + /* Checkpoints */ void Obj_ResetCheckpoints(void); void Obj_LinkCheckpoint(mobj_t *end); diff --git a/src/objects/CMakeLists.txt b/src/objects/CMakeLists.txt index c3b01f4a0..89d5a17c1 100644 --- a/src/objects/CMakeLists.txt +++ b/src/objects/CMakeLists.txt @@ -29,4 +29,5 @@ target_sources(SRB2SDL2 PRIVATE sneaker-panel.c emerald.c checkpoint.cpp + shadow.cpp ) diff --git a/src/objects/hyudoro.c b/src/objects/hyudoro.c index 4b104b9d0..b5fa87429 100644 --- a/src/objects/hyudoro.c +++ b/src/objects/hyudoro.c @@ -183,20 +183,6 @@ project_hyudoro_hover (mobj_t *hyu) bob_in_place(hyu, 64); } -static void -spawn_hyudoro_shadow (mobj_t *hyu) -{ - mobj_t *shadow = P_SpawnMobjFromMobj( - hyu, 0, 0, 0, MT_SHADOW); - - shadow->whiteshadow = true; - - shadow->shadowscale = hyu->shadowscale; - hyu->shadowscale = 0; - - P_SetTarget(&shadow->tracer, hyu); -} - static mobj_t * find_duel_target (mobj_t *ignore) { @@ -572,7 +558,7 @@ Obj_InitHyudoroCenter (mobj_t * center, mobj_t * master) hyu->renderflags &= ~(K_GetPlayerDontDrawFlag(master->player)); } - spawn_hyudoro_shadow(hyu); // this sucks btw + Obj_SpawnFakeShadow(hyu); // this sucks btw } void diff --git a/src/objects/shadow.cpp b/src/objects/shadow.cpp new file mode 100644 index 000000000..448f9d4af --- /dev/null +++ b/src/objects/shadow.cpp @@ -0,0 +1,59 @@ +#include "../info.h" +#include "../k_objects.h" +#include "../p_local.h" +#include "../p_mobj.h" +#include "../p_tick.h" +#include "../typedef.h" + +#define shadow_follow(o) ((o)->tracer) + +struct Shadow : mobj_t +{ + mobj_t* follow() const { return shadow_follow(this); } + void follow(mobj_t* n) { P_SetTarget(&shadow_follow(this), n); } + + static Shadow* spawn(mobj_t* from) + { + return static_cast(P_SpawnMobjFromMobj(from, 0, 0, 0, MT_SHADOW))->init(from); + } + + bool valid() const { return !P_MobjWasRemoved(this) && !P_MobjWasRemoved(follow()); } + + void destroy() { P_RemoveMobj(this); } + + void move() + { + whiteshadow = follow()->whiteshadow; + + P_MoveOrigin(this, follow()->x, follow()->y, P_GetMobjFeet(follow())); + } + +private: + Shadow* init(mobj_t* from) + { + shadowscale = from->shadowscale; + from->shadowscale = 0; + + follow(from); + + return this; + } +}; + +mobj_t* Obj_SpawnFakeShadow(mobj_t* from) +{ + return Shadow::spawn(from); +} + +void Obj_FakeShadowThink(mobj_t* shadow) +{ + auto x = static_cast(shadow); + + if (!x->valid()) + { + x->destroy(); + return; + } + + x->move(); +} diff --git a/src/p_mobj.c b/src/p_mobj.c index 30179af6c..0cab3eefc 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5782,16 +5782,10 @@ static void P_MobjSceneryThink(mobj_t *mobj) switch (mobj->type) { case MT_SHADOW: - if (mobj->tracer) + Obj_FakeShadowThink(mobj); + + if (P_MobjWasRemoved(mobj)) { - P_MoveOrigin(mobj, - mobj->tracer->x, - mobj->tracer->y, - mobj->tracer->z); - } - else - { - P_RemoveMobj(mobj); return; } break;