From 32313adde6237d53c7a94963af071bced7c74151 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Fri, 1 Aug 2025 16:45:51 -0400 Subject: [PATCH] Add mobj_t.gravity https://codeberg.org/srb2classic/srb2classic/pulls/39 --- src/lua_mobjlib.c | 8 ++++++++ src/p_mobj.c | 3 ++- src/p_mobj.h | 1 + src/p_saveg.c | 17 ++++++++++++++++- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 2c1412683..fa83ec123 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -83,6 +83,7 @@ enum mobj_e { mobj_tracer, mobj_friction, mobj_movefactor, + mobj_gravity, mobj_fuse, mobj_watertop, mobj_waterbottom, @@ -171,6 +172,7 @@ static const char *const mobj_opt[] = { "tracer", "friction", "movefactor", + "gravity", "fuse", "watertop", "waterbottom", @@ -479,6 +481,9 @@ static int mobj_get(lua_State *L) case mobj_movefactor: lua_pushfixed(L, mo->movefactor); break; + case mobj_gravity: + lua_pushfixed(L, mo->gravity); + break; case mobj_fuse: lua_pushinteger(L, mo->fuse); break; @@ -955,6 +960,9 @@ static int mobj_set(lua_State *L) case mobj_movefactor: mo->movefactor = luaL_checkfixed(L, 3); break; + case mobj_gravity: + mo->gravity = luaL_checkfixed(L, 3); + break; case mobj_fuse: mo->fuse = luaL_checkinteger(L, 3); break; diff --git a/src/p_mobj.c b/src/p_mobj.c index afd1dc364..abe8fee73 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1143,7 +1143,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) if (!gravsector) // If there is no 3D floor gravity, check sector's gravity gravsector = mo->subsector->sector; - gravityadd = -FixedMul(gravity, P_GetSectorGravityFactor(gravsector)); + gravityadd = -FixedMul(FixedMul(gravity, mo->gravity), P_GetSectorGravityFactor(gravsector)); if ((gravsector->flags & MSF_GRAVITYFLIP) && gravityadd > 0) { @@ -10909,6 +10909,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->friction = ORIG_FRICTION; mobj->movefactor = FRACUNIT; + mobj->gravity = FRACUNIT; // All mobjs are created at 100% scale. mobj->scale = FRACUNIT; diff --git a/src/p_mobj.h b/src/p_mobj.h index 11df861ed..1e3346681 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -386,6 +386,7 @@ struct mobj_t fixed_t friction; fixed_t movefactor; + fixed_t gravity; fixed_t lastmomz; INT32 fuse; // Does something in P_MobjThinker on reaching 0. diff --git a/src/p_saveg.c b/src/p_saveg.c index c9c2aac7b..7887a7a67 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2069,7 +2069,8 @@ typedef enum MD2_ITNEXT = 1<<27, MD2_LASTMOMZ = 1<<28, MD2_TERRAIN = 1<<29, - MD2_LIGHTLEVEL = (INT32)(1U<<30), + MD2_LIGHTLEVEL = 1<<30, + MD2_GRAVITY = (INT32)(1U<<31) } mobj_diff2_t; typedef enum @@ -2375,6 +2376,8 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 diff2 |= MD2_LASTMOMZ; if (mobj->terrain != NULL || mobj->terrainOverlay != NULL) diff2 |= MD2_TERRAIN; + if (mobj->gravity != FRACUNIT) + diff2 |= MD2_GRAVITY; if (diff2 != 0) diff |= MD_MORE; @@ -2641,6 +2644,10 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 WRITEUINT32(save->p, K_GetTerrainHeapIndex(mobj->terrain)); WRITEUINT32(save->p, SaveMobjnum(mobj->terrainOverlay)); } + if (diff2 & MD2_GRAVITY) + { + WRITEFIXED(save->p, mobj->gravity); + } WRITEUINT32(save->p, mobj->mobjnum); } @@ -3882,6 +3889,14 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) { mobj->terrain = NULL; } + if (diff2 & MD2_GRAVITY) + { + mobj->gravity = READFIXED(save->p); + } + else + { + mobj->gravity = FRACUNIT; + } // Reset some non-synch values mobj->sloperoll = 0;