From 1320f10839cb28d3fe5363a4feeee1cdd6fbb149 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Sat, 7 Nov 2020 23:53:46 -0500 Subject: [PATCH 1/4] Allow access to skin.sprites[] Only numframes so far though, as there's already a function for what spriteframe provides. --- src/lua_baselib.c | 2 ++ src/lua_libs.h | 2 ++ src/lua_skinlib.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 132ebc1a8..ab074c8ad 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -162,6 +162,8 @@ static const struct { {META_SKIN, "skin_t"}, {META_POWERS, "player_t.powers"}, {META_SOUNDSID, "skin_t.soundsid"}, + {META_SKINSPRITES, "skin_t.sprites"}, + {META_SKINSPRITESLIST, "skin_t.sprites[]"}, {META_VERTEX, "vertex_t"}, {META_LINE, "line_t"}, diff --git a/src/lua_libs.h b/src/lua_libs.h index 03bd99cd2..82fdccf10 100644 --- a/src/lua_libs.h +++ b/src/lua_libs.h @@ -34,6 +34,8 @@ extern lua_State *gL; #define META_SKIN "SKIN_T*" #define META_POWERS "PLAYER_T*POWERS" #define META_SOUNDSID "SKIN_T*SOUNDSID" +#define META_SKINSPRITES "SKIN_T*SPRITES" +#define META_SKINSPRITESLIST "SKIN_T*SPRITES[]" #define META_VERTEX "VERTEX_T*" #define META_LINE "LINE_T*" diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c index 3e4ddb9f0..1cd9df631 100644 --- a/src/lua_skinlib.c +++ b/src/lua_skinlib.c @@ -54,7 +54,8 @@ enum skin { skin_contspeed, skin_contangle, skin_soundsid, - skin_availability + skin_availability, + skin_sprites }; static const char *const skin_opt[] = { "valid", @@ -93,6 +94,7 @@ static const char *const skin_opt[] = { "contangle", "soundsid", "availability", + "sprites", NULL}; #define UNIMPLEMENTED luaL_error(L, LUA_QL("skin_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", skin_opt[field]) @@ -214,6 +216,9 @@ static int skin_get(lua_State *L) case skin_availability: lua_pushinteger(L, skin->availability); break; + case skin_sprites: + LUA_PushUserdata(L, skin->sprites, META_SKINSPRITES); + break; } return 1; } @@ -324,6 +329,49 @@ static int soundsid_num(lua_State *L) return 1; } +enum spritesopt { + numframes = 0 +}; + +static const char *const sprites_opt[] = { + "numframes", + NULL}; + +// skin.sprites[i] -> sprites[i] +static int lib_getSkinSprite(lua_State *L) +{ + spritedef_t *sprites = *((spritedef_t **)luaL_checkudata(L, 1, META_SKINSPRITES)); + playersprite_t i = luaL_checkinteger(L, 2); + + if (i < 0 || i >= NUMPLAYERSPRITES*2) + return luaL_error(L, "skin.sprites[] index %d out of range (0 - %d)", i, (NUMPLAYERSPRITES*2)-1); + + LUA_PushLightUserdata(L, &sprites[i], META_SKINSPRITESLIST); + return 1; +} + +// #skin.sprites -> NUMPLAYERSPRITES*2 +static int lib_numSkinsSprites(lua_State *L) +{ + lua_pushinteger(L, NUMPLAYERSPRITES*2); + return 1; +} + +static int sprite_get(lua_State *L) +{ + spritedef_t *sprite = (spritedef_t *)luaL_checkudata(L, 1, META_SKINSPRITESLIST); + enum spritesopt field = luaL_checkoption(L, 2, NULL, sprites_opt); + + switch (field) + { + case numframes: + lua_pushinteger(L, sprite->numframes); + break; + } + return 1; +} + + int LUA_SkinLib(lua_State *L) { luaL_newmetatable(L, META_SKIN); @@ -345,6 +393,19 @@ int LUA_SkinLib(lua_State *L) lua_setfield(L, -2, "__len"); lua_pop(L,1); + luaL_newmetatable(L, META_SKINSPRITES); + lua_pushcfunction(L, lib_getSkinSprite); + lua_setfield(L, -2, "__index"); + + lua_pushcfunction(L, lib_numSkinsSprites); + lua_setfield(L, -2, "__len"); + lua_pop(L,1); + + luaL_newmetatable(L, META_SKINSPRITESLIST); + lua_pushcfunction(L, sprite_get); + lua_setfield(L, -2, "__index"); + lua_pop(L,1); + lua_newuserdata(L, 0); lua_createtable(L, 0, 2); lua_pushcfunction(L, lib_getSkin); From 83a87042f1e76c8b378b188e9389830e50de0e3d Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Sun, 8 Nov 2020 13:25:56 -0500 Subject: [PATCH 2/4] Push skin->sprites as light userdata --- src/lua_skinlib.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c index 1cd9df631..d4d7bae12 100644 --- a/src/lua_skinlib.c +++ b/src/lua_skinlib.c @@ -217,7 +217,7 @@ static int skin_get(lua_State *L) lua_pushinteger(L, skin->availability); break; case skin_sprites: - LUA_PushUserdata(L, skin->sprites, META_SKINSPRITES); + LUA_PushLightUserdata(L, skin->sprites, META_SKINSPRITES); break; } return 1; @@ -340,7 +340,7 @@ static const char *const sprites_opt[] = { // skin.sprites[i] -> sprites[i] static int lib_getSkinSprite(lua_State *L) { - spritedef_t *sprites = *((spritedef_t **)luaL_checkudata(L, 1, META_SKINSPRITES)); + spritedef_t *sprites = (spritedef_t *)luaL_checkudata(L, 1, META_SKINSPRITES); playersprite_t i = luaL_checkinteger(L, 2); if (i < 0 || i >= NUMPLAYERSPRITES*2) From d26172661d6fac5720950c93365609dcf009cc68 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Sun, 8 Nov 2020 13:31:59 -0500 Subject: [PATCH 3/4] Remove spritedef field --- src/lua_skinlib.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c index d4d7bae12..e2f16756a 100644 --- a/src/lua_skinlib.c +++ b/src/lua_skinlib.c @@ -21,7 +21,6 @@ enum skin { skin_valid = 0, skin_name, - skin_spritedef, skin_wadnum, skin_flags, skin_realname, @@ -60,7 +59,6 @@ enum skin { static const char *const skin_opt[] = { "valid", "name", - "spritedef", "wadnum", "flags", "realname", @@ -115,8 +113,6 @@ static int skin_get(lua_State *L) case skin_name: lua_pushstring(L, skin->name); break; - case skin_spritedef: - return UNIMPLEMENTED; case skin_wadnum: // !!WARNING!! May differ between clients due to music wads, therefore NOT NETWORK SAFE return UNIMPLEMENTED; From 4c53eabc59c8d2d60d90d9019cf5b1939b627647 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Thu, 3 Dec 2020 21:14:27 -0500 Subject: [PATCH 4/4] Reword the error to be more consistent with other errors --- src/lua_skinlib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c index e2f16756a..ea368a9cd 100644 --- a/src/lua_skinlib.c +++ b/src/lua_skinlib.c @@ -340,7 +340,7 @@ static int lib_getSkinSprite(lua_State *L) playersprite_t i = luaL_checkinteger(L, 2); if (i < 0 || i >= NUMPLAYERSPRITES*2) - return luaL_error(L, "skin.sprites[] index %d out of range (0 - %d)", i, (NUMPLAYERSPRITES*2)-1); + return luaL_error(L, LUA_QL("skin_t") " field 'sprites' index %d out of range (0 - %d)", i, (NUMPLAYERSPRITES*2)-1); LUA_PushLightUserdata(L, &sprites[i], META_SKINSPRITESLIST); return 1;