From 324bd3b117ca1e402b071a5390f2074dd608751d Mon Sep 17 00:00:00 2001 From: Anonimus Date: Thu, 9 Oct 2025 16:48:18 -0400 Subject: [PATCH 1/3] Back-compat: Even more visibility eflags fixes --- src/lua_mobjlib.c | 30 +++++++++++++++++++++++++++++- src/r_defs.h | 11 ++++++----- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index a58b2c581..6b08d1cdd 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -615,6 +615,23 @@ static int mobj_get(lua_State *L) return 1; } +static inline UINT32 eflags_vischeck(UINT32 eflags) +{ + UINT8 playerhide; + + playerhide = 0; + if (eflags & RF_DONTDRAW) + { + // Visibility checks are necessary + playerhide = (UINT8)((eflags & RF_DONTDRAW) >> RF_HIDESHIFT); + + // Hiding is the opposite of visibility. + playerhide = (~playerhide) & 0x0F; + } + + return ((UINT32)(playerhide) << RF_HIDESHIFT); +} + #define NOSET luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " should not be set directly.", mobj_opt[field]) #define NOSETPOS luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " should not be set directly. Use " LUA_QL("P_Move") ", " LUA_QL("P_TryMove") ", or " LUA_QL("P_SetOrigin") ", or " LUA_QL("P_MoveOrigin") " instead.", mobj_opt[field]) static int mobj_set(lua_State *L) @@ -838,8 +855,19 @@ static int mobj_set(lua_State *L) case mobj_eflags: { UINT32 eflags = luaL_checkinteger(L, 3); + UINT32 visflags = 0; if (lua_compatmode) - mo->renderflags = (mo->renderflags & ~RF_DONTDRAW) | (~eflags & RF_DONTDRAW); // eeeyup. + { + // eeeyup. + // Mhm. Yeah. + visflags = eflags_vischeck(eflags); + + if (visflags) + { + mo->renderflags &= ~RF_DONTDRAW; + mo->renderflags |= visflags; + } + } mo->eflags = (UINT16)eflags; break; } diff --git a/src/r_defs.h b/src/r_defs.h index 0d70653e9..f0720b491 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -1021,11 +1021,12 @@ typedef enum RF_ABSOLUTELIGHTLEVEL = 0x00010000, // mobj_t.lightlevel is absolute instead of relative RF_HIDEINSKYBOX = 0x00020000, // do not render in skybox - RF_DONTDRAW = 0x00F00000, // --Don't generate a vissprite - RF_DONTDRAWP1 = 0x00100000, // No P1 - RF_DONTDRAWP2 = 0x00200000, // No P2 - RF_DONTDRAWP3 = 0x00400000, // No P3 - RF_DONTDRAWP4 = 0x00800000, // No P4 + RF_HIDESHIFT = (20), + RF_DONTDRAW = 0x0F << RF_HIDESHIFT, // --Don't generate a vissprite + RF_DONTDRAWP1 = 0x01 << RF_HIDESHIFT, // No P1 + RF_DONTDRAWP2 = 0x02 << RF_HIDESHIFT, // No P2 + RF_DONTDRAWP3 = 0x04 << RF_HIDESHIFT, // No P3 + RF_DONTDRAWP4 = 0x08 << RF_HIDESHIFT, // No P4 RF_BLENDMASK = 0x07000000, // --Blending override - see patchalphastyle_t RF_BLENDSHIFT = (6*4), From dc9ee0bc95d24670db079986b588b594000049b4 Mon Sep 17 00:00:00 2001 From: Anonimus Date: Thu, 9 Oct 2025 18:15:17 -0400 Subject: [PATCH 2/3] Legacy mode for ghost objects --- src/lua_baselib.c | 2 +- src/p_local.h | 3 ++- src/p_mobj.c | 2 +- src/p_user.c | 12 +++++++++--- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 78a6ef8a3..d98522171 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1372,7 +1372,7 @@ static int lib_pSpawnGhostMobj(lua_State *L) INLEVEL if (!mobj) return LUA_ErrInvalid(L, "mobj_t"); - LUA_PushUserdata(L, P_SpawnGhostMobj(mobj), META_MOBJ); + LUA_PushUserdata(L, P_SpawnGhostMobjEX(mobj, lua_compatmode), META_MOBJ); return 1; } diff --git a/src/p_local.h b/src/p_local.h index 885b66ea5..54be8014e 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -200,7 +200,8 @@ boolean P_PlayerHitFloor(player_t *player, boolean fromAir); void P_SetObjectMomZ(mobj_t *mo, fixed_t value, boolean relative); void P_RestoreMusic(player_t *player); boolean P_EndingMusic(player_t *player); -mobj_t *P_SpawnGhostMobj(mobj_t *mobj); +mobj_t *P_SpawnGhostMobjEX(mobj_t *mobj, boolean legacy); +#define P_SpawnGhostMobj(mobj) P_SpawnGhostMobjEX(mobj, false) INT32 P_GivePlayerRings(player_t *player, INT32 num_rings); void P_GivePlayerLives(player_t *player, INT32 numlives); UINT8 P_GetNextEmerald(void); diff --git a/src/p_mobj.c b/src/p_mobj.c index 73467b127..bf82db164 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10557,7 +10557,7 @@ void P_MobjThinker(mobj_t *mobj) } } } - else + else if (mobj->extravalue3 <= 0) // Legacy mode bypasses this visibility system. { UINT32 dur = (mobj->flags2 & MF2_BOSSNOTRAP) ? (2*mobj->fuse)/3 diff --git a/src/p_user.c b/src/p_user.c index e977f9ba4..dbc18e1fa 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1182,11 +1182,11 @@ boolean P_IsDisplayPlayer(player_t *player) } // -// P_SpawnGhostMobj +// P_SpawnGhostMobjEX // -// Spawns a ghost object on the player +// Spawns a ghost object on the player. Has an option for "legacy mode". // -mobj_t *P_SpawnGhostMobj(mobj_t *mobj) +mobj_t *P_SpawnGhostMobjEX(mobj_t *mobj, boolean legacy) { mobj_t *ghost = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_GHOST); @@ -1264,6 +1264,12 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) ghost->old_spritexoffset = mobj->old_spritexoffset2; ghost->old_spriteyoffset = mobj->old_spriteyoffset2; + // Legacy mode + if (legacy) + { + ghost->extravalue3 = 1; + } + return ghost; } From b67e9d07bbba1a3d20324ad7f39ef9cb5bfb3fae Mon Sep 17 00:00:00 2001 From: Anonimus Date: Fri, 10 Oct 2025 15:50:23 -0400 Subject: [PATCH 3/3] Prevent RF_DONTDRAW (and MF2_DONTDRAW) overrides due to eflags --- src/lua_mobjlib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 6b08d1cdd..c1ad48ab2 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -862,7 +862,7 @@ static int mobj_set(lua_State *L) // Mhm. Yeah. visflags = eflags_vischeck(eflags); - if (visflags) + if ((visflags) && ((mo->renderflags & RF_DONTDRAW) != RF_DONTDRAW)) { mo->renderflags &= ~RF_DONTDRAW; mo->renderflags |= visflags;