diff --git a/region_api.hpp b/region_api.hpp index 7e16202..43f3a5e 100644 --- a/region_api.hpp +++ b/region_api.hpp @@ -23,5 +23,5 @@ #include "lua.hpp" -#define TORTUGA_REGION_API "region" +#define TURTLEMAP_REGION_API "region" LUAMOD_API int openRegionAPI(lua_State* L); diff --git a/region_pager_api.cpp b/region_pager_api.cpp index 1500577..84ab33c 100644 --- a/region_pager_api.cpp +++ b/region_pager_api.cpp @@ -28,76 +28,121 @@ //NOTE: zero indexing is used here, but not in the region API static int setTile(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); - int ret = pager->SetTile(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //set tile + int ret = pager->SetTile(lua_tointeger(L, 1), lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4)); lua_pushinteger(L, ret); return 1; } static int getTile(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); - int ret = pager->GetTile(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //get tile + int ret = pager->GetTile(lua_tointeger(L, 1), lua_tointeger(L, 2), lua_tointeger(L, 3)); lua_pushinteger(L, ret); return 1; } static int setSolid(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); - bool ret = pager->SetSolid(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_toboolean(L, 4)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //set solid + bool ret = pager->SetSolid(lua_tointeger(L, 1), lua_tointeger(L, 2), lua_toboolean(L, 3)); lua_pushboolean(L, ret); return 1; } static int getSolid(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); - bool ret = pager->GetSolid(lua_tointeger(L, 2), lua_tointeger(L, 3)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //get solid + bool ret = pager->GetSolid(lua_tointeger(L, 1), lua_tointeger(L, 2)); lua_pushboolean(L, ret); return 1; } static int getRegion(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); - Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //get region + Region* region = pager->GetRegion(lua_tointeger(L, 1), lua_tointeger(L, 2)); lua_pushlightuserdata(L, region); return 1; } static int loadRegion(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); - Region* region = pager->LoadRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //load region + Region* region = pager->LoadRegion(lua_tointeger(L, 1), lua_tointeger(L, 2)); lua_pushlightuserdata(L, region); return 1; } static int saveRegion(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); - Region* region = pager->SaveRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //save region + Region* region = pager->SaveRegion(lua_tointeger(L, 1), lua_tointeger(L, 2)); lua_pushlightuserdata(L, region); return 1; } static int createRegion(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); - Region* region = pager->CreateRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //create region + Region* region = pager->CreateRegion(lua_tointeger(L, 1), lua_tointeger(L, 2)); lua_pushlightuserdata(L, region); return 1; } static int unloadRegion(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); //two argument types: coords & the region itself - switch(lua_type(L, 2)) { + switch(lua_type(L, 1)) { case LUA_TNUMBER: + //unload using coords pager->UnloadIf([&](Region const& region) -> bool { - int x = lua_tointeger(L, 2); - int y = lua_tointeger(L, 3); + int x = lua_tointeger(L, 1); + int y = lua_tointeger(L, 2); return region.GetX() == x && region.GetY() == y; }); break; case LUA_TLIGHTUSERDATA: + //unloading using reference pager->UnloadIf([&](Region const& region) -> bool { - return (®ion) == lua_touserdata(L, 2); + return (®ion) == lua_touserdata(L, 1); }); break; } @@ -105,28 +150,48 @@ static int unloadRegion(lua_State* L) { } static int setOnLoad(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //set on load luaL_unref(L, LUA_REGISTRYINDEX, pager->GetLoadReference()); pager->SetLoadReference(luaL_ref(L, LUA_REGISTRYINDEX)); return 0; } static int setOnSave(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //set on save luaL_unref(L, LUA_REGISTRYINDEX, pager->GetSaveReference()); pager->SetSaveReference(luaL_ref(L, LUA_REGISTRYINDEX)); return 0; } static int setOnCreate(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //set on create luaL_unref(L, LUA_REGISTRYINDEX, pager->GetCreateReference()); pager->SetCreateReference(luaL_ref(L, LUA_REGISTRYINDEX)); return 0; } static int setOnUnload(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //set on unload luaL_unref(L, LUA_REGISTRYINDEX, pager->GetUnloadReference()); pager->SetUnloadReference(luaL_ref(L, LUA_REGISTRYINDEX)); return 0; @@ -134,7 +199,12 @@ static int setOnUnload(lua_State* L) { //debugging static int containerSize(lua_State* L) { - RegionPagerLua* pager = static_cast(lua_touserdata(L, 1)); + //get the global pager + lua_getglobal(L, REGION_PAGER_NAME); + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + lua_pop(L, 1); + + //push container size lua_pushinteger(L, pager->GetContainer()->size()); return 1; } diff --git a/region_pager_api.hpp b/region_pager_api.hpp index 101d98e..176143c 100644 --- a/region_pager_api.hpp +++ b/region_pager_api.hpp @@ -23,6 +23,6 @@ #include "lua.hpp" -//TODO: (1) change the following line to remove reference to Tortuga -#define TORTUGA_REGION_PAGER_API "region_pager" +#define REGION_PAGER_NAME "_regionPager" +#define TURTLEMAP_REGION_PAGER_API "region_pager" LUAMOD_API int openRegionPagerAPI(lua_State* L); diff --git a/tile_sheet_api.cpp b/tile_sheet_api.cpp new file mode 100644 index 0000000..38828a3 --- /dev/null +++ b/tile_sheet_api.cpp @@ -0,0 +1,89 @@ +/* Copyright: (c) Kayne Ruse 2013-2016 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "tile_sheet_api.hpp" + +#include "tile_sheet.hpp" + +static int load(lua_State* L) { + lua_getglobal(L, TILESHEET_NAME); + TileSheet* sheet = static_cast(lua_touserdata(L, -1)); + lua_getglobal(L, RENDERER_NAME); + sheet->Load( + static_cast(lua_touserdata(L, -1)), + lua_tostring(L, 1), + lua_tointeger(L, 2), + lua_tointeger(L, 3) + ); + return 0; +} + +static int free(lua_State* L) { + lua_getglobal(L, TILESHEET_NAME); + TileSheet* sheet = static_cast(lua_touserdata(L, -1)); + sheet->Free(); + return 0; +} + +static int getCountX(lua_State* L) { + lua_getglobal(L, TILESHEET_NAME); + TileSheet* sheet = static_cast(lua_touserdata(L, -1)); + lua_pushinteger(L, sheet->GetCountX()); + return 1; +} + +static int getCountY(lua_State* L) { + lua_getglobal(L, TILESHEET_NAME); + TileSheet* sheet = static_cast(lua_touserdata(L, -1)); + lua_pushinteger(L, sheet->GetCountY()); + return 1; +} + +static int getTileW(lua_State* L) { + lua_getglobal(L, TILESHEET_NAME); + TileSheet* sheet = static_cast(lua_touserdata(L, -1)); + lua_pushinteger(L, sheet->GetTileW()); + return 1; +} + +static int getTileH(lua_State* L) { + lua_getglobal(L, TILESHEET_NAME); + TileSheet* sheet = static_cast(lua_touserdata(L, -1)); + lua_pushinteger(L, sheet->GetTileH()); + return 1; +} + +static const luaL_Reg tileSheetLib[] = { + {"Load", load}, + {"Free", free}, + + {"GetCountX", getCountX}, + {"GetCountY", getCountY}, + {"GetTileW", getTileW}, + {"GetTileH", getTileH}, + + {nullptr, nullptr} +}; + +LUAMOD_API int openTileSheetAPI(lua_State* L) { + luaL_newlib(L, tileSheetLib); + return 1; +} \ No newline at end of file diff --git a/tile_sheet_api.hpp b/tile_sheet_api.hpp new file mode 100644 index 0000000..04104b9 --- /dev/null +++ b/tile_sheet_api.hpp @@ -0,0 +1,29 @@ +/* Copyright: (c) Kayne Ruse 2013-2016 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#pragma once + +#include "lua.hpp" + +#define RENDERER_NAME "_renderer" +#define TILESHEET_NAME "_tilesheet" +#define TURTLEMAP_TILE_SHEET_API "tile_sheet" +LUAMOD_API int openTileSheetAPI(lua_State* L);