mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
mobj_t: add reappear and punt_ref members, add to savegame and Lua
This commit is contained in:
parent
b11f340dab
commit
a8a1c14580
4 changed files with 95 additions and 12 deletions
|
|
@ -106,7 +106,9 @@ enum mobj_e {
|
||||||
mobj_tid,
|
mobj_tid,
|
||||||
mobj_special,
|
mobj_special,
|
||||||
mobj_args,
|
mobj_args,
|
||||||
mobj_stringargs
|
mobj_stringargs,
|
||||||
|
mobj_reappear,
|
||||||
|
mobj_punt_ref,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *const mobj_opt[] = {
|
static const char *const mobj_opt[] = {
|
||||||
|
|
@ -194,6 +196,8 @@ static const char *const mobj_opt[] = {
|
||||||
"special",
|
"special",
|
||||||
"args",
|
"args",
|
||||||
"stringargs",
|
"stringargs",
|
||||||
|
"reappear",
|
||||||
|
"punt_ref",
|
||||||
NULL};
|
NULL};
|
||||||
|
|
||||||
#define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field])
|
#define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field])
|
||||||
|
|
@ -493,6 +497,17 @@ static int mobj_get(lua_State *L)
|
||||||
case mobj_stringargs:
|
case mobj_stringargs:
|
||||||
LUA_PushUserdata(L, mo->thing_stringargs, META_THINGSTRINGARGS);
|
LUA_PushUserdata(L, mo->thing_stringargs, META_THINGSTRINGARGS);
|
||||||
break;
|
break;
|
||||||
|
case mobj_reappear:
|
||||||
|
lua_pushinteger(L, mo->reappear);
|
||||||
|
break;
|
||||||
|
case mobj_punt_ref:
|
||||||
|
if (mo->punt_ref && P_MobjWasRemoved(mo->punt_ref))
|
||||||
|
{ // don't put invalid mobj back into Lua.
|
||||||
|
P_SetTarget(&mo->punt_ref, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
LUA_PushUserdata(L, mo->punt_ref, META_MOBJ);
|
||||||
|
break;
|
||||||
default: // extra custom variables in Lua memory
|
default: // extra custom variables in Lua memory
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
||||||
I_Assert(lua_istable(L, -1));
|
I_Assert(lua_istable(L, -1));
|
||||||
|
|
@ -883,6 +898,18 @@ static int mobj_set(lua_State *L)
|
||||||
return NOSET;
|
return NOSET;
|
||||||
case mobj_stringargs:
|
case mobj_stringargs:
|
||||||
return NOSET;
|
return NOSET;
|
||||||
|
case mobj_reappear:
|
||||||
|
mo->reappear = luaL_checkinteger(L, 3);
|
||||||
|
break;
|
||||||
|
case mobj_punt_ref:
|
||||||
|
if (lua_isnil(L, 3))
|
||||||
|
P_SetTarget(&mo->punt_ref, NULL);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mobj_t *punt_ref = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
|
||||||
|
P_SetTarget(&mo->punt_ref, punt_ref);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
||||||
I_Assert(lua_istable(L, -1));
|
I_Assert(lua_istable(L, -1));
|
||||||
|
|
|
||||||
|
|
@ -10250,6 +10250,8 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
P_SetTarget(&mobj->hprev, NULL);
|
P_SetTarget(&mobj->hprev, NULL);
|
||||||
if (mobj->itnext && P_MobjWasRemoved(mobj->itnext))
|
if (mobj->itnext && P_MobjWasRemoved(mobj->itnext))
|
||||||
P_SetTarget(&mobj->itnext, NULL);
|
P_SetTarget(&mobj->itnext, NULL);
|
||||||
|
if (mobj->punt_ref && P_MobjWasRemoved(mobj->punt_ref))
|
||||||
|
P_SetTarget(&mobj->punt_ref, NULL);
|
||||||
|
|
||||||
if (mobj->flags & MF_NOTHINK)
|
if (mobj->flags & MF_NOTHINK)
|
||||||
return;
|
return;
|
||||||
|
|
@ -11803,6 +11805,7 @@ void P_RemoveMobj(mobj_t *mobj)
|
||||||
}
|
}
|
||||||
|
|
||||||
P_SetTarget(&mobj->itnext, NULL);
|
P_SetTarget(&mobj->itnext, NULL);
|
||||||
|
P_SetTarget(&mobj->punt_ref, NULL);
|
||||||
|
|
||||||
P_RemoveThingTID(mobj);
|
P_RemoveThingTID(mobj);
|
||||||
P_DeleteMobjStringArgs(mobj);
|
P_DeleteMobjStringArgs(mobj);
|
||||||
|
|
|
||||||
|
|
@ -437,6 +437,9 @@ struct mobj_t
|
||||||
|
|
||||||
boolean frozen;
|
boolean frozen;
|
||||||
|
|
||||||
|
tic_t reappear;
|
||||||
|
mobj_t *punt_ref;
|
||||||
|
|
||||||
// WARNING: New fields must be added separately to savegame and Lua.
|
// WARNING: New fields must be added separately to savegame and Lua.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2668,9 +2668,16 @@ typedef enum
|
||||||
MD2_FROZEN = 1<<28,
|
MD2_FROZEN = 1<<28,
|
||||||
MD2_TERRAIN = 1<<29,
|
MD2_TERRAIN = 1<<29,
|
||||||
MD2_WATERSKIP = 1<<30,
|
MD2_WATERSKIP = 1<<30,
|
||||||
MD2_LIGHTLEVEL = (INT32)(1U<<31),
|
MD2_MORE = (INT32)(1U<<31),
|
||||||
} mobj_diff2_t;
|
} mobj_diff2_t;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MD3_LIGHTLEVEL = 1,
|
||||||
|
MD3_REAPPEAR = 1<<1,
|
||||||
|
MD3_PUNT_REF = 1<<2,
|
||||||
|
} mobj_diff3_t;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
tc_mobj,
|
tc_mobj,
|
||||||
|
|
@ -2781,12 +2788,14 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
|
||||||
const mobj_t *mobj = (const mobj_t *)th;
|
const mobj_t *mobj = (const mobj_t *)th;
|
||||||
UINT32 diff;
|
UINT32 diff;
|
||||||
UINT32 diff2;
|
UINT32 diff2;
|
||||||
|
UINT32 diff3;
|
||||||
size_t j;
|
size_t j;
|
||||||
|
|
||||||
if (TypeIsNetSynced(mobj->type) == false)
|
if (TypeIsNetSynced(mobj->type) == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
diff2 = 0;
|
diff2 = 0;
|
||||||
|
diff3 = 0;
|
||||||
|
|
||||||
if (mobj->spawnpoint)
|
if (mobj->spawnpoint)
|
||||||
{
|
{
|
||||||
|
|
@ -2968,8 +2977,6 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
|
||||||
|| (slope->normal.z != FRACUNIT))
|
|| (slope->normal.z != FRACUNIT))
|
||||||
diff2 |= MD2_FLOORSPRITESLOPE;
|
diff2 |= MD2_FLOORSPRITESLOPE;
|
||||||
}
|
}
|
||||||
if (mobj->lightlevel)
|
|
||||||
diff2 |= MD2_LIGHTLEVEL;
|
|
||||||
if (mobj->hitlag)
|
if (mobj->hitlag)
|
||||||
diff2 |= MD2_HITLAG;
|
diff2 |= MD2_HITLAG;
|
||||||
if (mobj->waterskip)
|
if (mobj->waterskip)
|
||||||
|
|
@ -2987,6 +2994,16 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
|
||||||
if (mobj->terrain != NULL || mobj->terrainOverlay != NULL)
|
if (mobj->terrain != NULL || mobj->terrainOverlay != NULL)
|
||||||
diff2 |= MD2_TERRAIN;
|
diff2 |= MD2_TERRAIN;
|
||||||
|
|
||||||
|
if (mobj->lightlevel)
|
||||||
|
diff3 |= MD3_LIGHTLEVEL;
|
||||||
|
if (mobj->reappear)
|
||||||
|
diff3 |= MD3_REAPPEAR;
|
||||||
|
if (mobj->punt_ref)
|
||||||
|
diff3 |= MD3_PUNT_REF;
|
||||||
|
|
||||||
|
if (diff3 != 0)
|
||||||
|
diff2 |= MD2_MORE;
|
||||||
|
|
||||||
if (diff2 != 0)
|
if (diff2 != 0)
|
||||||
diff |= MD_MORE;
|
diff |= MD_MORE;
|
||||||
|
|
||||||
|
|
@ -2998,6 +3015,8 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
|
||||||
WRITEUINT32(save->p, diff);
|
WRITEUINT32(save->p, diff);
|
||||||
if (diff & MD_MORE)
|
if (diff & MD_MORE)
|
||||||
WRITEUINT32(save->p, diff2);
|
WRITEUINT32(save->p, diff2);
|
||||||
|
if (diff2 & MD2_MORE)
|
||||||
|
WRITEUINT32(save->p, diff3);
|
||||||
|
|
||||||
WRITEFIXED(save->p, mobj->z); // Force this so 3dfloor problems don't arise.
|
WRITEFIXED(save->p, mobj->z); // Force this so 3dfloor problems don't arise.
|
||||||
WRITEFIXED(save->p, mobj->floorz);
|
WRITEFIXED(save->p, mobj->floorz);
|
||||||
|
|
@ -3235,10 +3254,6 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
|
||||||
WRITEFIXED(save->p, slope->normal.y);
|
WRITEFIXED(save->p, slope->normal.y);
|
||||||
WRITEFIXED(save->p, slope->normal.z);
|
WRITEFIXED(save->p, slope->normal.z);
|
||||||
}
|
}
|
||||||
if (diff2 & MD2_LIGHTLEVEL)
|
|
||||||
{
|
|
||||||
WRITEINT16(save->p, mobj->lightlevel);
|
|
||||||
}
|
|
||||||
if (diff2 & MD2_HITLAG)
|
if (diff2 & MD2_HITLAG)
|
||||||
{
|
{
|
||||||
WRITEINT32(save->p, mobj->hitlag);
|
WRITEINT32(save->p, mobj->hitlag);
|
||||||
|
|
@ -3261,6 +3276,19 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
|
||||||
WRITEUINT32(save->p, SaveMobjnum(mobj->terrainOverlay));
|
WRITEUINT32(save->p, SaveMobjnum(mobj->terrainOverlay));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (diff3 & MD3_LIGHTLEVEL)
|
||||||
|
{
|
||||||
|
WRITEINT16(save->p, mobj->lightlevel);
|
||||||
|
}
|
||||||
|
if (diff3 & MD3_REAPPEAR)
|
||||||
|
{
|
||||||
|
WRITEUINT32(save->p, mobj->reappear);
|
||||||
|
}
|
||||||
|
if (diff3 & MD3_PUNT_REF)
|
||||||
|
{
|
||||||
|
WRITEUINT32(save->p, mobj->punt_ref->mobjnum);
|
||||||
|
}
|
||||||
|
|
||||||
WRITEUINT32(save->p, mobj->mobjnum);
|
WRITEUINT32(save->p, mobj->mobjnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4134,6 +4162,7 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
||||||
mobj_t *mobj;
|
mobj_t *mobj;
|
||||||
UINT32 diff;
|
UINT32 diff;
|
||||||
UINT32 diff2;
|
UINT32 diff2;
|
||||||
|
UINT32 diff3;
|
||||||
INT32 i;
|
INT32 i;
|
||||||
fixed_t z, floorz, ceilingz;
|
fixed_t z, floorz, ceilingz;
|
||||||
ffloor_t *floorrover = NULL, *ceilingrover = NULL;
|
ffloor_t *floorrover = NULL, *ceilingrover = NULL;
|
||||||
|
|
@ -4145,6 +4174,11 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
||||||
else
|
else
|
||||||
diff2 = 0;
|
diff2 = 0;
|
||||||
|
|
||||||
|
if (diff2 & MD2_MORE)
|
||||||
|
diff3 = READUINT32(save->p);
|
||||||
|
else
|
||||||
|
diff3 = 0;
|
||||||
|
|
||||||
z = READFIXED(save->p); // Force this so 3dfloor problems don't arise.
|
z = READFIXED(save->p); // Force this so 3dfloor problems don't arise.
|
||||||
floorz = READFIXED(save->p);
|
floorz = READFIXED(save->p);
|
||||||
ceilingz = READFIXED(save->p);
|
ceilingz = READFIXED(save->p);
|
||||||
|
|
@ -4470,10 +4504,6 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
||||||
|
|
||||||
P_UpdateSlopeLightOffset(slope);
|
P_UpdateSlopeLightOffset(slope);
|
||||||
}
|
}
|
||||||
if (diff2 & MD2_LIGHTLEVEL)
|
|
||||||
{
|
|
||||||
mobj->lightlevel = READINT16(save->p);
|
|
||||||
}
|
|
||||||
if (diff2 & MD2_HITLAG)
|
if (diff2 & MD2_HITLAG)
|
||||||
{
|
{
|
||||||
mobj->hitlag = READINT32(save->p);
|
mobj->hitlag = READINT32(save->p);
|
||||||
|
|
@ -4500,6 +4530,19 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
||||||
mobj->terrain = NULL;
|
mobj->terrain = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (diff3 & MD3_LIGHTLEVEL)
|
||||||
|
{
|
||||||
|
mobj->lightlevel = READINT16(save->p);
|
||||||
|
}
|
||||||
|
if (diff3 & MD3_REAPPEAR)
|
||||||
|
{
|
||||||
|
mobj->reappear = READUINT32(save->p);
|
||||||
|
}
|
||||||
|
if (diff3 & MD3_PUNT_REF)
|
||||||
|
{
|
||||||
|
mobj->punt_ref = (mobj_t *)(size_t)READUINT32(save->p);
|
||||||
|
}
|
||||||
|
|
||||||
// set sprev, snext, bprev, bnext, subsector
|
// set sprev, snext, bprev, bnext, subsector
|
||||||
P_SetThingPosition(mobj);
|
P_SetThingPosition(mobj);
|
||||||
|
|
||||||
|
|
@ -5539,6 +5582,13 @@ static void P_RelinkPointers(void)
|
||||||
if (!P_SetTarget(&mobj->terrainOverlay, P_FindNewPosition(temp)))
|
if (!P_SetTarget(&mobj->terrainOverlay, P_FindNewPosition(temp)))
|
||||||
CONS_Debug(DBG_GAMELOGIC, "terrainOverlay not found on %d\n", mobj->type);
|
CONS_Debug(DBG_GAMELOGIC, "terrainOverlay not found on %d\n", mobj->type);
|
||||||
}
|
}
|
||||||
|
if (mobj->punt_ref)
|
||||||
|
{
|
||||||
|
temp = (UINT32)(size_t)mobj->punt_ref;
|
||||||
|
mobj->punt_ref = NULL;
|
||||||
|
if (!P_SetTarget(&mobj->punt_ref, P_FindNewPosition(temp)))
|
||||||
|
CONS_Debug(DBG_GAMELOGIC, "punt_ref not found on %d\n", mobj->type);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue