Merge branch 'develop', read more
This merge covers mostly back-end refactoring, including splitting Character into Renderable and BaseCharacter, as well as creating the manager interface.
This commit is contained in:
@@ -38,8 +38,7 @@
|
||||
#include "options_menu.hpp"
|
||||
#include "lobby_menu.hpp"
|
||||
#include "in_world.hpp"
|
||||
//#include "in_combat.hpp"
|
||||
#include "clean_up.hpp"
|
||||
#include "disconnected_screen.hpp"
|
||||
|
||||
//-------------------------
|
||||
//Public access members
|
||||
@@ -179,16 +178,13 @@ void ClientApplication::LoadScene(SceneList sceneIndex) {
|
||||
activeScene = new OptionsMenu();
|
||||
break;
|
||||
case SceneList::LOBBYMENU:
|
||||
activeScene = new LobbyMenu(&clientIndex, &accountIndex);
|
||||
activeScene = new LobbyMenu(&clientIndex, &accountIndex); //TODO: can I use the ConfigUtility for these parameters?
|
||||
break;
|
||||
case SceneList::INWORLD:
|
||||
activeScene = new InWorld(&clientIndex, &accountIndex, &characterIndex, &characterMap);
|
||||
activeScene = new InWorld(&clientIndex, &accountIndex);
|
||||
break;
|
||||
// case SceneList::INCOMBAT:
|
||||
// activeScene = new InCombat(&clientIndex, &accountIndex, &characterIndex, &characterMap);
|
||||
// break;
|
||||
case SceneList::CLEANUP:
|
||||
activeScene = new CleanUp(&clientIndex, &accountIndex, &characterIndex, &characterMap);
|
||||
case SceneList::DISCONNECTEDSCREEN:
|
||||
activeScene = new DisconnectedScreen();
|
||||
break;
|
||||
default:
|
||||
throw(std::logic_error("Failed to recognize the scene index"));
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include "base_scene.hpp"
|
||||
|
||||
#include "udp_network_utility.hpp"
|
||||
#include "character.hpp"
|
||||
|
||||
#include "singleton.hpp"
|
||||
|
||||
@@ -54,9 +53,6 @@ private:
|
||||
//shared parameters
|
||||
int clientIndex = -1;
|
||||
int accountIndex = -1;
|
||||
int characterIndex = -1;
|
||||
|
||||
CharacterMap characterMap;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -12,7 +12,7 @@ OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||
|
||||
#output
|
||||
OUTDIR=..
|
||||
OUT=$(addprefix $(OUTDIR)/,server.a)
|
||||
OUT=$(addprefix $(OUTDIR)/,client.a)
|
||||
|
||||
#targets
|
||||
all: $(OBJ) $(OUT)
|
||||
|
||||
+2
-1
@@ -1,5 +1,5 @@
|
||||
#config
|
||||
INCLUDES+=. client_utilities scenes ../common/debugging ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet_types ../common/ui ../common/utilities
|
||||
INCLUDES+=. client_utilities renderable scenes ../common/debugging ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet_types ../common/ui ../common/utilities
|
||||
LIBS+=client.a ../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
@@ -18,6 +18,7 @@ OUT=$(addprefix $(OUTDIR)/,client)
|
||||
all: $(OBJ) $(OUT)
|
||||
$(MAKE) -C client_utilities
|
||||
$(MAKE) -C scenes
|
||||
$(MAKE) -C renderable
|
||||
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)
|
||||
|
||||
$(OBJ): | $(OBJDIR)
|
||||
|
||||
@@ -19,23 +19,9 @@
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "character.hpp"
|
||||
#include "base_character.hpp"
|
||||
|
||||
void Character::Update() {
|
||||
if (motion.x && motion.y) {
|
||||
origin += motion * CHARACTER_WALKING_MOD;
|
||||
}
|
||||
else if (motion != 0) {
|
||||
origin += motion;
|
||||
}
|
||||
sprite.Update(0.016);
|
||||
}
|
||||
|
||||
void Character::DrawTo(SDL_Surface* const dest, int camX, int camY) {
|
||||
sprite.DrawTo(dest, origin.x - camX, origin.y - camY);
|
||||
}
|
||||
|
||||
void Character::CorrectSprite() {
|
||||
void BaseCharacter::CorrectSprite() {
|
||||
//NOTE: These must correspond to the sprite sheet in use
|
||||
if (motion.y > 0) {
|
||||
sprite.SetYIndex(0);
|
||||
@@ -19,38 +19,23 @@
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#ifndef CHARACTER_HPP_
|
||||
#define CHARACTER_HPP_
|
||||
#ifndef BASECHARACTER_HPP_
|
||||
#define BASECHARACTER_HPP_
|
||||
|
||||
//components
|
||||
#include "character_defines.hpp"
|
||||
#include "vector2.hpp"
|
||||
#include "bounding_box.hpp"
|
||||
#include "statistics.hpp"
|
||||
|
||||
//graphics
|
||||
#include "sprite_sheet.hpp"
|
||||
#include "renderable.hpp"
|
||||
|
||||
//std namespace
|
||||
#include <string>
|
||||
#include <cmath>
|
||||
|
||||
class Character {
|
||||
class BaseCharacter : public Renderable {
|
||||
public:
|
||||
Character() = default;
|
||||
~Character() = default;
|
||||
|
||||
void Update();
|
||||
BaseCharacter() = default;
|
||||
virtual ~BaseCharacter() = default;
|
||||
|
||||
//graphics
|
||||
void DrawTo(SDL_Surface* const, int camX, int camY);
|
||||
void CorrectSprite();
|
||||
SpriteSheet* GetSprite() { return &sprite; }
|
||||
|
||||
//gameplay
|
||||
Statistics* GetStats() { return &stats; }
|
||||
|
||||
//accessors and mutators
|
||||
|
||||
//metadata
|
||||
int SetOwner(int i) { return owner = i; }
|
||||
@@ -60,36 +45,11 @@ public:
|
||||
std::string SetAvatar(std::string s) { return avatar = s; }
|
||||
std::string GetAvatar() const { return avatar; }
|
||||
|
||||
//position
|
||||
Vector2 SetOrigin(Vector2 v) { return origin = v; }
|
||||
Vector2 GetOrigin() const { return origin; }
|
||||
Vector2 SetMotion(Vector2 v) { return motion = v; }
|
||||
Vector2 GetMotion() const { return motion; }
|
||||
BoundingBox SetBounds(BoundingBox b) { return bounds = b; }
|
||||
BoundingBox GetBounds() { return bounds; }
|
||||
|
||||
private:
|
||||
//graphics
|
||||
SpriteSheet sprite;
|
||||
|
||||
//base statistics
|
||||
Statistics stats;
|
||||
|
||||
//gameplay components: equipment, items, buffs, debuffs...
|
||||
|
||||
//metadata
|
||||
int owner;
|
||||
std::string handle;
|
||||
std::string avatar;
|
||||
|
||||
//position
|
||||
Vector2 origin = {0.0,0.0};
|
||||
Vector2 motion = {0.0,0.0};
|
||||
BoundingBox bounds;
|
||||
};
|
||||
|
||||
//tmp
|
||||
#include <map>
|
||||
typedef std::map<int, Character> CharacterMap;
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
/* 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_monster.hpp"
|
||||
|
||||
@@ -19,16 +19,18 @@
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#ifndef COMBATDEFINES_HPP_
|
||||
#define COMBATDEFINES_HPP_
|
||||
#ifndef BASEMONSTER_HPP_
|
||||
#define BASEMONSTER_HPP_
|
||||
|
||||
#define COMBAT_MAX_CHARACTERS 16
|
||||
#define COMBAT_MAX_ENEMIES 16
|
||||
#include "renderable.hpp"
|
||||
|
||||
enum class TerrainType {
|
||||
NONE = 0,
|
||||
GRASSLANDS,
|
||||
//etc.
|
||||
class BaseMonster {
|
||||
public:
|
||||
BaseMonster();
|
||||
virtual ~BaseMonster();
|
||||
|
||||
private:
|
||||
//
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
/* 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 "local_character.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 LOCALCHARACTER_HPP_
|
||||
#define LOCALCHARACTER_HPP_
|
||||
|
||||
#include "base_character.hpp"
|
||||
#include "statistics.hpp"
|
||||
|
||||
class LocalCharacter : public BaseCharacter {
|
||||
public:
|
||||
LocalCharacter() = default;
|
||||
~LocalCharacter() = default;
|
||||
|
||||
Statistics* GetBaseStats() { return &baseStats; }
|
||||
|
||||
private:
|
||||
Statistics baseStats;
|
||||
//TODO: weapons, armour, buffs, debuffs, etc.
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,37 @@
|
||||
#config
|
||||
INCLUDES+=. .. ../../common/gameplay ../../common/graphics ../../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)/,client.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
|
||||
@@ -0,0 +1,31 @@
|
||||
/* 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 "renderable.hpp"
|
||||
|
||||
void Renderable::Update() {
|
||||
origin += motion;
|
||||
sprite.Update(0.016);
|
||||
}
|
||||
|
||||
void Renderable::DrawTo(SDL_Surface* const dest, int camX, int camY) {
|
||||
sprite.DrawTo(dest, origin.x - camX, origin.y - camY);
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
/* 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 RENDERABLE_HPP_
|
||||
#define RENDERABLE_HPP_
|
||||
|
||||
#include "bounding_box.hpp"
|
||||
#include "sprite_sheet.hpp"
|
||||
#include "vector2.hpp"
|
||||
|
||||
class Renderable {
|
||||
public:
|
||||
Renderable() = default;
|
||||
virtual ~Renderable() = default;
|
||||
|
||||
virtual void Update();
|
||||
virtual void DrawTo(SDL_Surface* const, int camX, int camY);
|
||||
|
||||
SpriteSheet* GetSprite() { return &sprite; }
|
||||
|
||||
//position
|
||||
Vector2 SetOrigin(Vector2 v) { return origin = v; }
|
||||
Vector2 GetOrigin() const { return origin; }
|
||||
Vector2 SetMotion(Vector2 v) { return motion = v; }
|
||||
Vector2 GetMotion() const { return motion; }
|
||||
|
||||
//collision
|
||||
BoundingBox SetBounds(BoundingBox b) { return bounds = b; }
|
||||
BoundingBox GetBounds() { return bounds; }
|
||||
|
||||
protected: //TODO: should be private
|
||||
SpriteSheet sprite;
|
||||
Vector2 origin = {0, 0};
|
||||
Vector2 motion = {0, 0};
|
||||
BoundingBox bounds;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -34,8 +34,7 @@ enum class SceneList {
|
||||
OPTIONSMENU,
|
||||
LOBBYMENU,
|
||||
INWORLD,
|
||||
INCOMBAT,
|
||||
CLEANUP,
|
||||
DISCONNECTEDSCREEN,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -19,10 +19,11 @@
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "clean_up.hpp"
|
||||
#include "disconnected_screen.hpp"
|
||||
|
||||
#include "channels.hpp"
|
||||
#include "config_utility.hpp"
|
||||
#include "udp_network_utility.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
@@ -30,17 +31,7 @@
|
||||
//Public access members
|
||||
//-------------------------
|
||||
|
||||
CleanUp::CleanUp(
|
||||
int* const argClientIndex,
|
||||
int* const argAccountIndex,
|
||||
int* const argCharacterIndex,
|
||||
CharacterMap* argCharacterMap
|
||||
):
|
||||
clientIndex(*argClientIndex),
|
||||
accountIndex(*argAccountIndex),
|
||||
characterIndex(*argCharacterIndex),
|
||||
characterMap(*argCharacterMap)
|
||||
{
|
||||
DisconnectedScreen::DisconnectedScreen() {
|
||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||
|
||||
//setup the utility objects
|
||||
@@ -60,19 +51,13 @@ CleanUp::CleanUp(
|
||||
backButton.SetText("Back");
|
||||
|
||||
//full reset
|
||||
network.Unbind(Channels::SERVER);
|
||||
clientIndex = -1;
|
||||
accountIndex = -1;
|
||||
characterIndex = -1;
|
||||
// combatMap.clear();
|
||||
characterMap.clear();
|
||||
// enemyMap.clear();
|
||||
UDPNetworkUtility::GetSingleton().Unbind(Channels::SERVER);
|
||||
|
||||
//auto return
|
||||
startTick = std::chrono::steady_clock::now();
|
||||
}
|
||||
|
||||
CleanUp::~CleanUp() {
|
||||
DisconnectedScreen::~DisconnectedScreen() {
|
||||
//
|
||||
}
|
||||
|
||||
@@ -80,16 +65,16 @@ CleanUp::~CleanUp() {
|
||||
//Frame loop
|
||||
//-------------------------
|
||||
|
||||
void CleanUp::Update() {
|
||||
void DisconnectedScreen::Update() {
|
||||
if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(10)) {
|
||||
SetNextScene(SceneList::MAINMENU);
|
||||
}
|
||||
|
||||
//Eat incoming packets
|
||||
while(network.Receive());
|
||||
while(UDPNetworkUtility::GetSingleton().Receive());
|
||||
}
|
||||
|
||||
void CleanUp::Render(SDL_Surface* const screen) {
|
||||
void DisconnectedScreen::Render(SDL_Surface* const screen) {
|
||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||
|
||||
backButton.DrawTo(screen);
|
||||
@@ -100,25 +85,25 @@ void CleanUp::Render(SDL_Surface* const screen) {
|
||||
//Event handlers
|
||||
//-------------------------
|
||||
|
||||
void CleanUp::QuitEvent() {
|
||||
void DisconnectedScreen::QuitEvent() {
|
||||
SetNextScene(SceneList::QUIT);
|
||||
}
|
||||
|
||||
void CleanUp::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
||||
void DisconnectedScreen::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
||||
backButton.MouseMotion(motion);
|
||||
}
|
||||
|
||||
void CleanUp::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
||||
void DisconnectedScreen::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
||||
backButton.MouseButtonDown(button);
|
||||
}
|
||||
|
||||
void CleanUp::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
||||
void DisconnectedScreen::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
||||
if (backButton.MouseButtonUp(button) == Button::State::HOVER) {
|
||||
SetNextScene(SceneList::MAINMENU);
|
||||
}
|
||||
}
|
||||
|
||||
void CleanUp::KeyDown(SDL_KeyboardEvent const& key) {
|
||||
void DisconnectedScreen::KeyDown(SDL_KeyboardEvent const& key) {
|
||||
switch(key.keysym.sym) {
|
||||
case SDLK_ESCAPE:
|
||||
SetNextScene(SceneList::MAINMENU);
|
||||
@@ -126,6 +111,6 @@ void CleanUp::KeyDown(SDL_KeyboardEvent const& key) {
|
||||
}
|
||||
}
|
||||
|
||||
void CleanUp::KeyUp(SDL_KeyboardEvent const& key) {
|
||||
void DisconnectedScreen::KeyUp(SDL_KeyboardEvent const& key) {
|
||||
//
|
||||
}
|
||||
@@ -19,11 +19,8 @@
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#ifndef CLEANUP_HPP_
|
||||
#define CLEANUP_HPP_
|
||||
|
||||
//network
|
||||
#include "udp_network_utility.hpp"
|
||||
#ifndef DISCONNECTEDSCREEN_HPP_
|
||||
#define DISCONNECTEDSCREEN_HPP_
|
||||
|
||||
//graphics
|
||||
#include "image.hpp"
|
||||
@@ -31,22 +28,16 @@
|
||||
#include "button.hpp"
|
||||
|
||||
//client
|
||||
#include "character.hpp"
|
||||
#include "base_scene.hpp"
|
||||
|
||||
//std namespace
|
||||
#include <chrono>
|
||||
|
||||
class CleanUp : public BaseScene {
|
||||
class DisconnectedScreen : public BaseScene {
|
||||
public:
|
||||
//Public access members
|
||||
CleanUp(
|
||||
int* const argClientIndex,
|
||||
int* const argAccountIndex,
|
||||
int* const argCharacterIndex,
|
||||
CharacterMap* argCharacterMap
|
||||
);
|
||||
~CleanUp();
|
||||
DisconnectedScreen();
|
||||
~DisconnectedScreen();
|
||||
|
||||
protected:
|
||||
//Frame loop
|
||||
@@ -61,13 +52,6 @@ protected:
|
||||
void KeyDown(SDL_KeyboardEvent const&);
|
||||
void KeyUp(SDL_KeyboardEvent const&);
|
||||
|
||||
//shared parameters
|
||||
UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton();
|
||||
int& clientIndex;
|
||||
int& accountIndex;
|
||||
int& characterIndex;
|
||||
CharacterMap& characterMap;
|
||||
|
||||
//graphics
|
||||
Image image;
|
||||
RasterFont font;
|
||||
@@ -34,16 +34,9 @@
|
||||
//Public access members
|
||||
//-------------------------
|
||||
|
||||
InWorld::InWorld(
|
||||
int* const argClientIndex,
|
||||
int* const argAccountIndex,
|
||||
int* const argCharacterIndex,
|
||||
CharacterMap* argCharacterMap
|
||||
):
|
||||
InWorld::InWorld(int* const argClientIndex, int* const argAccountIndex):
|
||||
clientIndex(*argClientIndex),
|
||||
accountIndex(*argAccountIndex),
|
||||
characterIndex(*argCharacterIndex),
|
||||
characterMap(*argCharacterMap)
|
||||
accountIndex(*argAccountIndex)
|
||||
{
|
||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||
|
||||
@@ -153,7 +146,7 @@ void InWorld::Update() {
|
||||
if (Clock::now() - lastBeat > std::chrono::seconds(3)) {
|
||||
if (attemptedBeats > 2) {
|
||||
RequestDisconnect();
|
||||
SetNextScene(SceneList::CLEANUP);
|
||||
SetNextScene(SceneList::DISCONNECTEDSCREEN);
|
||||
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "Error: Lost connection to the server";
|
||||
}
|
||||
|
||||
@@ -342,7 +335,7 @@ void InWorld::HandlePong(ServerPacket* const argPacket) {
|
||||
|
||||
void InWorld::HandleDisconnect(ClientPacket* const argPacket) {
|
||||
//TODO: More needed in the disconnection
|
||||
SetNextScene(SceneList::CLEANUP);
|
||||
SetNextScene(SceneList::DISCONNECTEDSCREEN);
|
||||
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "You have been disconnected";
|
||||
}
|
||||
|
||||
@@ -352,7 +345,7 @@ void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) {
|
||||
}
|
||||
|
||||
//create the character object
|
||||
Character& newCharacter = characterMap[argPacket->characterIndex];
|
||||
BaseCharacter& newCharacter = characterMap[argPacket->characterIndex];
|
||||
|
||||
//fill out the character's members
|
||||
newCharacter.SetHandle(argPacket->handle);
|
||||
@@ -369,7 +362,7 @@ void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) {
|
||||
CHARACTER_BOUNDS_HEIGHT
|
||||
});
|
||||
|
||||
(*newCharacter.GetStats()) = argPacket->stats;
|
||||
// (*newCharacter.GetBaseStats()) = argPacket->stats;
|
||||
|
||||
//bookkeeping code
|
||||
newCharacter.CorrectSprite();
|
||||
@@ -407,7 +400,7 @@ void InWorld::HandleCharacterUpdate(CharacterPacket* const argPacket) {
|
||||
return;
|
||||
}
|
||||
|
||||
Character& character = characterMap[argPacket->characterIndex];
|
||||
BaseCharacter& character = characterMap[argPacket->characterIndex];
|
||||
|
||||
//other characters moving
|
||||
if (argPacket->characterIndex != characterIndex) {
|
||||
@@ -419,7 +412,7 @@ void InWorld::HandleCharacterUpdate(CharacterPacket* const argPacket) {
|
||||
|
||||
void InWorld::HandleCharacterRejection(TextPacket* const argPacket) {
|
||||
RequestDisconnect();
|
||||
SetNextScene(SceneList::CLEANUP);
|
||||
SetNextScene(SceneList::DISCONNECTEDSCREEN);
|
||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||
config["client.disconnectMessage"] = "Error: ";
|
||||
config["client.disconnectMessage"] += argPacket->text;
|
||||
@@ -464,7 +457,7 @@ void InWorld::SendPlayerUpdate() {
|
||||
newPacket.roomIndex = 0; //TODO: room index
|
||||
newPacket.origin = localCharacter->GetOrigin();
|
||||
newPacket.motion = localCharacter->GetMotion();
|
||||
newPacket.stats = *localCharacter->GetStats();
|
||||
// newPacket.stats = *localCharacter->GetBaseStats();
|
||||
|
||||
//TODO: gameplay components: equipment, items, buffs, debuffs
|
||||
|
||||
|
||||
@@ -38,7 +38,8 @@
|
||||
//common
|
||||
#include "frame_rate.hpp"
|
||||
|
||||
#include "character.hpp"
|
||||
#include "base_character.hpp"
|
||||
#include "local_character.hpp"
|
||||
|
||||
//client
|
||||
#include "base_scene.hpp"
|
||||
@@ -51,12 +52,7 @@
|
||||
class InWorld : public BaseScene {
|
||||
public:
|
||||
//Public access members
|
||||
InWorld(
|
||||
int* const argClientIndex,
|
||||
int* const argAccountIndex,
|
||||
int* const argCharacterIndex,
|
||||
CharacterMap* argCharacterMap
|
||||
);
|
||||
InWorld(int* const argClientIndex, int* const argAccountIndex);
|
||||
~InWorld();
|
||||
|
||||
protected:
|
||||
@@ -100,8 +96,8 @@ protected:
|
||||
UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton();
|
||||
int& clientIndex;
|
||||
int& accountIndex;
|
||||
int& characterIndex;
|
||||
CharacterMap& characterMap;
|
||||
int characterIndex = -1;
|
||||
std::map<int, BaseCharacter> characterMap;
|
||||
|
||||
//graphics
|
||||
Image buttonImage;
|
||||
@@ -124,7 +120,7 @@ protected:
|
||||
FrameRate fps;
|
||||
|
||||
//game
|
||||
Character* localCharacter = nullptr;
|
||||
BaseCharacter* localCharacter = nullptr;
|
||||
|
||||
//connections
|
||||
//TODO: This needs it's own utility, for both InWorld and InCombat
|
||||
|
||||
@@ -34,6 +34,10 @@ LobbyMenu::LobbyMenu(int* const argClientIndex, int* const argAccountIndex):
|
||||
clientIndex(*argClientIndex),
|
||||
accountIndex(*argAccountIndex)
|
||||
{
|
||||
//preemptive reset
|
||||
clientIndex = -1;
|
||||
accountIndex = -1;
|
||||
|
||||
//setup the utility objects
|
||||
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
||||
image.SetClipH(image.GetClipH()/3);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#config
|
||||
INCLUDES+=. .. ../../common/gameplay ../../common/graphics ../../common/map ../../common/network ../../common/network/packet_types ../../common/ui ../../common/utilities
|
||||
INCLUDES+=. .. ../renderable ../../common/gameplay ../../common/graphics ../../common/map ../../common/network ../../common/network/packet_types ../../common/ui ../../common/utilities
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
//the speeds that the characters move
|
||||
constexpr double CHARACTER_WALKING_SPEED = 2.24;
|
||||
constexpr double CHARACTER_WALKING_MOD = 1.0/sqrt(2.0);
|
||||
constexpr double CHARACTER_WALKING_NEGATIVE_MOD = 1.0 - CHARACTER_WALKING_MOD;
|
||||
|
||||
//the bounds for the character objects, mapped to the default sprites
|
||||
constexpr int CHARACTER_BOUNDS_X = 0;
|
||||
|
||||
@@ -53,15 +53,15 @@ void ConfigUtility::Load(std::string fname, int argc, char* argv[]) {
|
||||
}
|
||||
|
||||
//set some specific values
|
||||
if (!strncmp(argv[i], "-C", 2)) {
|
||||
if (!strncmp(argv[i], "-", 1)) {
|
||||
//wipe the variables
|
||||
memset(key, 0, 256);
|
||||
memset(key, 0, 256);
|
||||
|
||||
//read the key-value pair
|
||||
if (sscanf(argv[i], "-C%[^=]=%[^\0]", key, val) != 2) {
|
||||
if (sscanf(argv[i], "-%[^=]=%[^\0]", key, val) != 2) {
|
||||
std::ostringstream os;
|
||||
os << "Failed to read a command line config argument (expected -C%s=%s):" << std::endl;
|
||||
os << "Failed to read a command line config argument (expected -%s=%s):" << std::endl;
|
||||
os << "\targv[" << i << "]: " << argv[i] << std::endl;
|
||||
os << "\tkey: " << key << std::endl;
|
||||
os << "\tval: " << val << std::endl;
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.0 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 784 B |
@@ -87,13 +87,13 @@ int AccountManager::Load(std::string username, int clientIndex) {
|
||||
int uid = sqlite3_column_int(statement, 0);
|
||||
|
||||
//check to see if this account is already loaded
|
||||
if (accountMap.find(uid) != accountMap.end()) {
|
||||
if (elementMap.find(uid) != elementMap.end()) {
|
||||
sqlite3_finalize(statement);
|
||||
return -1;
|
||||
}
|
||||
|
||||
//extract the data into memory
|
||||
AccountData& newAccount = accountMap[uid];
|
||||
AccountData& newAccount = elementMap[uid];
|
||||
newAccount.username = reinterpret_cast<const char*>(sqlite3_column_text(statement, 1));
|
||||
newAccount.blackListed = sqlite3_column_int(statement, 2);
|
||||
newAccount.whiteListed = sqlite3_column_int(statement, 3);
|
||||
@@ -121,11 +121,11 @@ int AccountManager::Save(int uid) {
|
||||
//DOCS: To use this method, change the in-memory copy, and then call this function using that object's UID.
|
||||
|
||||
//this method fails if this account is not loaded
|
||||
if (accountMap.find(uid) == accountMap.end()) {
|
||||
if (elementMap.find(uid) == elementMap.end()) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
AccountData& account = accountMap[uid];
|
||||
AccountData& account = elementMap[uid];
|
||||
sqlite3_stmt* statement = nullptr;
|
||||
|
||||
//prep
|
||||
@@ -163,7 +163,7 @@ void AccountManager::Unload(int uid) {
|
||||
//save this user account, and then unload it
|
||||
//NOTE: the associated characters are unloaded externally
|
||||
Save(uid);
|
||||
accountMap.erase(uid);
|
||||
elementMap.erase(uid);
|
||||
}
|
||||
|
||||
void AccountManager::Delete(int uid) {
|
||||
@@ -190,26 +190,28 @@ void AccountManager::Delete(int uid) {
|
||||
|
||||
//finish the routine
|
||||
sqlite3_finalize(statement);
|
||||
accountMap.erase(uid);
|
||||
elementMap.erase(uid);
|
||||
}
|
||||
|
||||
void AccountManager::UnloadAll() {
|
||||
for (auto& it : accountMap) {
|
||||
for (auto& it : elementMap) {
|
||||
Save(it.first);
|
||||
}
|
||||
accountMap.clear();
|
||||
elementMap.clear();
|
||||
}
|
||||
|
||||
void AccountManager::UnloadIf(std::function<bool(std::pair<int, AccountData>)> fn) {
|
||||
void AccountManager::UnloadIf(std::function<bool(std::pair<const int, AccountData>)> fn) {
|
||||
//replicate std::remove_if, using custom code
|
||||
for (std::map<int, AccountData>::iterator it = accountMap.begin(); it != accountMap.end(); /* empty */) {
|
||||
std::map<int, AccountData>::iterator it = elementMap.begin();
|
||||
while (it != elementMap.end()) {
|
||||
if (fn(*it)) {
|
||||
Save(it->first);
|
||||
it = accountMap.erase(it);
|
||||
continue;
|
||||
it = elementMap.erase(it);
|
||||
}
|
||||
else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
@@ -218,9 +220,9 @@ void AccountManager::UnloadIf(std::function<bool(std::pair<int, AccountData>)> f
|
||||
|
||||
AccountData* AccountManager::Get(int uid) {
|
||||
//TODO: could this load an account first?
|
||||
std::map<int, AccountData>::iterator it = accountMap.find(uid);
|
||||
std::map<int, AccountData>::iterator it = elementMap.find(uid);
|
||||
|
||||
if (it == accountMap.end()) {
|
||||
if (it == elementMap.end()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -228,7 +230,7 @@ AccountData* AccountManager::Get(int uid) {
|
||||
}
|
||||
|
||||
int AccountManager::GetLoadedCount() {
|
||||
return accountMap.size();
|
||||
return elementMap.size();
|
||||
}
|
||||
|
||||
int AccountManager::GetTotalCount() {
|
||||
@@ -250,7 +252,7 @@ int AccountManager::GetTotalCount() {
|
||||
}
|
||||
|
||||
std::map<int, AccountData>* AccountManager::GetContainer() {
|
||||
return &accountMap;
|
||||
return &elementMap;
|
||||
}
|
||||
|
||||
sqlite3* AccountManager::SetDatabase(sqlite3* db) {
|
||||
|
||||
@@ -24,29 +24,33 @@
|
||||
|
||||
#include "account_data.hpp"
|
||||
#include "singleton.hpp"
|
||||
#include "manager_interface.hpp"
|
||||
|
||||
#include "sqlite3/sqlite3.h"
|
||||
|
||||
#include <functional>
|
||||
#include <map>
|
||||
|
||||
class AccountManager : public Singleton<AccountManager> {
|
||||
class AccountManager:
|
||||
public Singleton<AccountManager>,
|
||||
public ManagerInterface<AccountData, std::string, int>
|
||||
{
|
||||
public:
|
||||
//public access 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);
|
||||
//common public methods
|
||||
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<int, AccountData>)> 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();
|
||||
@@ -57,7 +61,6 @@ private:
|
||||
AccountManager() = default;
|
||||
~AccountManager() = default;
|
||||
|
||||
std::map<int, AccountData> accountMap;
|
||||
sqlite3* database = nullptr;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#config
|
||||
INCLUDES+=. ../../common/utilities
|
||||
INCLUDES+=. ../server_utilities ../../common/utilities
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ int CharacterManager::Load(int owner, std::string handle, std::string avatar) {
|
||||
int uid = sqlite3_column_int(statement, 0);
|
||||
|
||||
//check to see if this character is already loaded
|
||||
if (characterMap.find(uid) != characterMap.end()) {
|
||||
if (elementMap.find(uid) != elementMap.end()) {
|
||||
sqlite3_finalize(statement);
|
||||
return -1;
|
||||
}
|
||||
@@ -110,7 +110,7 @@ int CharacterManager::Load(int owner, std::string handle, std::string avatar) {
|
||||
}
|
||||
|
||||
//extract the data into memory
|
||||
CharacterData& newChar = characterMap[uid];
|
||||
CharacterData& newChar = elementMap[uid];
|
||||
|
||||
//metadata
|
||||
newChar.owner = owner;
|
||||
@@ -145,11 +145,11 @@ int CharacterManager::Save(int uid) {
|
||||
//DOCS: To use this method, change the in-memory copy, and then call this function using that object's UID.
|
||||
|
||||
//this method fails if this character is not loaded
|
||||
if (characterMap.find(uid) == characterMap.end()) {
|
||||
if (elementMap.find(uid) == elementMap.end()) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
CharacterData& character = characterMap[uid];
|
||||
CharacterData& character = elementMap[uid];
|
||||
sqlite3_stmt* statement = nullptr;
|
||||
|
||||
//prep
|
||||
@@ -187,7 +187,7 @@ int CharacterManager::Save(int uid) {
|
||||
void CharacterManager::Unload(int uid) {
|
||||
//save this character, then unload it
|
||||
Save(uid);
|
||||
characterMap.erase(uid);
|
||||
elementMap.erase(uid);
|
||||
}
|
||||
|
||||
void CharacterManager::Delete(int uid) {
|
||||
@@ -213,26 +213,27 @@ void CharacterManager::Delete(int uid) {
|
||||
|
||||
//finish the routine
|
||||
sqlite3_finalize(statement);
|
||||
characterMap.erase(uid);
|
||||
elementMap.erase(uid);
|
||||
}
|
||||
|
||||
void CharacterManager::UnloadAll() {
|
||||
for (auto& it : characterMap) {
|
||||
for (auto& it : elementMap) {
|
||||
Save(it.first);
|
||||
}
|
||||
characterMap.clear();
|
||||
elementMap.clear();
|
||||
}
|
||||
|
||||
void CharacterManager::UnloadIf(std::function<bool(std::pair<int, CharacterData>)> fn) {
|
||||
//replicate std::remove_if, using custom code
|
||||
for (std::map<int, CharacterData>::iterator it = characterMap.begin(); it != characterMap.end(); /* empty */) {
|
||||
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)) {
|
||||
Save(it->first);
|
||||
it = characterMap.erase(it);
|
||||
continue;
|
||||
it = elementMap.erase(it);
|
||||
}
|
||||
else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
@@ -240,9 +241,9 @@ void CharacterManager::UnloadIf(std::function<bool(std::pair<int, CharacterData>
|
||||
//-------------------------
|
||||
|
||||
CharacterData* CharacterManager::Get(int uid) {
|
||||
std::map<int, CharacterData>::iterator it = characterMap.find(uid);
|
||||
std::map<int, CharacterData>::iterator it = elementMap.find(uid);
|
||||
|
||||
if (it == characterMap.end()) {
|
||||
if (it == elementMap.end()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -250,7 +251,7 @@ CharacterData* CharacterManager::Get(int uid) {
|
||||
}
|
||||
|
||||
int CharacterManager::GetLoadedCount() {
|
||||
return characterMap.size();
|
||||
return elementMap.size();
|
||||
}
|
||||
|
||||
int CharacterManager::GetTotalCount() {
|
||||
@@ -272,7 +273,7 @@ int CharacterManager::GetTotalCount() {
|
||||
}
|
||||
|
||||
std::map<int, CharacterData>* CharacterManager::GetContainer() {
|
||||
return &characterMap;
|
||||
return &elementMap;
|
||||
}
|
||||
|
||||
sqlite3* CharacterManager::SetDatabase(sqlite3* db) {
|
||||
|
||||
@@ -24,29 +24,33 @@
|
||||
|
||||
#include "character_data.hpp"
|
||||
#include "singleton.hpp"
|
||||
#include "manager_interface.hpp"
|
||||
|
||||
#include "sqlite3/sqlite3.h"
|
||||
|
||||
#include <functional>
|
||||
#include <map>
|
||||
|
||||
class CharacterManager : public Singleton<CharacterManager> {
|
||||
class CharacterManager:
|
||||
public Singleton<CharacterManager>,
|
||||
public ManagerInterface<CharacterData, int, std::string, std::string>
|
||||
{
|
||||
public:
|
||||
//public access 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);
|
||||
//common public methods
|
||||
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<int, CharacterData>)> 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();
|
||||
@@ -57,7 +61,6 @@ private:
|
||||
CharacterManager() = default;
|
||||
~CharacterManager() = default;
|
||||
|
||||
std::map<int, CharacterData> characterMap;
|
||||
sqlite3* database = nullptr;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#config
|
||||
INCLUDES+=. ../../common/gameplay ../../common/utilities
|
||||
INCLUDES+=. ../server_utilities ../../common/gameplay ../../common/utilities
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#config
|
||||
INCLUDES+=. ../../common/map ../../common/utilities
|
||||
INCLUDES+=. ../server_utilities ../../common/map ../../common/utilities
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
|
||||
@@ -29,21 +29,36 @@ static int getPager(lua_State* L) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int create(lua_State* L) {
|
||||
//EMPTY
|
||||
//NOTE: This can be used to set defaults for the pager
|
||||
static int setRoomName(lua_State* L) {
|
||||
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
|
||||
room->SetRoomName(lua_tostring(L, 2));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int unload(lua_State* L) {
|
||||
//EMPTY
|
||||
static int getRoomName(lua_State* L) {
|
||||
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
|
||||
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->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->GetTilesetName().c_str());
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const luaL_Reg roomLib[] = {
|
||||
{"GetPager",getPager},
|
||||
{"Create", create},
|
||||
{"Unload", unload},
|
||||
{"SetRoomName", setRoomName},
|
||||
{"GetRoomName", getRoomName},
|
||||
{"SetTileset", setTilesetName},
|
||||
{"GetTileset", getTilesetName},
|
||||
{nullptr, nullptr}
|
||||
};
|
||||
|
||||
|
||||
@@ -35,6 +35,9 @@ public:
|
||||
//accessors and mutators
|
||||
RegionPagerLua* GetPager() { return &pager; }
|
||||
|
||||
std::string SetRoomName(std::string s) { return roomName = s; }
|
||||
std::string GetRoomName() { return roomName; }
|
||||
|
||||
std::string SetTilesetName(std::string s) { return tilesetName = s; }
|
||||
std::string GetTilesetName() { return tilesetName; }
|
||||
|
||||
@@ -43,7 +46,10 @@ private:
|
||||
|
||||
//members
|
||||
RegionPagerLua pager;
|
||||
std::string roomName;
|
||||
std::string tilesetName;
|
||||
//TODO: pass the room name & tileset name to the clients
|
||||
//TODO: lua references i.e. create, unload, etc.
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -29,78 +29,76 @@
|
||||
//public access methods
|
||||
//-------------------------
|
||||
|
||||
int RoomManager::CreateRoom() {
|
||||
int RoomManager::Create() {
|
||||
//create the room
|
||||
RoomData* newRoom = new RoomData();
|
||||
newRoom->pager.SetLuaState(luaState);
|
||||
|
||||
//register the room
|
||||
roomMap[counter] = newRoom;
|
||||
|
||||
//API hook
|
||||
lua_getglobal(luaState, TORTUGA_ROOM_NAME);
|
||||
lua_getfield(luaState, -1, "Create");
|
||||
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);
|
||||
RoomData* newRoom = &elementMap[counter]; //implicitly constructs the element
|
||||
newRoom->pager.SetLuaState(lua);
|
||||
|
||||
//finish the routine
|
||||
return counter++;
|
||||
}
|
||||
|
||||
void RoomManager::UnloadRoom(int uid) {
|
||||
int RoomManager::Load() {
|
||||
//TODO: RoomManager::Load()
|
||||
return -1;
|
||||
}
|
||||
|
||||
int RoomManager::Save(int uid) {
|
||||
//TODO: RoomManager::Save(uid)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void RoomManager::Unload(int uid) {
|
||||
//find the room
|
||||
RoomData* room = FindRoom(uid);
|
||||
if (!room) {
|
||||
std::map<int, RoomData>::iterator it = elementMap.find(uid);
|
||||
if (it == elementMap.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
//API hook
|
||||
lua_getglobal(luaState, TORTUGA_ROOM_NAME);
|
||||
lua_getfield(luaState, -1, "Unload");
|
||||
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;
|
||||
roomMap.erase(uid);
|
||||
elementMap.erase(uid);
|
||||
}
|
||||
|
||||
RoomData* RoomManager::GetRoom(int uid) {
|
||||
return FindRoom(uid);
|
||||
//TODO: expand this to auto-create the room
|
||||
}
|
||||
|
||||
RoomData* RoomManager::FindRoom(int uid) {
|
||||
std::map<int, RoomData*>::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::Delete(int uid) {
|
||||
//TODO: RoomManager::Delete(int uid)
|
||||
//NOTE: aliased to RoomManager::Unload(int uid)
|
||||
Unload(uid);
|
||||
}
|
||||
|
||||
void RoomManager::UnloadAll() {
|
||||
lua_getglobal(luaState, TORTUGA_ROOM_NAME);
|
||||
|
||||
for (auto& it : roomMap) {
|
||||
//API hook
|
||||
lua_getfield(luaState, -1, "Unload");
|
||||
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();
|
||||
elementMap.clear();
|
||||
}
|
||||
|
||||
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)) {
|
||||
it = elementMap.erase(it);
|
||||
}
|
||||
else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RoomData* RoomManager::Get(int uid) {
|
||||
std::map<int, RoomData>::iterator it = elementMap.find(uid);
|
||||
|
||||
if (it == elementMap.end()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return &it->second;
|
||||
}
|
||||
|
||||
int RoomManager::GetLoadedCount() {
|
||||
return elementMap.size();
|
||||
}
|
||||
|
||||
int RoomManager::GetTotalCount() {
|
||||
return elementMap.size();
|
||||
}
|
||||
|
||||
std::map<int, RoomData>* RoomManager::GetContainer() {
|
||||
return &elementMap;
|
||||
}
|
||||
@@ -24,28 +24,34 @@
|
||||
|
||||
#include "room_data.hpp"
|
||||
#include "singleton.hpp"
|
||||
#include "manager_interface.hpp"
|
||||
|
||||
#include "lua/lua.hpp"
|
||||
|
||||
#include <map>
|
||||
|
||||
class RoomManager : public Singleton<RoomManager> {
|
||||
class RoomManager:
|
||||
public Singleton<RoomManager>,
|
||||
public ManagerInterface<RoomData>
|
||||
{
|
||||
public:
|
||||
//public access methods
|
||||
int CreateRoom();
|
||||
void UnloadRoom(int uid);
|
||||
//common public methods
|
||||
int Create() override;
|
||||
int Load() override;
|
||||
int Save(int uid) override;
|
||||
void Unload(int uid) override;
|
||||
void Delete(int uid) override;
|
||||
|
||||
RoomData* GetRoom(int uid);
|
||||
RoomData* FindRoom(int uid);
|
||||
int PushRoom(RoomData*);
|
||||
|
||||
void UnloadAll();
|
||||
void UnloadAll() override;
|
||||
void UnloadIf(std::function<bool(std::pair<const int,RoomData>)> fn) override;
|
||||
|
||||
//accessors and mutators
|
||||
std::map<int, RoomData*>* GetContainer() { return &roomMap; }
|
||||
RoomData* Get(int uid) override;
|
||||
int GetLoadedCount() override;
|
||||
int GetTotalCount() override;
|
||||
std::map<int, RoomData>* GetContainer() override;
|
||||
|
||||
lua_State* SetLuaState(lua_State* L) { return luaState = L; }
|
||||
lua_State* GetLuaState() { return luaState; }
|
||||
//hooks
|
||||
lua_State* SetLuaState(lua_State* L) { return lua = L; }
|
||||
lua_State* GetLuaState() { return lua; }
|
||||
|
||||
private:
|
||||
friend Singleton<RoomManager>;
|
||||
@@ -53,8 +59,7 @@ private:
|
||||
RoomManager() = default;
|
||||
~RoomManager() = default;
|
||||
|
||||
std::map<int, RoomData*> roomMap;
|
||||
lua_State* luaState = nullptr;
|
||||
lua_State* lua = nullptr;
|
||||
int counter = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -23,34 +23,34 @@
|
||||
|
||||
#include "room_manager.hpp"
|
||||
|
||||
#include <string>
|
||||
int createRoom(lua_State* L) {
|
||||
//create & get the room
|
||||
RoomManager& roomMgr = RoomManager::GetSingleton();
|
||||
int uid = roomMgr.Create();
|
||||
RoomData* room = roomMgr.Get(uid);
|
||||
|
||||
static int getRoom(lua_State* L) {
|
||||
//find, push and return the room
|
||||
RoomData* room = RoomManager::GetSingleton().GetRoom(lua_tointeger(L, -2));
|
||||
lua_pushlightuserdata(L, reinterpret_cast<void*>(room));
|
||||
return 1;
|
||||
//setup the room
|
||||
//TODO: room parameters only set via lua, fix this
|
||||
room->SetRoomName(lua_tostring(L, 1));
|
||||
room->SetTilesetName(lua_tostring(L, 2));
|
||||
|
||||
//return room, uid
|
||||
lua_pushlightuserdata(L, static_cast<void*>(room));
|
||||
lua_pushinteger(L, uid);
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
static int createRoom(lua_State* L) {
|
||||
//TODO: check parameter count for the glue functions
|
||||
|
||||
//create, find and return the room
|
||||
int uid = RoomManager::GetSingleton().CreateRoom();
|
||||
lua_pushlightuserdata(L, RoomManager::GetSingleton().FindRoom(uid));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int unloadRoom(lua_State* L) {
|
||||
//unload the specified room
|
||||
RoomManager::GetSingleton().UnloadRoom(lua_tointeger(L, -2));
|
||||
int unloadRoom(lua_State* L) {
|
||||
//TODO: check authorization for room deletion
|
||||
RoomManager& roomMgr = RoomManager::GetSingleton();
|
||||
roomMgr.Unload(lua_tointeger(L, 1));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const luaL_Reg roomManagerLib[] = {
|
||||
{"GetRoom",getRoom},
|
||||
{"CreateRoom",createRoom},
|
||||
{"UnloadRoom",unloadRoom},
|
||||
{"CreateRoom", createRoom},
|
||||
{"UnloadRoom", unloadRoom},
|
||||
{nullptr, nullptr}
|
||||
};
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@ void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) {
|
||||
newPacket.y = argPacket->y;
|
||||
|
||||
//BUG: possibly related to #35
|
||||
newPacket.region = roomMgr.GetRoom(argPacket->roomIndex)->GetPager()->GetRegion(argPacket->x, argPacket->y);
|
||||
newPacket.region = roomMgr.Get(argPacket->roomIndex)->GetPager()->GetRegion(argPacket->x, argPacket->y);
|
||||
|
||||
//send the content
|
||||
network.SendTo(argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket));
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
/* 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 MANAGERINTERFACE_HPP_
|
||||
#define MANAGERINTERFACE_HPP_
|
||||
|
||||
#include <functional>
|
||||
#include <map>
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,12 +0,0 @@
|
||||
TODO: Get the rooms working, even if only via hotkeys
|
||||
TODO: Fix shoddy movement
|
||||
|
||||
TODO: Remove the big "Shut Down" button
|
||||
TODO: Make a way for the server owner to control the server directly
|
||||
TODO: Move the map system into it's own namespace?
|
||||
TODO: The TileSheet class should implement the surface itself
|
||||
TODO: make the whole thing more fault tolerant
|
||||
TODO: Authentication
|
||||
|
||||
TODO: Time delay for requesting region packets
|
||||
TODO: A proper logging system
|
||||
Reference in New Issue
Block a user