Implement linedef args (unused and untested so far)

This commit is contained in:
MascaraSnake 2020-01-02 12:23:14 +01:00
parent 5ba179ad7c
commit 68da1856da
6 changed files with 75 additions and 2 deletions

View File

@ -175,6 +175,7 @@ static const struct {
{META_SECTORLINES, "sector_t.lines"}, {META_SECTORLINES, "sector_t.lines"},
{META_SIDENUM, "line_t.sidenum"}, {META_SIDENUM, "line_t.sidenum"},
{META_LINEARGS, "line_t.args"},
#ifdef HAVE_LUA_SEGS #ifdef HAVE_LUA_SEGS
{META_NODEBBOX, "node_t.bbox"}, {META_NODEBBOX, "node_t.bbox"},
{META_NODECHILDREN, "node_t.children"}, {META_NODECHILDREN, "node_t.children"},

View File

@ -56,6 +56,7 @@ extern lua_State *gL;
#define META_SECTORLINES "SECTOR_T*LINES" #define META_SECTORLINES "SECTOR_T*LINES"
#define META_SIDENUM "LINE_T*SIDENUM" #define META_SIDENUM "LINE_T*SIDENUM"
#define META_LINEARGS "LINE_T*ARGS"
#ifdef HAVE_LUA_SEGS #ifdef HAVE_LUA_SEGS
#define META_NODEBBOX "NODE_T*BBOX" #define META_NODEBBOX "NODE_T*BBOX"
#define META_NODECHILDREN "NODE_T*CHILDREN" #define META_NODECHILDREN "NODE_T*CHILDREN"

View File

@ -94,6 +94,7 @@ enum line_e {
line_flags, line_flags,
line_special, line_special,
line_tag, line_tag,
line_args,
line_sidenum, line_sidenum,
line_frontside, line_frontside,
line_backside, line_backside,
@ -115,6 +116,7 @@ static const char *const line_opt[] = {
"flags", "flags",
"special", "special",
"tag", "tag",
"args",
"sidenum", "sidenum",
"frontside", "frontside",
"backside", "backside",
@ -703,6 +705,24 @@ static int subsector_num(lua_State *L)
// line_t // // line_t //
//////////// ////////////
// args, i -> args[i]
static int lineargs_get(lua_State *L)
{
INT32 *args = *((INT32**)luaL_checkudata(L, 1, META_LINEARGS));
int i = luaL_checkinteger(L, 2);
if (i < 0 || i >= NUMLINEARGS)
return luaL_error(L, LUA_QL("line_t.args") " index cannot be %d", i);
lua_pushinteger(L, args[i]);
return 1;
}
// #args -> NUMLINEARGS
static int lineargs_len(lua_State* L)
{
lua_pushinteger(L, NUMLINEARGS);
return 1;
}
static int line_get(lua_State *L) static int line_get(lua_State *L)
{ {
line_t *line = *((line_t **)luaL_checkudata(L, 1, META_LINE)); line_t *line = *((line_t **)luaL_checkudata(L, 1, META_LINE));
@ -743,6 +763,9 @@ static int line_get(lua_State *L)
case line_tag: case line_tag:
lua_pushinteger(L, line->tag); lua_pushinteger(L, line->tag);
return 1; return 1;
case line_args:
LUA_PushUserdata(L, line->args, META_LINEARGS);
return 1;
case line_sidenum: case line_sidenum:
LUA_PushUserdata(L, line->sidenum, META_SIDENUM); LUA_PushUserdata(L, line->sidenum, META_SIDENUM);
return 1; return 1;
@ -2142,6 +2165,14 @@ int LUA_MapLib(lua_State *L)
lua_setfield(L, -2, "__len"); lua_setfield(L, -2, "__len");
lua_pop(L, 1); lua_pop(L, 1);
luaL_newmetatable(L, META_LINEARGS);
lua_pushcfunction(L, lineargs_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lineargs_len);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_SIDENUM); luaL_newmetatable(L, META_SIDENUM);
lua_pushcfunction(L, sidenum_get); lua_pushcfunction(L, sidenum_get);
lua_setfield(L, -2, "__index"); lua_setfield(L, -2, "__index");

View File

@ -768,6 +768,17 @@ static void P_NetUnArchiveColormaps(void)
#define LD_S2TOPTEX 0x02 #define LD_S2TOPTEX 0x02
#define LD_S2BOTTEX 0x04 #define LD_S2BOTTEX 0x04
#define LD_S2MIDTEX 0x08 #define LD_S2MIDTEX 0x08
#define LD_ARGS 0x10
static boolean P_AreArgsEqual(const INT32 args[NUMLINEARGS], const INT32 spawnargs[NUMLINEARGS])
{
UINT8 i;
for (i = 0; i < NUMLINEARGS; i++)
if (args[i] != spawnargs[i])
return false;
return true;
}
// //
// P_NetArchiveWorld // P_NetArchiveWorld
@ -944,6 +955,9 @@ static void P_NetArchiveWorld(void)
if (spawnli->special == 321 || spawnli->special == 322) // only reason li->callcount would be non-zero is if either of these are involved if (spawnli->special == 321 || spawnli->special == 322) // only reason li->callcount would be non-zero is if either of these are involved
diff |= LD_CLLCOUNT; diff |= LD_CLLCOUNT;
if (!P_AreArgsEqual(li->args, spawnli->args))
diff2 |= LD_ARGS;
if (li->sidenum[0] != 0xffff) if (li->sidenum[0] != 0xffff)
{ {
si = &sides[li->sidenum[0]]; si = &sides[li->sidenum[0]];
@ -970,10 +984,11 @@ static void P_NetArchiveWorld(void)
diff2 |= LD_S2BOTTEX; diff2 |= LD_S2BOTTEX;
if (si->midtexture != spawnsi->midtexture) if (si->midtexture != spawnsi->midtexture)
diff2 |= LD_S2MIDTEX; diff2 |= LD_S2MIDTEX;
if (diff2)
diff |= LD_DIFF2;
} }
if (diff2)
diff |= LD_DIFF2;
if (diff) if (diff)
{ {
statline++; statline++;
@ -1007,6 +1022,12 @@ static void P_NetArchiveWorld(void)
WRITEINT32(put, si->bottomtexture); WRITEINT32(put, si->bottomtexture);
if (diff2 & LD_S2MIDTEX) if (diff2 & LD_S2MIDTEX)
WRITEINT32(put, si->midtexture); WRITEINT32(put, si->midtexture);
if (diff2 & LD_ARGS)
{
UINT8 j;
for (j = 0; j < NUMLINEARGS; j++)
WRITEINT32(put, li->args[j]);
}
} }
} }
WRITEUINT16(put, 0xffff); WRITEUINT16(put, 0xffff);
@ -1190,6 +1211,13 @@ static void P_NetUnArchiveWorld(void)
si->bottomtexture = READINT32(get); si->bottomtexture = READINT32(get);
if (diff2 & LD_S2MIDTEX) if (diff2 & LD_S2MIDTEX)
si->midtexture = READINT32(get); si->midtexture = READINT32(get);
if (diff2 & LD_ARGS)
{
UINT8 j;
for (j = 0; j < NUMLINEARGS; j++)
li->args[j] = READINT32(get);
}
} }
save_p = get; save_p = get;

