Add mobj_t.gravity

https://codeberg.org/srb2classic/srb2classic/pulls/39
This commit is contained in:
NepDisk 2025-08-01 16:45:51 -04:00
parent c1b6cdb624
commit 32313adde6
4 changed files with 27 additions and 2 deletions

View file

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

View file

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

View file

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

View file

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