diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 942963780..6d2c8661e 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -184,8 +184,10 @@ 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_SKINSPRITES, "skin_t.skinsprites"}, + {META_SKINSPRITESLIST, "skin_t.skinsprites[]"}, + {META_SKINSPRITESCOMPAT, "skin_t.sprites"}, // TODO: 2.3: Delete {META_VERTEX, "vertex_t"}, {META_LINE, "line_t"}, diff --git a/src/lua_libs.h b/src/lua_libs.h index a90d8ac7f..90c7bba7c 100644 --- a/src/lua_libs.h +++ b/src/lua_libs.h @@ -42,8 +42,9 @@ extern boolean ignoregameinputs; #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_SKINSPRITES "SKIN_T*SKINSPRITES" +#define META_SKINSPRITESLIST "SKIN_T*SKINSPRITES[]" +#define META_SKINSPRITESCOMPAT "SKIN_T*SPRITES" // TODO: 2.3: Delete #define META_VERTEX "VERTEX_T*" #define META_LINE "LINE_T*" diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c index 24d948a67..26f4011d3 100644 --- a/src/lua_skinlib.c +++ b/src/lua_skinlib.c @@ -54,7 +54,8 @@ enum skin { skin_contspeed, skin_contangle, skin_soundsid, - skin_sprites, + skin_sprites, // TODO: 2.3: Delete + skin_skinsprites, skin_supersprites, skin_natkcolor }; @@ -95,7 +96,8 @@ static const char *const skin_opt[] = { "contspeed", "contangle", "soundsid", - "sprites", + "sprites", // TODO: 2.3: Delete + "skinsprites", "supersprites", "natkcolor", NULL}; @@ -219,7 +221,10 @@ static int skin_get(lua_State *L) case skin_soundsid: LUA_PushUserdata(L, skin->soundsid, META_SOUNDSID); break; - case skin_sprites: + case skin_sprites: // TODO: 2.3: Delete + LUA_PushUserdata(L, skin->sprites_compat, META_SKINSPRITESCOMPAT); + break; + case skin_skinsprites: LUA_PushUserdata(L, skin->sprites, META_SKINSPRITES); break; case skin_supersprites: @@ -338,15 +343,7 @@ 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] +// skin.skinsprites[i] -> sprites[i] static int lib_getSkinSprite(lua_State *L) { spritedef_t *sksprites = *(spritedef_t **)luaL_checkudata(L, 1, META_SKINSPRITES); @@ -359,13 +356,43 @@ static int lib_getSkinSprite(lua_State *L) return 1; } -// #skin.sprites -> NUMPLAYERSPRITES +// #skin.skinsprites -> NUMPLAYERSPRITES static int lib_numSkinsSprites(lua_State *L) { lua_pushinteger(L, NUMPLAYERSPRITES); return 1; } +// TODO: 2.3: Delete +// skin.sprites[i] -> sprites[i] +static int lib_getSkinSpriteCompat(lua_State *L) +{ + spritedef_t *sksprites = *(spritedef_t **)luaL_checkudata(L, 1, META_SKINSPRITESCOMPAT); + 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_PushUserdata(L, &sksprites[i], META_SKINSPRITESLIST); + return 1; +} + +// TODO: 2.3: Delete +// #skin.sprites -> NUMPLAYERSPRITES*2 +static int lib_numSkinsSpritesCompat(lua_State *L) +{ + lua_pushinteger(L, NUMPLAYERSPRITES*2); + return 1; +} + +enum spritesopt { + numframes = 0 +}; + +static const char *const sprites_opt[] = { + "numframes", + NULL}; + static int sprite_get(lua_State *L) { spritedef_t *sprite = *(spritedef_t **)luaL_checkudata(L, 1, META_SKINSPRITESLIST); @@ -387,6 +414,7 @@ int LUA_SkinLib(lua_State *L) LUA_RegisterUserdataMetatable(L, META_SOUNDSID, soundsid_get, NULL, soundsid_num); LUA_RegisterUserdataMetatable(L, META_SKINSPRITES, lib_getSkinSprite, NULL, lib_numSkinsSprites); LUA_RegisterUserdataMetatable(L, META_SKINSPRITESLIST, sprite_get, NULL, NULL); + LUA_RegisterUserdataMetatable(L, META_SKINSPRITESCOMPAT, lib_getSkinSpriteCompat, NULL, lib_numSkinsSpritesCompat); // TODO: 2.3: Delete skin_fields_ref = Lua_CreateFieldTable(L, skin_opt); diff --git a/src/r_skins.c b/src/r_skins.c index cd7d60b53..a341ee80f 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -636,6 +636,14 @@ static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, ski if (skin->sprites[0].numframes == 0) CONS_Alert(CONS_ERROR, M_GetText("No frames found for sprite SPR2_%s\n"), spr2names[0]); + + // TODO: 2.3: Delete + memcpy(&skin->sprites_compat[start_spr2], + &skin->sprites[start_spr2], + sizeof(spritedef_t) * (free_spr2 - start_spr2)); + memcpy(&skin->sprites_compat[start_spr2 + NUMPLAYERSPRITES], + &skin->super.sprites[start_spr2], + sizeof(spritedef_t) * (free_spr2 - start_spr2)); } // returns whether found appropriate property diff --git a/src/r_skins.h b/src/r_skins.h index 1f2c57472..5122b53a6 100644 --- a/src/r_skins.h +++ b/src/r_skins.h @@ -88,6 +88,9 @@ typedef struct spritedef_t sprites[NUMPLAYERSPRITES]; spriteinfo_t sprinfo[NUMPLAYERSPRITES]; } super; + + // TODO: 2.3: Delete + spritedef_t sprites_compat[NUMPLAYERSPRITES * 2]; } skin_t; /// Externs