Compare commits

..

3 Commits

Author SHA1 Message Date
Kayne Ruse 7c51f820d5 I fucking hate collisions 2014-12-27 20:27:24 +11:00
Kayne Ruse 8bf45bc8e4 Merge branch 'high-water-mark' into collisions 2014-12-27 19:30:12 +11:00
Kayne Ruse 5c1ea1988e Trying to implement smooth collisions without other issues 2014-12-27 16:43:40 +11:00
64 changed files with 418 additions and 1145 deletions
+1 -1
View File
@@ -26,7 +26,7 @@ The most recent stable build for Windows can be found [here](https://dl.dropboxu
The current version of Tortuga is released under the [zlib license](http://en.wikipedia.org/wiki/Zlib_License).
Copyright (c) 2013-2015 Kayne Ruse
Copyright (c) 2013, 2014 Kayne Ruse
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.
+51 -7
View File
@@ -21,15 +21,59 @@
*/
#include "local_character.hpp"
#include <iostream>
bool LocalCharacter::ProcessCollisions(std::list<BoundingBox>& boxList) {
if (CheckCollisionSimple(boxList, origin + motion)) {
Vector2 velocity;
velocity.x = CorrectVelocityX(boxList, motion.x);
velocity.y = CorrectVelocityY(boxList, motion.y);
origin += velocity;
return true;
}
else {
origin += motion;
return false;
}
}
bool LocalCharacter::ProcessCollisionGrid(std::list<BoundingBox> boxList) {
for(auto& box : boxList) {
if (box.CheckOverlap(origin + bounds)) {
origin -= motion;
motion = {0, 0};
bool LocalCharacter::CheckCollisionSimple(std::list<BoundingBox>& boxList, Vector2 newPos) {
for (auto& it : boxList) {
if (it.CheckOverlap(bounds + newPos)) {
return true;
}
}
return false;
}
}
double LocalCharacter::CorrectVelocityX(std::list<BoundingBox>& boxList, double velocityX) {
double ret = velocityX;
for (auto& it : boxList) {
if (it.CheckOverlap(bounds + origin + Vector2(velocityX, 0) )) {
if (velocityX > 0) {
ret = std::min(ret, it.x - (origin.x + bounds.x + bounds.w -1));
ret = std::min(ret, 0.0);
}
else if (velocityX < 0) {
ret = std::max(ret, (it.x + it.w) - (origin.x + bounds.x));
ret = std::max(ret, 0.0);
}
}
}
return ret;
}
double LocalCharacter::CorrectVelocityY(std::list<BoundingBox>& boxList, double velocityY) {
double ret = velocityY;
for (auto& it : boxList) {
if (it.CheckOverlap(bounds + origin + Vector2(0, velocityY) )) {
if (velocityY > 0) {
ret = std::min(ret, it.y - (origin.y + bounds.y + bounds.h -1));
ret = std::min(ret, 0.0);
}
else if (velocityY < 0) {
ret = std::max(ret, (it.y + it.h) - (origin.y + bounds.y));
ret = std::max(ret, 0.0);
}
}
}
return ret;
}
+5 -3
View File
@@ -33,10 +33,12 @@ public:
LocalCharacter() = default;
virtual ~LocalCharacter() = default;
bool ProcessCollisionGrid(std::list<BoundingBox>);
bool ProcessCollisions(std::list<BoundingBox>& boxList);
private:
//NOTE: NO MEMBERS
protected:
bool CheckCollisionSimple(std::list<BoundingBox>& boxList, Vector2 newPos);
double CorrectVelocityX(std::list<BoundingBox>& boxList, double velocityX);
double CorrectVelocityY(std::list<BoundingBox>& boxList, double velocityY);
};
#endif
+49 -75
View File
@@ -134,12 +134,27 @@ void InWorld::Update() {
//free the buffer
delete reinterpret_cast<char*>(packetBuffer);
//heartbeat system
CheckHeartBeat();
//check the connection (heartbeat)
if (Clock::now() - lastBeat > std::chrono::seconds(3)) {
if (attemptedBeats > 2) {
//escape to the disconnect screen
SendDisconnectRequest();
SetNextScene(SceneList::DISCONNECTEDSCREEN);
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "Error: Lost connection to the server";
}
else {
ServerPacket newPacket;
newPacket.type = SerialPacketType::PING;
network.SendTo(Channels::SERVER, &newPacket);
attemptedBeats++;
lastBeat = Clock::now();
}
}
//update all entities
for (auto& it : characterMap) {
it.second.Update();
// it.second.Update();
}
for (auto& it : monsterMap) {
it.second.Update();
@@ -153,14 +168,35 @@ void InWorld::Update() {
return;
}
//get the collidable boxes
std::list<BoundingBox> boxList = GenerateCollisionGrid(localCharacter, tileSheet.GetTileW(), tileSheet.GetTileH());
//prepare for collisions
BoundingBox wallBounds = {0, 0, tileSheet.GetTileW(), tileSheet.GetTileH()};
std::list<BoundingBox> boxList;
//NOTE: for loops were too dense to work with, so I've just used while loops
//NOTE: this code is complex, and can be replaced with hard-coded relative positions, at the cost of variable-sized sprites/bounding boxes
//outer loop
wallBounds.x = snapToBase((double)wallBounds.w, localCharacter->GetOrigin().x) - wallBounds.w;
while(wallBounds.x < (localCharacter->GetOrigin() + localCharacter->GetBounds()).x + localCharacter->GetBounds().w) {
//inner loop
wallBounds.y = snapToBase((double)wallBounds.h, localCharacter->GetOrigin().y) - wallBounds.h;
while(wallBounds.y < (localCharacter->GetOrigin() + localCharacter->GetBounds()).y + localCharacter->GetBounds().h) {
//check to see if this tile is solid
if (regionPager.GetSolid(wallBounds.x / wallBounds.w, wallBounds.y / wallBounds.h)) {
//push onto the box set
boxList.push_front(wallBounds);
}
//increment
wallBounds.y += wallBounds.h;
}
//increment
wallBounds.x += wallBounds.w;
}
//process the collisions
if (localCharacter->ProcessCollisionGrid(boxList)) {
localCharacter->CorrectSprite();
SendLocalCharacterMotion();
}
localCharacter->ProcessCollisions(boxList);
//update the camera
camera.x = localCharacter->GetOrigin().x - camera.marginX;
@@ -463,26 +499,6 @@ void InWorld::HandleDisconnectForced(ClientPacket* const argPacket) {
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "You have been forcibly disconnected by the server";
}
void InWorld::CheckHeartBeat() {
//check the connection (heartbeat)
if (Clock::now() - lastBeat > std::chrono::seconds(3)) {
if (attemptedBeats > 2) {
//escape to the disconnect screen
SendDisconnectRequest();
SetNextScene(SceneList::DISCONNECTEDSCREEN);
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "Error: Lost connection to the server";
}
else {
ServerPacket newPacket;
newPacket.type = SerialPacketType::PING;
network.SendTo(Channels::SERVER, &newPacket);
attemptedBeats++;
lastBeat = Clock::now();
}
}
}
//-------------------------
//map management
//-------------------------
@@ -501,9 +517,7 @@ void InWorld::SendRegionRequest(int roomIndex, int x, int y) {
void InWorld::HandleRegionContent(RegionPacket* const argPacket) {
//replace existing regions
regionPager.UnloadIf([&](Region const& region) -> bool {
return region.GetX() == argPacket->x && region.GetY() == argPacket->y;
});
regionPager.UnloadRegion(argPacket->x, argPacket->y);
regionPager.PushRegion(argPacket->region);
//clean up after the serial code
@@ -542,9 +556,9 @@ void InWorld::UpdateMap() {
//entity management
//-------------------------
//DOCS: preexisting characters will result in query responses
//DOCS: new characters will result in create messages
//DOCS: this client's character will exist in both (skipped)
//NOTE: preexisting characters will result in query responses
//NOTE: new characters will result in create messages
//NOTE: this client's character will exist in both (skipped)
void InWorld::HandleCharacterCreate(CharacterPacket* const argPacket) {
//prevent double message
@@ -677,11 +691,6 @@ void InWorld::HandleCharacterSetRoom(CharacterPacket* const argPacket) {
}
void InWorld::HandleCharacterSetOrigin(CharacterPacket* const argPacket) {
//TODO: Authentication
if (argPacket->characterIndex == characterIndex) {
return;
}
//check that this character exists
std::map<int, BaseCharacter>::iterator characterIt = characterMap.find(argPacket->characterIndex);
if (characterIt != characterMap.end()) {
@@ -693,11 +702,6 @@ void InWorld::HandleCharacterSetOrigin(CharacterPacket* const argPacket) {
}
void InWorld::HandleCharacterSetMotion(CharacterPacket* const argPacket) {
//TODO: Authentication
if (argPacket->characterIndex == characterIndex) {
return;
}
//check that this character exists
std::map<int, BaseCharacter>::iterator characterIt = characterMap.find(argPacket->characterIndex);
if (characterIt != characterMap.end()) {
@@ -724,34 +728,4 @@ void InWorld::SendLocalCharacterMotion() {
newPacket.motion = localCharacter->GetMotion();
network.SendTo(Channels::SERVER, &newPacket);
}
std::list<BoundingBox> InWorld::GenerateCollisionGrid(Entity* ptr, int tileWidth, int tileHeight) {
//prepare for collisions
BoundingBox wallBounds = {0, 0, tileWidth, tileHeight};
std::list<BoundingBox> boxList;
//NOTE: for loops were too dense to work with, so I've just used while loops
//outer loop
wallBounds.x = snapToBase((double)wallBounds.w, ptr->GetOrigin().x);
while(wallBounds.x < (ptr->GetOrigin() + ptr->GetBounds()).x + ptr->GetBounds().w) {
//inner loop
wallBounds.y = snapToBase((double)wallBounds.h, ptr->GetOrigin().y);
while(wallBounds.y < (ptr->GetOrigin() + ptr->GetBounds()).y + ptr->GetBounds().h) {
//check to see if this tile is solid
if (regionPager.GetSolid(wallBounds.x / wallBounds.w, wallBounds.y / wallBounds.h)) {
//push onto the box set
boxList.push_front(wallBounds);
}
//increment
wallBounds.y += wallBounds.h;
}
//increment
wallBounds.x += wallBounds.w;
}
return std::move(boxList);
}
-3
View File
@@ -85,8 +85,6 @@ protected:
void HandleDisconnectResponse(ClientPacket* const);
void HandleDisconnectForced(ClientPacket* const);
void CheckHeartBeat();
//map management
void SendRegionRequest(int roomIndex, int x, int y);
void HandleRegionContent(RegionPacket* const);
@@ -102,7 +100,6 @@ protected:
//player movement
void SendLocalCharacterMotion();
std::list<BoundingBox> GenerateCollisionGrid(Entity*, int tileWidth, int tileHeight);
//indexes
int& clientIndex;
+21 -1
View File
@@ -26,11 +26,31 @@
#include "region_pager_api.hpp"
#include "tile_sheet_api.hpp"
//macros
#include "region.hpp"
//useful "globals"
//...
static int getRegionWidth(lua_State* L) {
lua_pushinteger(L, REGION_WIDTH);
return 1;
}
static int getRegionHeight(lua_State* L) {
lua_pushinteger(L, REGION_HEIGHT);
return 1;
}
static int getRegionDepth(lua_State* L) {
lua_pushinteger(L, REGION_DEPTH);
return 1;
}
//This mimics linit.c to create a nested collection of all map modules.
static const luaL_Reg funcs[] = {
//synonyms
{"GetRegionWidth", getRegionWidth},
{"GetRegionHeight", getRegionHeight},
{"GetRegionDepth", getRegionDepth},
{nullptr, nullptr}
};
+1 -13
View File
@@ -21,9 +21,9 @@
*/
#include "region.hpp"
#include <stdexcept>
#include <cmath>
#include <cstring>
#include <stdexcept>
int snapToBase(int base, int x) {
return floor((double)x / base) * base;
@@ -55,16 +55,4 @@ bool Region::SetSolid(int x, int y, bool b) {
bool Region::GetSolid(int x, int y) {
return solid[x * REGION_WIDTH + y];
}
int Region::GetX() const {
return x;
}
int Region::GetY() const {
return y;
}
std::bitset<REGION_WIDTH*REGION_HEIGHT>* Region::GetSolidBitset() {
return &solid;
}
+3 -3
View File
@@ -48,10 +48,10 @@ public:
bool GetSolid(int x, int y);
//accessors
int GetX() const;
int GetY() const;
int GetX() const { return x; }
int GetY() const { return y; }
std::bitset<REGION_WIDTH*REGION_HEIGHT>* GetSolidBitset();
std::bitset<REGION_WIDTH*REGION_HEIGHT>* GetSolidBitset() { return &solid; }
private:
const int x;
const int y;
-2
View File
@@ -85,8 +85,6 @@ static const luaL_Reg regionLib[] = {
{"GetSolid",getSolid},
{"GetX",getX},
{"GetY",getY},
//the global macros
{"GetWidth",getWidth},
{"GetHeight",getHeight},
{"GetDepth",getDepth},
+1 -26
View File
@@ -84,22 +84,7 @@ static int createRegion(lua_State* L) {
static int unloadRegion(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
//two argument types: coords & the region itself
switch(lua_type(L, 2)) {
case LUA_TNUMBER:
pager->UnloadIf([&](Region const& region) -> bool {
int x = lua_tointeger(L, 2);
int y = lua_tointeger(L, 3);
return region.GetX() == x && region.GetY() == y;
});
break;
case LUA_TLIGHTUSERDATA:
pager->UnloadIf([&](Region const& region) -> bool {
return (&region) == lua_touserdata(L, 2);
});
break;
}
pager->UnloadRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
return 0;
}
@@ -131,13 +116,6 @@ static int setOnUnload(lua_State* L) {
return 0;
}
//debugging
static int containerSize(lua_State* L) {
RegionPagerLua* pager = static_cast<RegionPagerLua*>(lua_touserdata(L, 1));
lua_pushinteger(L, pager->GetContainer()->size());
return 1;
}
static const luaL_Reg regionPagerLib[] = {
//curry
{"SetTile", setTile},
@@ -158,9 +136,6 @@ static const luaL_Reg regionPagerLib[] = {
{"SetOnCreate",setOnCreate},
{"SetOnUnload",setOnUnload},
//debugging
{"ContainerSize", containerSize},
//sentinel
{nullptr, nullptr}
};
+4 -10
View File
@@ -24,10 +24,6 @@
#include <stdexcept>
#include <algorithm>
RegionPagerBase::~RegionPagerBase() {
UnloadAll();
};
Region::type_t RegionPagerBase::SetTile(int x, int y, int z, Region::type_t v) {
Region* ptr = GetRegion(x, y);
return ptr->SetTile(x - ptr->GetX(), y - ptr->GetY(), z, v);
@@ -92,14 +88,12 @@ Region* RegionPagerBase::CreateRegion(int x, int y) {
return &regionList.front();
}
void RegionPagerBase::UnloadIf(std::function<bool(Region const&)> fn) {
regionList.remove_if(fn);
void RegionPagerBase::UnloadRegion(int x, int y) {
regionList.remove_if([x, y](Region& region) -> bool {
return region.GetX() == x && region.GetY() == y;
});
}
void RegionPagerBase::UnloadAll() {
regionList.clear();
}
std::list<Region>* RegionPagerBase::GetContainer() {
return &regionList;
}
+3 -4
View File
@@ -24,13 +24,12 @@
#include "region.hpp"
#include <functional>
#include <list>
class RegionPagerBase {
public:
RegionPagerBase() = default;
virtual ~RegionPagerBase();
virtual ~RegionPagerBase() { UnloadAll(); };
//tile manipulation
virtual Region::type_t SetTile(int x, int y, int z, Region::type_t v);
@@ -48,12 +47,12 @@ public:
virtual Region* LoadRegion(int x, int y);
virtual Region* SaveRegion(int x, int y);
virtual Region* CreateRegion(int x, int y);
virtual void UnloadRegion(int x, int y);
virtual void UnloadIf(std::function<bool(Region const&)> fn);
virtual void UnloadAll();
//accessors & mutators
std::list<Region>* GetContainer();
std::list<Region>* GetContainer() { return &regionList; }
protected:
std::list<Region> regionList;
};
+3 -10
View File
@@ -23,9 +23,6 @@
#include <stdexcept>
//DOCS: Load, Save and Create fail unless the lua function has been set
//DOCS: UnloadIf and UnloadAll will still continue without the function set
RegionPagerLua::~RegionPagerLua() {
//unload all regions
UnloadAll();
@@ -133,25 +130,23 @@ Region* RegionPagerLua::CreateRegion(int x, int y) {
}
//no return
void RegionPagerLua::UnloadIf(std::function<bool(Region const&)> fn) {
void RegionPagerLua::UnloadRegion(int x, int y) {
//get the pager's function from the registry
lua_rawgeti(lua, LUA_REGISTRYINDEX, unloadRef);
//check if this function is available
if (lua_isnil(lua, -1)) {
lua_pop(lua, 1);
//remove the regions anyway
regionList.remove_if(fn);
return;
}
//run each region through this lambda
regionList.remove_if([&](Region& region) -> bool {
if (fn(region)) {
if (region.GetX() == x && region.GetY() == y) {
//push a copy of the function onto the stack with the region
lua_pushvalue(lua, -1);
lua_pushlightuserdata(lua, static_cast<void*>(&region));
lua_pushlightuserdata(lua, &region);
//call the function, 1 arg, 0 return
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
@@ -176,8 +171,6 @@ void RegionPagerLua::UnloadAll() {
//check if this function is available
if (lua_isnil(lua, -1)) {
lua_pop(lua, 1);
//remove the regions anyway
regionList.clear();
return;
}
+1 -2
View File
@@ -30,7 +30,6 @@
#include "lua.hpp"
#endif
#include <functional>
#include <string>
class RegionPagerLua : public RegionPagerBase {
@@ -42,8 +41,8 @@ public:
Region* LoadRegion(int x, int y) override;
Region* SaveRegion(int x, int y) override;
Region* CreateRegion(int x, int y) override;
void UnloadRegion(int x, int y) override;
void UnloadIf(std::function<bool(Region const&)> fn) override;
void UnloadAll() override;
//accessors & mutators
+1 -1
View File
@@ -26,7 +26,7 @@
#include <stdexcept>
//DOCS: memset() is used before sending a packet to remove old data; you don't want to send sensitive data over the network
//NOTE: memset() is used before sending a packet to remove old data; you don't want to send sensitive data over the network
//NOTE: don't confuse SerialPacketBase with UDPpacket
void UDPNetworkUtility::Open(int port) {
+1 -1
View File
@@ -2,7 +2,7 @@ Future versions (to be determined) may be released under a modified version of t
The current version of Tortuga is released under the zlib license.
Copyright (c) 2013-2015 Kayne Ruse
Copyright (c) 2013, 2014 Kayne Ruse
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.
-8
View File
@@ -36,12 +36,4 @@ function mapMaker.debugIsland(region)
end
end
function mapMaker.dirtLand(region)
for i = 1, mapSystem.Region.GetWidth(region) do
for j = 1, mapSystem.Region.GetHeight(region) do
mapSystem.Region.SetTile(region, i, j, 1, mapMaker.dirt)
end
end
end
return mapMaker
-2
View File
@@ -1,11 +1,9 @@
local mapSaver = {}
function mapSaver.Load(region)
--empty
print("map_saver.lua:mapSaver.Load(region)")
end
function mapSaver.Save(region)
--empty
print("map_saver.lua:mapSaver.Save(region)")
end
--TODO: create a flexible saving & loading system
return mapSaver
+17 -56
View File
@@ -1,71 +1,32 @@
print("Lua script check")
mapSystem = require "map_system"
mapMaker = require "map_maker"
mapSaver = require "map_saver"
roomSystem = require "room_system"
waypointSystem = require "waypoint_system"
local function dumpTable(t)
print(t)
for k, v in pairs(t) do
print("",k,v)
print("",k, v)
end
end
--create the overworld, set it's generator, loader & saver
--[[
local t = {
"overworld.bmp", --tileset name
mapSaver.load, --load function
mapSaver.save, --save function
mapMaker.debugIsland, --create function
mapSaver.save --unload function
}]]
dumpTable(roomSystem)
dumpTable(roomSystem.RoomManager)
dumpTable(roomSystem.Room)
--NOTE: room 0 is the first that the client asks for, therefore it must exist
local overworld, uid = roomSystem.RoomManager.CreateRoom("overworld", "overworld.bmp")
--NOTE: This is horrible; room initialization is important
mapSystem.RegionPager.SetOnLoad(roomSystem.Room.GetPager(overworld), mapSaver.Load)
mapSystem.RegionPager.SetOnSave(roomSystem.Room.GetPager(overworld), mapSaver.Save)
mapSystem.RegionPager.SetOnCreate(roomSystem.Room.GetPager(overworld), mapMaker.debugIsland)
mapSystem.RegionPager.SetOnUnload(roomSystem.Room.GetPager(overworld), mapSaver.Save)
--Dirt Land
local dirtLand = roomSystem.RoomManager.CreateRoom("dirt land", "overworld.bmp")
roomSystem.Room.Initialize(dirtLand, mapSaver.Load, mapSaver.Save, mapMaker.dirtLand, mapSaver.Save)
local overworld, uid = roomSystem.RoomManager.CreateRoom("overworld")
roomSystem.Room.Initialize(overworld, "overworld.bmp", mapSaver.Load, mapSaver.Save, mapMaker.debugIsland, mapSaver.Save)
print("Finished the lua script")
--[[
debugging test
Ideal output:
-------------------------
pager: userdata: [memory location]
Size 0: 0
[debug output from load]
Size 1: 1
[debug output from save]
Size 2: 0
[debug output from load]
Size 3: 1
[debug output from save]
Size 4: 0
-------------------------
--]-]
print("-------------------------")
local pager = roomSystem.Room.GetPager(overworld)
print("pager:", pager)
print("Size 0:", mapSystem.RegionPager.ContainerSize(pager))
local regionFoo = mapSystem.RegionPager.GetRegion(pager, 0, 0)
print("Size 1:", mapSystem.RegionPager.ContainerSize(pager))
mapSystem.RegionPager.UnloadRegion(pager, regionFoo)
print("Size 2:", mapSystem.RegionPager.ContainerSize(pager))
local regionFoo = mapSystem.RegionPager.GetRegion(pager, 0, 0)
print("Size 3:", mapSystem.RegionPager.ContainerSize(pager))
mapSystem.RegionPager.UnloadRegion(pager, 0, 0)
print("Size 4:", mapSystem.RegionPager.ContainerSize(pager))
print("-------------------------")
--]]
+2 -1
View File
@@ -200,7 +200,7 @@ void AccountManager::UnloadAll() {
elementMap.clear();
}
void AccountManager::UnloadIf(std::function<bool(std::pair<const int, AccountData const&>)> fn) {
void AccountManager::UnloadIf(std::function<bool(std::pair<const int, AccountData>)> fn) {
//replicate std::remove_if, using custom code
std::map<int, AccountData>::iterator it = elementMap.begin();
while (it != elementMap.end()) {
@@ -219,6 +219,7 @@ void AccountManager::UnloadIf(std::function<bool(std::pair<const int, AccountDat
//-------------------------
AccountData* AccountManager::Get(int uid) {
//TODO: could this load an account first?
std::map<int, AccountData>::iterator it = elementMap.find(uid);
if (it == elementMap.end()) {
+16 -14
View File
@@ -24,6 +24,7 @@
#include "account_data.hpp"
#include "singleton.hpp"
#include "manager_interface.hpp"
#if defined(__MINGW32__)
#include "sqlite3/sqlite3.h"
@@ -34,23 +35,26 @@
#include <functional>
#include <map>
class AccountManager: public Singleton<AccountManager> {
class AccountManager:
public Singleton<AccountManager>,
public ManagerInterface<AccountData, std::string, int>
{
public:
//common public methods
int Create(std::string username, int clientIndex);
int Load(std::string username, int clientIndex);
int Save(int uid);
void Unload(int uid);
void Delete(int uid);
int Create(std::string username, int clientIndex) override;
int Load(std::string username, int clientIndex) override;
int Save(int uid) override;
void Unload(int uid) override;
void Delete(int uid) override;
void UnloadAll();
void UnloadIf(std::function<bool(std::pair<const int, AccountData const&>)> fn);
void UnloadAll() override;
void UnloadIf(std::function<bool(std::pair<const int, AccountData>)> fn) override;
//accessors and mutators
AccountData* Get(int uid);
int GetLoadedCount();
int GetTotalCount();
std::map<int, AccountData>* GetContainer();
AccountData* Get(int uid) override;
int GetLoadedCount() override;
int GetTotalCount() override;
std::map<int, AccountData>* GetContainer() override;
sqlite3* SetDatabase(sqlite3* db);
sqlite3* GetDatabase();
@@ -61,8 +65,6 @@ private:
AccountManager() = default;
~AccountManager() = default;
//members
std::map<int, AccountData> elementMap;
sqlite3* database = nullptr;
};
-33
View File
@@ -1,33 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 "character_api.hpp"
#include "character_data.hpp"
static const luaL_Reg characterLib[] = {
{nullptr, nullptr}
};
LUAMOD_API int openCharacterAPI(lua_State* L) {
luaL_newlib(L, characterLib);
return 1;
}
-34
View File
@@ -1,34 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 CHARACTERAPI_HPP_
#define CHARACTERAPI_HPP_
#if defined(__MINGW32__)
#include "lua/lua.hpp"
#else
#include "lua.hpp"
#endif
#define TORTUGA_CHARACTER_API "character"
LUAMOD_API int openCharacterAPI(lua_State* L);
#endif
-24
View File
@@ -30,33 +30,9 @@
#include <string>
#include <cmath>
#include <iostream>
class CharacterData: public Entity {
public:
CharacterData() = default;
CharacterData(CharacterData const& rhs) {
std::cerr << "Character copy detected" << std::endl;
owner = rhs.owner;
handle = rhs.handle;
avatar = rhs.avatar;
//entity stuff
roomIndex = rhs.roomIndex;
origin = rhs.origin;
motion = rhs.motion;
}
CharacterData(CharacterData&& rhs) {
std::cerr << "Character move detected" << std::endl;
owner = rhs.owner;
handle = rhs.handle;
avatar = rhs.avatar;
//entity stuff
roomIndex = rhs.roomIndex;
origin = rhs.origin;
motion = rhs.motion;
}
~CharacterData() = default;
//accessors and mutators
+2 -2
View File
@@ -229,7 +229,7 @@ void CharacterManager::UnloadAll() {
elementMap.clear();
}
void CharacterManager::UnloadIf(std::function<bool(std::pair<const int, CharacterData const&>)> fn) {
void CharacterManager::UnloadIf(std::function<bool(std::pair<const int, CharacterData>)> fn) {
std::map<int, CharacterData>::iterator it = elementMap.begin();
while (it != elementMap.end()) {
if (fn(*it)) {
@@ -253,7 +253,7 @@ CharacterData* CharacterManager::Get(int uid) {
return nullptr;
}
return &(it->second);
return &it->second;
}
int CharacterManager::GetLoadedCount() {
+16 -14
View File
@@ -24,6 +24,7 @@
#include "character_data.hpp"
#include "singleton.hpp"
#include "manager_interface.hpp"
#if defined(__MINGW32__)
#include "sqlite3/sqlite3.h"
@@ -34,23 +35,26 @@
#include <functional>
#include <map>
class CharacterManager: public Singleton<CharacterManager> {
class CharacterManager:
public Singleton<CharacterManager>,
public ManagerInterface<CharacterData, int, std::string, std::string>
{
public:
//common public methods
int Create(int owner, std::string handle, std::string avatar);
int Load(int owner, std::string handle, std::string avatar);
int Save(int uid);
void Unload(int uid);
void Delete(int uid);
int Create(int owner, std::string handle, std::string avatar) override;
int Load(int owner, std::string handle, std::string avatar) override;
int Save(int uid) override;
void Unload(int uid) override;
void Delete(int uid) override;
void UnloadAll();
void UnloadIf(std::function<bool(std::pair<const int, CharacterData const&>)> fn);
void UnloadAll() override;
void UnloadIf(std::function<bool(std::pair<const int, CharacterData>)> fn) override;
//accessors and mutators
CharacterData* Get(int uid);
int GetLoadedCount();
int GetTotalCount();
std::map<int, CharacterData>* GetContainer();
CharacterData* Get(int uid) override;
int GetLoadedCount() override;
int GetTotalCount() override;
std::map<int, CharacterData>* GetContainer() override;
sqlite3* SetDatabase(sqlite3* db);
sqlite3* GetDatabase();
@@ -61,8 +65,6 @@ private:
CharacterManager() = default;
~CharacterManager() = default;
//members
std::map<int, CharacterData> elementMap;
sqlite3* database = nullptr;
};
@@ -1,33 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 "character_manager_api.hpp"
#include "character_manager.hpp"
static const luaL_Reg characterManagerLib[] = {
{nullptr, nullptr}
};
LUAMOD_API int openCharacterManagerAPI(lua_State* L) {
luaL_newlib(L, characterManagerLib);
return 1;
}
@@ -1,34 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 CHARACTERMANAGERAPI_HPP_
#define CHARACTERMANAGERAPI_HPP_
#if defined(__MINGW32__)
#include "lua/lua.hpp"
#else
#include "lua.hpp"
#endif
#define TORTUGA_CHARACTER_MANAGER_API "character_manager"
LUAMOD_API int openCharacterManagerAPI(lua_State* L);
#endif
+2 -1
View File
@@ -73,11 +73,12 @@ void ClientManager::UnloadAll() {
elementMap.clear();
}
void ClientManager::UnloadIf(std::function<bool(std::pair<const int, ClientData const&>)> fn) {
void ClientManager::UnloadIf(std::function<bool(std::pair<const int, ClientData>)> fn) {
std::map<int, ClientData>::iterator it = elementMap.begin();
while (it != elementMap.end()) {
if (fn(*it)) {
it = elementMap.erase(it);
//TODO: ? disconnect, unload characters, notify other clients
}
else {
++it;
+18 -12
View File
@@ -23,32 +23,35 @@
#define CLIENTMANAGER_HPP_
#include "client_data.hpp"
#include "manager_interface.hpp"
#include "server_packet.hpp"
#include "singleton.hpp"
#include "SDL/SDL_net.h"
#include <functional>
#include <map>
class ClientManager: public Singleton<ClientManager> {
class ClientManager:
public Singleton<ClientManager>,
public ManagerInterface<ClientData, IPaddress>
{
public:
//methods
int CheckConnections();
void HandlePong(ServerPacket* const argPacket);
//common public methods
int Create(IPaddress);
void Unload(int uid);
int Create(IPaddress) override;
void Unload(int uid) override;
void UnloadAll();
void UnloadIf(std::function<bool(std::pair<const int, ClientData const&>)> fn);
void UnloadAll() override;
void UnloadIf(std::function<bool(std::pair<const int, ClientData>)> fn) override;
//accessors & mutators
ClientData* Get(int uid);
int GetLoadedCount();
int GetTotalCount();
std::map<int, ClientData>* GetContainer();
ClientData* Get(int uid) override;
int GetLoadedCount() override;
int GetTotalCount() override;
std::map<int, ClientData>* GetContainer() override;
private:
friend Singleton<ClientManager>;
@@ -56,8 +59,11 @@ private:
ClientManager() = default;
~ClientManager() = default;
//members
std::map<int, ClientData> elementMap;
//EMPTY
int Load(IPaddress) override { return -1; }
int Save(int uid) override { return -1; }
void Delete(int uid) override { return; }
int counter = 0;
};
@@ -19,12 +19,20 @@
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "waypoint_data.hpp"
#include "door_data.hpp"
int WaypointData::SetTriggerReference(int i) {
return triggerRef = i;
std::string DoorData::SetRoomName(std::string s) {
return roomName = s;
}
int WaypointData::GetTriggerReference() {
return triggerRef;
}
Vector2 DoorData::SetDestPosition(Vector2 v) {
return destPosition = v;
}
std::string DoorData::GetRoomName() {
return roomName;
}
Vector2 DoorData::GetDestPosition() {
return destPosition;
}
@@ -19,31 +19,31 @@
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#ifndef WAYPOINTDATA_HPP_
#define WAYPOINTDATA_HPP_
#ifndef DOORDATA_HPP_
#define DOORDATA_HPP_
#include "entity.hpp"
#if defined(__MINGW32__)
#include "lua/lua.hpp"
#else
#include "lua.hpp"
#endif
#include "vector2.hpp"
#include <string>
class WaypointData: public Entity {
class DoorData: public Entity {
public:
WaypointData() = default;
~WaypointData() = default;
DoorData() = default;
~DoorData() = default;
int SetTriggerReference(int i);
int GetTriggerReference();
//accessors & mutators
std::string SetRoomName(std::string);
Vector2 SetDestPosition(Vector2);
std::string GetRoomName();
Vector2 GetDestPosition();
private:
friend class WaypointManager;
friend class DoorManager;
int triggerRef = LUA_NOREF;
std::string roomName;
Vector2 destPosition;
};
#endif
@@ -19,48 +19,48 @@
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "waypoint_manager.hpp"
#include "door_manager.hpp"
int WaypointManager::Create() {
int DoorManager::Create(std::string, Vector2) {
//TODO
}
int WaypointManager::Load() {
int DoorManager::Load(std::string, Vector2) {
//TODO
}
int WaypointManager::Save(int uid) {
int DoorManager::Save(int uid) {
//TODO
}
void WaypointManager::Unload(int uid) {
void DoorManager::Unload(int uid) {
//TODO
}
void WaypointManager::Delete(int uid) {
void DoorManager::Delete(int uid) {
//TODO
}
void WaypointManager::UnloadAll() {
void DoorManager::UnloadAll() {
//TODO
}
void WaypointManager::UnloadIf(std::function<bool(std::pair<const int, WaypointData const&>)> fn) {
void DoorManager::UnloadIf(std::function<bool(std::pair<const int, DoorData>)> fn) {
//TODO
}
WaypointData* WaypointManager::Get(int uid) {
DoorData* DoorManager::Get(int uid) {
//TODO
}
int WaypointManager::GetLoadedCount() {
int DoorManager::GetLoadedCount() {
//TODO
}
int WaypointManager::GetTotalCount() {
int DoorManager::GetTotalCount() {
//TODO
}
std::map<int, WaypointData>* WaypointManager::GetContainer() {
std::map<int, DoorData>* DoorManager::GetContainer() {
//TODO
}
@@ -19,56 +19,43 @@
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#ifndef WAYPOINTMANAGER_HPP_
#define WAYPOINTMANAGER_HPP_
#ifndef DOORMANAGER_HPP_
#define DOORMANAGER_HPP_
#include "waypoint_data.hpp"
#include "door_data.hpp"
#include "manager_interface.hpp"
#include "singleton.hpp"
#include "vector2.hpp"
#if defined(__MINGW32__)
#include "lua/lua.hpp"
#else
#include "lua.hpp"
#endif
#include <functional>
#include <map>
#include <string>
//TODO: should waypoints be managed on a per-room basis?
class WaypointManager: public Singleton<WaypointManager> {
class DoorManager:
public Singleton<DoorManager>,
public ManagerInterface<DoorData, std::string, Vector2>
{
public:
//common public methods
int Create();
int Load();
int Save(int uid);
void Unload(int uid);
void Delete(int uid);
int Create(std::string, Vector2) override;
int Load(std::string, Vector2) override;
int Save(int uid) override;
void Unload(int uid) override;
void Delete(int uid) override;
void UnloadAll();
void UnloadIf(std::function<bool(std::pair<const int, WaypointData const&>)> fn);
void UnloadAll() override;
void UnloadIf(std::function<bool(std::pair<const int, DoorData>)> fn) override;
//accessors & mutators
WaypointData* Get(int uid);
int GetLoadedCount();
int GetTotalCount();
std::map<int, WaypointData>* GetContainer();
//hooks
lua_State* SetLuaState(lua_State* L) { return lua = L; }
lua_State* GetLuaState() { return lua; }
DoorData* Get(int uid) override;
int GetLoadedCount() override;
int GetTotalCount() override;
std::map<int, DoorData>* GetContainer() override;
private:
friend Singleton<WaypointManager>;
friend Singleton<DoorManager>;
WaypointManager() = default;
~WaypointManager() = default;
//members
std::map<int, WaypointData> elementMap;
lua_State* lua = nullptr;
int counter = 0;
DoorManager() = default;
~DoorManager() = default;
};
#endif
+1 -1
View File
@@ -38,7 +38,7 @@ public:
protected:
Entity() = default;
virtual ~Entity() = default;
~Entity() = default;
int roomIndex = -1;
Vector2 origin;
-77
View File
@@ -1,77 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 "entity_api.hpp"
#include "entity.hpp"
static int setRoomIndex(lua_State* L) {
Entity* entity = static_cast<Entity*>(lua_touserdata(L, 1));
entity->SetRoomIndex(lua_tointeger(L, 2));
return 0;
}
static int setOrigin(lua_State* L) {
Entity* entity = static_cast<Entity*>(lua_touserdata(L, 1));
entity->SetOrigin({lua_tonumber(L, 2), lua_tonumber(L, 3)});
return 0;
}
static int setMotion(lua_State* L) {
Entity* entity = static_cast<Entity*>(lua_touserdata(L, 1));
entity->SetMotion({lua_tonumber(L, 2), lua_tonumber(L, 3)});
return 0;
}
static int getRoomIndex(lua_State* L) {
Entity* entity = static_cast<Entity*>(lua_touserdata(L, 1));
lua_pushinteger(L, entity->GetRoomIndex());
return 1;
}
static int getOrigin(lua_State* L) {
Entity* entity = static_cast<Entity*>(lua_touserdata(L, 1));
lua_pushnumber(L, entity->GetOrigin().x);
lua_pushnumber(L, entity->GetOrigin().y);
return 2;
}
static int getMotion(lua_State* L) {
Entity* entity = static_cast<Entity*>(lua_touserdata(L, 1));
lua_pushnumber(L, entity->GetOrigin().x);
lua_pushnumber(L, entity->GetOrigin().y);
return 2;
}
static const luaL_Reg entityLib[] = {
{"SetRoomIndex", setRoomIndex},
{"SetOrigin", setOrigin},
{"SetMotion", setMotion},
{"GetRoomIndex", getRoomIndex},
{"GetOrigin", getOrigin},
{"GetMotion", getMotion},
{nullptr, nullptr}
};
LUAMOD_API int openEntityAPI(lua_State* L) {
luaL_newlib(L, entityLib);
return 1;
}
-34
View File
@@ -1,34 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 ENTITYAPI_HPP_
#define ENTITYAPI_HPP_
#if defined(__MINGW32__)
#include "lua/lua.hpp"
#else
#include "lua.hpp"
#endif
#define TORTUGA_ENTITY_API "entity"
LUAMOD_API int openEntityAPI(lua_State* L);
#endif
-2
View File
@@ -42,7 +42,6 @@
#include "map_system_api.hpp"
#include "room_system_api.hpp"
#include "waypoint_system_api.hpp"
//these libs are loaded by lua.c and are readily available to any Lua program
static const luaL_Reg loadedlibs[] = {
@@ -65,7 +64,6 @@ static const luaL_Reg loadedlibs[] = {
static const luaL_Reg preloadedlibs[] = {
{TORTUGA_MAP_SYSTEM_API, openMapSystemAPI},
{TORTUGA_ROOM_SYSTEM_API, openRoomSystemAPI},
{TORTUGA_WAYPOINT_SYSTEM_API, openWaypointSystemAPI},
{NULL, NULL}
};
+3 -3
View File
@@ -26,10 +26,10 @@
#include "character_manager.hpp"
#include "client_manager.hpp"
#include "config_utility.hpp"
#include "door_manager.hpp"
#include "monster_manager.hpp"
#include "room_manager.hpp"
#include "udp_network_utility.hpp"
#include "waypoint_manager.hpp"
#include <stdexcept>
#include <iostream>
@@ -43,10 +43,10 @@ int main(int argc, char* argv[]) {
CharacterManager::CreateSingleton();
ClientManager::CreateSingleton();
ConfigUtility::CreateSingleton();
DoorManager::CreateSingleton();
MonsterManager::CreateSingleton();
RoomManager::CreateSingleton();
UDPNetworkUtility::CreateSingleton();
WaypointManager::CreateSingleton();
//call the server's routines
ServerApplication::CreateSingleton();
@@ -63,10 +63,10 @@ int main(int argc, char* argv[]) {
CharacterManager::DeleteSingleton();
ClientManager::DeleteSingleton();
ConfigUtility::DeleteSingleton();
DoorManager::DeleteSingleton();
MonsterManager::DeleteSingleton();
RoomManager::DeleteSingleton();
UDPNetworkUtility::DeleteSingleton();
WaypointManager::DeleteSingleton();
}
catch(exception& e) {
cerr << "Fatal exception thrown: " << e.what() << endl;
+2 -2
View File
@@ -1,5 +1,5 @@
#include directories
INCLUDES+=. accounts characters clients entities monsters rooms server_utilities waypoints ../common/debugging ../common/gameplay ../common/map ../common/network ../common/network/packet_types ../common/utilities
INCLUDES+=. accounts characters clients doors entities monsters rooms server_utilities ../common/debugging ../common/gameplay ../common/map ../common/network ../common/network/packet_types ../common/utilities
#libraries
#the order of the $(LIBS) is important, at least for MinGW
@@ -28,11 +28,11 @@ all: $(OBJ) $(OUT)
$(MAKE) -C accounts
$(MAKE) -C characters
$(MAKE) -C clients
$(MAKE) -C doors
$(MAKE) -C entities
$(MAKE) -C monsters
$(MAKE) -C rooms
$(MAKE) -C server_utilities
$(MAKE) -C waypoints
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)
$(OBJ): | $(OBJDIR)
-33
View File
@@ -1,33 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 "monster_api.hpp"
#include "monster_data.hpp"
static const luaL_Reg monsterLib[] = {
{nullptr, nullptr}
};
LUAMOD_API int openMonsterAPI(lua_State* L) {
luaL_newlib(L, monsterLib);
return 1;
}
-34
View File
@@ -1,34 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 MONSTERAPI_HPP_
#define MONSTERAPI_HPP_
#if defined(__MINGW32__)
#include "lua/lua.hpp"
#else
#include "lua.hpp"
#endif
#define TORTUGA_MONSTER_API "monster"
LUAMOD_API int openMonsterAPI(lua_State* L);
#endif
+1 -1
View File
@@ -45,7 +45,7 @@ void MonsterManager::UnloadAll() {
//TODO
}
void MonsterManager::UnloadIf(std::function<bool(std::pair<const int, MonsterData const&>)> fn) {
void MonsterManager::UnloadIf(std::function<bool(std::pair<const int, MonsterData>)> fn) {
//TODO
}
+16 -15
View File
@@ -22,6 +22,7 @@
#ifndef MONSTERMANAGER_HPP_
#define MONSTERMANAGER_HPP_
#include "manager_interface.hpp"
#include "monster_data.hpp"
#include "singleton.hpp"
@@ -34,26 +35,28 @@
#endif
#include <functional>
#include <map>
#include <string>
class MonsterManager: public Singleton<MonsterManager> {
class MonsterManager:
public Singleton<MonsterManager>,
public ManagerInterface<MonsterData, std::string>
{
public:
//common public methods
int Create(std::string);
int Load(std::string);
int Save(int uid);
void Unload(int uid);
void Delete(int uid);
int Create(std::string) override;
int Load(std::string) override;
int Save(int uid) override;
void Unload(int uid) override;
void Delete(int uid) override;
void UnloadAll();
void UnloadIf(std::function<bool(std::pair<const int, MonsterData const&>)> fn);
void UnloadAll() override;
void UnloadIf(std::function<bool(std::pair<const int, MonsterData>)> fn) override;
//accessors & mutators
MonsterData* Get(int uid);
int GetLoadedCount();
int GetTotalCount();
std::map<int, MonsterData>* GetContainer();
MonsterData* Get(int uid) override;
int GetLoadedCount() override;
int GetTotalCount() override;
std::map<int, MonsterData>* GetContainer() override;
//hooks
sqlite3* SetDatabase(sqlite3* db);
@@ -67,8 +70,6 @@ private:
MonsterManager() = default;
~MonsterManager() = default;
//members
std::map<int, MonsterData> elementMap;
sqlite3* database = nullptr;
lua_State* lua = nullptr;
};
-33
View File
@@ -1,33 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 "monster_manager_api.hpp"
#include "monster_manager.hpp"
static const luaL_Reg monsterManagerLib[] = {
{nullptr, nullptr}
};
LUAMOD_API int openMonsterManagerAPI(lua_State* L) {
luaL_newlib(L, monsterManagerLib);
return 1;
}
-34
View File
@@ -1,34 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 MONSTERMANAGERAPI_HPP_
#define MONSTERMANAGERAPI_HPP_
#if defined(__MINGW32__)
#include "lua/lua.hpp"
#else
#include "lua.hpp"
#endif
#define TORTUGA_MONSTER_MANAGER_API "monster_manager"
LUAMOD_API int openMonsterManagerAPI(lua_State* L);
#endif
+7 -6
View File
@@ -25,25 +25,25 @@
static int setRoomName(lua_State* L) {
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
room->SetName(lua_tostring(L, 2));
room->SetRoomName(lua_tostring(L, 2));
return 0;
}
static int getRoomName(lua_State* L) {
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
lua_pushstring(L, room->GetName().c_str());
lua_pushstring(L, room->GetRoomName().c_str());
return 1;
}
static int setTilesetName(lua_State* L) {
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
room->SetTileset(lua_tostring(L, 2));
room->SetTilesetName(lua_tostring(L, 2));
return 0;
}
static int getTilesetName(lua_State* L) {
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
lua_pushstring(L, room->GetTileset().c_str());
lua_pushstring(L, room->GetTilesetName().c_str());
return 1;
}
@@ -56,6 +56,7 @@ static int getPager(lua_State* L) {
static int initialize(lua_State* L) {
//set the members of the given room
RoomData* room = static_cast<RoomData*>(lua_touserdata(L, 1));
room->SetRoomName(lua_tostring(L, 2));
//set the refs of these parameters (backwards, since it pops from the top of the stack)
room->GetPager()->SetUnloadReference(luaL_ref(L, LUA_REGISTRYINDEX));
@@ -69,8 +70,8 @@ static int initialize(lua_State* L) {
static const luaL_Reg roomLib[] = {
{"GetPager",getPager},
{"SetName", setRoomName},
{"GetName", getRoomName},
{"SetRoomName", setRoomName},
{"GetRoomName", getRoomName},
{"SetTileset", setTilesetName},
{"GetTileset", getTilesetName},
{"Initialize", initialize},
+4 -4
View File
@@ -21,19 +21,19 @@
*/
#include "room_data.hpp"
std::string RoomData::SetName(std::string s) {
std::string RoomData::SetRoomName(std::string s) {
return roomName = s;
}
std::string RoomData::GetName() {
std::string RoomData::GetRoomName() {
return roomName;
}
std::string RoomData::SetTileset(std::string s) {
std::string RoomData::SetTilesetName(std::string s) {
return tilesetName = s;
}
std::string RoomData::GetTileset() {
std::string RoomData::GetTilesetName() {
return tilesetName;
}
+4 -6
View File
@@ -40,17 +40,15 @@ public:
~RoomData() = default;
//accessors and mutators
std::string SetName(std::string);
std::string GetName();
std::string SetRoomName(std::string s);
std::string GetRoomName();
std::string SetTileset(std::string);
std::string GetTileset();
std::string SetTilesetName(std::string s);
std::string GetTilesetName();
RegionPagerLua* GetPager();
std::list<Entity*>* GetEntityList();
//TODO: triggers for unload, save, per-second, player enter, player exit, etc.
private:
friend class RoomManager;
+12 -61
View File
@@ -24,73 +24,37 @@
#include "room_api.hpp"
#include <stdexcept>
#include <sstream>
//debug
#include <iostream>
//-------------------------
//public access methods
//-------------------------
int RoomManager::Create(std::string roomName, std::string tileset) {
int RoomManager::Create(std::string roomName) {
//create the room
RoomData* newRoom = &elementMap[counter]; //implicitly constructs the element
newRoom->SetName(roomName);
newRoom->SetTileset(tileset);
newRoom->SetRoomName(roomName);
newRoom->pager.SetLuaState(lua);
//finish the routine
return counter++;
}
void RoomManager::PushEntity(Entity const* entity) {
if (!entity) {
throw(std::runtime_error("Failed to push null entity"));
}
std::map<int, RoomData>::iterator it = elementMap.find(entity->GetRoomIndex());
void RoomManager::Unload(int uid) {
//find the room
std::map<int, RoomData>::iterator it = elementMap.find(uid);
if (it == elementMap.end()) {
std::ostringstream msg;
// msg << "Failed to push entity; Room index not found: " << entity->GetRoomIndex() << std::endl;
throw(std::runtime_error(msg.str()));
return;
}
it->second.entityList.push_back(const_cast<Entity*>(entity));
std::cout << "\troom[" << it->first << "].entityList.size(): " << it->second.entityList.size() << std::endl;
std::cout << "\tEntity: " << int(entity) << "," << int(it->second.entityList.front()) << std::endl;
}
void RoomManager::PopEntity(Entity const* entity) {
if (!entity) {
throw(std::runtime_error("Failed to pop null entity"));
}
std::map<int, RoomData>::iterator it = elementMap.find(entity->GetRoomIndex());
if (it == elementMap.end()) {
std::ostringstream msg;
msg << "Failed to pop entity; Room index not found: " << entity->GetRoomIndex() << std::endl;
throw(std::runtime_error(msg.str()));
}
it->second.entityList.remove_if([entity](Entity* ptr) -> bool {
bool b = (entity == ptr);
std::cout << "\tmatch(" << int(ptr) << "," << int(entity) << "): " << b << std::endl;
return b;
});
std::cout << "\troom[" << it->first << "].entityList.size(): " << it->second.entityList.size() << std::endl;
//free the memory
elementMap.erase(uid);
}
void RoomManager::UnloadAll() {
elementMap.clear();
}
void RoomManager::UnloadIf(std::function<bool(std::pair<const int, RoomData const&>)> fn) {
void RoomManager::UnloadIf(std::function<bool(std::pair<const int,RoomData>)> fn) {
std::map<int, RoomData>::iterator it = elementMap.begin();
while (it != elementMap.end()) {
if (fn(*it)) {
@@ -112,27 +76,14 @@ RoomData* RoomManager::Get(int uid) {
return &it->second;
}
RoomData* RoomManager::Get(std::string name) {
for (std::map<int, RoomData>::iterator it = elementMap.begin(); it != elementMap.end(); ++it) {
if (it->second.GetName() == name) {
return &it->second;
}
}
return nullptr;
int RoomManager::GetLoadedCount() {
return elementMap.size();
}
int RoomManager::GetLoadedCount() {
int RoomManager::GetTotalCount() {
return elementMap.size();
}
std::map<int, RoomData>* RoomManager::GetContainer() {
return &elementMap;
}
lua_State* RoomManager::SetLuaState(lua_State* L) {
return lua = L;
}
lua_State* RoomManager::GetLuaState() {
return lua;
}
+19 -19
View File
@@ -22,9 +22,9 @@
#ifndef ROOMMANAGER_HPP_
#define ROOMMANAGER_HPP_
#include "entity.hpp"
#include "room_data.hpp"
#include "singleton.hpp"
#include "manager_interface.hpp"
#if defined(__MINGW32__)
#include "lua/lua.hpp"
@@ -32,29 +32,27 @@
#include "lua.hpp"
#endif
#include <functional>
#include <map>
class RoomManager: public Singleton<RoomManager> {
class RoomManager:
public Singleton<RoomManager>,
public ManagerInterface<RoomData, std::string>
{
public:
//common public methods
int Create(std::string name, std::string tileset);
int Create(std::string) override;
void Unload(int uid) override;
void PushEntity(Entity const* entity);
void PopEntity(Entity const* entity);
void UnloadAll();
void UnloadIf(std::function<bool(std::pair<const int, RoomData const&>)> fn);
void UnloadAll() override;
void UnloadIf(std::function<bool(std::pair<const int,RoomData>)> fn) override;
//accessors and mutators
RoomData* Get(int uid);
RoomData* Get(std::string name);
int GetLoadedCount();
std::map<int, RoomData>* GetContainer();
RoomData* Get(int uid) override;
int GetLoadedCount() override;
int GetTotalCount() override;
std::map<int, RoomData>* GetContainer() override;
//hooks
lua_State* SetLuaState(lua_State* L);
lua_State* GetLuaState();
lua_State* SetLuaState(lua_State* L) { return lua = L; }
lua_State* GetLuaState() { return lua; }
private:
friend Singleton<RoomManager>;
@@ -62,8 +60,10 @@ private:
RoomManager() = default;
~RoomManager() = default;
//members
std::map<int, RoomData> elementMap;
int Load(std::string) override { return -1; }
int Save(int uid) override { return -1; }
void Delete(int uid) override { }
lua_State* lua = nullptr;
int counter = 0;
};
+6 -42
View File
@@ -24,67 +24,31 @@
#include "room_manager.hpp"
int createRoom(lua_State* L) {
//create & get the room
RoomManager& roomMgr = RoomManager::GetSingleton();
int uid = roomMgr.Create(lua_tostring(L, 1), lua_tostring(L, 2));
int uid = roomMgr.Create(lua_tostring(L, 1));
RoomData* room = roomMgr.Get(uid);
//TODO: initialization parameters here?
//return room, uid
lua_pushlightuserdata(L, static_cast<void*>(room));
lua_pushinteger(L, uid); //for debugging, mostly
lua_pushinteger(L, uid);
return 2;
}
int unloadRoom(lua_State* L) {
//TODO: check authorization for room deletion
RoomManager& roomMgr = RoomManager::GetSingleton();
switch(lua_type(L, 1)) {
case LUA_TNUMBER: {
//number
int uid = lua_tointeger(L, 1);
roomMgr.UnloadIf([uid](std::pair<int, RoomData> it){
return it.first == uid;
});
}
break;
case LUA_TSTRING: {
//name
std::string name = lua_tostring(L, 1);
roomMgr.UnloadIf([name](std::pair<int, RoomData> it){
return it.second.GetName() == name;
});
}
break;
case LUA_TLIGHTUSERDATA: {
//the room itself
std::string name = static_cast<RoomData*>(lua_touserdata(L, 1))->GetName();
roomMgr.UnloadIf([name](std::pair<int, RoomData> it){
return it.second.GetName() == name;
});
}
break;
}
roomMgr.Unload(lua_tointeger(L, 1));
return 0;
}
int getRoom(lua_State* L) {
//TODO: integer vs name for getRoom()
RoomManager& roomMgr = RoomManager::GetSingleton();
RoomData* room = nullptr;
switch(lua_type(L, 1)) {
case LUA_TNUMBER:
//number
room = roomMgr.Get(lua_tointeger(L, 1));
break;
case LUA_TSTRING:
//name
room = roomMgr.Get(lua_tostring(L, 1));
break;
}
RoomData* room = roomMgr.Get(lua_tointeger(L, 1));
if (room) {
lua_pushlightuserdata(L, static_cast<void*>(room));
+2 -2
View File
@@ -26,9 +26,9 @@
#include "account_manager.hpp"
#include "character_manager.hpp"
#include "client_manager.hpp"
#include "door_manager.hpp"
#include "monster_manager.hpp"
#include "room_manager.hpp"
#include "waypoint_manager.hpp"
//utilities
#include "config_utility.hpp"
@@ -123,9 +123,9 @@ private:
AccountManager& accountMgr = AccountManager::GetSingleton();
CharacterManager& characterMgr = CharacterManager::GetSingleton();
ClientManager& clientMgr = ClientManager::GetSingleton();
DoorManager& doorMgr = DoorManager::GetSingleton();
MonsterManager& monsterMgr = MonsterManager::GetSingleton();
RoomManager& roomMgr = RoomManager::GetSingleton();
WaypointManager& waypointMgr = WaypointManager::GetSingleton();
ConfigUtility& config = ConfigUtility::GetSingleton();
UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton();
+2 -17
View File
@@ -45,9 +45,6 @@ void ServerApplication::HandleCharacterCreate(CharacterPacket* const argPacket)
return;
}
//push this character to the rooms
// roomMgr.PushEntity(static_cast<Entity*>(characterMgr.Get(characterIndex)));
//pump this character to all clients
CharacterPacket newPacket;
CopyCharacterToPacket(&newPacket, characterIndex);
@@ -90,7 +87,6 @@ void ServerApplication::HandleCharacterDelete(CharacterPacket* const argPacket)
}
//delete the character
// roomMgr.PopEntity(static_cast<Entity*>(characterMgr.Get(characterIndex)));
characterMgr.Delete(characterIndex);
//pump character delete
@@ -109,7 +105,7 @@ void ServerApplication::HandleCharacterLoad(CharacterPacket* const argPacket) {
if (characterIndex == -1) {
msg << "Character already loaded: ";
}
if (characterIndex == -2) {
if (characterIndex == -1) {
msg << "Character name is taken: ";
}
msg << argPacket->handle;
@@ -123,10 +119,6 @@ void ServerApplication::HandleCharacterLoad(CharacterPacket* const argPacket) {
return;
}
//push this character to the rooms
std::cout << "pushing index " << characterIndex << std::endl;
roomMgr.PushEntity(static_cast<Entity*>(characterMgr.Get(characterIndex)));
//pump this character to all clients
CharacterPacket newPacket;
CopyCharacterToPacket(&newPacket, characterIndex);
@@ -158,8 +150,6 @@ void ServerApplication::HandleCharacterUnload(CharacterPacket* const argPacket)
}
//unload the character
std::cout << "poping index " << argPacket->characterIndex << std::endl;
roomMgr.PopEntity(static_cast<Entity*>(characterData));
characterMgr.Unload(argPacket->characterIndex);
//pump character delete
@@ -200,17 +190,12 @@ void ServerApplication::HandleCharacterSetRoom(CharacterPacket* const argPacket)
return;
}
//pop from the rooms
roomMgr.PopEntity(static_cast<Entity*>(characterData));
//set the character's room, zero it's origin, zero it's motion
//TODO: Set the origin here
characterData->SetRoomIndex(argPacket->roomIndex);
characterData->SetOrigin({0, 0});
characterData->SetMotion({0, 0});
//push to the rooms
roomMgr.PushEntity(static_cast<Entity*>(characterData));
//update the clients
CharacterPacket newPacket;
CopyCharacterToPacket(&newPacket, argPacket->characterIndex);
+2 -3
View File
@@ -78,7 +78,7 @@ void ServerApplication::Init(int argc, char* argv[]) {
std::cout << "Initialized lua" << std::endl;
//append config["dir.scripts"] to the module path
//prepend config["dir.scripts"] to the module path
if (config["dir.scripts"].size() > 0) {
//get the original path
lua_getglobal(luaState, "package");
@@ -105,7 +105,6 @@ void ServerApplication::Init(int argc, char* argv[]) {
characterMgr.SetDatabase(database);
roomMgr.SetLuaState(luaState);
waypointMgr.SetLuaState(luaState);
std::cout << "Internal managers initialized" << std::endl;
@@ -202,9 +201,9 @@ void ServerApplication::Quit() {
accountMgr.UnloadAll();
characterMgr.UnloadAll();
clientMgr.UnloadAll();
doorMgr.UnloadAll();
monsterMgr.UnloadAll();
roomMgr.UnloadAll();
waypointMgr.UnloadAll();
//APIs
lua_close(luaState);
+3 -8
View File
@@ -97,7 +97,7 @@ void ServerApplication::HandleShutdownRequest(ClientPacket* const argPacket) {
//-------------------------
void ServerApplication::FullClientUnload(int index) {
clientMgr.UnloadIf([&](std::pair<const int, ClientData const&> client) -> bool {
clientMgr.UnloadIf([&](std::pair<const int, ClientData> client) -> bool {
//skip the wrong clients
if (client.first != index) {
return false;
@@ -120,7 +120,7 @@ void ServerApplication::FullClientUnload(int index) {
}
void ServerApplication::FullAccountUnload(int index) {
accountMgr.UnloadIf([&](std::pair<const int, AccountData const&> account) -> bool {
accountMgr.UnloadIf([&](std::pair<const int, AccountData> account) -> bool {
//skip the wrong accounts
if (account.first != index) {
return false;
@@ -143,17 +143,12 @@ void ServerApplication::FullAccountUnload(int index) {
}
void ServerApplication::FullCharacterUnload(int index) {
//BUG: #38 UnloadIf() lambas are taking COPIES of data structures, rather than the structures themselves
characterMgr.UnloadIf([&](std::pair<const int, CharacterData const&> character) -> bool {
characterMgr.UnloadIf([&](std::pair<const int, CharacterData> character) -> bool {
//skip the wrong characters
if (character.first != index) {
return false;
}
//pop from the rooms
std::cout << "popping index " << index << std::endl;
roomMgr.PopEntity(reinterpret_cast<Entity const*>(&character.second));
//pump character unload
CharacterPacket newPacket;
newPacket.type = SerialPacketType::CHARACTER_DELETE;
@@ -19,37 +19,37 @@
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "waypoint_system_api.hpp"
#ifndef MANAGERINTERFACE_HPP_
#define MANAGERINTERFACE_HPP_
//all waypoint API headers
#include "waypoint_api.hpp"
#include "waypoint_manager_api.hpp"
#include <functional>
#include <map>
//useful "globals"
//...
template<typename T, typename... Arguments>
class ManagerInterface {
public:
//common public methods
virtual int Create(Arguments... parameters) = 0;
virtual int Load(Arguments... parameters) = 0;
virtual int Save(int uid) = 0;
virtual void Unload(int uid) = 0;
virtual void Delete(int uid) = 0;
//This mimics linit.c to create a nested collection of all waypoint modules.
static const luaL_Reg funcs[] = {
{nullptr, nullptr}
virtual void UnloadAll() = 0;
virtual void UnloadIf(std::function<bool(std::pair<const int, T>)> fn) = 0;
//accessors & mutators
virtual T* Get(int uid) = 0;
virtual int GetLoadedCount() = 0;
virtual int GetTotalCount() = 0; //can be an alias of GetLoadedCount()
virtual std::map<int, T>* GetContainer() = 0;
protected:
ManagerInterface() = default;
~ManagerInterface() = default;
//members
std::map<int, T> elementMap;
};
static const luaL_Reg libs[] = {
{"Waypoint", openWaypointAPI},
{"WaypointManager", openWaypointManagerAPI},
{nullptr, nullptr}
};
int openWaypointSystemAPI(lua_State* L) {
//create the table
luaL_newlibtable(L, libs);
//push the "global" functions
luaL_setfuncs(L, funcs, 0);
//push the substable
for (const luaL_Reg* lib = libs; lib->func; lib++) {
lib->func(L);
lua_setfield(L, -2, lib->name);
}
return 1;
}
#endif
-34
View File
@@ -1,34 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 "waypoint_api.hpp"
#include "waypoint_data.hpp"
//TODO: Can I alias the entity API for this?
static const luaL_Reg waypointLib[] = {
{nullptr, nullptr}
};
LUAMOD_API int openWaypointAPI(lua_State* L) {
luaL_newlib(L, waypointLib);
return 1;
}
-34
View File
@@ -1,34 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 WAYPOINTAPI_HPP_
#define WAYPOINTAPI_HPP_
#if defined(__MINGW32__)
#include "lua/lua.hpp"
#else
#include "lua.hpp"
#endif
#define TORTUGA_WAYPOINT_API "waypoint"
LUAMOD_API int openWaypointAPI(lua_State* L);
#endif
-33
View File
@@ -1,33 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 "waypoint_manager_api.hpp"
#include "waypoint_manager.hpp"
static const luaL_Reg waypointManagerLib[] = {
{nullptr, nullptr}
};
LUAMOD_API int openWaypointManagerAPI(lua_State* L) {
luaL_newlib(L, waypointManagerLib);
return 1;
}
-34
View File
@@ -1,34 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 WAYPOINTMANAGERAPI_HPP_
#define WAYPOINTMANAGERAPI_HPP_
#if defined(__MINGW32__)
#include "lua/lua.hpp"
#else
#include "lua.hpp"
#endif
#define TORTUGA_WAYPOINT_MANAGER_API "waypoint_manager"
LUAMOD_API int openWaypointManagerAPI(lua_State* L);
#endif
-34
View File
@@ -1,34 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* 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 WAYPOINTSYSTEMAPI_HPP_
#define WAYPOINTSYSTEMAPI_HPP_
#if defined(__MINGW32__)
#include "lua/lua.hpp"
#else
#include "lua.hpp"
#endif
#define TORTUGA_WAYPOINT_SYSTEM_API "waypoint_system"
LUAMOD_API int openWaypointSystemAPI(lua_State* L);
#endif
+24 -12
View File
@@ -1,19 +1,31 @@
TODO: In need of script APIs (list)
* Characters
* Monsters
* Waypoints
TODO: Account system needs salts & hashes for security
TODO: Character system might need an API
TODO: Door system needs an API
TODO: monster system needs an API
TODO: Account passwords (list)
* backbone account server OR
* social network login OR
* ...
* salts & hashes
TODO: Waypoints, with positions and trigger zones (collision areas) for doors, monster spawns, etc.
TODO: rewrite the main body of the server
TODO: I need a better way to handle the statistics
TODO: Fix shoddy movement
TODO: Handle statistics server-side
TODO: Periodic mass server saves
TODO: Remove the big "Shut Down" button (currently broken...)
TODO: join vs login
TODO: Remove the big "Shut Down" button
TODO: Make a way for the server owner to control the server directly
TODO: The TileSheet class should implement the surface itself
TODO: Passwords/Authentication
TODO: Time delay for requesting region packets
TODO: A proper logging system
-------------------------
The entities might need an API, which interfaces with all entity types (characters, monsters, doors, etc.)
The Entity base class handles position (including room) and motion, so something generic like this could be used (or aliased by other APIs)
entity:
-------------------------
Lobby:
JOIN_REQUEST -> JOIN_RESPONSE, JOIN_REJECTION
LOGIN_REQUEST -> LOGIN_RESPONSE, LOGIN_REJECTION