MT_SHADOW: move code to objects/shadow.cpp; copy whiteshadow from followed object

This commit is contained in:
James R. 2023-09-17 19:06:55 -07:00
parent 72ef1d352b
commit fac5abf69e
5 changed files with 68 additions and 24 deletions

View file

@ -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);

View file

@ -29,4 +29,5 @@ target_sources(SRB2SDL2 PRIVATE
sneaker-panel.c
emerald.c
checkpoint.cpp
shadow.cpp
)

View file

@ -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

59
src/objects/shadow.cpp Normal file
View file

@ -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<Shadow*>(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*>(shadow);
if (!x->valid())
{
x->destroy();
return;
}
x->move();
}

View file

@ -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;