From 102ba18b7b11c349a6d4c466102cc9c146e9ff54 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Fri, 8 May 2015 23:17:35 +1000 Subject: [PATCH] Finally wrote the monster manager API --- rsc/scripts/setup_server.lua | 15 +++++++- server/entities/entity.hpp | 2 +- server/monsters/monster_data.cpp | 15 +++++++- server/monsters/monster_data.hpp | 13 ++++++- server/monsters/monster_manager.cpp | 10 ++++-- server/monsters/monster_manager.hpp | 3 +- server/monsters/monster_manager_api.cpp | 47 +++++++++++++++++++++++++ 7 files changed, 98 insertions(+), 7 deletions(-) diff --git a/rsc/scripts/setup_server.lua b/rsc/scripts/setup_server.lua index a815015..afe6690 100644 --- a/rsc/scripts/setup_server.lua +++ b/rsc/scripts/setup_server.lua @@ -27,6 +27,8 @@ print("Lua script check") --requirements roomManagerAPI = require("room_manager") roomAPI = require("room") +monsterManagerAPI = require("monster_manager") +monsterAPI = require("monster") mapMaker = require("map_maker") mapSaver = require("map_saver") @@ -43,7 +45,7 @@ roomManagerAPI.SetOnCreate(function(room, index) end) roomAPI.ForEachMonster(room, function(monster) - -- + --TODO: move ForEachMonster to the monster manager API end) end) end) @@ -62,4 +64,15 @@ roomAPI.Initialize(underworld, mapSaver.Load, mapSaver.Save, mapMaker.DebugGrass --call the monstrosity doorUtility.createDoorPair("pair 1", overworld, -64, -64, underworld, 64, 64) +--testing the monster creation +print("testing monsters") +local monsterMgr = roomAPI.GetMonsterMgr(overworld) + +local monster, mIndex = monsterManagerAPI.Create(monsterMgr, "skume.bmp", 0) + +print("Monster count: ", monsterManagerAPI.GetLoadedCount(monsterMgr)) +print("Monster avatar: ", monsterAPI.GetAvatar(monster), mIndex) + +monsterManagerAPI.UnloadAll(monsterMgr) + print("Finished the lua script") diff --git a/server/entities/entity.hpp b/server/entities/entity.hpp index 623a912..e7e9250 100644 --- a/server/entities/entity.hpp +++ b/server/entities/entity.hpp @@ -46,7 +46,7 @@ public: const char* GetType() const; protected: - Entity(const char*); + Entity(const char* type); virtual ~Entity() = default; int roomIndex = -1; diff --git a/server/monsters/monster_data.cpp b/server/monsters/monster_data.cpp index 8a29f12..d2d6abf 100644 --- a/server/monsters/monster_data.cpp +++ b/server/monsters/monster_data.cpp @@ -21,10 +21,23 @@ */ #include "monster_data.hpp" -MonsterData::MonsterData(): Entity("monster") { +MonsterData::MonsterData(std::string _avatar, int _scriptRef): + Entity("monster"), + avatar(_avatar), + scriptRef(_scriptRef) +{ //EMPTY } +void MonsterData::Update() { + Entity::Update(); + //TODO: (0) call the script reference +} + +//------------------------- +//accessors & mutators +//------------------------- + std::string MonsterData::SetAvatar(std::string s) { return avatar = s; } diff --git a/server/monsters/monster_data.hpp b/server/monsters/monster_data.hpp index 44a5300..45fb3dd 100644 --- a/server/monsters/monster_data.hpp +++ b/server/monsters/monster_data.hpp @@ -28,11 +28,22 @@ #include +/* DOCS: Monster attributes, read more + * species (avatar, script) + * level + * health/mana + * permadeath/respawn +*/ + class MonsterData: public Entity { public: - MonsterData(); + MonsterData(std::string avatar, int scriptRef); ~MonsterData() = default; + virtual void Update(); + + //accessors & mutators + std::string SetAvatar(std::string); std::string GetAvatar(); diff --git a/server/monsters/monster_manager.cpp b/server/monsters/monster_manager.cpp index a8cf51c..7f9a11a 100644 --- a/server/monsters/monster_manager.cpp +++ b/server/monsters/monster_manager.cpp @@ -29,10 +29,16 @@ MonsterManager::~MonsterManager() { UnloadAll(); } -int MonsterManager::Create(std::string s) { - //TODO: (1) MonsterManager::Create() +int MonsterManager::Create(std::string avatar, int scriptRef) { + //implicitly create the new + elementMap.emplace(counter, MonsterData(avatar, scriptRef)); + + //TODO: do various things like saving to the database + return counter++; } +//TODO: (1) monster load, save + void MonsterManager::Unload(int uid) { elementMap.erase(uid); } diff --git a/server/monsters/monster_manager.hpp b/server/monsters/monster_manager.hpp index 5d74e4c..7ab1dfd 100644 --- a/server/monsters/monster_manager.hpp +++ b/server/monsters/monster_manager.hpp @@ -37,7 +37,7 @@ public: ~MonsterManager(); //common public methods - int Create(std::string); + int Create(std::string avatar, int scriptRef); void Unload(int uid); void UnloadAll(); @@ -57,6 +57,7 @@ public: private: //members std::map elementMap; + int counter = 0; lua_State* lua = nullptr; sqlite3* database = nullptr; }; diff --git a/server/monsters/monster_manager_api.cpp b/server/monsters/monster_manager_api.cpp index 6fc6a81..08be549 100644 --- a/server/monsters/monster_manager_api.cpp +++ b/server/monsters/monster_manager_api.cpp @@ -23,7 +23,54 @@ #include "monster_manager.hpp" +static int create(lua_State* L) { + MonsterManager* mgr = static_cast(lua_touserdata(L, 1)); + int index = mgr->Create(lua_tostring(L, 2), lua_tointeger(L, 3)); + MonsterData* monster = mgr->Get(index); + lua_pushlightuserdata(L, static_cast(monster)); + lua_pushinteger(L, index); + return 2; +} + +//TOOD: this needs to take the userdata as a parameter too +static int unload(lua_State* L) { + MonsterManager* mgr = static_cast(lua_touserdata(L, 1)); + mgr->Unload(lua_tointeger(L, 2)); + return 0; +} + +static int unloadAll(lua_State* L) { + MonsterManager* mgr = static_cast(lua_touserdata(L, 1)); + mgr->UnloadAll(); + return 0; +} + +static int unloadIf(lua_State* L) { + MonsterManager* mgr = static_cast(lua_touserdata(L, 1)); + //TODO: unloadIf + return 0; +} + +static int get(lua_State* L) { + MonsterManager* mgr = static_cast(lua_touserdata(L, 1)); + MonsterData* monster = mgr->Get(lua_tointeger(L, 2)); + lua_pushlightuserdata(L, static_cast(monster)); + return 1; +} + +static int getLoadedCount(lua_State* L) { + MonsterManager* mgr = static_cast(lua_touserdata(L, 1)); + lua_pushinteger(L, mgr->GetLoadedCount()); + return 1; +} + static const luaL_Reg monsterManagerLib[] = { + {"Create", create}, + {"Unload", unload}, + {"UnloadAll", unloadAll}, +// {"UnloadIf", unloadIf}, + {"Get", get}, + {"GetLoadedCount", getLoadedCount}, {nullptr, nullptr} };