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/common/utilities/simple_rng.hpp b/common/utilities/simple_rng.hpp new file mode 100644 index 0000000..52ca91b --- /dev/null +++ b/common/utilities/simple_rng.hpp @@ -0,0 +1,42 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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. +*/ +#ifndef SIMPLERNG_HPP_ +#define SIMPLERNG_HPP_ + +//a simple, stateless, random number generator +class SimpleRNG { +public: + SimpleRNG() { SetSeed(8891.0); } + SimpleRNG(double x) { SetSeed(x); } + + double SetSeed(double s) { return seed = s; } + double GetSeed() { return seed; } + + double operator()(double x) { + return (x + seed) * 11235.0 + 81321.0; + }; + +private: + double seed; +}; + +#endif \ No newline at end of file diff --git a/common/utilities/vector2.hpp b/common/utilities/vector2.hpp index 1d8882d..2be3d34 100644 --- a/common/utilities/vector2.hpp +++ b/common/utilities/vector2.hpp @@ -41,6 +41,11 @@ public: double SquaredLength() const { return x*x+y*y; } + void Normalize() { + double l = Length(); + x /= l; + y /= l; + } //Arithmetic operators Vector2 operator+(Vector2 v) const { @@ -97,15 +102,6 @@ public: template bool operator!=(T t) { return (x != t || y != t); } }; -//non-member templates (flip the order) -template Vector2 operator+(T t, Vector2 v) { return v + t; } -template Vector2 operator-(T t, Vector2 v) { return v - t; } -template Vector2 operator*(T t, Vector2 v) { return v * t; } -template Vector2 operator/(T t, Vector2 v) { return v / t; } - -template bool operator==(T t, Vector2 v) { return v == t; } -template bool operator!=(T t, Vector2 v) { return v != t; } - //This is explicitly a POD static_assert(std::is_pod::value, "Vector2 is not a POD"); 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/account_data.hpp b/server/accounts/account_data.hpp similarity index 100% rename from server/account_data.hpp rename to server/accounts/account_data.hpp diff --git a/server/account_manager.cpp b/server/accounts/account_manager.cpp similarity index 100% rename from server/account_manager.cpp rename to server/accounts/account_manager.cpp diff --git a/server/account_manager.hpp b/server/accounts/account_manager.hpp similarity index 100% rename from server/account_manager.hpp rename to server/accounts/account_manager.hpp diff --git a/server/accounts/makefile b/server/accounts/makefile new file mode 100644 index 0000000..8d12afe --- /dev/null +++ b/server/accounts/makefile @@ -0,0 +1,37 @@ +#config +INCLUDES+=. +LIBS+= +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#output +OUTDIR=.. +OUT=$(addprefix $(OUTDIR)/,server.a) + +#targets +all: $(OBJ) $(OUT) + ar -crs $(OUT) $(OBJ) + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/server/character_manager.cpp b/server/characters/character_manager.cpp similarity index 100% rename from server/character_manager.cpp rename to server/characters/character_manager.cpp diff --git a/server/character_manager.hpp b/server/characters/character_manager.hpp similarity index 100% rename from server/character_manager.hpp rename to server/characters/character_manager.hpp diff --git a/server/characters/makefile b/server/characters/makefile new file mode 100644 index 0000000..68368e7 --- /dev/null +++ b/server/characters/makefile @@ -0,0 +1,37 @@ +#config +INCLUDES+=. ../../common/gameplay ../../common/utilities +LIBS+= +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#output +OUTDIR=.. +OUT=$(addprefix $(OUTDIR)/,server.a) + +#targets +all: $(OBJ) $(OUT) + ar -crs $(OUT) $(OBJ) + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/server/combat_manager.cpp b/server/combat/combat_manager.cpp similarity index 100% rename from server/combat_manager.cpp rename to server/combat/combat_manager.cpp diff --git a/server/combat_manager.hpp b/server/combat/combat_manager.hpp similarity index 100% rename from server/combat_manager.hpp rename to server/combat/combat_manager.hpp diff --git a/server/combat/makefile b/server/combat/makefile new file mode 100644 index 0000000..68368e7 --- /dev/null +++ b/server/combat/makefile @@ -0,0 +1,37 @@ +#config +INCLUDES+=. ../../common/gameplay ../../common/utilities +LIBS+= +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#output +OUTDIR=.. +OUT=$(addprefix $(OUTDIR)/,server.a) + +#targets +all: $(OBJ) $(OUT) + ar -crs $(OUT) $(OBJ) + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/server/enemy_factory_generic.cpp b/server/enemies/enemy_factory_generic.cpp similarity index 100% rename from server/enemy_factory_generic.cpp rename to server/enemies/enemy_factory_generic.cpp diff --git a/server/enemy_factory_generic.hpp b/server/enemies/enemy_factory_generic.hpp similarity index 100% rename from server/enemy_factory_generic.hpp rename to server/enemies/enemy_factory_generic.hpp diff --git a/server/enemy_factory_interface.hpp b/server/enemies/enemy_factory_interface.hpp similarity index 88% rename from server/enemy_factory_interface.hpp rename to server/enemies/enemy_factory_interface.hpp index 335814e..8e97e78 100644 --- a/server/enemy_factory_interface.hpp +++ b/server/enemies/enemy_factory_interface.hpp @@ -23,7 +23,7 @@ #define ENEMYFACTORYINTERFACE_HPP_ #include "enemy_data.hpp" -#include "room_data.hpp" +#include "map_type.hpp" #include @@ -36,13 +36,14 @@ public: virtual void Generate(std::list* container) = 0; //control the difficulty of the room - RoomData::RoomType SetType(RoomData::RoomType t) { return type = t; } + MapType SetType(MapType t) { return type = t; } + MapType GetType() { return type; } + int SetDifficulty(int d) { return difficulty = d; } - RoomData::RoomType GetType() { return type; } int GetDifficulty() { return difficulty; } protected: - RoomData::RoomType type; - int difficulty; + MapType type; + int difficulty = 0; }; #endif diff --git a/server/enemy_manager.cpp b/server/enemies/enemy_manager.cpp similarity index 100% rename from server/enemy_manager.cpp rename to server/enemies/enemy_manager.cpp diff --git a/server/enemy_manager.hpp b/server/enemies/enemy_manager.hpp similarity index 100% rename from server/enemy_manager.hpp rename to server/enemies/enemy_manager.hpp diff --git a/server/enemies/makefile b/server/enemies/makefile new file mode 100644 index 0000000..8c2156a --- /dev/null +++ b/server/enemies/makefile @@ -0,0 +1,37 @@ +#config +INCLUDES+=. ../mapgen ../../common/gameplay ../../common/map ../../common/utilities +LIBS+= +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#output +OUTDIR=.. +OUT=$(addprefix $(OUTDIR)/,server.a) + +#targets +all: $(OBJ) $(OUT) + ar -crs $(OUT) $(OBJ) + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/server/linit.cpp b/server/linit.cpp index 13541f2..8108a49 100644 --- a/server/linit.cpp +++ b/server/linit.cpp @@ -37,7 +37,10 @@ #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" //these libs are loaded by lua.c and are readily available to any Lua program static const luaL_Reg loadedlibs[] = { @@ -53,9 +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}, + //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/makefile b/server/makefile index 1d8df31..642dec3 100644 --- a/server/makefile +++ b/server/makefile @@ -1,6 +1,6 @@ #config -INCLUDES+=. ../common/gameplay ../common/map ../common/network ../common/network/packet ../common/network/serial ../common/utilities -LIBS+=../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua -lsqlite3 +INCLUDES+=. accounts characters combat enemies mapgen mapgen/generators rooms ../common/gameplay ../common/map ../common/network ../common/network/packet ../common/network/serial ../common/utilities +LIBS+=server.a ../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua -lsqlite3 CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) #source @@ -16,6 +16,12 @@ OUT=$(addprefix $(OUTDIR)/,server) #targets all: $(OBJ) $(OUT) + $(MAKE) -C accounts + $(MAKE) -C characters + $(MAKE) -C combat + $(MAKE) -C enemies + $(MAKE) -C mapgen + $(MAKE) -C rooms $(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS) $(OBJ): | $(OBJDIR) diff --git a/server/mapgen/chunk_data.hpp b/server/mapgen/chunk_data.hpp new file mode 100644 index 0000000..c0c1621 --- /dev/null +++ b/server/mapgen/chunk_data.hpp @@ -0,0 +1,44 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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. +*/ +#ifndef CHUNKDATA_HPP_ +#define CHUNKDATA_HPP_ + +#include "terrain_type.hpp" + +#include + +struct ChunkData { + enum class Moddable { + LOCKED, //do not change + HARD, //minor changes + SOFT, //major changes + CLEAR, //untouched + }; + + TerrainType type; +// int fountainCount; + Moddable mod; +}; + +static_assert(std::is_pod::value, "ChunkData is not a POD"); + +#endif diff --git a/server/mapgen/generator_api.cpp b/server/mapgen/generator_api.cpp new file mode 100644 index 0000000..f3cc84f --- /dev/null +++ b/server/mapgen/generator_api.cpp @@ -0,0 +1,79 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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 "generator_api.hpp" + +#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 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 openGeneratorAPI(lua_State* L) { + luaL_newlib(L, generatorLib); + return 1; +} diff --git a/server/mapgen/generator_api.hpp b/server/mapgen/generator_api.hpp new file mode 100644 index 0000000..78c24c2 --- /dev/null +++ b/server/mapgen/generator_api.hpp @@ -0,0 +1,30 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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. +*/ +#ifndef GENERATORAPI_HPP_ +#define GENERATORAPI_HPP_ + +#include "lua/lua.hpp" + +#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 new file mode 100644 index 0000000..9afab6b --- /dev/null +++ b/server/mapgen/generators/base_generator.cpp @@ -0,0 +1,36 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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 "base_generator.hpp" + +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; + chunks[i][j].mod = ChunkData::Moddable::CLEAR; + } + } +} + +BaseGenerator::~BaseGenerator() { + // +} \ No newline at end of file diff --git a/server/mapgen/generators/base_generator.hpp b/server/mapgen/generators/base_generator.hpp new file mode 100644 index 0000000..6d629cd --- /dev/null +++ b/server/mapgen/generators/base_generator.hpp @@ -0,0 +1,54 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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. +*/ +#ifndef BASEGENERATOR_HPP_ +#define BASEGENERATOR_HPP_ + +#include "map_type.hpp" +#include "chunk_data.hpp" + +#include "lua/lua.hpp" + +constexpr int MAP_WIDTH = 256; +constexpr int MAP_HEIGHT = 256; + +class BaseGenerator { +public: + 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; +}; + +#endif diff --git a/server/mapgen/generators/caves_generator.cpp b/server/mapgen/generators/caves_generator.cpp new file mode 100644 index 0000000..0019bf5 --- /dev/null +++ b/server/mapgen/generators/caves_generator.cpp @@ -0,0 +1,30 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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 "caves_generator.hpp" + +CavesGenerator::CavesGenerator() : BaseGenerator(MapType::CAVES) { + // +} + +CavesGenerator::~CavesGenerator() { + // +} \ No newline at end of file diff --git a/server/mapgen/generators/caves_generator.hpp b/server/mapgen/generators/caves_generator.hpp new file mode 100644 index 0000000..062a86d --- /dev/null +++ b/server/mapgen/generators/caves_generator.hpp @@ -0,0 +1,36 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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. +*/ +#ifndef CAVESGENERATOR_HPP_ +#define CAVESGENERATOR_HPP_ + +#include "base_generator.hpp" + +class CavesGenerator : public BaseGenerator { +public: + CavesGenerator(); + ~CavesGenerator(); + +private: + // +}; + +#endif diff --git a/server/mapgen/generators/forests_generator.cpp b/server/mapgen/generators/forests_generator.cpp new file mode 100644 index 0000000..cbff079 --- /dev/null +++ b/server/mapgen/generators/forests_generator.cpp @@ -0,0 +1,30 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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 "forests_generator.hpp" + +ForestsGenerator::ForestsGenerator() : BaseGenerator(MapType::FORESTS) { + // +} + +ForestsGenerator::~ForestsGenerator() { + // +} \ No newline at end of file diff --git a/server/mapgen/generators/forests_generator.hpp b/server/mapgen/generators/forests_generator.hpp new file mode 100644 index 0000000..459428f --- /dev/null +++ b/server/mapgen/generators/forests_generator.hpp @@ -0,0 +1,36 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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. +*/ +#ifndef FORESTSGENERATOR_HPP_ +#define FORESTSGENERATOR_HPP_ + +#include "base_generator.hpp" + +class ForestsGenerator : public BaseGenerator { +public: + ForestsGenerator(); + ~ForestsGenerator(); + +private: + // +}; + +#endif diff --git a/server/mapgen/generators/makefile b/server/mapgen/generators/makefile new file mode 100644 index 0000000..3e4ed5b --- /dev/null +++ b/server/mapgen/generators/makefile @@ -0,0 +1,37 @@ +#config +INCLUDES+=. .. +LIBS+= +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#output +OUTDIR=../.. +OUT=$(addprefix $(OUTDIR)/,server.a) + +#targets +all: $(OBJ) $(OUT) + ar -crs $(OUT) $(OBJ) + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/server/mapgen/generators/overworld_generator.cpp b/server/mapgen/generators/overworld_generator.cpp new file mode 100644 index 0000000..7bcd1c5 --- /dev/null +++ b/server/mapgen/generators/overworld_generator.cpp @@ -0,0 +1,30 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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 "overworld_generator.hpp" + +OverworldGenerator::OverworldGenerator() : BaseGenerator(MapType::OVERWORLD) { + // +} + +OverworldGenerator::~OverworldGenerator() { + // +} \ No newline at end of file diff --git a/server/mapgen/generators/overworld_generator.hpp b/server/mapgen/generators/overworld_generator.hpp new file mode 100644 index 0000000..63fd418 --- /dev/null +++ b/server/mapgen/generators/overworld_generator.hpp @@ -0,0 +1,36 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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. +*/ +#ifndef OVERWORLDGENERATOR_HPP_ +#define OVERWORLDGENERATOR_HPP_ + +#include "base_generator.hpp" + +class OverworldGenerator : public BaseGenerator { +public: + OverworldGenerator(); + ~OverworldGenerator(); + +private: + // +}; + +#endif diff --git a/server/mapgen/generators/ruins_generator.cpp b/server/mapgen/generators/ruins_generator.cpp new file mode 100644 index 0000000..164de89 --- /dev/null +++ b/server/mapgen/generators/ruins_generator.cpp @@ -0,0 +1,30 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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 "ruins_generator.hpp" + +RuinsGenerator::RuinsGenerator() : BaseGenerator(MapType::RUINS) { + // +} + +RuinsGenerator::~RuinsGenerator() { + // +} \ No newline at end of file diff --git a/server/mapgen/generators/ruins_generator.hpp b/server/mapgen/generators/ruins_generator.hpp new file mode 100644 index 0000000..fbc0518 --- /dev/null +++ b/server/mapgen/generators/ruins_generator.hpp @@ -0,0 +1,36 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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. +*/ +#ifndef RUINSGENERATOR_HPP_ +#define RUINSGENERATOR_HPP_ + +#include "base_generator.hpp" + +class RuinsGenerator : public BaseGenerator { +public: + RuinsGenerator(); + ~RuinsGenerator(); + +private: + // +}; + +#endif diff --git a/server/mapgen/generators/towers_generator.cpp b/server/mapgen/generators/towers_generator.cpp new file mode 100644 index 0000000..ad50a09 --- /dev/null +++ b/server/mapgen/generators/towers_generator.cpp @@ -0,0 +1,30 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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 "towers_generator.hpp" + +TowersGenerator::TowersGenerator() : BaseGenerator(MapType::TOWERS) { + // +} + +TowersGenerator::~TowersGenerator() { + // +} \ No newline at end of file diff --git a/server/mapgen/generators/towers_generator.hpp b/server/mapgen/generators/towers_generator.hpp new file mode 100644 index 0000000..48a29bb --- /dev/null +++ b/server/mapgen/generators/towers_generator.hpp @@ -0,0 +1,36 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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. +*/ +#ifndef TOWERSGENERATOR_HPP_ +#define TOWERSGENERATOR_HPP_ + +#include "base_generator.hpp" + +class TowersGenerator : public BaseGenerator { +public: + TowersGenerator(); + ~TowersGenerator(); + +private: + // +}; + +#endif diff --git a/server/mapgen/makefile b/server/mapgen/makefile new file mode 100644 index 0000000..9a44bb4 --- /dev/null +++ b/server/mapgen/makefile @@ -0,0 +1,38 @@ +#config +INCLUDES+=. generators +LIBS+= +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#output +OUTDIR=.. +OUT=$(addprefix $(OUTDIR)/,server.a) + +#targets +all: $(OBJ) $(OUT) + ar -crs $(OUT) $(OBJ) + $(MAKE) -C generators + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/server/mapgen/map_type.hpp b/server/mapgen/map_type.hpp new file mode 100644 index 0000000..e56b924 --- /dev/null +++ b/server/mapgen/map_type.hpp @@ -0,0 +1,34 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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. +*/ +#ifndef MAPTYPE_HPP_ +#define MAPTYPE_HPP_ + +enum class MapType { + NONE, + OVERWORLD, + RUINS, + TOWERS, + FORESTS, + CAVES, +}; + +#endif \ No newline at end of file diff --git a/server/mapgen/terrain_type.hpp b/server/mapgen/terrain_type.hpp new file mode 100644 index 0000000..aadfaa9 --- /dev/null +++ b/server/mapgen/terrain_type.hpp @@ -0,0 +1,40 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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. +*/ +#ifndef TERRAINTYPE_HPP_ +#define TERRAINTYPE_HPP_ + +enum class TerrainType { + //default: something's wrong + NONE = 0, + + //standard overworld + PLAINS, + GRASS, + DIRT, + SAND, + WATER, + + //not used + LAST, +}; + +#endif diff --git a/server/room_manager.cpp b/server/room_manager.cpp deleted file mode 100644 index 8f60ba4..0000000 --- a/server/room_manager.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* Copyright: (c) Kayne Ruse 2014 - * - * 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 "room_manager.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 - if (luaState) { - roomMap[uid]->pager.SetLuaState(luaState); - } - return roomMap[uid]; -} - -RoomData* RoomManager::UnloadRoom(int uid) { - //TODO: unload room in the API - delete roomMap[uid]; - roomMap.erase(uid); -} - -RoomData* RoomManager::GetRoom(int uid) { - RoomData* ptr = FindRoom(uid); - if (ptr) return ptr; - ptr = CreateRoom(uid); - return ptr; -} - -RoomData* RoomManager::FindRoom(int uid) { - std::map::iterator it = roomMap.find(uid); - if (it == roomMap.end()) { - return nullptr; - } - 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; -} diff --git a/server/rooms/makefile b/server/rooms/makefile new file mode 100644 index 0000000..f4921ea --- /dev/null +++ b/server/rooms/makefile @@ -0,0 +1,37 @@ +#config +INCLUDES+=. ../mapgen ../mapgen/generators ../../common/map +LIBS+= +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#output +OUTDIR=.. +OUT=$(addprefix $(OUTDIR)/,server.a) + +#targets +all: $(OBJ) $(OUT) + ar -crs $(OUT) $(OBJ) + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/server/room_api.cpp b/server/rooms/room_api.cpp similarity index 63% rename from server/room_api.cpp rename to server/rooms/room_api.cpp index ea7ea52..3f217a8 100644 --- a/server/room_api.cpp +++ b/server/rooms/room_api.cpp @@ -21,43 +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; } -//RoomManager only -static int getRoom(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)); - - //push the room and return it - lua_pushlightuserdata(L, reinterpret_cast( roomMgr->GetRoom(lua_tointeger(L, -2)) )); +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}, - {"getroom",getRoom}, +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/room_api.hpp b/server/rooms/room_api.hpp similarity index 92% rename from server/room_api.hpp rename to server/rooms/room_api.hpp index a9c31a8..5d2eab8 100644 --- a/server/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/room_data.hpp b/server/rooms/room_data.hpp similarity index 90% rename from server/room_data.hpp rename to server/rooms/room_data.hpp index cf1b6cb..660e057 100644 --- a/server/room_data.hpp +++ b/server/rooms/room_data.hpp @@ -23,20 +23,14 @@ #define ROOMDATA_HPP_ //map system +#include "map_type.hpp" #include "region_pager_lua.hpp" +#include "base_generator.hpp" struct RoomData { - enum class RoomType { - OVERWORLD = 0, - RUINS = 1, - TOWERS = 2, - FORESTS = 3, - CAVE = 4, - }; - //members RegionPagerLua pager; - RoomType type; + BaseGenerator* generator = nullptr; //TODO: collision map //TODO: NPCs? diff --git a/server/rooms/room_manager.cpp b/server/rooms/room_manager.cpp new file mode 100644 index 0000000..3e4ec87 --- /dev/null +++ b/server/rooms/room_manager.cpp @@ -0,0 +1,132 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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 "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(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) { + newRoom->pager.SetLuaState(luaState); + newRoom->generator->SetLuaState(luaState); + } + + //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; +} + +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; + return CreateRoom(MapType::NONE); +} + +RoomData* RoomManager::FindRoom(int uid) { + std::map::iterator it = roomMap.find(uid); + if (it == roomMap.end()) { + return nullptr; + } + return it->second; +} + +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/room_manager.hpp b/server/rooms/room_manager.hpp similarity index 92% rename from server/room_manager.hpp rename to server/rooms/room_manager.hpp index 80480f7..02c5b32 100644 --- a/server/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 new file mode 100644 index 0000000..9907896 --- /dev/null +++ b/server/rooms/room_mgr_api.cpp @@ -0,0 +1,89 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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 "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); + lua_gettable(L, LUA_REGISTRYINDEX); + RoomManager* roomMgr = reinterpret_cast(lua_touserdata(L, -1)); + + //push the room and return it + lua_pushlightuserdata(L, reinterpret_cast( roomMgr->GetRoom(lua_tointeger(L, -2)) )); + return 1; +} + +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 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 new file mode 100644 index 0000000..f870e5e --- /dev/null +++ b/server/rooms/room_mgr_api.hpp @@ -0,0 +1,30 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * 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. +*/ +#ifndef ROOMMGRAPI_HPP_ +#define ROOMMGRAPI_HPP_ + +#include "lua/lua.hpp" + +#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