From c7525fb5a64e91930d89a35ab5ff26c1def5365f Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 8 Jan 2023 18:16:04 +0000 Subject: [PATCH] Introduce MT_OVERLAY exception flags - Applied via threshold of Overlay mobj - OV_DONTSCREENOFFSET - spritexoffset, spriteyoffset - Given to Item Capsule quantity numbers - OV_DONT3DOFFSET - sprxoffset, spryoffset, sprzoffset - OV_DONTXYSCALE - spritexscale, spriteyscale - OV_DONTROLL - rollangle, pitch, roll Makes overlay on UFO emerald follow the emerald's spriteyoffset now --- src/deh_tables.c | 6 ++++++ src/p_local.h | 6 ++++++ src/p_mobj.c | 37 +++++++++++++++++++++++++------------ 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 474db3b43..4761c96e7 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -6443,6 +6443,12 @@ struct int_const_s const INT_CONST[] = { // {"JT_RACENT",JT_RACENT}, // {"JT_CONTSC",JT_CONTSC}, + // Overlay exception settings + {"OV_DONTSCREENOFFSET", OV_DONTSCREENOFFSET}, + {"OV_DONT3DOFFSET", OV_DONT3DOFFSET}, + {"OV_DONTXYSCALE", OV_DONTXYSCALE}, + {"OV_DONTROLL", OV_DONTROLL}, + // Player state (playerstate_t) {"PST_LIVE",PST_LIVE}, // Playing or camping. {"PST_DEAD",PST_DEAD}, // Dead on the ground, view follows killer. diff --git a/src/p_local.h b/src/p_local.h index 06adebf6b..03d420555 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -295,7 +295,13 @@ boolean P_MobjWasRemoved(mobj_t *th); void P_RemoveSavegameMobj(mobj_t *th); boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state); boolean P_SetMobjState(mobj_t *mobj, statenum_t state); + void P_RunOverlays(void); +#define OV_DONTSCREENOFFSET 1 +#define OV_DONT3DOFFSET 1<<1 +#define OV_DONTXYSCALE 1<<2 +#define OV_DONTROLL 1<<3 + void P_HandleMinecartSegments(mobj_t *mobj); void P_MobjThinker(mobj_t *mobj); boolean P_RailThinker(mobj_t *mobj); diff --git a/src/p_mobj.c b/src/p_mobj.c index 24d881471..979c95126 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -4406,6 +4406,7 @@ static void P_RefreshItemCapsuleParts(mobj_t *mobj) P_SetMobjState(part->tracer, S_INVISIBLE); part->tracer->spriteyoffset = 10*FRACUNIT; part->tracer->spritexoffset = 13*numNumbers*FRACUNIT; + part->threshold = OV_DONTSCREENOFFSET; } part = part->tracer; part->sprite = SPR_ITMN; @@ -5310,20 +5311,32 @@ void P_RunOverlays(void) mo->eflags = (mo->eflags & ~MFE_VERTICALFLIP) | (mo->target->eflags & MFE_VERTICALFLIP); mo->scale = mo->destscale = FixedMul(mo->target->scale, mo->movefactor); mo->angle = (mo->target->player ? mo->target->player->drawangle : mo->target->angle) + mo->movedir; - mo->rollangle = mo->target->rollangle; - mo->pitch = mo->target->pitch; - mo->roll = mo->target->roll; -#if 0 - mo->spritexoffset = mo->target->spritexoffset; - mo->spriteyoffset = mo->target->spriteyoffset; - mo->spritexscale = mo->target->spritexscale; - mo->spriteyscale = mo->target->spriteyscale; + if (!(mo->threshold & OV_DONTSCREENOFFSET)) + { + mo->spritexoffset = mo->target->spritexoffset; + mo->spriteyoffset = mo->target->spriteyoffset; + } - mo->sprxoff = mo->target->sprxoff; - mo->spryoff = mo->target->spryoff; - mo->sprzoff = mo->target->sprzoff; -#endif + if (!(mo->threshold & OV_DONT3DOFFSET)) + { + mo->sprxoff = mo->target->sprxoff; + mo->spryoff = mo->target->spryoff; + mo->sprzoff = mo->target->sprzoff; + } + + if (!(mo->threshold & OV_DONTXYSCALE)) + { + mo->spritexscale = mo->target->spritexscale; + mo->spriteyscale = mo->target->spriteyscale; + } + + if (!(mo->threshold & OV_DONTROLL)) + { + mo->rollangle = mo->target->rollangle; + mo->pitch = mo->target->pitch; + mo->roll = mo->target->roll; + } mo->hitlag = mo->target->hitlag; mo->eflags = (mo->eflags & ~MFE_DAMAGEHITLAG) | (mo->target->eflags & MFE_DAMAGEHITLAG);