View File

@ -1053,6 +1053,7 @@ static void P_LoadLinedefs(UINT8 *data)
ld->flags = SHORT(mld->flags); ld->flags = SHORT(mld->flags);
ld->special = SHORT(mld->special); ld->special = SHORT(mld->special);
ld->tag = SHORT(mld->tag); ld->tag = SHORT(mld->tag);
memset(ld->args, 0, NUMLINEARGS*sizeof(*ld->args));
P_SetLinedefV1(i, SHORT(mld->v1)); P_SetLinedefV1(i, SHORT(mld->v1));
P_SetLinedefV2(i, SHORT(mld->v2)); P_SetLinedefV2(i, SHORT(mld->v2));
@ -1428,6 +1429,13 @@ static void ParseTextmapLinedefParameter(UINT32 i, char *param, char *val)
P_SetLinedefV1(i, atol(val)); P_SetLinedefV1(i, atol(val));
else if (fastcmp(param, "v2")) else if (fastcmp(param, "v2"))
P_SetLinedefV2(i, atol(val)); P_SetLinedefV2(i, atol(val));
else if (fastncmp(param, "arg", 3) && strlen(param) > 3)
{
size_t argnum = atol(param + 3);
if (argnum >= NUMLINEARGS)
return;
lines[i].args[argnum] = atol(val);
}
else if (fastcmp(param, "sidefront")) else if (fastcmp(param, "sidefront"))
lines[i].sidenum[0] = atol(val); lines[i].sidenum[0] = atol(val);
else if (fastcmp(param, "sideback")) else if (fastcmp(param, "sideback"))
@ -1616,6 +1624,7 @@ static void P_LoadTextmap(void)
ld->flags = 0; ld->flags = 0;
ld->special = 0; ld->special = 0;
ld->tag = 0; ld->tag = 0;
memset(ld->args, 0, NUMLINEARGS*sizeof(*ld->args));
ld->sidenum[0] = 0xffff; ld->sidenum[0] = 0xffff;
ld->sidenum[1] = 0xffff; ld->sidenum[1] = 0xffff;

View File

@ -401,6 +401,8 @@ typedef enum
#define HORIZONSPECIAL 41 #define HORIZONSPECIAL 41
#define NUMLINEARGS 6
typedef struct line_s typedef struct line_s
{ {
// Vertices, from v1 to v2. // Vertices, from v1 to v2.
@ -413,6 +415,7 @@ typedef struct line_s
INT16 flags; INT16 flags;
INT16 special; INT16 special;
INT16 tag; INT16 tag;
INT32 args[NUMLINEARGS];
// Visual appearance: sidedefs. // Visual appearance: sidedefs.
UINT16 sidenum[2]; // sidenum[1] will be 0xffff if one-sided UINT16 sidenum[2]; // sidenum[1] will be 0xffff if one-sided