diff --git a/common/map/region_api.cpp b/common/map/region_api.cpp index b30f04f..fdff4f7 100644 --- a/common/map/region_api.cpp +++ b/common/map/region_api.cpp @@ -64,43 +64,43 @@ static int getDepth(lua_State* L) { return 1; } -static int load(lua_State* L) { - //TODO: fill this +static int onLoad(lua_State* L) { + //TODO: onLoad() lua_pushboolean(L, false); return 1; } -static int save(lua_State* L) { - //TODO: fill this +static int onSave(lua_State* L) { + //TODO: onSave() return 0; } -static int create(lua_State* L) { - //TODO: fill this +static int onCreate(lua_State* L) { + //TODO: onCreate() return 0; } -static int unload(lua_State* L) { - //TODO: fill this +static int onUnload(lua_State* L) { + //TODO: onUnload() return 0; } -static const luaL_Reg regionlib[] = { - {"settile",setTile}, - {"gettile",getTile}, - {"getx",getX}, - {"gety",getY}, - {"getwidth",getWidth}, - {"getheight",getHeight}, - {"getdepth",getDepth}, - {"load",load}, - {"save",save}, - {"create",create}, - {"unload",unload}, +static const luaL_Reg regionLib[] = { + {"SetTile",setTile}, + {"GetTile",getTile}, + {"GetX",getX}, + {"GetY",getY}, + {"GetWidth",getWidth}, + {"GetHeight",getHeight}, + {"GetDepth",getDepth}, + {"OnLoad",onLoad}, + {"OnSave",onSave}, + {"OnCreate",onCreate}, + {"OnUnload",onUnload}, {nullptr, nullptr} }; -LUAMOD_API int luaopen_regionapi(lua_State* L) { - luaL_newlib(L, regionlib); +LUAMOD_API int openRegionAPI(lua_State* L) { + luaL_newlib(L, regionLib); return 1; } \ No newline at end of file diff --git a/common/map/region_api.hpp b/common/map/region_api.hpp index 310074d..6e6733f 100644 --- a/common/map/region_api.hpp +++ b/common/map/region_api.hpp @@ -24,7 +24,7 @@ #include "lua/lua.hpp" -#define LUA_REGIONLIBNAME "region" -LUAMOD_API int luaopen_regionapi(lua_State* L); +#define TORTUGA_REGION_NAME "Region" +LUAMOD_API int openRegionAPI(lua_State* L); #endif diff --git a/common/map/pager_api.cpp b/common/map/region_pager_api.cpp similarity index 59% rename from common/map/pager_api.cpp rename to common/map/region_pager_api.cpp index 8f60e61..f38d1e2 100644 --- a/common/map/pager_api.cpp +++ b/common/map/region_pager_api.cpp @@ -19,7 +19,7 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#include "pager_api.hpp" +#include "region_pager_api.hpp" #include "region_pager_lua.hpp" #include "region.hpp" @@ -27,6 +27,8 @@ #include #include +//DOCS: These functions are just wrappers for the RegionPagerLua class + 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)); @@ -63,94 +65,46 @@ static int getDirectory(lua_State* L) { } static int loadRegion(lua_State* L) { - //get the parameters RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); - Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); - std::string s = pager->GetDirectory(); - - //push the parameters - lua_getglobal(L, "region"); - lua_getfield(L, -1, "load"); + Region* region = pager->LoadRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); lua_pushlightuserdata(L, region); - lua_pushstring(L, s.c_str()); - - //call the method - if (lua_pcall(L, 2, 1, 0) != LUA_OK) { - throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(L, -1) )); - } return 1; } static int saveRegion(lua_State* L) { - //get the parameters RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); - Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); - std::string s = pager->GetDirectory(); - - //push the parameters - lua_getglobal(L, "region"); - lua_getfield(L, -1, "save"); + Region* region = pager->SaveRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); lua_pushlightuserdata(L, region); - lua_pushstring(L, s.c_str()); - - //call the method - if (lua_pcall(L, 2, 0, 0) != LUA_OK) { - throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(L, -1) )); - } - return 0; + return 1; } static int createRegion(lua_State* L) { - //get the parameters RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); - Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); - - //push the parameters - lua_getglobal(L, "region"); - lua_getfield(L, -1, "create"); + Region* region = pager->CreateRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); lua_pushlightuserdata(L, region); - //TODO: parameters - - //call the method - if (lua_pcall(L, 1, 0, 0) != LUA_OK) { - throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(L, -1) )); - } - return 0; + return 1; } static int unloadRegion(lua_State* L) { - //get the parameters RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); - Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); - std::string s = pager->GetDirectory(); - - //push the parameters - lua_getglobal(L, "region"); - lua_getfield(L, -1, "unload"); - lua_pushlightuserdata(L, region); - lua_pushstring(L, s.c_str()); - - //call the method - if (lua_pcall(L, 2, 0, 0) != LUA_OK) { - throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(L, -1) )); - } + pager->UnloadRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); return 0; } static const luaL_Reg pagerlib[] = { - {"settile", setTile}, - {"gettile", getTile}, - {"getregion", getRegion}, - {"setdirectory", setDirectory}, - {"getdirectory", getDirectory}, - {"loadregion", loadRegion}, - {"saveregion", saveRegion}, - {"createregion", createRegion}, - {"unloadregion", unloadRegion}, + {"SetTile", setTile}, + {"GetTile", getTile}, + {"GetRegion", getRegion}, + {"SetDirectory", setDirectory}, + {"GetDirectory", getDirectory}, + {"LoadRegion", loadRegion}, + {"SaveRegion", saveRegion}, + {"CreateRegion", createRegion}, + {"UnloadRegion", unloadRegion}, {nullptr, nullptr} }; -LUAMOD_API int luaopen_pagerapi(lua_State* L) { +LUAMOD_API int openRegionPagerAPI(lua_State* L) { luaL_newlib(L, pagerlib); return 1; } \ No newline at end of file diff --git a/common/map/pager_api.hpp b/common/map/region_pager_api.hpp similarity index 90% rename from common/map/pager_api.hpp rename to common/map/region_pager_api.hpp index 2531e94..466af61 100644 --- a/common/map/pager_api.hpp +++ b/common/map/region_pager_api.hpp @@ -24,7 +24,7 @@ #include "lua/lua.hpp" -#define LUA_PAGERLIBNAME "pager" -LUAMOD_API int luaopen_pagerapi(lua_State* L); +#define TORTUGA_REGION_PAGER_NAME "RegionPager" +LUAMOD_API int openRegionPagerAPI(lua_State* L); #endif diff --git a/common/map/region_pager_lua.cpp b/common/map/region_pager_lua.cpp index a183be8..85ea167 100644 --- a/common/map/region_pager_lua.cpp +++ b/common/map/region_pager_lua.cpp @@ -29,12 +29,12 @@ Region* RegionPagerLua::LoadRegion(int x, int y) { //load the region if possible //something to work on - regionList.emplace_front(x, y); + Region tmpRegion(x, y); //API hook - lua_getglobal(luaState, "region"); - lua_getfield(luaState, -1, "load"); - lua_pushlightuserdata(luaState, ®ionList.front()); + lua_getglobal(luaState, "Region"); + lua_getfield(luaState, -1, "OnLoad"); + lua_pushlightuserdata(luaState, &tmpRegion); lua_pushstring(luaState, directory.c_str()); if (lua_pcall(luaState, 2, 1, 0) != LUA_OK) { throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) )); @@ -42,10 +42,10 @@ Region* RegionPagerLua::LoadRegion(int x, int y) { //success or failure if (!lua_toboolean(luaState, -1)) { lua_pop(luaState, 2); - regionList.pop_front(); return nullptr; } lua_pop(luaState, 2); + regionList.push_front(tmpRegion); return ®ionList.front(); } @@ -54,8 +54,8 @@ Region* RegionPagerLua::SaveRegion(int x, int y) { Region* ptr = FindRegion(x, y); if (ptr) { //API hook - lua_getglobal(luaState, "region"); - lua_getfield(luaState, -1, "save"); + lua_getglobal(luaState, "Region"); + lua_getfield(luaState, -1, "OnSave"); lua_pushlightuserdata(luaState, ptr); lua_pushstring(luaState, directory.c_str()); if (lua_pcall(luaState, 2, 0, 0) != LUA_OK) { @@ -72,28 +72,29 @@ Region* RegionPagerLua::CreateRegion(int x, int y) { } //something to work on - regionList.emplace_front(x, y); + Region tmpRegion(x, y); //API hook - lua_getglobal(luaState, "region"); - lua_getfield(luaState, -1, "create"); - lua_pushlightuserdata(luaState, ®ionList.front()); + lua_getglobal(luaState, "Region"); + lua_getfield(luaState, -1, "OnCreate"); + lua_pushlightuserdata(luaState, &tmpRegion); //TODO: parameters if (lua_pcall(luaState, 1, 0, 0) != LUA_OK) { throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) )); } lua_pop(luaState, 1); - return ®ionList.front();; + regionList.push_front(tmpRegion); + return ®ionList.front(); } void RegionPagerLua::UnloadRegion(int x, int y) { - lua_getglobal(luaState, "region"); + lua_getglobal(luaState, "Region"); regionList.remove_if([&](Region& region) -> bool { if (region.GetX() == x && region.GetY() == y) { //API hook - lua_getfield(luaState, -1, "unload"); + lua_getfield(luaState, -1, "OnUnload"); lua_pushlightuserdata(luaState, ®ion); lua_pushstring(luaState, directory.c_str()); if (lua_pcall(luaState, 2, 0, 0) != LUA_OK) { @@ -109,11 +110,11 @@ void RegionPagerLua::UnloadRegion(int x, int y) { } void RegionPagerLua::UnloadAll() { - lua_getglobal(luaState, "region"); + lua_getglobal(luaState, "Region"); for (auto& it : regionList) { //API hook - lua_getfield(luaState, -1, "unload"); + lua_getfield(luaState, -1, "OnUnload"); lua_pushlightuserdata(luaState, &it); lua_pushstring(luaState, directory.c_str()); if (lua_pcall(luaState, 2, 0, 0) != LUA_OK) { diff --git a/common/map/region_pager_lua.hpp b/common/map/region_pager_lua.hpp index 78aed17..9468a18 100644 --- a/common/map/region_pager_lua.hpp +++ b/common/map/region_pager_lua.hpp @@ -41,6 +41,7 @@ public: void UnloadAll() override; + //accessors & mutators std::string SetDirectory(std::string s) { return directory = s; } std::string GetDirectory() { return directory; } diff --git a/makefile b/makefile index 080a22d..56e39a3 100644 --- a/makefile +++ b/makefile @@ -3,6 +3,7 @@ #MKDIR=mkdir #RM=del /y +#CXXFLAGS+=-static-libgcc -static-libstdc++ -g -fno-inline-functions -Wall CXXFLAGS+=-static-libgcc -static-libstdc++ export diff --git a/rsc/scripts/setup_server.lua b/rsc/scripts/setup_server.lua index bae4a74..6bc65f0 100644 --- a/rsc/scripts/setup_server.lua +++ b/rsc/scripts/setup_server.lua @@ -1,20 +1,42 @@ print("Lua script check (./rsc)") -------------------------- ---Map API overrides -------------------------- +--uber lazy declarations +function square(x) return x*x end +function distance(x, y, i, j) return math.sqrt(square(x - i) + square(y - j)) end -function region.create(r) - for i = 1, region.getwidth() do - for j = 1, region.getheight() do - if math.abs(region.getx(r) + i -1) == math.abs(region.gety(r) + j -1) then - region.settile(r, i, j, 1, 50) +--tile macros, mapped to the tilesheet +local base = 14 +local shift = 36 +plains = base + shift * 0 +grass = base + shift * 1 +dirt = base + shift * 2 +sand = base + shift * 3 +water = base + shift * 4 + +--Overwrite the original OnCreate with my own version +Region.hcOnCreate = Region.OnCreate +Region.OnCreate = function(region) + local ret = Region.hcOnCreate(region) --best practices + for i = 1, Region.GetWidth() do + for j = 1, Region.GetHeight() do + if distance(0, 0, i + Region.GetX(region) -1, j + Region.GetY(region) -1) > 10 then + Region.SetTile(region, i, j, 1, water) else - region.settile(r, i, j, 1, 14) + Region.SetTile(region, i, j, 1, plains) end end end - - --signal - region.settile(r, 4, 5, 2, 86) + return ret end + +--Get some regions +newRoom = RoomMgr.CreateRoom("overworld") +pager = Room.GetPager(newRoom) +regionTable = { + RegionPager.GetRegion(pager, 0, 0), + RegionPager.GetRegion(pager, 0, -20), + RegionPager.GetRegion(pager, -20, 0), + RegionPager.GetRegion(pager, -20, -20) +} + +print("Finished the lua script") \ No newline at end of file diff --git a/server/linit.cpp b/server/linit.cpp index 7898184..8108a49 100644 --- a/server/linit.cpp +++ b/server/linit.cpp @@ -37,7 +37,7 @@ #include "lua/lua.hpp" #include "region_api.hpp" -#include "pager_api.hpp" +#include "region_pager_api.hpp" #include "room_api.hpp" #include "room_mgr_api.hpp" #include "generator_api.hpp" @@ -56,12 +56,12 @@ static const luaL_Reg loadedlibs[] = { {LUA_MATHLIBNAME, luaopen_math}, {LUA_DBLIBNAME, luaopen_debug}, - //custom libs - {LUA_REGIONLIBNAME, luaopen_regionapi}, - {LUA_PAGERLIBNAME, luaopen_pagerapi}, - {LUA_ROOMLIBNAME, luaopen_roomapi}, - {LUA_ROOMMGRLIBNAME, luaopen_roommgrapi}, - {LUA_GENERATORLIBNAME, luaopen_generatorapi}, + //Tortuga's API + {TORTUGA_REGION_NAME, openRegionAPI}, + {TORTUGA_REGION_PAGER_NAME, openRegionPagerAPI}, + {TORTUGA_ROOM_NAME, openRoomAPI}, + {TORTUGA_ROOM_MGR_NAME, openRoomMgrAPI}, + {TORTUGA_GENRATOR_NAME, openGeneratorAPI}, {NULL, NULL} }; diff --git a/server/mapgen/generator_api.cpp b/server/mapgen/generator_api.cpp index 2593fb5..f3cc84f 100644 --- a/server/mapgen/generator_api.cpp +++ b/server/mapgen/generator_api.cpp @@ -21,17 +21,59 @@ */ #include "generator_api.hpp" -static int getGenerator(lua_State* L) { - //TODO: return a generator based on the given parameter - return 0; +#include "base_generator.hpp" + +static int getMapType(lua_State* L) { + BaseGenerator* ptr = reinterpret_cast(lua_touserdata(L, 1)); + switch(ptr->GetMapType()) { + case MapType::NONE: + lua_pushstring(L, "none"); + break; + case MapType::OVERWORLD: + lua_pushstring(L, "overworld"); + break; + case MapType::RUINS: + lua_pushstring(L, "ruins"); + break; + case MapType::TOWERS: + lua_pushstring(L, "towers"); + break; + case MapType::FORESTS: + lua_pushstring(L, "forests"); + break; + case MapType::CAVES: + lua_pushstring(L, "caves"); + break; + } + return 1; } -static const luaL_Reg generatorlib[] = { - {"getgenerator", getGenerator}, +static int getChunk(lua_State* L) { + BaseGenerator* ptr = reinterpret_cast(lua_touserdata(L, 1)); + ChunkData* chunk = ptr->GetChunk(lua_tointeger(L, 2), lua_tointeger(L, 3)); + lua_pushlightuserdata(L, reinterpret_cast(chunk)); + return 1; +} + +static int getMapWidth(lua_State* L) { + lua_pushinteger(L, MAP_WIDTH); + return 1; +} + +static int getMapHeight(lua_State* L) { + lua_pushinteger(L, MAP_HEIGHT); + return 1; +} + +static const luaL_Reg generatorLib[] = { + {"GetMapType", getMapType}, + {"GetChunk", getChunk}, + {"GetMapWidth", getMapWidth}, + {"GetMapHeight", getMapHeight}, {nullptr, nullptr} }; -LUAMOD_API int luaopen_generatorapi(lua_State* L) { - luaL_newlib(L, generatorlib); +LUAMOD_API int openGeneratorAPI(lua_State* L) { + luaL_newlib(L, generatorLib); return 1; } diff --git a/server/mapgen/generator_api.hpp b/server/mapgen/generator_api.hpp index a0b9fb3..78c24c2 100644 --- a/server/mapgen/generator_api.hpp +++ b/server/mapgen/generator_api.hpp @@ -24,8 +24,7 @@ #include "lua/lua.hpp" -#define LUA_GENERATORLIBNAME "generator" -LUAMOD_API int luaopen_generatorapi(lua_State* L); - +#define TORTUGA_GENRATOR_NAME "Generator" +LUAMOD_API int openGeneratorAPI(lua_State* L); #endif \ No newline at end of file diff --git a/server/mapgen/generators/base_generator.cpp b/server/mapgen/generators/base_generator.cpp index 8ea5974..9afab6b 100644 --- a/server/mapgen/generators/base_generator.cpp +++ b/server/mapgen/generators/base_generator.cpp @@ -21,7 +21,8 @@ */ #include "base_generator.hpp" -BaseGenerator::BaseGenerator() { +BaseGenerator::BaseGenerator(MapType t) { + mapType = t; for (int i = 0; i < MAP_WIDTH; i++) { for (int j = 0; j < MAP_HEIGHT; j++) { chunks[i][j].type = TerrainType::NONE; diff --git a/server/mapgen/generators/base_generator.hpp b/server/mapgen/generators/base_generator.hpp index ef93c38..6d629cd 100644 --- a/server/mapgen/generators/base_generator.hpp +++ b/server/mapgen/generators/base_generator.hpp @@ -22,6 +22,7 @@ #ifndef BASEGENERATOR_HPP_ #define BASEGENERATOR_HPP_ +#include "map_type.hpp" #include "chunk_data.hpp" #include "lua/lua.hpp" @@ -31,17 +32,22 @@ constexpr int MAP_HEIGHT = 256; class BaseGenerator { public: - BaseGenerator(); virtual ~BaseGenerator(); //accessors and mutators virtual ChunkData* GetChunk(int x, int y) { return &chunks[x][y]; } + MapType GetMapType() { return mapType; } + lua_State* SetLuaState(lua_State* L) { return luaState = L; } lua_State* GetLuaState() { return luaState; } protected: + BaseGenerator() = delete; + BaseGenerator(MapType t); + ChunkData chunks[MAP_WIDTH][MAP_HEIGHT]; + MapType mapType = MapType::NONE; lua_State* luaState = nullptr; }; diff --git a/server/mapgen/generators/caves_generator.cpp b/server/mapgen/generators/caves_generator.cpp index a2cbaed..0019bf5 100644 --- a/server/mapgen/generators/caves_generator.cpp +++ b/server/mapgen/generators/caves_generator.cpp @@ -21,7 +21,7 @@ */ #include "caves_generator.hpp" -CavesGenerator::CavesGenerator() { +CavesGenerator::CavesGenerator() : BaseGenerator(MapType::CAVES) { // } diff --git a/server/mapgen/generators/caves_generator.hpp b/server/mapgen/generators/caves_generator.hpp index 975ed8c..062a86d 100644 --- a/server/mapgen/generators/caves_generator.hpp +++ b/server/mapgen/generators/caves_generator.hpp @@ -24,8 +24,6 @@ #include "base_generator.hpp" -#define CAVES_GENERATOR_PSEUDOINDEX "CavesGenerator" - class CavesGenerator : public BaseGenerator { public: CavesGenerator(); diff --git a/server/mapgen/generators/forests_generator.cpp b/server/mapgen/generators/forests_generator.cpp index 5ff8127..cbff079 100644 --- a/server/mapgen/generators/forests_generator.cpp +++ b/server/mapgen/generators/forests_generator.cpp @@ -21,7 +21,7 @@ */ #include "forests_generator.hpp" -ForestsGenerator::ForestsGenerator() { +ForestsGenerator::ForestsGenerator() : BaseGenerator(MapType::FORESTS) { // } diff --git a/server/mapgen/generators/forests_generator.hpp b/server/mapgen/generators/forests_generator.hpp index e87d89e..459428f 100644 --- a/server/mapgen/generators/forests_generator.hpp +++ b/server/mapgen/generators/forests_generator.hpp @@ -24,8 +24,6 @@ #include "base_generator.hpp" -#define FORESTS_GENERATOR_PSEUDOINDEX "ForestsGenerator" - class ForestsGenerator : public BaseGenerator { public: ForestsGenerator(); diff --git a/server/mapgen/generators/overworld_generator.cpp b/server/mapgen/generators/overworld_generator.cpp index 8119158..7bcd1c5 100644 --- a/server/mapgen/generators/overworld_generator.cpp +++ b/server/mapgen/generators/overworld_generator.cpp @@ -21,7 +21,7 @@ */ #include "overworld_generator.hpp" -OverworldGenerator::OverworldGenerator() { +OverworldGenerator::OverworldGenerator() : BaseGenerator(MapType::OVERWORLD) { // } diff --git a/server/mapgen/generators/overworld_generator.hpp b/server/mapgen/generators/overworld_generator.hpp index e47026d..63fd418 100644 --- a/server/mapgen/generators/overworld_generator.hpp +++ b/server/mapgen/generators/overworld_generator.hpp @@ -24,8 +24,6 @@ #include "base_generator.hpp" -#define OVERWORLD_GENERATOR_PSEUDOINDEX "OverworldGenerator" - class OverworldGenerator : public BaseGenerator { public: OverworldGenerator(); diff --git a/server/mapgen/generators/ruins_generator.cpp b/server/mapgen/generators/ruins_generator.cpp index 24a7c3e..164de89 100644 --- a/server/mapgen/generators/ruins_generator.cpp +++ b/server/mapgen/generators/ruins_generator.cpp @@ -21,7 +21,7 @@ */ #include "ruins_generator.hpp" -RuinsGenerator::RuinsGenerator() { +RuinsGenerator::RuinsGenerator() : BaseGenerator(MapType::RUINS) { // } diff --git a/server/mapgen/generators/ruins_generator.hpp b/server/mapgen/generators/ruins_generator.hpp index 309bf45..fbc0518 100644 --- a/server/mapgen/generators/ruins_generator.hpp +++ b/server/mapgen/generators/ruins_generator.hpp @@ -24,8 +24,6 @@ #include "base_generator.hpp" -#define RUINS_GENERATOR_PSEUDOINDEX "RuinsGenerator" - class RuinsGenerator : public BaseGenerator { public: RuinsGenerator(); diff --git a/server/mapgen/generators/towers_generator.cpp b/server/mapgen/generators/towers_generator.cpp index 3e8a2c6..ad50a09 100644 --- a/server/mapgen/generators/towers_generator.cpp +++ b/server/mapgen/generators/towers_generator.cpp @@ -21,7 +21,7 @@ */ #include "towers_generator.hpp" -TowersGenerator::TowersGenerator() { +TowersGenerator::TowersGenerator() : BaseGenerator(MapType::TOWERS) { // } diff --git a/server/mapgen/generators/towers_generator.hpp b/server/mapgen/generators/towers_generator.hpp index 0dcb9d9..48a29bb 100644 --- a/server/mapgen/generators/towers_generator.hpp +++ b/server/mapgen/generators/towers_generator.hpp @@ -24,8 +24,6 @@ #include "base_generator.hpp" -#define TOWERS_GENERATOR_PSEUDOINDEX "TowersGenerator" - class TowersGenerator : public BaseGenerator { public: TowersGenerator(); diff --git a/server/mapgen/makefile b/server/mapgen/makefile index d949a54..9a44bb4 100644 --- a/server/mapgen/makefile +++ b/server/mapgen/makefile @@ -1,5 +1,5 @@ #config -INCLUDES+=. +INCLUDES+=. generators LIBS+= CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) diff --git a/server/mapgen/map_type.hpp b/server/mapgen/map_type.hpp index 3127e1a..e56b924 100644 --- a/server/mapgen/map_type.hpp +++ b/server/mapgen/map_type.hpp @@ -23,11 +23,12 @@ #define MAPTYPE_HPP_ enum class MapType { - OVERWORLD = 0, - RUINS = 1, - TOWERS = 2, - FORESTS = 3, - CAVES = 4, + NONE, + OVERWORLD, + RUINS, + TOWERS, + FORESTS, + CAVES, }; #endif \ No newline at end of file diff --git a/server/rooms/room_api.cpp b/server/rooms/room_api.cpp index 9f09f3c..3f217a8 100644 --- a/server/rooms/room_api.cpp +++ b/server/rooms/room_api.cpp @@ -21,32 +21,41 @@ */ #include "room_api.hpp" -#include "room_manager.hpp" #include "room_data.hpp" -static int getType(lua_State* L) { - RoomData* room = reinterpret_cast(lua_touserdata(L, 1)); - lua_pushinteger(L, static_cast(room->type)); - return 1; -} - -//TODO: parameters - -static int getRegionPager(lua_State* L) { +static int getPager(lua_State* L) { RoomData* room = reinterpret_cast(lua_touserdata(L, 1)); lua_pushlightuserdata(L, reinterpret_cast(&room->pager)); return 1; } -//TODO: generators +static int getGenerator(lua_State* L) { + RoomData* room = reinterpret_cast(lua_touserdata(L, 1)); + lua_pushlightuserdata(L, reinterpret_cast(room->generator)); + return 1; +} -static const luaL_Reg roomlib[] = { - {"gettype",getType}, - {"getregionpager",getRegionPager}, +static int onCreate(lua_State* L) { + //TODO: onCreate() + return 0; +} + +static int onUnload(lua_State* L) { + //TODO: onUnload() + return 0; +} + +//TODO: parameters + +static const luaL_Reg roomLib[] = { + {"GetPager",getPager}, + {"GetGenerator",getGenerator}, + {"OnCreate", onCreate}, + {"OnUnload", onUnload}, {nullptr, nullptr} }; -LUAMOD_API int luaopen_roomapi(lua_State* L) { - luaL_newlib(L, roomlib); +LUAMOD_API int openRoomAPI(lua_State* L) { + luaL_newlib(L, roomLib); return 1; } \ No newline at end of file diff --git a/server/rooms/room_api.hpp b/server/rooms/room_api.hpp index a9c31a8..5d2eab8 100644 --- a/server/rooms/room_api.hpp +++ b/server/rooms/room_api.hpp @@ -24,7 +24,7 @@ #include "lua/lua.hpp" -#define LUA_ROOMLIBNAME "room" -LUAMOD_API int luaopen_roomapi(lua_State* L); +#define TORTUGA_ROOM_NAME "Room" +LUAMOD_API int openRoomAPI(lua_State* L); #endif diff --git a/server/rooms/room_data.hpp b/server/rooms/room_data.hpp index 4b9e811..660e057 100644 --- a/server/rooms/room_data.hpp +++ b/server/rooms/room_data.hpp @@ -29,7 +29,6 @@ struct RoomData { //members - MapType type; RegionPagerLua pager; BaseGenerator* generator = nullptr; diff --git a/server/rooms/room_manager.cpp b/server/rooms/room_manager.cpp index 8f60ba4..3e4ec87 100644 --- a/server/rooms/room_manager.cpp +++ b/server/rooms/room_manager.cpp @@ -21,37 +21,85 @@ */ #include "room_manager.hpp" +//the generator types +#include "overworld_generator.hpp" +#include "ruins_generator.hpp" +#include "towers_generator.hpp" +#include "forests_generator.hpp" +#include "caves_generator.hpp" + #include //------------------------- //public access methods //------------------------- -RoomData* RoomManager::CreateRoom(int uid) { - //don't overwrite existing rooms - std::map::iterator it = roomMap.find(uid); - if (it != roomMap.end()) { - throw(std::runtime_error("Cannot overwrite an existing room")); - } - roomMap[uid] = new RoomData(); - //TODO: create room in the API +RoomData* RoomManager::CreateRoom(MapType mapType) { + //create the room + RoomData* newRoom = new RoomData(); + + //create the generator, use a lambda because I'm lazy + newRoom->generator = [mapType]() -> BaseGenerator* { + switch(mapType) { + //BUG: Not having a map type results in an overworld generator by default + case MapType::NONE: + case MapType::OVERWORLD: return new OverworldGenerator(); + case MapType::RUINS: return new RuinsGenerator(); + case MapType::TOWERS: return new TowersGenerator(); + case MapType::FORESTS: return new ForestsGenerator(); + case MapType::CAVES: return new CavesGenerator(); + } + throw(std::runtime_error("Failed to set the room's generator")); + }(); + + //set the state if (luaState) { - roomMap[uid]->pager.SetLuaState(luaState); + newRoom->pager.SetLuaState(luaState); + newRoom->generator->SetLuaState(luaState); } - return roomMap[uid]; + + //register the room + roomMap[counter++] = newRoom; + + //API hook + lua_getglobal(luaState, "Room"); + lua_getfield(luaState, -1, "OnCreate"); + lua_pushlightuserdata(luaState, newRoom); + if (lua_pcall(luaState, 1, 0, 0) != LUA_OK) { + throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) )); + } + lua_pop(luaState, 1); + + //finish the routine + return newRoom; } -RoomData* RoomManager::UnloadRoom(int uid) { - //TODO: unload room in the API - delete roomMap[uid]; +void RoomManager::UnloadRoom(int uid) { + //find the room + RoomData* room = FindRoom(uid); + if (!room) { + return; + } + + //API hook + lua_getglobal(luaState, "Room"); + lua_getfield(luaState, -1, "OnUnload"); + lua_pushlightuserdata(luaState, room); + if (lua_pcall(luaState, 1, 0, 0) != LUA_OK) { + throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) )); + } + lua_pop(luaState, 1); + + //free the memory + delete room->generator; + delete room; roomMap.erase(uid); } RoomData* RoomManager::GetRoom(int uid) { RoomData* ptr = FindRoom(uid); if (ptr) return ptr; - ptr = CreateRoom(uid); - return ptr; + return CreateRoom(MapType::NONE); } RoomData* RoomManager::FindRoom(int uid) { @@ -62,11 +110,23 @@ RoomData* RoomManager::FindRoom(int uid) { return it->second; } -RoomData* RoomManager::PushRoom(int uid, RoomData* room) { - //unload existing rooms with this index - std::map::iterator it = roomMap.find(uid); - if (it != roomMap.end()) { - UnloadRoom(uid); - } - roomMap[uid] = room; +int RoomManager::PushRoom(RoomData* room) { + roomMap[counter++] = room; + return counter; } + +void RoomManager::UnloadAll() { + lua_getglobal(luaState, "Room"); + + for (auto& it : roomMap) { + //API hook + lua_getfield(luaState, -1, "OnUnload"); + lua_pushlightuserdata(luaState, it.second); + if (lua_pcall(luaState, 1, 0, 0) != LUA_OK) { + throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) )); + } + } + + lua_pop(luaState, 1); + roomMap.clear(); +} \ No newline at end of file diff --git a/server/rooms/room_manager.hpp b/server/rooms/room_manager.hpp index 80480f7..02c5b32 100644 --- a/server/rooms/room_manager.hpp +++ b/server/rooms/room_manager.hpp @@ -36,12 +36,14 @@ public: ~RoomManager() = default; //public access methods - RoomData* CreateRoom(int uid); - RoomData* UnloadRoom(int uid); + RoomData* CreateRoom(MapType); + void UnloadRoom(int uid); RoomData* GetRoom(int uid); RoomData* FindRoom(int uid); - RoomData* PushRoom(int uid, RoomData*); + int PushRoom(RoomData*); + + void UnloadAll(); //accessors and mutators std::map* GetContainer() { return &roomMap; } @@ -52,6 +54,7 @@ public: private: std::map roomMap; lua_State* luaState = nullptr; + int counter = 0; }; #endif \ No newline at end of file diff --git a/server/rooms/room_mgr_api.cpp b/server/rooms/room_mgr_api.cpp index 44050dc..9907896 100644 --- a/server/rooms/room_mgr_api.cpp +++ b/server/rooms/room_mgr_api.cpp @@ -21,9 +21,12 @@ */ #include "room_mgr_api.hpp" +#include "room_api.hpp" #include "room_manager.hpp" #include "room_data.hpp" +#include + static int getRoom(lua_State* L) { //get the room manager lua_pushstring(L, ROOM_MANAGER_PSEUDOINDEX); @@ -35,12 +38,52 @@ static int getRoom(lua_State* L) { return 1; } -static const luaL_Reg roommgrlib[] = { - {"getroom",getRoom}, +static int createRoom(lua_State* L) { + //TODO: check parameter count for the glue functions + + //get the room manager + lua_pushstring(L, ROOM_MANAGER_PSEUDOINDEX); + lua_gettable(L, LUA_REGISTRYINDEX); + RoomManager* roomMgr = reinterpret_cast(lua_touserdata(L, -1)); + + //determine the specified room type + MapType mapType = [L]() -> MapType { + if (std::string("overworld") == lua_tostring(L, -2)) return MapType::OVERWORLD; + if (std::string("ruins") == lua_tostring(L, -2)) return MapType::RUINS; + if (std::string("towers") == lua_tostring(L, -2)) return MapType::TOWERS; + if (std::string("forests") == lua_tostring(L, -2)) return MapType::FORESTS; + if (std::string("caves") == lua_tostring(L, -2)) return MapType::CAVES; + return MapType::NONE; + }(); + + //create the room + RoomData* newRoom = roomMgr->CreateRoom(mapType); + + //return the new room + lua_pushlightuserdata(L, newRoom); + return 1; +} + +static int unloadRoom(lua_State* L) { + //get the room manager + lua_pushstring(L, ROOM_MANAGER_PSEUDOINDEX); + lua_gettable(L, LUA_REGISTRYINDEX); + RoomManager* roomMgr = reinterpret_cast(lua_touserdata(L, -1)); + + //unload the specified room + roomMgr->UnloadRoom(lua_tointeger(L, -2)); + + return 0; +} + +static const luaL_Reg roomMgrLib[] = { + {"GetRoom",getRoom}, + {"CreateRoom",createRoom}, + {"UnloadRoom",unloadRoom}, {nullptr, nullptr} }; -LUAMOD_API int luaopen_roommgrapi(lua_State* L) { - luaL_newlib(L, roommgrlib); +LUAMOD_API int openRoomMgrAPI(lua_State* L) { + luaL_newlib(L, roomMgrLib); return 1; } \ No newline at end of file diff --git a/server/rooms/room_mgr_api.hpp b/server/rooms/room_mgr_api.hpp index 1382b4d..f870e5e 100644 --- a/server/rooms/room_mgr_api.hpp +++ b/server/rooms/room_mgr_api.hpp @@ -24,7 +24,7 @@ #include "lua/lua.hpp" -#define LUA_ROOMMGRLIBNAME "roommgr" -LUAMOD_API int luaopen_roommgrapi(lua_State* L); +#define TORTUGA_ROOM_MGR_NAME "RoomMgr" +LUAMOD_API int openRoomMgrAPI(lua_State* L); #endif diff --git a/server/server_application.cpp b/server/server_application.cpp index c60da3b..d9d763e 100644 --- a/server/server_application.cpp +++ b/server/server_application.cpp @@ -157,7 +157,7 @@ void ServerApplication::Quit() { characterMgr.UnloadAll(); //TODO: unload combats //TODO: unload enemies - //TODO: unload rooms + roomMgr.UnloadAll(); //APIs lua_close(luaState); diff --git a/todo.txt b/todo.txt index 78b1506..f3394b6 100644 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,7 @@ TODO: encapsulate the data structures TODO: Get the rooms working +TODO: make the whole thing more fault tolerant TODO: Authentication TODO: server is slaved to the client