Allow $$$.sav to archive and read ffloor_t userdata Lua extvars

Oh, and P_GetFFloorByID is now a thing, to assist with the above. Also added a suitable description for P_GetFFloorBySec
This commit is contained in:
Monster Iestyn 2016-07-10 17:58:54 +01:00
parent c8a2eaf8a6
commit 3fba690d0a
3 changed files with 68 additions and 0 deletions

View File

@ -474,6 +474,7 @@ enum
ARCH_SECTOR,
ARCH_SEG,
ARCH_NODE,
ARCH_FFLOOR,
ARCH_MAPHEADER,
ARCH_TEND=0xFF,
@ -495,6 +496,7 @@ static const struct {
{META_SECTOR, ARCH_SECTOR},
{META_SEG, ARCH_SEG},
{META_NODE, ARCH_NODE},
{META_FFLOOR, ARCH_FFLOOR},
{META_MAPHEADER, ARCH_MAPHEADER},
{NULL, ARCH_NULL}
};
@ -707,6 +709,32 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex)
}
break;
}
case ARCH_FFLOOR:
{
ffloor_t *rover = *((ffloor_t **)lua_touserdata(gL, myindex));
if (!rover)
WRITEUINT8(save_p, ARCH_NULL);
else {
ffloor_t *r2 = NULL;
UINT16 i = 0;
// search for id
for (r2 = rover->target->ffloors; r2; r2 = r2->next);
{
if (r2 == rover)
break;
i++;
}
if (!r2)
WRITEUINT8(save_p, ARCH_NULL);
else
{
WRITEUINT8(save_p, ARCH_FFLOOR);
WRITEUINT16(save_p, rover->target - sectors);
WRITEUINT16(save_p, i);
}
}
break;
}
case ARCH_MAPHEADER:
{
mapheader_t *header = *((mapheader_t **)lua_touserdata(gL, myindex));
@ -891,6 +919,15 @@ static UINT8 UnArchiveValue(int TABLESINDEX)
case ARCH_NODE:
LUA_PushUserdata(gL, &nodes[READUINT16(save_p)], META_NODE);
break;
case ARCH_FFLOOR:
{
sector_t *sector = &sectors[READUINT16(save_p)];
UINT16 id = READUINT16(save_p);
ffloor_t *rover = P_GetFFloorByID(sector, id);
if (rover)
LUA_PushUserdata(gL, rover, META_FFLOOR);
break;
}
case ARCH_MAPHEADER:
LUA_PushUserdata(gL, &sectors[READUINT16(save_p)], META_MAPHEADER);
break;

View File

@ -4708,6 +4708,13 @@ void P_UpdateSpecials(void)
}
}
/** Gets a 3Dfloor by control sector.
*
* \param sec Target sector.
* \param sec2 Control sector.
* \return Pointer to found 3Dfloor, or NULL.
* \sa P_GetFFloorByID
*/
static inline ffloor_t *P_GetFFloorBySec(sector_t *sec, sector_t *sec2)
{
ffloor_t *rover;
@ -4720,6 +4727,28 @@ static inline ffloor_t *P_GetFFloorBySec(sector_t *sec, sector_t *sec2)
return NULL;
}
/** Gets a 3Dfloor by ID number.
*
* \param sec Target sector.
* \param id ID of 3Dfloor in target sector. Can be a number from 0 to sec->numattached-1.
* \return Pointer to found 3Dfloor, or NULL.
* \sa P_GetFFloorBySec
*/
ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id)
{
ffloor_t *rover;
UINT16 i = 0;
if (!sec->ffloors)
return NULL;
if (id >= sec->numattached)
return NULL; // ID out of range
for (rover = sec->ffloors; rover; rover = rover->next)
if (i++ == id)
return rover;
return NULL;
}
/** Adds a newly formed 3Dfloor structure to a sector's ffloors list.
*
* \param sec Target sector.

View File

@ -64,6 +64,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller);
void P_ChangeSectorTag(UINT32 sector, INT16 newtag);
ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id);
//
// P_LIGHTS
//