Compare commits

..

5 Commits

Author SHA1 Message Date
Kayne Ruse f978cff98f lobby_server.cpp compiles 2014-07-31 15:58:56 +10:00
Kayne Ruse 35363c05c3 Updated a number of simpler client scenes (read more)
Updated the ClientApplication class to help support the new design, but
it's not finished because of that module's dependence on the various
scenes.

Updated the following scenes:

* CleanUp
* MainMenu
* OptionsMenu

The following source files (in client/scenes/) compile correctly:

* base_scene.cpp
* splash_screen.cpp
* clean_up.cpp
* main_menu.cpp
* options_menu.cpp

The folling source files (in client/scenes/) do not compile:

* in_world.cpp
* in_combat.cpp
* lobby_menu.cpp
2014-07-31 14:53:08 +10:00
Kayne Ruse a8eb67d619 Updated ClientApplication 2014-07-31 13:57:46 +10:00
Kayne Ruse 67c8bb6f11 rsc/ and common/ seem OK from the splice (read more)
common compiles correctly, although there are issues:

* There needs to be support for multiple pagers at once
* There needs to be a way to support multiple generation algorithms
2014-07-30 22:55:22 +10:00
Kayne Ruse 03f1723d88 Lazily committing the entire splice at once (read more)
(this message is copied from my blog)

So I took the lazy route and just committed the entire splice between the jam branch and the development branch all at once. It is exactly as terrible as you think it is, but I've been out of coding for 2 weeks, and I want to get some shit done. I'll pick through each piece one by one, by comparing the diffs from the develop branch to the current jam-merge branch.

Those developers I met on Monday said they were impressed by my ability to manage a large codebase, but if they saw this I'd expect they'd probably take that back.

And oh god it's been 3 weeks since I touched the main branch WTF?
2014-07-30 22:42:24 +10:00
112 changed files with 3131 additions and 2291 deletions
+1
View File
@@ -15,6 +15,7 @@ Out/
*.o *.o
*.a *.a
*.exe *.exe
*.diff
#Shell files #Shell files
*.bat *.bat
+4 -4
View File
@@ -21,14 +21,14 @@
*/ */
#include "character.hpp" #include "character.hpp"
void Character::Update() { void Character::Update(double delta) {
if (motion.x && motion.y) { if (motion.x && motion.y) {
origin += motion * CHARACTER_WALKING_MOD; origin += motion * delta * CHARACTER_WALKING_MOD;
} }
else if (motion != 0) { else if (motion != 0) {
origin += motion; origin += motion * delta;
} }
sprite.Update(0.016); sprite.Update(delta);
} }
void Character::DrawTo(SDL_Surface* const dest, int camX, int camY) { void Character::DrawTo(SDL_Surface* const dest, int camX, int camY) {
+3 -12
View File
@@ -26,7 +26,6 @@
#include "character_defines.hpp" #include "character_defines.hpp"
#include "vector2.hpp" #include "vector2.hpp"
#include "bounding_box.hpp" #include "bounding_box.hpp"
#include "statistics.hpp"
//graphics //graphics
#include "sprite_sheet.hpp" #include "sprite_sheet.hpp"
@@ -40,16 +39,13 @@ public:
Character() = default; Character() = default;
~Character() = default; ~Character() = default;
void Update(); void Update(double delta);
//graphics //graphics
void DrawTo(SDL_Surface* const, int camX, int camY); void DrawTo(SDL_Surface* const, int camX, int camY);
void CorrectSprite(); void CorrectSprite();
SpriteSheet* GetSprite() { return &sprite; } SpriteSheet* GetSprite() { return &sprite; }
//gameplay
Statistics* GetStats() { return &stats; }
//accessors and mutators //accessors and mutators
//metadata //metadata
@@ -65,18 +61,13 @@ public:
Vector2 GetOrigin() const { return origin; } Vector2 GetOrigin() const { return origin; }
Vector2 SetMotion(Vector2 v) { return motion = v; } Vector2 SetMotion(Vector2 v) { return motion = v; }
Vector2 GetMotion() const { return motion; } Vector2 GetMotion() const { return motion; }
BoundingBox SetBounds(BoundingBox b) { return bounds = b; } BoundingBox SetBoundingBox(BoundingBox b) { return bounds = b; }
BoundingBox GetBounds() { return bounds; } BoundingBox GetBoundingBox() const { return bounds; }
private: private:
//graphics //graphics
SpriteSheet sprite; SpriteSheet sprite;
//base statistics
Statistics stats;
//TODO: gameplay components: equipment, items, buffs, debuffs
//metadata //metadata
int owner; int owner;
std::string handle; std::string handle;
+70 -35
View File
@@ -21,7 +21,7 @@
*/ */
#include "client_application.hpp" #include "client_application.hpp"
#include "config_utility.hpp" #include "serial.hpp"
#include <stdexcept> #include <stdexcept>
#include <chrono> #include <chrono>
@@ -37,7 +37,7 @@
#include "options_menu.hpp" #include "options_menu.hpp"
#include "lobby_menu.hpp" #include "lobby_menu.hpp"
#include "in_world.hpp" #include "in_world.hpp"
//#include "in_combat.hpp" #include "in_combat.hpp"
#include "clean_up.hpp" #include "clean_up.hpp"
//------------------------- //-------------------------
@@ -47,10 +47,6 @@
void ClientApplication::Init(int argc, char** argv) { void ClientApplication::Init(int argc, char** argv) {
std::cout << "Beginning " << argv[0] << std::endl; std::cout << "Beginning " << argv[0] << std::endl;
//load the prerequisites
ConfigUtility& config = ConfigUtility::GetSingleton();
config.Load("rsc\\config.cfg");
//------------------------- //-------------------------
//Initialize the APIs //Initialize the APIs
//------------------------- //-------------------------
@@ -65,45 +61,83 @@ void ClientApplication::Init(int argc, char** argv) {
if (SDLNet_Init()) { if (SDLNet_Init()) {
throw(std::runtime_error("Failed to initialize SDL_net")); throw(std::runtime_error("Failed to initialize SDL_net"));
} }
UDPNetworkUtility::GetSingleton().Open(0); network.Open(0);
std::cout << "Initialized SDL_net" << std::endl; std::cout << "Initialized SDL_net" << std::endl;
//initialize lua
lua = luaL_newstate();
if (!lua) {
throw(std::runtime_error("Failed to initialize lua"));
}
luaL_openlibs(lua);
std::cout << "Initialized lua" << std::endl;
//run the setup script
if (luaL_dofile(lua, "rsc\\setup.lua")) {
throw(std::runtime_error("Failed to initialize lua's startup script"));
}
std::cout << "Initialized lua's setup script" << std::endl;
//place the config table onto the stack
lua_getglobal(lua, "config");
//------------------------- //-------------------------
//Setup the screen //Setup the screen
//------------------------- //-------------------------
int w = config.Int("client.screen.w"); //get each field
int h = config.Int("client.screen.h"); lua_getfield(lua, -1, "client");
int f = config.Bool("client.screen.f") ? SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN : SDL_HWSURFACE|SDL_DOUBLEBUF; lua_getfield(lua, -1, "screen");
lua_getfield(lua, -1, "width");
lua_getfield(lua, -2, "height");
lua_getfield(lua, -3, "fullscreen");
BaseScene::SetScreen(w ? w : 800, h ? h : 600, 0, f); int w = lua_tointeger(lua, -3);
int h = lua_tointeger(lua, -2);
int f = lua_toboolean(lua, -1);
//pop the screen members
lua_pop(lua, 5);
BaseScene::SetScreen(w ? w : 800, h ? h : 600, 0, f ?
SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN :
SDL_HWSURFACE|SDL_DOUBLEBUF);
std::cout << "Initialized the screen" << std::endl; std::cout << "Initialized the screen" << std::endl;
//------------------------- //-------------------------
//debug output //debug output
//------------------------- //-------------------------
//TODO: enable/disable these with a switch lua_getfield(lua, -1, "debug");
if (lua_toboolean(lua, -1)) {
#define DEBUG_OUTPUT_VAR(x) std::cout << "\t" << #x << ": " << x << std::endl; #define DEBUG_OUTPUT_VAR(x) std::cout << "\t" << #x << ": " << x << std::endl;
std::cout << "Internal sizes:" << std::endl; std::cout << "Internal sizes:" << std::endl;
DEBUG_OUTPUT_VAR(sizeof(Region::type_t)); DEBUG_OUTPUT_VAR(sizeof(Region::type_t));
DEBUG_OUTPUT_VAR(sizeof(Region)); DEBUG_OUTPUT_VAR(sizeof(Region));
DEBUG_OUTPUT_VAR(REGION_WIDTH); DEBUG_OUTPUT_VAR(REGION_WIDTH);
DEBUG_OUTPUT_VAR(REGION_HEIGHT); DEBUG_OUTPUT_VAR(REGION_HEIGHT);
DEBUG_OUTPUT_VAR(REGION_DEPTH); DEBUG_OUTPUT_VAR(REGION_DEPTH);
DEBUG_OUTPUT_VAR(REGION_TILE_FOOTPRINT); DEBUG_OUTPUT_VAR(REGION_SOLID_FOOTPRINT);
DEBUG_OUTPUT_VAR(REGION_SOLID_FOOTPRINT); DEBUG_OUTPUT_VAR(REGION_FOOTPRINT);
DEBUG_OUTPUT_VAR(PACKET_BUFFER_SIZE); DEBUG_OUTPUT_VAR(PACKET_BUFFER_SIZE);
DEBUG_OUTPUT_VAR(MAX_PACKET_SIZE); DEBUG_OUTPUT_VAR(MAX_PACKET_SIZE);
#undef DEBUG_OUTPUT_VAR #undef DEBUG_OUTPUT_VAR
}
//pop the debug value
lua_pop(lua, 1);
//------------------------- //-------------------------
//finalize the startup //finalize the startup
//------------------------- //-------------------------
//pop the config table
lua_pop(lua, 1);
std::cout << "Startup completed successfully" << std::endl; std::cout << "Startup completed successfully" << std::endl;
//------------------------- //-------------------------
@@ -119,6 +153,7 @@ void ClientApplication::Proc() {
//prepare the time system //prepare the time system
typedef std::chrono::steady_clock Clock; typedef std::chrono::steady_clock Clock;
std::chrono::duration<int, std::milli> delta(16);
Clock::time_point simTime = Clock::now(); Clock::time_point simTime = Clock::now();
Clock::time_point realTime; Clock::time_point realTime;
@@ -136,9 +171,8 @@ void ClientApplication::Proc() {
//simulate game time //simulate game time
while (simTime < realTime) { while (simTime < realTime) {
//call each user defined function //call each user defined function
activeScene->RunFrame(); activeScene->RunFrame(constexpr(double(delta.count()) / std::chrono::duration<int, std::milli>::period::den));
//~60 FPS simTime += delta;
simTime += std::chrono::duration<int, std::milli>(16);
} }
//draw the game to the screen //draw the game to the screen
@@ -150,7 +184,8 @@ void ClientApplication::Proc() {
void ClientApplication::Quit() { void ClientApplication::Quit() {
std::cout << "Shutting down" << std::endl; std::cout << "Shutting down" << std::endl;
UDPNetworkUtility::GetSingleton().Close(); lua_close(lua);
network.Close();
SDLNet_Quit(); SDLNet_Quit();
SDL_Quit(); SDL_Quit();
std::cout << "Clean exit" << std::endl; std::cout << "Clean exit" << std::endl;
@@ -166,25 +201,25 @@ void ClientApplication::LoadScene(SceneList sceneIndex) {
//add scene creation calls here //add scene creation calls here
case SceneList::FIRST: case SceneList::FIRST:
case SceneList::SPLASHSCREEN: case SceneList::SPLASHSCREEN:
activeScene = new SplashScreen(); activeScene = new SplashScreen(lua);
break; break;
case SceneList::MAINMENU: case SceneList::MAINMENU:
activeScene = new MainMenu(); activeScene = new MainMenu(lua);
break; break;
case SceneList::OPTIONSMENU: case SceneList::OPTIONSMENU:
activeScene = new OptionsMenu(); activeScene = new OptionsMenu(lua);
break; break;
case SceneList::LOBBYMENU: case SceneList::LOBBYMENU:
activeScene = new LobbyMenu(&clientIndex, &accountIndex); activeScene = new LobbyMenu(lua, network, characterMap);
break; break;
case SceneList::INWORLD: case SceneList::INWORLD:
activeScene = new InWorld(&clientIndex, &accountIndex, &characterIndex, &characterMap); activeScene = new InWorld(lua, network, characterMap);
break;
case SceneList::INCOMBAT:
activeScene = new InCombat(lua, network, characterMap);
break; break;
// case SceneList::INCOMBAT:
// activeScene = new InCombat(&clientIndex, &accountIndex, &characterIndex, &characterMap);
// break;
case SceneList::CLEANUP: case SceneList::CLEANUP:
activeScene = new CleanUp(&clientIndex, &accountIndex, &characterIndex, &characterMap); activeScene = new CleanUp(lua, network, characterMap);
break; break;
default: default:
throw(std::logic_error("Failed to recognize the scene index")); throw(std::logic_error("Failed to recognize the scene index"));
+7 -8
View File
@@ -28,23 +28,20 @@
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
#include "character.hpp" #include "character.hpp"
#include "singleton.hpp" #include "lua/lua.hpp"
#include <map> #include <map>
class ClientApplication: public Singleton<ClientApplication> { class ClientApplication {
public: public:
//public methods ClientApplication() = default;
~ClientApplication() = default;
void Init(int argc, char** argv); void Init(int argc, char** argv);
void Proc(); void Proc();
void Quit(); void Quit();
private: private:
friend Singleton<ClientApplication>;
ClientApplication() = default;
~ClientApplication() = default;
//Private access members //Private access members
void LoadScene(SceneList sceneIndex); void LoadScene(SceneList sceneIndex);
void UnloadScene(); void UnloadScene();
@@ -52,6 +49,8 @@ private:
BaseScene* activeScene = nullptr; BaseScene* activeScene = nullptr;
//shared parameters //shared parameters
lua_State* lua = nullptr;
UDPNetworkUtility network;
int clientIndex = -1; int clientIndex = -1;
int accountIndex = -1; int accountIndex = -1;
int characterIndex = -1; int characterIndex = -1;
+85
View File
@@ -0,0 +1,85 @@
/* $Id: linit.c,v 1.32, modified
* Initialization of libraries for lua.c and other clients
* See Copyright Notice in lua.h
*
* If you embed Lua in your program and need to open the standard
* libraries, call luaL_openlibs in your program. If you need a
* different set of libraries, copy this file to your project and edit
* it to suit your needs.
*
* Modified for use in Tortuga, renamed to linit.cpp
* Modifications are released under the zlib license:
*
* 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.
*/
#define linit_c
#define LUA_LIB
#include "lua/lua.hpp"
#include "region_api.hpp"
#include "region_pager_api.hpp"
#include "tile_sheet_api.hpp"
//these libs are loaded by lua.c and are readily available to any Lua program
static const luaL_Reg loadedlibs[] = {
//Standard libs
{"_G", luaopen_base},
{LUA_LOADLIBNAME, luaopen_package},
{LUA_COLIBNAME, luaopen_coroutine},
{LUA_TABLIBNAME, luaopen_table},
{LUA_IOLIBNAME, luaopen_io},
{LUA_OSLIBNAME, luaopen_os},
{LUA_STRLIBNAME, luaopen_string},
{LUA_BITLIBNAME, luaopen_bit32},
{LUA_MATHLIBNAME, luaopen_math},
{LUA_DBLIBNAME, luaopen_debug},
//Tortuga's API
{TORTUGA_REGION_NAME, openRegionAPI},
{TORTUGA_REGION_PAGER_NAME, openRegionPagerAPI},
{TORTUGA_TILE_SHEET_NAME, openTileSheetAPI},
{NULL, NULL}
};
//these libs are preloaded and must be required before used
static const luaL_Reg preloadedlibs[] = {
{NULL, NULL}
};
LUALIB_API void luaL_openlibs (lua_State *L) {
const luaL_Reg *lib;
//call open functions from 'loadedlibs' and set results to global table
for (lib = loadedlibs; lib->func; lib++) {
luaL_requiref(L, lib->name, lib->func, 1);
lua_pop(L, 1); //remove lib
}
//add open functions from 'preloadedlibs' into 'package.preload' table
luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD");
for (lib = preloadedlibs; lib->func; lib++) {
lua_pushcfunction(L, lib->func);
lua_setfield(L, -2, lib->name);
}
lua_pop(L, 1); //remove _PRELOAD table
}
+2 -19
View File
@@ -21,10 +21,6 @@
*/ */
#include "client_application.hpp" #include "client_application.hpp"
//singletons
#include "config_utility.hpp"
#include "udp_network_utility.hpp"
#include <stdexcept> #include <stdexcept>
#include <iostream> #include <iostream>
@@ -32,27 +28,14 @@ using namespace std;
int main(int argc, char** argv) { int main(int argc, char** argv) {
try { try {
//create the singletons ClientApplication app;
ConfigUtility::Create();
UDPNetworkUtility::Create();
//call the server's routines
ClientApplication::Create();
ClientApplication& app = ClientApplication::GetSingleton();
app.Init(argc, argv); app.Init(argc, argv);
app.Proc(); app.Proc();
app.Quit(); app.Quit();
ClientApplication::Delete();
//delete the singletons
ConfigUtility::Delete();
UDPNetworkUtility::Delete();
} }
catch(exception& e) { catch(exception& e) {
cerr << "Fatal exception thrown: " << e.what() << endl; cerr << "Fatal exception thrown: " << e.what() << endl;
return 1; return 1;
} }
return 0; return 0;
} }
+1 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. scenes ../common/debugging ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet_types ../common/ui ../common/utilities INCLUDES+=. scenes ../common/debugging ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet ../common/network/serial ../common/ui ../common/utilities
LIBS+=client.a ../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua LIBS+=client.a ../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
+2 -3
View File
@@ -75,10 +75,10 @@ SceneList BaseScene::GetNextScene() const {
//Frame loop //Frame loop
//------------------------- //-------------------------
void BaseScene::RunFrame() { void BaseScene::RunFrame(double delta) {
FrameStart(); FrameStart();
HandleEvents(); HandleEvents();
Update(); Update(delta);
FrameEnd(); FrameEnd();
} }
@@ -86,7 +86,6 @@ void BaseScene::RenderFrame() {
SDL_FillRect(screen, 0, 0); SDL_FillRect(screen, 0, 0);
Render(screen); Render(screen);
SDL_Flip(screen); SDL_Flip(screen);
SDL_Delay(10);
} }
//------------------------- //-------------------------
+2 -2
View File
@@ -40,13 +40,13 @@ public:
SceneList GetNextScene() const; SceneList GetNextScene() const;
//Frame loop //Frame loop
virtual void RunFrame(); virtual void RunFrame(double delta);
virtual void RenderFrame(); virtual void RenderFrame();
protected: protected:
virtual void FrameStart() {} virtual void FrameStart() {}
virtual void HandleEvents(); virtual void HandleEvents();
virtual void Update() {} virtual void Update(double delta) {}
virtual void FrameEnd() {} virtual void FrameEnd() {}
virtual void Render(SDL_Surface* const screen) {} virtual void Render(SDL_Surface* const screen) {}
+44 -26
View File
@@ -22,7 +22,6 @@
#include "clean_up.hpp" #include "clean_up.hpp"
#include "channels.hpp" #include "channels.hpp"
#include "config_utility.hpp"
#include <stdexcept> #include <stdexcept>
@@ -30,23 +29,43 @@
//Public access members //Public access members
//------------------------- //-------------------------
CleanUp::CleanUp( CleanUp::CleanUp(lua_State* L, UDPNetworkUtility& aNetwork, CharacterMap& aCharacterMap):
int* const argClientIndex, lua(L),
int* const argAccountIndex, network(aNetwork),
int* const argCharacterIndex, characterMap(aCharacterMap)
CharacterMap* argCharacterMap
):
clientIndex(*argClientIndex),
accountIndex(*argAccountIndex),
characterIndex(*argCharacterIndex),
characterMap(*argCharacterMap)
{ {
ConfigUtility& config = ConfigUtility::GetSingleton(); //get the config table
lua_getglobal(lua, "config");
//TODO: I need to figure out an alternative to loading these over and over again
//get the directories
lua_getfield(lua, -1, "dir");
lua_getfield(lua, -1, "interface");
lua_getfield(lua, -2, "fonts");
std::string interfaceDir = lua_tostring(lua, -2);
std::string fontsDir = lua_tostring(lua, -1);
lua_pop(lua, 3);
//clear the indicies
lua_getfield(lua, -1, "client");
lua_pushnil(lua);
lua_pushnil(lua);
lua_pushnil(lua);
lua_setfield(lua, -4, "clientIndex");
lua_setfield(lua, -3, "accountIndex");
lua_setfield(lua, -2, "characterIndex");
//pop the remaining objects from the stack
lua_pop(lua, 2);
//setup the utility objects //setup the utility objects
image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); image.LoadSurface(interfaceDir + "button_menu.bmp");
image.SetClipH(image.GetClipH()/3); image.SetClipH(image.GetClipH()/3);
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp"); font.LoadSurface(fontsDir + "pk_white_8.bmp");
//pass the utility objects //pass the utility objects
backButton.SetImage(&image); backButton.SetImage(&image);
@@ -61,12 +80,7 @@ CleanUp::CleanUp(
//full reset //full reset
network.Unbind(Channels::SERVER); network.Unbind(Channels::SERVER);
clientIndex = -1;
accountIndex = -1;
characterIndex = -1;
// combatMap.clear();
characterMap.clear(); characterMap.clear();
// enemyMap.clear();
//auto return //auto return
startTick = std::chrono::steady_clock::now(); startTick = std::chrono::steady_clock::now();
@@ -80,7 +94,7 @@ CleanUp::~CleanUp() {
//Frame loop //Frame loop
//------------------------- //-------------------------
void CleanUp::Update() { void CleanUp::Update(double delta) {
if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(10)) { if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(10)) {
SetNextScene(SceneList::MAINMENU); SetNextScene(SceneList::MAINMENU);
} }
@@ -89,6 +103,13 @@ void CleanUp::Update() {
while(network.Receive()); while(network.Receive());
} }
void CleanUp::RenderFrame() {
SDL_FillRect(GetScreen(), 0, 0);
Render(GetScreen());
SDL_Flip(GetScreen());
fps.Calculate();
}
void CleanUp::Render(SDL_Surface* const screen) { void CleanUp::Render(SDL_Surface* const screen) {
backButton.DrawTo(screen); backButton.DrawTo(screen);
font.DrawStringTo("You have been disconnected.", screen, 50, 30); font.DrawStringTo("You have been disconnected.", screen, 50, 30);
@@ -111,17 +132,14 @@ void CleanUp::MouseButtonDown(SDL_MouseButtonEvent const& button) {
} }
void CleanUp::MouseButtonUp(SDL_MouseButtonEvent const& button) { void CleanUp::MouseButtonUp(SDL_MouseButtonEvent const& button) {
if (backButton.MouseButtonUp(button) == Button::State::HOVER) { if (backButton.MouseButtonUp(button) == Button::State::HOVER &&
button.button & SDL_BUTTON_LMASK) {
SetNextScene(SceneList::MAINMENU); SetNextScene(SceneList::MAINMENU);
} }
} }
void CleanUp::KeyDown(SDL_KeyboardEvent const& key) { void CleanUp::KeyDown(SDL_KeyboardEvent const& key) {
switch(key.keysym.sym) { //
case SDLK_ESCAPE:
SetNextScene(SceneList::MAINMENU);
break;
}
} }
void CleanUp::KeyUp(SDL_KeyboardEvent const& key) { void CleanUp::KeyUp(SDL_KeyboardEvent const& key) {
+13 -16
View File
@@ -25,14 +25,18 @@
//network //network
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
//graphics //graphics & ui
#include "image.hpp" #include "image.hpp"
#include "raster_font.hpp" #include "raster_font.hpp"
#include "button.hpp" #include "button.hpp"
#include "frame_rate.hpp"
//client //client
#include "character.hpp"
#include "base_scene.hpp" #include "base_scene.hpp"
#include "character.hpp"
//APIs
#include "lua/lua.hpp"
//std namespace //std namespace
#include <chrono> #include <chrono>
@@ -40,17 +44,13 @@
class CleanUp : public BaseScene { class CleanUp : public BaseScene {
public: public:
//Public access members //Public access members
CleanUp( CleanUp(lua_State*, UDPNetworkUtility&, CharacterMap&);
int* const argClientIndex,
int* const argAccountIndex,
int* const argCharacterIndex,
CharacterMap* argCharacterMap
);
~CleanUp(); ~CleanUp();
protected: protected:
//Frame loop //Frame loop
void Update(); void Update(double delta);
void RenderFrame();
void Render(SDL_Surface* const); void Render(SDL_Surface* const);
//Event handlers //Event handlers
@@ -62,18 +62,15 @@ protected:
void KeyUp(SDL_KeyboardEvent const&); void KeyUp(SDL_KeyboardEvent const&);
//shared parameters //shared parameters
UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton(); lua_State* lua = nullptr;
int& clientIndex; UDPNetworkUtility& network;
int& accountIndex;
int& characterIndex;
CharacterMap& characterMap; CharacterMap& characterMap;
//graphics //graphics & ui
Image image; Image image;
RasterFont font; RasterFont font;
//UI
Button backButton; Button backButton;
FrameRate fps;
//auto return //auto return
std::chrono::steady_clock::time_point startTick; std::chrono::steady_clock::time_point startTick;
+221
View File
@@ -0,0 +1,221 @@
/* Copyright: (c) Kayne Ruse 2013, 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 "in_combat.hpp"
#include "channels.hpp"
#include "utility.hpp"
#include <stdexcept>
//-------------------------
//Public access members
//-------------------------
InCombat::InCombat(
ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork,
int* const argClientIndex,
int* const argAccountIndex,
int* const argCharacterIndex,
CharacterMap* argCharacterMap
):
config(*argConfig),
network(*argNetwork),
clientIndex(*argClientIndex),
accountIndex(*argAccountIndex),
characterIndex(*argCharacterIndex),
characterMap(*argCharacterMap)
{
/* //setup the utility objects
buttonImage.LoadSurface(config["dir.interface"] + "button_menu.bmp");
buttonImage.SetClipH(buttonImage.GetClipH()/3);
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp");
//pass the utility objects
backButton.SetImage(&buttonImage);
backButton.SetFont(&font);
//set the button positions
backButton.SetX(50);
backButton.SetY(50 + buttonImage.GetClipH() * 0);
//set the button texts
backButton.SetText("Back");
//request a sync
RequestSynchronize();
*/
//debug
//
}
InCombat::~InCombat() {
//
}
//-------------------------
//Frame loop
//-------------------------
void InCombat::FrameStart() {
//
}
void InCombat::Update(double delta) {
//suck in and process all waiting packets
SerialPacket* packetBuffer = static_cast<SerialPacket*>(malloc(MAX_PACKET_SIZE));
while(network.Receive(packetBuffer)) {
HandlePacket(packetBuffer);
}
free(static_cast<void*>(packetBuffer));
//TODO: more
}
void InCombat::FrameEnd() {
//
}
void InCombat::RenderFrame() {
SDL_FillRect(GetScreen(), 0, 0);
Render(GetScreen());
SDL_Flip(GetScreen());
fps.Calculate();
}
void InCombat::Render(SDL_Surface* const screen) {
//TODO: draw the background
//TODO: draw the characters
//TODO: draw the enemies
//TODO: draw the UI
}
//-------------------------
//Event handlers
//-------------------------
void InCombat::QuitEvent() {
//exit the game AND the server
RequestDisconnect();
SetNextScene(SceneList::QUIT);
}
void InCombat::MouseMotion(SDL_MouseMotionEvent const& motion) {
//
}
void InCombat::MouseButtonDown(SDL_MouseButtonEvent const& button) {
//
}
void InCombat::MouseButtonUp(SDL_MouseButtonEvent const& button) {
//
}
void InCombat::KeyDown(SDL_KeyboardEvent const& key) {
//
}
void InCombat::KeyUp(SDL_KeyboardEvent const& key) {
//
}
//-------------------------
//Network handlers
//-------------------------
void InCombat::HandlePacket(SerialPacket* const argPacket) {
switch(argPacket->type) {
case SerialPacketType::DISCONNECT:
HandleDisconnect(argPacket);
break;
//handle errors
default:
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in InCombat: " + to_string_custom(static_cast<int>(argPacket->type)) ));
break;
}
}
void InCombat::HandleDisconnect(SerialPacket* const) {
SetNextScene(SceneList::CLEANUP);
}
//TODO: more network handlers
//-------------------------
//Server control
//-------------------------
void InCombat::RequestSynchronize() {
ClientPacket newPacket;
//request a sync
newPacket.type = SerialPacketType::SYNCHRONIZE;
newPacket.clientIndex = clientIndex;
newPacket.accountIndex = accountIndex;
network.SendTo(Channels::SERVER, &newPacket);
}
void InCombat::SendPlayerUpdate() {
CharacterPacket newPacket;
//pack the packet
newPacket.type = SerialPacketType::CHARACTER_UPDATE;
newPacket.characterIndex = characterIndex;
//handle, avatar
newPacket.accountIndex = accountIndex;
// newPacket.roomIndex = localCharacter->roomIndex;
// newPacket.origin = localCharacter->origin;
// newPacket.motion = localCharacter->motion;
// newPacket.stats = localCharacter->stats;
//TODO: gameplay components: equipment, items, buffs, debuffs
network.SendTo(Channels::SERVER, &newPacket);
}
void InCombat::RequestDisconnect() {
ClientPacket newPacket;
//send a disconnect request
newPacket.type = SerialPacketType::DISCONNECT;
newPacket.clientIndex = clientIndex;
newPacket.accountIndex = accountIndex;
network.SendTo(Channels::SERVER, &newPacket);
}
void InCombat::RequestShutdown() {
ClientPacket newPacket;
//send a shutdown request
newPacket.type = SerialPacketType::SHUTDOWN;
newPacket.clientIndex = clientIndex;
newPacket.accountIndex = accountIndex;
network.SendTo(Channels::SERVER, &newPacket);
}
+97
View File
@@ -0,0 +1,97 @@
/* Copyright: (c) Kayne Ruse 2013, 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 INCOMBAT_HPP_
#define INCOMBAT_HPP_
//network
#include "udp_network_utility.hpp"
//graphics
#include "image.hpp"
#include "raster_font.hpp"
#include "button.hpp"
//common
#include "config_utility.hpp"
#include "frame_rate.hpp"
#include "character.hpp"
//client
#include "base_scene.hpp"
class InCombat : public BaseScene {
public:
//Public access members
InCombat(
ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork,
int* const argClientIndex,
int* const argAccountIndex,
int* const argCharacterIndex,
CharacterMap* argCharacterMap
);
~InCombat();
protected:
//Frame loop
void FrameStart();
void Update(double delta);
void FrameEnd();
void RenderFrame();
void Render(SDL_Surface* const);
//Event handlers
void QuitEvent();
void MouseMotion(SDL_MouseMotionEvent const&);
void MouseButtonDown(SDL_MouseButtonEvent const&);
void MouseButtonUp(SDL_MouseButtonEvent const&);
void KeyDown(SDL_KeyboardEvent const&);
void KeyUp(SDL_KeyboardEvent const&);
//Network handlers
void HandlePacket(SerialPacket* const);
void HandleDisconnect(SerialPacket* const);
//Server control
void RequestSynchronize();
void SendPlayerUpdate();
void RequestDisconnect();
void RequestShutdown();
//shared parameters
ConfigUtility& config;
UDPNetworkUtility& network;
int& clientIndex;
int& accountIndex;
int& characterIndex;
CharacterMap& characterMap;
//graphics
//TODO: graphics
//UI
//TODO: UI
FrameRate fps;
};
#endif
+129 -85
View File
@@ -23,7 +23,6 @@
#include "channels.hpp" #include "channels.hpp"
#include "utility.hpp" #include "utility.hpp"
#include "config_utility.hpp"
#include <stdexcept> #include <stdexcept>
#include <algorithm> #include <algorithm>
@@ -35,18 +34,74 @@
//------------------------- //-------------------------
InWorld::InWorld( InWorld::InWorld(
ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork,
int* const argClientIndex, int* const argClientIndex,
int* const argAccountIndex, int* const argAccountIndex,
int* const argCharacterIndex, int* const argCharacterIndex,
CharacterMap* argCharacterMap CharacterMap* argCharacterMap
): ):
config(*argConfig),
network(*argNetwork),
clientIndex(*argClientIndex), clientIndex(*argClientIndex),
accountIndex(*argAccountIndex), accountIndex(*argAccountIndex),
characterIndex(*argCharacterIndex), characterIndex(*argCharacterIndex),
characterMap(*argCharacterMap) characterMap(*argCharacterMap)
{ {
ConfigUtility& config = ConfigUtility::GetSingleton(); //register the pager
lua_pushstring(lua, TORTUGA_REGION_PAGER_PSEUDO_INDEX);
lua_pushlightuserdata(lua, &pager);
lua_settable(L, LUA_REGISTRYINDEX);
//register the tilesheet
lua_pushstring(lua, TORTUGA_TILE_SHEET_PSEUDO_INDEX);
lua_pushlightuserdata(lua, &tileSheet);
lua_settable(L, LUA_REGISTRYINDEX);
//setup the component objecrs
pager.SetLuaState(lua);
//get the config info
lua_getglobal(lua, "config");
lua_getfield(lua, -1, "dir");
lua_getfield(lua, -1, "fonts");
std::string fonts = lua_tostring(lua, -1);
lua_getfield(lua, -2, "interface");
std::string interface = lua_tostring(lua, -1);
lua_getfield(lua, -3, "sprites");
std::string sprites = lua_tostring(lua, -1);
lua_getfield(lua, -4, "scripts");
std::string scripts = lua_tostring(lua, -1);
lua_pop(lua, 6);
//run the additional scripts
if (luaL_dofile(lua, (scripts + "in_world.lua").c_str())) {
throw(std::runtime_error(std::string() + "Failed to run in_world.lua: " + lua_tostring(lua, -1) ));
}
//setup the utility objects
buttonImage.LoadSurface(interface + "button_menu.bmp");
buttonImage.SetClipH(buttonImage.GetClipH()/3);
font.LoadSurface(fonts + "pk_white_8.bmp");
//pass the utility objects
backButton.SetImage(&buttonImage);
backButton.SetFont(&font);
//set the button positions
backButton.SetX(50);
backButton.SetY(50 + buttonImage.GetClipH() * 0);
//set the button texts
backButton.SetText("Back");
//entities
character.GetSprite()->LoadSurface(sprites + "elliot2.bmp", 4, 4);
character.SetBoundingBox({0, 0,
character.GetSprite()->GetImage()->GetClipW(),
character.GetSprite()->GetImage()->GetClipH()
});
//-------------------------
//setup the utility objects //setup the utility objects
buttonImage.LoadSurface(config["dir.interface"] + "button_menu.bmp"); buttonImage.LoadSurface(config["dir.interface"] + "button_menu.bmp");
buttonImage.SetClipH(buttonImage.GetClipH()/3); buttonImage.SetClipH(buttonImage.GetClipH()/3);
@@ -70,8 +125,7 @@ InWorld::InWorld(
//load the tilesheet //load the tilesheet
//TODO: add the tilesheet to the map system? //TODO: add the tilesheet to the map system?
//TODO: Tile size and tile sheet should be loaded elsewhere tileSheet.Load(config["dir.tilesets"] + "terrain.bmp", 12, 15);
tileSheet.Load(config["dir.tilesets"] + "terrain.bmp", 32, 32);
//request a sync //request a sync
RequestSynchronize(); RequestSynchronize();
@@ -81,7 +135,13 @@ InWorld::InWorld(
} }
InWorld::~InWorld() { InWorld::~InWorld() {
// //unregister the map components
lua_pushstring(lua, TORTUGA_REGION_PAGER_PSEUDO_INDEX);
lua_pushstring(lua, TORTUGA_TILE_SHEET_PSEUDO_INDEX);
lua_pushnil(lua);
lua_settable(lua, LUA_REGISTRYINDEX);
lua_pushnil(lua);
lua_settable(lua, LUA_REGISTRYINDEX);
} }
//------------------------- //-------------------------
@@ -92,54 +152,51 @@ void InWorld::FrameStart() {
// //
} }
void InWorld::Update() { void InWorld::Update(double delta) {
//suck in and process all waiting packets //suck in and process all waiting packets
SerialPacket* packetBuffer = reinterpret_cast<SerialPacket*>(new char[MAX_PACKET_SIZE]); SerialPacket* packetBuffer = static_cast<SerialPacket*>(malloc(MAX_PACKET_SIZE));
while(network.Receive(packetBuffer)) { while(network.Receive(packetBuffer)) {
HandlePacket(packetBuffer); HandlePacket(packetBuffer);
} }
delete reinterpret_cast<char*>(packetBuffer); free(static_cast<void*>(packetBuffer));
//update the characters //update the characters
for (auto& it : characterMap) { for (auto& it : characterMap) {
it.second.Update(); it.second.Update(delta);
}
//check the map
UpdateMap();
//skip the rest
if (!localCharacter) {
return;
} }
//TODO: Check collisions here
//check for collisions with the map //check for collisions with the map
BoundingBox wallBounds = {0, 0, tileSheet.GetTileW(), tileSheet.GetTileH()}; BoundingBox wallBounds = {0, 0, tileSheet.GetTileW(), tileSheet.GetTileH()};
const int xCount = localCharacter->GetBounds().w / wallBounds.w + 1; const int xCount = character.GetBoundingBox().w / wallBounds.w + 1;
const int yCount = localCharacter->GetBounds().h / wallBounds.h + 1; const int yCount = character.GetBoundingBox().h / wallBounds.h + 1;
for (int i = -1; i <= xCount; ++i) { for (int i = -1; i <= xCount; ++i) {
for (int j = -1; j <= yCount; ++j) { for (int j = -1; j <= yCount; ++j) {
//set the wall's position //set the wall's position
wallBounds.x = wallBounds.w * i + snapToBase((double)wallBounds.w, localCharacter->GetOrigin().x); wallBounds.x = wallBounds.w * i + snapToBase((double)wallBounds.w, character.GetOrigin().x);
wallBounds.y = wallBounds.h * j + snapToBase((double)wallBounds.h, localCharacter->GetOrigin().y); wallBounds.y = wallBounds.h * j + snapToBase((double)wallBounds.h, character.GetOrigin().y);
if (!regionPager.GetSolid(wallBounds.x / wallBounds.w, wallBounds.y / wallBounds.h)) { if (!pager.GetSolid(wallBounds.x / wallBounds.w, wallBounds.y / wallBounds.h)) {
continue; continue;
} }
if ((localCharacter->GetOrigin() + localCharacter->GetBounds()).CheckOverlap(wallBounds)) { if ((character.GetOrigin() + character.GetBoundingBox()).CheckOverlap(wallBounds)) {
localCharacter->SetOrigin(localCharacter->GetOrigin() - (localCharacter->GetMotion())); character.SetOrigin(character.GetOrigin() - (character.GetMotion() * delta));
localCharacter->SetMotion({0,0}); character.SetMotion({0,0});
localCharacter->CorrectSprite(); character.CorrectSprite();
SendPlayerUpdate();
} }
} }
} }
//update the camera //update the camera
camera.x = localCharacter->GetOrigin().x - camera.marginX; if(localCharacter) {
camera.y = localCharacter->GetOrigin().y - camera.marginY; camera.x = localCharacter->GetOrigin().x - camera.marginX;
camera.y = localCharacter->GetOrigin().y - camera.marginY;
}
//check the map
UpdateMap();
} }
void InWorld::FrameEnd() { void InWorld::FrameEnd() {
@@ -205,13 +262,6 @@ void InWorld::KeyDown(SDL_KeyboardEvent const& key) {
return; return;
} }
//hotkeys
switch(key.keysym.sym) {
case SDLK_ESCAPE:
RequestDisconnect();
break;
}
//player movement //player movement
Vector2 motion = localCharacter->GetMotion(); Vector2 motion = localCharacter->GetMotion();
switch(key.keysym.sym) { switch(key.keysym.sym) {
@@ -269,7 +319,7 @@ void InWorld::KeyUp(SDL_KeyboardEvent const& key) {
//------------------------- //-------------------------
void InWorld::HandlePacket(SerialPacket* const argPacket) { void InWorld::HandlePacket(SerialPacket* const argPacket) {
switch(argPacket->GetType()) { switch(argPacket->type) {
case SerialPacketType::DISCONNECT: case SerialPacketType::DISCONNECT:
HandleDisconnect(argPacket); HandleDisconnect(argPacket);
break; break;
@@ -287,7 +337,7 @@ void InWorld::HandlePacket(SerialPacket* const argPacket) {
break; break;
//handle errors //handle errors
default: default:
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in InWorld: " + to_string_custom(static_cast<int>(argPacket->GetType())) )); throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in InWorld: " + to_string_custom(static_cast<int>(argPacket->type)) ));
break; break;
} }
} }
@@ -297,36 +347,30 @@ void InWorld::HandleDisconnect(SerialPacket* const argPacket) {
} }
void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) { void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) {
if (characterMap.find(argPacket->GetCharacterIndex()) != characterMap.end()) { if (characterMap.find(argPacket->characterIndex) != characterMap.end()) {
throw(std::runtime_error("Cannot create duplicate characters")); throw(std::runtime_error("Cannot create duplicate characters"));
} }
//create the character object //create the character object
Character& newCharacter = characterMap[argPacket->GetCharacterIndex()]; Character& newCharacter = characterMap[argPacket->characterIndex];
//fill out the character's members //fill out the character's members
newCharacter.SetHandle(argPacket->GetHandle()); newCharacter.SetHandle(argPacket->handle);
newCharacter.SetAvatar(argPacket->GetAvatar()); newCharacter.SetAvatar(argPacket->avatar);
newCharacter.GetSprite()->LoadSurface(ConfigUtility::GetSingleton()["dir.sprites"] + newCharacter.GetAvatar(), 4, 4); newCharacter.GetSprite()->LoadSurface(config["dir.sprites"] + newCharacter.GetAvatar(), 4, 4);
newCharacter.SetOrigin(argPacket->GetOrigin()); newCharacter.SetOrigin(argPacket->origin);
newCharacter.SetMotion(argPacket->GetMotion()); newCharacter.SetMotion(argPacket->motion);
newCharacter.SetBounds({
CHARACTER_BOUNDS_X,
CHARACTER_BOUNDS_Y,
CHARACTER_BOUNDS_WIDTH,
CHARACTER_BOUNDS_HEIGHT
});
*newCharacter.GetStats() = *argPacket->GetStatistics(); (*newCharacter.GetStats()) = argPacket->stats;
//bookkeeping code //bookkeeping code
newCharacter.CorrectSprite(); newCharacter.CorrectSprite();
//catch this client's player object //catch this client's player object
if (argPacket->GetAccountIndex() == accountIndex && !localCharacter) { if (argPacket->accountIndex == accountIndex && !localCharacter) {
characterIndex = argPacket->GetCharacterIndex(); characterIndex = argPacket->characterIndex;
localCharacter = &newCharacter; localCharacter = &newCharacter;
//setup the camera //setup the camera
@@ -344,39 +388,39 @@ void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) {
//TODO: authenticate when own character is being deleted (linked to a TODO in the server) //TODO: authenticate when own character is being deleted (linked to a TODO in the server)
//catch this client's player object //catch this client's player object
if (argPacket->GetCharacterIndex() == characterIndex) { if (argPacket->characterIndex == characterIndex) {
characterIndex = -1; characterIndex = -1;
localCharacter = nullptr; localCharacter = nullptr;
} }
characterMap.erase(argPacket->GetCharacterIndex()); characterMap.erase(argPacket->characterIndex);
} }
void InWorld::HandleCharacterUpdate(CharacterPacket* const argPacket) { void InWorld::HandleCharacterUpdate(CharacterPacket* const argPacket) {
if (characterMap.find(argPacket->GetCharacterIndex()) == characterMap.end()) { if (characterMap.find(argPacket->characterIndex) == characterMap.end()) {
std::cout << "Warning: HandleCharacterUpdate() is passing to HandleCharacterNew()" << std::endl; std::cout << "Warning: HandleCharacterUpdate() is passing to HandleCharacterNew()" << std::endl;
HandleCharacterNew(argPacket); HandleCharacterNew(argPacket);
return; return;
} }
Character& character = characterMap[argPacket->GetCharacterIndex()]; Character& character = characterMap[argPacket->characterIndex];
//other characters moving //other characters moving
if (argPacket->GetCharacterIndex() != characterIndex) { if (argPacket->characterIndex != characterIndex) {
character.SetOrigin(argPacket->GetOrigin()); character.SetOrigin(argPacket->origin);
character.SetMotion(argPacket->GetMotion()); character.SetMotion(argPacket->motion);
character.CorrectSprite(); character.CorrectSprite();
} }
} }
void InWorld::HandleRegionContent(RegionPacket* const argPacket) { void InWorld::HandleRegionContent(RegionPacket* const argPacket) {
//replace existing regions //replace existing regions
regionPager.UnloadRegion(argPacket->GetX(), argPacket->GetY()); regionPager.UnloadRegion(argPacket->x, argPacket->y);
regionPager.PushRegion(argPacket->GetRegion()); regionPager.PushRegion(argPacket->region);
//clean up after the serial code //clean up after the serial code
delete argPacket->GetRegion(); delete argPacket->region;
argPacket->SetRegion(nullptr); argPacket->region = nullptr;
} }
//------------------------- //-------------------------
@@ -387,9 +431,9 @@ void InWorld::RequestSynchronize() {
ClientPacket newPacket; ClientPacket newPacket;
//request a sync //request a sync
newPacket.SetType(SerialPacketType::SYNCHRONIZE); newPacket.type = SerialPacketType::SYNCHRONIZE;
newPacket.SetClientIndex(clientIndex); newPacket.clientIndex = clientIndex;
newPacket.SetAccountIndex(accountIndex); newPacket.accountIndex = accountIndex;
//TODO: location, range for sync request //TODO: location, range for sync request
@@ -400,15 +444,15 @@ void InWorld::SendPlayerUpdate() {
CharacterPacket newPacket; CharacterPacket newPacket;
//pack the packet //pack the packet
newPacket.SetType(SerialPacketType::CHARACTER_UPDATE); newPacket.type = SerialPacketType::CHARACTER_UPDATE;
newPacket.SetCharacterIndex(characterIndex); newPacket.characterIndex = characterIndex;
//NOTE: omitting the handle and avatar here //NOTE: omitting the handle and avatar here
newPacket.SetAccountIndex(accountIndex); newPacket.accountIndex = accountIndex;
newPacket.SetRoomIndex(0); //TODO: room index newPacket.roomIndex = 0; //TODO: room index
newPacket.SetOrigin(localCharacter->GetOrigin()); newPacket.origin = localCharacter->GetOrigin();
newPacket.SetMotion(localCharacter->GetMotion()); newPacket.motion = localCharacter->GetMotion();
*newPacket.GetStatistics() = *localCharacter->GetStats(); newPacket.stats = *localCharacter->GetStats();
//TODO: gameplay components: equipment, items, buffs, debuffs //TODO: gameplay components: equipment, items, buffs, debuffs
@@ -419,9 +463,9 @@ void InWorld::RequestDisconnect() {
ClientPacket newPacket; ClientPacket newPacket;
//send a disconnect request //send a disconnect request
newPacket.SetType(SerialPacketType::DISCONNECT); newPacket.type = SerialPacketType::DISCONNECT;
newPacket.SetClientIndex(clientIndex); newPacket.clientIndex = clientIndex;
newPacket.SetAccountIndex(accountIndex); newPacket.accountIndex = accountIndex;
network.SendTo(Channels::SERVER, &newPacket); network.SendTo(Channels::SERVER, &newPacket);
} }
@@ -430,9 +474,9 @@ void InWorld::RequestShutDown() {
ClientPacket newPacket; ClientPacket newPacket;
//send a shutdown request //send a shutdown request
newPacket.SetType(SerialPacketType::SHUTDOWN); newPacket.type = SerialPacketType::SHUTDOWN;
newPacket.SetClientIndex(clientIndex); newPacket.clientIndex = clientIndex;
newPacket.SetAccountIndex(accountIndex); newPacket.accountIndex = accountIndex;
network.SendTo(Channels::SERVER, &newPacket); network.SendTo(Channels::SERVER, &newPacket);
} }
@@ -441,10 +485,10 @@ void InWorld::RequestRegion(int roomIndex, int x, int y) {
RegionPacket packet; RegionPacket packet;
//pack the region's data //pack the region's data
packet.SetType(SerialPacketType::REGION_REQUEST); packet.type = SerialPacketType::REGION_REQUEST;
packet.SetRoomIndex(roomIndex); packet.roomIndex = roomIndex;
packet.SetX(x); packet.x = x;
packet.SetY(y); packet.y = y;
network.SendTo(Channels::SERVER, &packet); network.SendTo(Channels::SERVER, &packet);
} }
+21 -13
View File
@@ -22,25 +22,28 @@
#ifndef INWORLD_HPP_ #ifndef INWORLD_HPP_
#define INWORLD_HPP_ #define INWORLD_HPP_
//maps //map stuff
#include "region_pager_base.hpp" #include "tile_sheet.hpp"
#include "region_pager_lua.hpp"
//networking //networking
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
//graphics //graphics & ui
#include "image.hpp" #include "image.hpp"
#include "raster_font.hpp" #include "raster_font.hpp"
#include "button.hpp" #include "button.hpp"
#include "tile_sheet.hpp"
//common //utilities
#include "frame_rate.hpp" #include "frame_rate.hpp"
#include "timer.hpp"
#include "character.hpp"
//client //client
#include "base_scene.hpp" #include "base_scene.hpp"
#include "character.hpp"
//APIs
#include "lua/lua.hpp"
//STL //STL
#include <map> #include <map>
@@ -49,6 +52,8 @@ class InWorld : public BaseScene {
public: public:
//Public access members //Public access members
InWorld( InWorld(
ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork,
int* const argClientIndex, int* const argClientIndex,
int* const argAccountIndex, int* const argAccountIndex,
int* const argCharacterIndex, int* const argCharacterIndex,
@@ -59,7 +64,7 @@ public:
protected: protected:
//Frame loop //Frame loop
void FrameStart(); void FrameStart();
void Update(); void Update(double delta);
void FrameEnd(); void FrameEnd();
void RenderFrame(); void RenderFrame();
void Render(SDL_Surface* const); void Render(SDL_Surface* const);
@@ -90,8 +95,10 @@ protected:
//utilities //utilities
void UpdateMap(); void UpdateMap();
//TODO: Streamline this with lua
//shared parameters //shared parameters
UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton(); ConfigUtility& config;
UDPNetworkUtility& network;
int& clientIndex; int& clientIndex;
int& accountIndex; int& accountIndex;
int& characterIndex; int& characterIndex;
@@ -110,10 +117,11 @@ protected:
Button shutDownButton; Button shutDownButton;
//TODO: Review the camera //TODO: Review the camera
struct { struct {
int x = 0, y = 0; struct {
int width = 0, height = 0; int x, y;
int marginX = 0, marginY = 0; }origin, margin;
} camera; }camera;
FrameRate fps; FrameRate fps;
//game //game
+92 -67
View File
@@ -30,14 +30,25 @@
//Public access members //Public access members
//------------------------- //-------------------------
LobbyMenu::LobbyMenu(int* const argClientIndex, int* const argAccountIndex): LobbyMenu::LobbyMenu(lua_State* L, UDPNetworkUtility& aNetwork):
clientIndex(*argClientIndex), lua(L),
accountIndex(*argAccountIndex) network(aNetwork)
{ {
//get the config info
lua_getglobal(lua, "config");
lua_getfield(lua, -1, "dir");
lua_getfield(lua, -1, "interface");
lua_getfield(lua, -2, "fonts");
std::string interfaceDir = lua_tostring(lua, -2);
std::string fontsDir = lua_tostring(lua, -1);
lua_pop(lua, 4);
//setup the utility objects //setup the utility objects
image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); image.LoadSurface(interfaceDir + "button_menu.bmp");
image.SetClipH(image.GetClipH()/3); image.SetClipH(image.GetClipH()/3);
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp"); font.LoadSurface(fontsDir + "pk_white_8.bmp");
//pass the utility objects //pass the utility objects
search.SetImage(&image); search.SetImage(&image);
@@ -65,9 +76,6 @@ LobbyMenu::LobbyMenu(int* const argClientIndex, int* const argAccountIndex):
//BUGFIX: Eat incoming packets //BUGFIX: Eat incoming packets
while(network.Receive()); while(network.Receive());
//Initial broadcast
SendBroadcastRequest();
} }
LobbyMenu::~LobbyMenu() { LobbyMenu::~LobbyMenu() {
@@ -82,13 +90,13 @@ void LobbyMenu::FrameStart() {
// //
} }
void LobbyMenu::Update() { void LobbyMenu::Update(double delta) {
//suck in and process all waiting packets //suck in and process all waiting packets
SerialPacket* packetBuffer = reinterpret_cast<SerialPacket*>(new char[MAX_PACKET_SIZE]); SerialPacket* packetBuffer = new SerialPacket();
while(network.Receive(packetBuffer)) { while(network.Receive(packetBuffer)) {
HandlePacket(packetBuffer); HandlePacket(packetBuffer);
} }
delete reinterpret_cast<char*>(packetBuffer); delete packetBuffer;
} }
void LobbyMenu::FrameEnd() { void LobbyMenu::FrameEnd() {
@@ -107,10 +115,7 @@ void LobbyMenu::Render(SDL_Surface* const screen) {
for (int i = 0; i < serverInfo.size(); i++) { for (int i = 0; i < serverInfo.size(); i++) {
//draw the selected server's highlight //draw the selected server's highlight
if (selection == &serverInfo[i]) { if (selection == &serverInfo[i]) {
SDL_Rect r = { SDL_Rect r = listBox;
(Sint16)listBox.x, (Sint16)listBox.y,
(Uint16)listBox.w, (Uint16)listBox.h
};
r.y += i * listBox.h; r.y += i * listBox.h;
SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 255, 127, 39)); SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 255, 127, 39));
} }
@@ -147,33 +152,70 @@ void LobbyMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) {
} }
void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
//prep
lua_getglobal(lua, "config");
if (search.MouseButtonUp(button) == Button::State::HOVER) { if (search.MouseButtonUp(button) == Button::State::HOVER) {
SendBroadcastRequest(); //get the set parameters
lua_getfield(lua, -1, "server");
lua_getfield(lua, -1, "host");
lua_getfield(lua, -2, "port");
//broadcast to the network, or a specific server
SerialPacket packet;
packet.type = SerialPacketType::BROADCAST_REQUEST;
network.SendTo(lua_tostring(lua, -2), lua_tointeger(lua, -1), &packet);
//reset the server list
serverInfo.clear();
selection = nullptr;
//clear the parameters
lua_pop(lua, 3);
} }
else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) { else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) {
SendJoinRequest(); //get the parameters
lua_getfield(lua, -1, "client");
lua_getfield(lua, -1, "username");
//pack the packet
ClientPacket packet;
packet.type = SerialPacketType::JOIN_REQUEST;
strncpy(packet.username, lua_tostring(lua, -1), PACKET_STRING_SIZE);
//join the selected server
network.SendTo(&selection->address, &packet);
selection = nullptr;
//clear the parameters
lua_pop(lua, 2);
} }
else if (back.MouseButtonUp(button) == Button::State::HOVER) { else if (back.MouseButtonUp(button) == Button::State::HOVER) {
SetNextScene(SceneList::MAINMENU); SetNextScene(SceneList::MAINMENU);
} }
//has the user selected a server on the list? else if (
BoundingBox tmpBox = listBox; //has the user selected a server on the list?
tmpBox.h *= serverInfo.size(); //TODO: replace with regular collision checker
if (tmpBox.CheckOverlap({button.x, button.y})) { button.x > listBox.x &&
button.x < listBox.x + listBox.w &&
button.y > listBox.y &&
button.y < listBox.y + listBox.h * serverInfo.size()
) {
selection = &serverInfo[(button.y - listBox.y)/listBox.h]; selection = &serverInfo[(button.y - listBox.y)/listBox.h];
} }
else { else {
selection = nullptr; selection = nullptr;
} }
//clear the parameters
lua_pop(lua, 1);
} }
void LobbyMenu::KeyDown(SDL_KeyboardEvent const& key) { void LobbyMenu::KeyDown(SDL_KeyboardEvent const& key) {
switch(key.keysym.sym) { //
case SDLK_ESCAPE:
SetNextScene(SceneList::MAINMENU);
break;
}
} }
void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) { void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) {
@@ -185,16 +227,16 @@ void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) {
//------------------------- //-------------------------
void LobbyMenu::HandlePacket(SerialPacket* const argPacket) { void LobbyMenu::HandlePacket(SerialPacket* const argPacket) {
switch(argPacket->GetType()) { switch(argPacket->type) {
case SerialPacketType::BROADCAST_RESPONSE: case SerialPacketType::BROADCAST_RESPONSE:
HandleBroadcastResponse(static_cast<ServerPacket*>(argPacket)); HandleBroadcastResponse(dynamic_cast<ServerPacket*>(argPacket));
break; break;
case SerialPacketType::JOIN_RESPONSE: case SerialPacketType::JOIN_RESPONSE:
HandleJoinResponse(static_cast<ClientPacket*>(argPacket)); HandleJoinResponse(dynamic_cast<ClientPacket*>(argPacket));
break; break;
//handle errors //handle errors
default: default:
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in LobbyMenu: " + to_string_custom(static_cast<int>(argPacket->GetType())) )); throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in LobbyMenu: " + to_string_custom(static_cast<int>(argPacket->type)) ));
break; break;
} }
} }
@@ -202,10 +244,10 @@ void LobbyMenu::HandlePacket(SerialPacket* const argPacket) {
void LobbyMenu::HandleBroadcastResponse(ServerPacket* const argPacket) { void LobbyMenu::HandleBroadcastResponse(ServerPacket* const argPacket) {
//extract the data //extract the data
ServerInformation server; ServerInformation server;
server.address = argPacket->GetAddress(); server.address = argPacket->srcAddress;
server.name = argPacket->GetName(); server.name = argPacket->name;
server.playerCount = argPacket->GetPlayerCount(); server.playerCount = argPacket->playerCount;
server.version = argPacket->GetVersion(); server.version = argPacket->version;
//Checking compatibility //Checking compatibility
server.compatible = server.version == NETWORK_VERSION; server.compatible = server.version == NETWORK_VERSION;
@@ -215,42 +257,25 @@ void LobbyMenu::HandleBroadcastResponse(ServerPacket* const argPacket) {
} }
void LobbyMenu::HandleJoinResponse(ClientPacket* const argPacket) { void LobbyMenu::HandleJoinResponse(ClientPacket* const argPacket) {
clientIndex = argPacket->GetClientIndex(); lua_getglobal(lua, "config");
accountIndex = argPacket->GetAccountIndex(); lua_getfield(lua, -1, "client");
network.Bind(argPacket->GetAddressPtr(), Channels::SERVER); lua_getfield(lua, -1, "handle");
lua_getfield(lua, -2, "avatar");
lua_pushinteger(lua, argPacket->clientIndex);
lua_pushinteger(lua, argPacket->accountIndex);
lua_setfield(lua, -5, "accountIndex");
lua_setfield(lua, -4, "clientIndex");
network.Bind(&argPacket->srcAddress, Channels::SERVER);
SetNextScene(SceneList::INWORLD); SetNextScene(SceneList::INWORLD);
//send this player's character info //send this player's character info
CharacterPacket newPacket; CharacterPacket newPacket;
newPacket.SetType(SerialPacketType::CHARACTER_NEW); newPacket.type = SerialPacketType::CHARACTER_NEW;
newPacket.SetHandle(config["client.handle"].c_str()); strncpy(newPacket.handle, lua_tostring(lua, -2), PACKET_STRING_SIZE);
newPacket.SetAvatar(config["client.avatar"].c_str()); strncpy(newPacket.avatar, lua_tostring(lua, -1), PACKET_STRING_SIZE);
newPacket.SetAccountIndex(accountIndex); newPacket.accountIndex = argPacket->accountIndex;
network.SendTo(Channels::SERVER, &newPacket); network.SendTo(Channels::SERVER, &newPacket);
}
//------------------------- lua_pop(lua, 4);
//server control }
//-------------------------
void LobbyMenu::SendBroadcastRequest() {
//broadcast to the network, or a specific server
ServerPacket packet;
packet.SetType(SerialPacketType::BROADCAST_REQUEST);
network.SendTo(config["server.host"].c_str(), config.Int("server.port"), &packet);
//reset the server list
serverInfo.clear();
selection = nullptr;
}
void LobbyMenu::SendJoinRequest() {
//pack the packet
ClientPacket packet;
packet.SetType(SerialPacketType::JOIN_REQUEST);
packet.SetUsername(config["client.username"].c_str());
//join the selected server
network.SendTo(&selection->address, &packet);
selection = nullptr;
}
+10 -15
View File
@@ -26,28 +26,29 @@
#include "image.hpp" #include "image.hpp"
#include "raster_font.hpp" #include "raster_font.hpp"
#include "button.hpp" #include "button.hpp"
#include "bounding_box.hpp"
//utilities //utilities
#include "config_utility.hpp"
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
//client //client
#include "base_scene.hpp" #include "base_scene.hpp"
//APIs
#include "lua/lua.hpp"
//STL //STL
#include <vector> #include <vector>
class LobbyMenu : public BaseScene { class LobbyMenu : public BaseScene {
public: public:
//Public access members //Public access members
LobbyMenu(int* const argClientIndex, int* const argAccountIndex); LobbyMenu(lua_State*, UDPNetworkUtility&);
~LobbyMenu(); ~LobbyMenu();
protected: protected:
//Frame loop //Frame loop
void FrameStart(); void FrameStart();
void Update(); void Update(double delta);
void FrameEnd(); void FrameEnd();
void Render(SDL_Surface* const); void Render(SDL_Surface* const);
@@ -63,15 +64,9 @@ protected:
void HandleBroadcastResponse(ServerPacket* const); void HandleBroadcastResponse(ServerPacket* const);
void HandleJoinResponse(ClientPacket* const); void HandleJoinResponse(ClientPacket* const);
//server control
void SendBroadcastRequest();
void SendJoinRequest();
//shared parameters //shared parameters
ConfigUtility& config = ConfigUtility::GetSingleton(); lua_State* lua = nullptr;
UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton(); UDPNetworkUtility& network;
int& clientIndex;
int& accountIndex;
//members //members
Image image; Image image;
@@ -91,9 +86,9 @@ protected:
std::vector<ServerInformation> serverInfo; std::vector<ServerInformation> serverInfo;
//NOTE: a terrible hack //a terrible hack, forgive me
//I'd love a proper gui system for this //TODO: I'd love a proper gui system for this
BoundingBox listBox; SDL_Rect listBox;
ServerInformation* selection = nullptr; ServerInformation* selection = nullptr;
}; };
+17 -10
View File
@@ -21,19 +21,26 @@
*/ */
#include "main_menu.hpp" #include "main_menu.hpp"
#include "config_utility.hpp"
//------------------------- //-------------------------
//Public access members //Public access members
//------------------------- //-------------------------
MainMenu::MainMenu() { MainMenu::MainMenu(lua_State* L): lua(L) {
ConfigUtility& config = ConfigUtility::GetSingleton(); //get the config info
lua_getglobal(lua, "config");
lua_getfield(lua, -1, "dir");
lua_getfield(lua, -1, "interface");
lua_getfield(lua, -2, "fonts");
std::string interfaceDir = lua_tostring(lua, -2);
std::string fontsDir = lua_tostring(lua, -1);
lua_pop(lua, 4);
//setup the utility objects //setup the utility objects
image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); image.LoadSurface(interfaceDir + "button_menu.bmp");
image.SetClipH(image.GetClipH()/3); image.SetClipH(image.GetClipH()/3);
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp"); font.LoadSurface(fontsDir + "pk_white_8.bmp");
//pass the utility objects //pass the utility objects
startButton.SetImage(&image); startButton.SetImage(&image);
@@ -72,7 +79,7 @@ void MainMenu::FrameStart() {
// //
} }
void MainMenu::Update() { void MainMenu::Update(double delta) {
// //
} }
@@ -103,14 +110,14 @@ void MainMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) {
} }
void MainMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { void MainMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
//TODO: Buttons should only register as "selected" when the left button is used
if (startButton.MouseButtonUp(button) == Button::State::HOVER) { if (startButton.MouseButtonUp(button) == Button::State::HOVER) {
SetNextScene(SceneList::LOBBYMENU); SetNextScene(SceneList::INWORLD);
} }
if (optionsButton.MouseButtonUp(button) == Button::State::HOVER) { if (optionsButton.MouseButtonUp(button) == Button::State::HOVER) {
SetNextScene(SceneList::OPTIONSMENU); SetNextScene(SceneList::OPTIONSMENU);
} }
if (quitButton.MouseButtonUp(button) == Button::State::HOVER) { if (quitButton.MouseButtonUp(button) == Button::State::HOVER &&
button.button & SDL_BUTTON_LMASK) {
QuitEvent(); QuitEvent();
} }
} }
+7 -2
View File
@@ -28,16 +28,18 @@
#include "raster_font.hpp" #include "raster_font.hpp"
#include "button.hpp" #include "button.hpp"
#include "lua/lua.hpp"
class MainMenu : public BaseScene { class MainMenu : public BaseScene {
public: public:
//Public access members //Public access members
MainMenu(); MainMenu(lua_State* L);
~MainMenu(); ~MainMenu();
protected: protected:
//Frame loop //Frame loop
void FrameStart(); void FrameStart();
void Update(); void Update(double delta);
void FrameEnd(); void FrameEnd();
void Render(SDL_Surface* const); void Render(SDL_Surface* const);
@@ -48,6 +50,9 @@ protected:
void KeyDown(SDL_KeyboardEvent const&); void KeyDown(SDL_KeyboardEvent const&);
void KeyUp(SDL_KeyboardEvent const&); void KeyUp(SDL_KeyboardEvent const&);
//shared parameters
lua_State* lua = nullptr;
//members //members
Image image; Image image;
RasterFont font; RasterFont font;
+1 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. .. ../../common/gameplay ../../common/graphics ../../common/map ../../common/network ../../common/network/packet_types ../../common/ui ../../common/utilities INCLUDES+=. .. ../../common/gameplay ../../common/graphics ../../common/map ../../common/network ../../common/network/packet ../../common/network/serial ../../common/ui ../../common/utilities
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
+17 -13
View File
@@ -21,19 +21,26 @@
*/ */
#include "options_menu.hpp" #include "options_menu.hpp"
#include "config_utility.hpp"
//------------------------- //-------------------------
//Public access members //Public access members
//------------------------- //-------------------------
OptionsMenu::OptionsMenu() { OptionsMenu::OptionsMenu(lua_State* L): lua(L) {
ConfigUtility& config = ConfigUtility::GetSingleton(); //get the config info
lua_getglobal(lua, "config");
lua_getfield(lua, -1, "dir");
lua_getfield(lua, -1, "interface");
lua_getfield(lua, -2, "fonts");
std::string interfaceDir = lua_tostring(lua, -2);
std::string fontsDir = lua_tostring(lua, -1);
lua_pop(lua, 4);
//setup the utility objects //setup the utility objects
image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); image.LoadSurface(interfaceDir + "button_menu.bmp");
image.SetClipH(image.GetClipH()/3); image.SetClipH(image.GetClipH()/3);
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp"); font.LoadSurface(fontsDir + "pk_white_8.bmp");
//pass the utility objects //pass the utility objects
backButton.SetImage(&image); backButton.SetImage(&image);
@@ -59,7 +66,7 @@ void OptionsMenu::FrameStart() {
// //
} }
void OptionsMenu::Update() { void OptionsMenu::Update(double delta) {
// //
} }
@@ -86,17 +93,14 @@ void OptionsMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) {
} }
void OptionsMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { void OptionsMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
if (backButton.MouseButtonUp(button) == Button::State::HOVER) { if (backButton.MouseButtonUp(button) == Button::State::HOVER &&
button.button & SDL_BUTTON_LMASK) {
SetNextScene(SceneList::MAINMENU); SetNextScene(SceneList::MAINMENU);
} }
} }
void OptionsMenu::KeyDown(SDL_KeyboardEvent const& key) { void OptionsMenu::KeyDown(SDL_KeyboardEvent const& key) {
switch(key.keysym.sym) { //
case SDLK_ESCAPE:
SetNextScene(SceneList::MAINMENU);
break;
}
} }
void OptionsMenu::KeyUp(SDL_KeyboardEvent const& key) { void OptionsMenu::KeyUp(SDL_KeyboardEvent const& key) {
+7 -2
View File
@@ -28,17 +28,19 @@
#include "raster_font.hpp" #include "raster_font.hpp"
#include "button.hpp" #include "button.hpp"
#include "lua/lua.hpp"
//TODO: The options screen needs to be USED //TODO: The options screen needs to be USED
class OptionsMenu : public BaseScene { class OptionsMenu : public BaseScene {
public: public:
//Public access members //Public access members
OptionsMenu(); OptionsMenu(lua_State* L);
~OptionsMenu(); ~OptionsMenu();
protected: protected:
//Frame loop //Frame loop
void FrameStart(); void FrameStart();
void Update(); void Update(double delta);
void FrameEnd(); void FrameEnd();
void Render(SDL_Surface* const); void Render(SDL_Surface* const);
@@ -49,6 +51,9 @@ protected:
void KeyDown(SDL_KeyboardEvent const&); void KeyDown(SDL_KeyboardEvent const&);
void KeyUp(SDL_KeyboardEvent const&); void KeyUp(SDL_KeyboardEvent const&);
//shared parameters
lua_State* lua = nullptr;
//members //members
Image image; Image image;
RasterFont font; RasterFont font;
+11 -4
View File
@@ -21,14 +21,21 @@
*/ */
#include "splash_screen.hpp" #include "splash_screen.hpp"
#include "config_utility.hpp" #include <string>
//------------------------- //-------------------------
//Public access members //Public access members
//------------------------- //-------------------------
SplashScreen::SplashScreen() { SplashScreen::SplashScreen(lua_State* L): lua(L) {
logo.LoadSurface(ConfigUtility::GetSingleton()["dir.logos"] + "krstudios.bmp"); //get the config info
lua_getglobal(lua, "config");
lua_getfield(lua, -1, "dir");
lua_getfield(lua, -1, "logos");
std::string logos = lua_tostring(lua, -1);
lua_pop(lua, 3);
logo.LoadSurface(logos + "krstudios.bmp");
startTick = std::chrono::steady_clock::now(); startTick = std::chrono::steady_clock::now();
} }
@@ -40,7 +47,7 @@ SplashScreen::~SplashScreen() {
//Frame loop //Frame loop
//------------------------- //-------------------------
void SplashScreen::Update() { void SplashScreen::Update(double delta) {
if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(1)) { if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(1)) {
SetNextScene(SceneList::MAINMENU); SetNextScene(SceneList::MAINMENU);
} }
+7 -2
View File
@@ -26,19 +26,24 @@
#include "image.hpp" #include "image.hpp"
#include "lua/lua.hpp"
#include <chrono> #include <chrono>
class SplashScreen : public BaseScene { class SplashScreen : public BaseScene {
public: public:
//Public access members //Public access members
SplashScreen(); SplashScreen(lua_State* L);
~SplashScreen(); ~SplashScreen();
protected: protected:
//Frame loop //Frame loop
void Update(); void Update(double delta);
void Render(SDL_Surface* const); void Render(SDL_Surface* const);
//shared parameters
lua_State* lua = nullptr;
//members //members
std::chrono::steady_clock::time_point startTick; std::chrono::steady_clock::time_point startTick;
Image logo; Image logo;
+1 -1
View File
@@ -11,7 +11,7 @@ OBJDIR=obj
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
#output #output
OUTDIR=../.. OUTDIR=..
OUT=$(addprefix $(OUTDIR)/,libcommon.a) OUT=$(addprefix $(OUTDIR)/,libcommon.a)
#targets #targets
+2 -18
View File
@@ -21,25 +21,9 @@
*/ */
#include "timer.hpp" #include "timer.hpp"
Timer::Timer(): start(Timer::Clock::now()) {
//
}
Timer::Timer(std::string s): name(s), start(Timer::Clock::now()) {
//
}
void Timer::Start() {
start = Clock::now();
}
void Timer::Stop() {
timeSpan = Clock::now() - start;
}
std::ostream& operator<<(std::ostream& os, Timer& t) { std::ostream& operator<<(std::ostream& os, Timer& t) {
os << t.GetName() << ": "; os << t.GetName() << ": ";
os << std::chrono::duration_cast<std::chrono::milliseconds>(t.GetTime()).count(); os << std::chrono::duration_cast<std::chrono::nanoseconds>(t.GetTime()).count();
os << "ms"; os << "ns";
return os; return os;
} }
+6 -6
View File
@@ -30,15 +30,15 @@ class Timer {
public: public:
typedef std::chrono::high_resolution_clock Clock; typedef std::chrono::high_resolution_clock Clock;
Timer(); Timer() = default;
Timer(std::string s); Timer(std::string s) : name(s), start(Clock::now()) {};
~Timer() = default; ~Timer() = default;
inline void Start(); inline void Start() { start = Clock::now(); }
inline void Stop(); inline void Stop() { time = Clock::now() - start; }
//accessors and mutators //accessors and mutators
Clock::duration GetTime() { return timeSpan; } Clock::duration GetTime() { return time; }
std::string SetName(std::string s) { return name = s; } std::string SetName(std::string s) { return name = s; }
std::string GetName() { return name; } std::string GetName() { return name; }
@@ -46,7 +46,7 @@ public:
private: private:
std::string name; std::string name;
Clock::time_point start; Clock::time_point start;
Clock::duration timeSpan; Clock::duration time;
}; };
std::ostream& operator<<(std::ostream& os, Timer& t); std::ostream& operator<<(std::ostream& os, Timer& t);
+4 -6
View File
@@ -25,13 +25,11 @@
#include <cmath> #include <cmath>
//the speeds that the characters move //the speeds that the characters move
constexpr double CHARACTER_WALKING_SPEED = 2.24; constexpr double CHARACTER_WALKING_SPEED = 140.0;
constexpr double CHARACTER_WALKING_MOD = 1.0/sqrt(2.0); constexpr double CHARACTER_WALKING_MOD = 1.0/sqrt(2.0);
//the bounds for the character objects, mapped to the default sprites //the bounding boxes for the characters
constexpr int CHARACTER_BOUNDS_X = 0; constexpr double CHARACTER_BOUNDS_WIDTH = 32.0;
constexpr int CHARACTER_BOUNDS_Y = 16; constexpr double CHARACTER_BOUNDS_HEIGHT = 32.0;
constexpr int CHARACTER_BOUNDS_WIDTH = 32;
constexpr int CHARACTER_BOUNDS_HEIGHT = 32;
#endif #endif
+1 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. INCLUDES+=. ../map
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
+1 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. ../graphics ../utilities INCLUDES+=. ../utilities ../graphics
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
+3 -6
View File
@@ -21,13 +21,10 @@
*/ */
#include "region.hpp" #include "region.hpp"
#include <stdexcept> #include "utility.hpp"
#include <cmath>
#include <cstring>
int snapToBase(int base, int x) { #include <stdexcept>
return floor((double)x / base) * base; #include <cstring>
}
Region::Region(int argX, int argY): x(argX), y(argY) { Region::Region(int argX, int argY): x(argX), y(argY) {
if (x != snapToBase(REGION_WIDTH, x) || y != snapToBase(REGION_HEIGHT, y)) { if (x != snapToBase(REGION_WIDTH, x) || y != snapToBase(REGION_HEIGHT, y)) {
+6 -2
View File
@@ -23,14 +23,15 @@
#define REGION_HPP_ #define REGION_HPP_
#include <bitset> #include <bitset>
#include <cmath>
//the region's storage format //the region's storage format
constexpr int REGION_WIDTH = 20; constexpr int REGION_WIDTH = 20;
constexpr int REGION_HEIGHT = 20; constexpr int REGION_HEIGHT = 20;
constexpr int REGION_DEPTH = 3; constexpr int REGION_DEPTH = 3;
//utility function //the size of the solid map
int snapToBase(int base, int x); constexpr int REGION_SOLID_FOOTPRINT = ceil(REGION_WIDTH * REGION_HEIGHT / 8.0);
class Region { class Region {
public: public:
@@ -60,4 +61,7 @@ private:
std::bitset<REGION_WIDTH*REGION_HEIGHT> solid; std::bitset<REGION_WIDTH*REGION_HEIGHT> solid;
}; };
//the memory footprint of the tile and solid data; not including any metadata
constexpr int REGION_FOOTPRINT = REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) + REGION_SOLID_FOOTPRINT;
#endif #endif
+25
View File
@@ -78,6 +78,27 @@ static int getDepth(lua_State* L) {
return 1; return 1;
} }
static int load(lua_State* L) {
//EMPTY
lua_pushboolean(L, false);
return 1;
}
static int save(lua_State* L) {
//EMPTY
return 0;
}
static int create(lua_State* L) {
//EMPTY
return 0;
}
static int unload(lua_State* L) {
//EMPTY
return 0;
}
static const luaL_Reg regionLib[] = { static const luaL_Reg regionLib[] = {
{"SetTile",setTile}, {"SetTile",setTile},
{"GetTile",getTile}, {"GetTile",getTile},
@@ -88,6 +109,10 @@ static const luaL_Reg regionLib[] = {
{"GetWidth",getWidth}, {"GetWidth",getWidth},
{"GetHeight",getHeight}, {"GetHeight",getHeight},
{"GetDepth",getDepth}, {"GetDepth",getDepth},
{"Load",load},
{"Save",save},
{"Create",create},
{"Unload",unload},
{nullptr, nullptr} {nullptr, nullptr}
}; };
+8 -39
View File
@@ -24,6 +24,13 @@
#include "region_pager_lua.hpp" #include "region_pager_lua.hpp"
#include "region.hpp" #include "region.hpp"
#include <string>
static int getRegionPager(lua_State* L) {
lua_pushstring(L, TORTUGA_REGION_PAGER_PSEUDO_INDEX);
lua_gettable(L, LUA_REGISTRYINDEX);
}
//DOCS: These glue functions simply wrap RegionPagerLua's methods //DOCS: These glue functions simply wrap RegionPagerLua's methods
static int setTile(lua_State* L) { static int setTile(lua_State* L) {
@@ -88,55 +95,17 @@ static int unloadRegion(lua_State* L) {
return 0; return 0;
} }
static int setOnLoad(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetLoadReference());
pager->SetLoadReference(luaL_ref(L, LUA_REGISTRYINDEX));
return 0;
}
static int setOnSave(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetSaveReference());
pager->SetSaveReference(luaL_ref(L, LUA_REGISTRYINDEX));
return 0;
}
static int setOnCreate(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetCreateReference());
pager->SetCreateReference(luaL_ref(L, LUA_REGISTRYINDEX));
return 0;
}
static int setOnUnload(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetUnloadReference());
pager->SetUnloadReference(luaL_ref(L, LUA_REGISTRYINDEX));
return 0;
}
static const luaL_Reg regionPagerLib[] = { static const luaL_Reg regionPagerLib[] = {
//curry {"GetRegionPager", getRegionPager},
{"SetTile", setTile}, {"SetTile", setTile},
{"GetTile", getTile}, {"GetTile", getTile},
{"SetSolid", setSolid}, {"SetSolid", setSolid},
{"GetSolid", getSolid}, {"GetSolid", getSolid},
//access and control
{"GetRegion", getRegion}, {"GetRegion", getRegion},
{"LoadRegion", loadRegion}, {"LoadRegion", loadRegion},
{"SaveRegion", saveRegion}, {"SaveRegion", saveRegion},
{"CreateRegion", createRegion}, {"CreateRegion", createRegion},
{"UnloadRegion", unloadRegion}, {"UnloadRegion", unloadRegion},
//triggers
{"SetOnLoad",setOnLoad},
{"SetOnSave",setOnSave},
{"SetOnCreate",setOnCreate},
{"SetOnUnload",setOnUnload},
//sentinel
{nullptr, nullptr} {nullptr, nullptr}
}; };
+1
View File
@@ -24,6 +24,7 @@
#include "lua/lua.hpp" #include "lua/lua.hpp"
#define TORTUGA_REGION_PAGER_PSEUDO_INDEX "RegionPagerPseudoIndex"
#define TORTUGA_REGION_PAGER_NAME "RegionPager" #define TORTUGA_REGION_PAGER_NAME "RegionPager"
LUAMOD_API int openRegionPagerAPI(lua_State* L); LUAMOD_API int openRegionPagerAPI(lua_State* L);
+6 -5
View File
@@ -21,6 +21,8 @@
*/ */
#include "region_pager_base.hpp" #include "region_pager_base.hpp"
#include "utility.hpp"
#include <stdexcept> #include <stdexcept>
#include <algorithm> #include <algorithm>
@@ -71,12 +73,12 @@ Region* RegionPagerBase::PushRegion(Region* const ptr) {
} }
Region* RegionPagerBase::LoadRegion(int x, int y) { Region* RegionPagerBase::LoadRegion(int x, int y) {
//EMPTY, intended for override //TODO: load the region if possible
return nullptr; return nullptr;
} }
Region* RegionPagerBase::SaveRegion(int x, int y) { Region* RegionPagerBase::SaveRegion(int x, int y) {
//EMPTY, intended for override //TODO: find & save the region
return nullptr; return nullptr;
} }
@@ -89,9 +91,8 @@ Region* RegionPagerBase::CreateRegion(int x, int y) {
} }
void RegionPagerBase::UnloadRegion(int x, int y) { void RegionPagerBase::UnloadRegion(int x, int y) {
regionList.remove_if([x, y](Region& region) -> bool { //custom loop, not FindRegion()
return region.GetX() == x && region.GetY() == y; regionList.remove_if([x, y](Region& region) -> bool { return region.GetX() == x && region.GetY() == y; });
});
} }
void RegionPagerBase::UnloadAll() { void RegionPagerBase::UnloadAll() {
+35 -91
View File
@@ -21,71 +21,47 @@
*/ */
#include "region_pager_lua.hpp" #include "region_pager_lua.hpp"
#include "utility.hpp"
#include <stdexcept> #include <stdexcept>
Region* RegionPagerLua::LoadRegion(int x, int y) { Region* RegionPagerLua::LoadRegion(int x, int y) {
//get the pager's function from the registry //load the region if possible
lua_rawgeti(lua, LUA_REGISTRYINDEX, loadRef);
//check if this function is available
if (lua_isnil(lua, -1)) {
lua_pop(lua, 1);
return nullptr;
}
//something to work on //something to work on
Region tmpRegion(x, y); Region tmpRegion(x, y);
lua_pushlightuserdata(lua, &tmpRegion);
//call the funtion, 1 arg, 1 return //API hook
lua_getglobal(lua, "Region");
lua_getfield(lua, -1, "Load");
lua_pushlightuserdata(lua, &tmpRegion);
if (lua_pcall(lua, 1, 1, 0) != LUA_OK) { if (lua_pcall(lua, 1, 1, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
} }
//success or failure
//check the return value, success or failure if (!lua_toboolean(lua, -1)) {
if (lua_toboolean(lua, -1)) { lua_pop(lua, 2);
lua_pop(lua, 1);
regionList.push_front(tmpRegion);
return &regionList.front();
}
else {
lua_pop(lua, 1);
return nullptr; return nullptr;
} }
lua_pop(lua, 2);
regionList.push_front(tmpRegion);
return &regionList.front();
} }
Region* RegionPagerLua::SaveRegion(int x, int y) { Region* RegionPagerLua::SaveRegion(int x, int y) {
//get the pager's function from the registry //find & save the region
lua_rawgeti(lua, LUA_REGISTRYINDEX, saveRef);
//check if this function is available
if (lua_isnil(lua, -1)) {
lua_pop(lua, 1);
return nullptr;
}
//find the specified region
Region* ptr = FindRegion(x, y); Region* ptr = FindRegion(x, y);
if (!ptr) { if (ptr) {
//API hook
lua_getglobal(lua, "Region");
lua_getfield(lua, -1, "Save");
lua_pushlightuserdata(lua, ptr);
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
}
lua_pop(lua, 1); lua_pop(lua, 1);
return nullptr;
}
lua_pushlightuserdata(lua, ptr);
//call the function, 1 arg, 1 return
if (lua_pcall(lua, 1, 1, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
}
//check the return value, success or failure
if (lua_toboolean(lua, -1)) {
lua_pop(lua, 1);
return ptr;
}
else {
lua_pop(lua, 1);
return nullptr;
} }
return ptr;
} }
Region* RegionPagerLua::CreateRegion(int x, int y) { Region* RegionPagerLua::CreateRegion(int x, int y) {
@@ -93,87 +69,55 @@ Region* RegionPagerLua::CreateRegion(int x, int y) {
throw(std::logic_error("Cannot overwrite an existing region")); throw(std::logic_error("Cannot overwrite an existing region"));
} }
//get the pager's function from the registry
lua_rawgeti(lua, LUA_REGISTRYINDEX, createRef);
//check if this function is available
if (lua_isnil(lua, -1)) {
lua_pop(lua, 1);
return nullptr;
}
//something to work on //something to work on
Region tmpRegion(x, y); Region tmpRegion(x, y);
lua_pushlightuserdata(lua, &tmpRegion);
//call the function, 1 arg, 0 return //API hook
lua_getglobal(lua, "Region");
lua_getfield(lua, -1, "Create");
lua_pushlightuserdata(lua, &tmpRegion);
//TODO: parameters
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) { if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
} }
lua_pop(lua, 1);
//return the new region
regionList.push_front(tmpRegion); regionList.push_front(tmpRegion);
return &regionList.front(); return &regionList.front();
} }
void RegionPagerLua::UnloadRegion(int x, int y) { void RegionPagerLua::UnloadRegion(int x, int y) {
//get the pager's function from the registry lua_getglobal(lua, "Region");
lua_rawgeti(lua, LUA_REGISTRYINDEX, unloadRef);
//check if this function is available
if (lua_isnil(lua, -1)) {
lua_pop(lua, 1);
return;
}
//run each region through this lambda
regionList.remove_if([&](Region& region) -> bool { regionList.remove_if([&](Region& region) -> bool {
if (region.GetX() == x && region.GetY() == y) { if (region.GetX() == x && region.GetY() == y) {
//push a copy of the function onto the stack with the region //API hook
lua_pushvalue(lua, -1); lua_getfield(lua, -1, "Unload");
lua_pushlightuserdata(lua, &region); lua_pushlightuserdata(lua, &region);
//call the function, 1 arg, 0 return
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) { if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
} }
//signal to the container
return true; return true;
} }
//signal to the container
return false; return false;
}); });
//pop the base copy of the function
lua_pop(lua, 1); lua_pop(lua, 1);
} }
void RegionPagerLua::UnloadAll() { void RegionPagerLua::UnloadAll() {
//get the pager's function from the registry lua_getglobal(lua, "Region");
lua_rawgeti(lua, LUA_REGISTRYINDEX, unloadRef);
//check if this function is available
if (lua_isnil(lua, -1)) {
lua_pop(lua, 1);
return;
}
for (auto& it : regionList) { for (auto& it : regionList) {
//push a copy of the function onto the stack with the region //API hook
lua_pushvalue(lua, -1); lua_getfield(lua, -1, "Unload");
lua_pushlightuserdata(lua, &it); lua_pushlightuserdata(lua, &it);
//call the function, 1 arg, 0 return
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) { if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
} }
} }
//pop the base copy of the function
lua_pop(lua, 1); lua_pop(lua, 1);
//remove from memory
regionList.clear(); regionList.clear();
} }
-17
View File
@@ -44,25 +44,8 @@ public:
//accessors & mutators //accessors & mutators
lua_State* SetLuaState(lua_State* L) { return lua = L; } lua_State* SetLuaState(lua_State* L) { return lua = L; }
lua_State* GetLuaState() { return lua; } lua_State* GetLuaState() { return lua; }
//utilities for the API
int SetLoadReference(int i) { return loadRef = i; }
int SetSaveReference(int i) { return saveRef = i; }
int SetCreateReference(int i) { return createRef = i; }
int SetUnloadReference(int i) { return unloadRef = i; }
int GetLoadReference() { return loadRef; }
int GetSaveReference() { return saveRef; }
int GetCreateReference() { return createRef; }
int GetUnloadReference() { return unloadRef; }
protected: protected:
lua_State* lua = nullptr; lua_State* lua = nullptr;
int loadRef = LUA_NOREF;
int saveRef = LUA_NOREF;
int createRef = LUA_NOREF;
int unloadRef = LUA_NOREF;
}; };
#endif #endif
+7
View File
@@ -23,6 +23,12 @@
#include "tile_sheet.hpp" #include "tile_sheet.hpp"
static int getTileSheet(lua_State* L) {
lua_pushstring(L, TORTUGA_TILE_SHEET_PSEUDO_INDEX);
lua_gettable(L, LUA_REGISTRYINDEX);
return 1;
}
static int load(lua_State* L) { static int load(lua_State* L) {
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1)); TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
sheet->Load(lua_tostring(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4)); sheet->Load(lua_tostring(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4));
@@ -60,6 +66,7 @@ static int getTileH(lua_State* L) {
} }
static const luaL_Reg tileSheetLib[] = { static const luaL_Reg tileSheetLib[] = {
{"GetTileSheet",getTileSheet},
{"Load",load}, {"Load",load},
{"Unload",unload}, {"Unload",unload},
{"GetXCount",getXCount}, {"GetXCount",getXCount},
+1
View File
@@ -24,6 +24,7 @@
#include "lua/lua.hpp" #include "lua/lua.hpp"
#define TORTUGA_TILE_SHEET_PSEUDO_INDEX "TileSheetPseudoIndex"
#define TORTUGA_TILE_SHEET_NAME "TileSheet" #define TORTUGA_TILE_SHEET_NAME "TileSheet"
LUAMOD_API int openTileSheetAPI(lua_State* L); LUAMOD_API int openTileSheetAPI(lua_State* L);
+3 -2
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. packet_types ../gameplay ../map ../utilities INCLUDES+=. packet serial ../gameplay ../map ../utilities
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
@@ -17,7 +17,8 @@ OUT=$(addprefix $(OUTDIR)/,libcommon.a)
#targets #targets
all: $(OBJ) $(OUT) all: $(OBJ) $(OUT)
ar -crs $(OUT) $(OBJ) ar -crs $(OUT) $(OBJ)
$(MAKE) -C packet_types $(MAKE) -C packet
$(MAKE) -C serial
$(OBJ): | $(OBJDIR) $(OBJ): | $(OBJDIR)
@@ -19,35 +19,32 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#ifndef SERVERPACKET_HPP_ #ifndef CHARACTERPACKET_HPP_
#define SERVERPACKET_HPP_ #define CHARACTERPACKET_HPP_
#include "serial_packet_base.hpp" #include "serial_packet_base.hpp"
#include <cstring> #include "vector2.hpp"
#include "statistics.hpp"
class ServerPacket : public SerialPacketBase { struct CharacterPacket : SerialPacketBase {
public: //identify the character
ServerPacket() {} int characterIndex;
~ServerPacket() {} char handle[PACKET_STRING_SIZE];
char avatar[PACKET_STRING_SIZE];
const char* SetName(const char* s) //the owner
{ return strncpy(name, s, PACKET_STRING_SIZE); } int accountIndex;
int SetPlayerCount(int i) { return playerCount = i; }
int SetVersion(int i) { return version = i; }
const char* GetName() { return name; } //location
int GetPlayerCount() { return playerCount; } int roomIndex;
int GetVersion() { return version; } Vector2 origin;
Vector2 motion;
virtual void Serialize(void* buffer) override; //gameplay
virtual void Deserialize(void* buffer) override; Statistics stats;
private: //TODO: gameplay components: equipment, items, buffs, debuffs
//identify the server
char name[PACKET_STRING_SIZE+1];
int playerCount;
int version;
}; };
#endif #endif
@@ -24,30 +24,10 @@
#include "serial_packet_base.hpp" #include "serial_packet_base.hpp"
#include <cstring> struct ClientPacket : SerialPacketBase {
class ClientPacket : public SerialPacketBase {
public:
ClientPacket() {}
~ClientPacket() {}
//accessors & mutators
int SetClientIndex(int i) { return clientIndex = i; }
int SetAccountIndex(int i) { return accountIndex = i; }
const char* SetUsername(const char* s)
{ return strncpy(username, s, PACKET_STRING_SIZE); }
int GetClientIndex() { return clientIndex; }
int GetAccountIndex() { return accountIndex; }
const char* GetUsername() { return username; }
virtual void Serialize(void* buffer) override;
virtual void Deserialize(void* buffer) override;
private:
int clientIndex; int clientIndex;
int accountIndex; int accountIndex;
char username[PACKET_STRING_SIZE+1]; char username[PACKET_STRING_SIZE];
// char password[PACKET_STRING_SIZE]; //hashed, not currently used // char password[PACKET_STRING_SIZE]; //hashed, not currently used
}; };
+46
View File
@@ -0,0 +1,46 @@
/* Copyright: (c) Kayne Ruse 2013, 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 COMBATPACKET_HPP_
#define COMBATPACKET_HPP_
#include "serial_packet_base.hpp"
#include "combat_defines.hpp"
struct CombatPacket : SerialPacketBase {
//identify the combat instance
int combatIndex;
int difficulty;
TerrainType terrainType;
//combatants
int characterArray[COMBAT_MAX_CHARACTERS];
int enemyArray[COMBAT_MAX_ENEMIES];
//location
int mapIndex;
Vector2 origin;
//TODO: gameplay components: rewards
};
#endif
+39
View File
@@ -0,0 +1,39 @@
/* Copyright: (c) Kayne Ruse 2013, 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 ENEMYPACKET_HPP_
#define ENEMYPACKET_HPP_
#include "serial_packet_base.hpp"
struct EnemyPacket : SerialPacketBase {
//identify the enemy
int enemyIndex;
char handle[PACKET_STRING_SIZE];
char avatar[PACKET_STRING_SIZE];
//gameplay
Statistics stats;
//TODO: gameplay components: equipment, items, buffs, debuffs, rewards
};
#endif
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. .. ../../gameplay ../../map ../../utilities INCLUDES+=. ../../gameplay ../../map ../../utilities
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
+38
View File
@@ -0,0 +1,38 @@
/* Copyright: (c) Kayne Ruse 2013, 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 REGIONPACKET_HPP_
#define REGIONPACKET_HPP_
#include "serial_packet_base.hpp"
#include "region.hpp"
struct RegionPacket : SerialPacketBase {
//location/identify the region
int roomIndex;
int x, y;
//the data
Region* region;
};
#endif
+28
View File
@@ -0,0 +1,28 @@
/* Copyright: (c) Kayne Ruse 2013, 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 "serial_packet.hpp"
/* DOCS: Sanity check, read more
* Since most/all of the files in this directory are header files, I've created
* this source file as a "sanity check", to ensure that the above header files
* are written correctly via make.
*/
+44
View File
@@ -0,0 +1,44 @@
/* Copyright: (c) Kayne Ruse 2013, 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 SERIALPACKET_HPP_
#define SERIALPACKET_HPP_
#include "character_packet.hpp"
#include "client_packet.hpp"
#include "combat_packet.hpp"
#include "enemy_packet.hpp"
#include "region_packet.hpp"
#include "server_packet.hpp"
//NOTE: SerialPacket is defined in serial_packet_base.hpp
union MaxPacket {
CharacterPacket a;
ClientPacket b;
CombatPacket c;
EnemyPacket d;
RegionPacket e;
ServerPacket f;
};
constexpr int MAX_PACKET_SIZE = sizeof(MaxPacket);
#endif
@@ -22,32 +22,25 @@
#ifndef SERIALPACKETBASE_HPP_ #ifndef SERIALPACKETBASE_HPP_
#define SERIALPACKETBASE_HPP_ #define SERIALPACKETBASE_HPP_
#ifndef SERIALPACKET_HPP_
#error Cannot include this file without 'serial_packet.hpp'
#endif
#include "serial_packet_type.hpp" #include "serial_packet_type.hpp"
#include "SDL/SDL_net.h" #include "SDL/SDL_net.h"
//The packets use a char array for string storage constexpr int NETWORK_VERSION = 20140701;
constexpr int PACKET_STRING_SIZE = 100; constexpr int PACKET_STRING_SIZE = 100;
class SerialPacketBase { struct SerialPacketBase {
public: //members
SerialPacketType SetType(SerialPacketType t) { return type = t; }
SerialPacketType GetType() { return type; }
IPaddress GetAddress() { return srcAddress; }
IPaddress* GetAddressPtr() { return &srcAddress; }
SerialPacketBase() {};
virtual ~SerialPacketBase() {};
virtual void Serialize(void* buffer) = 0;
virtual void Deserialize(void* buffer) = 0;
protected:
friend class UDPNetworkUtility;
SerialPacketType type; SerialPacketType type;
IPaddress srcAddress; IPaddress srcAddress;
virtual ~SerialPacketBase() {};
}; };
typedef SerialPacketBase SerialPacket;
#endif #endif
@@ -0,0 +1,113 @@
/* Copyright: (c) Kayne Ruse 2013, 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 SERIALPACKETTYPE_HPP_
#define SERIALPACKETTYPE_HPP_
/* Key for the comments:
* request => response
*/
enum class SerialPacketType {
//default: there is something wrong
NONE = 0,
//keep alive
//ping => pong
PING = 1,
PONG = 2,
//search for the server list
//none => server name, player count, version info (and source address)
BROADCAST_REQUEST = 3,
BROADCAST_RESPONSE = 4,
//try to join the server
//username, and password => client index, account index
JOIN_REQUEST = 5,
JOIN_RESPONSE = 6,
JOIN_REJECTION = 7,
//mass update of all surrounding content
//character.x, character.y => packet barrage
SYNCHRONIZE = 8,
//disconnect from the server
//autentication, account index => disconnect that account
DISCONNECT = 9,
//shut down the server
//autentication => disconnect, shutdown
SHUTDOWN = 10,
//map data
//room index, region.x, region.y => room index, region.x, region.y, region content
REGION_REQUEST = 11,
REGION_CONTENT = 12,
//combat data
//TODO: system incomplete
COMBAT_NEW = 13,
COMBAT_DELETE = 14,
COMBAT_UPDATE = 15,
COMBAT_ENTER_REQUEST = 16,
COMBAT_ENTER_RESPONSE = 17,
COMBAT_EXIT_REQUEST = 18,
COMBAT_EXIT_RESPONSE = 19,
//TODO: COMBAT info
COMBAT_REJECTION = 20,
//character data
//character data => etc.
CHARACTER_NEW = 21,
CHARACTER_DELETE = 22,
CHARACTER_UPDATE = 23,
//authentication, character index => character stats
CHARACTER_STATS_REQUEST= 24,
CHARACTER_STATS_RESPONSE = 25,
//character new => character rejection, disconnect?
CHARACTER_REJECTION = 26,
//enemy data
//enemy data => etc.
ENEMY_NEW = 27,
ENEMY_DELETE = 28,
ENEMY_UPDATE = 29,
ENEMY_STATS_REQUEST = 30,
ENEMY_STATS_RESPONSE = 31,
//enemy index => enemy doens't exist
ENEMY_REJECTION= 32,
//NOTE: more packet types go here
//not used
LAST
};
#endif
@@ -19,6 +19,16 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#ifndef SERVERPACKET_HPP_
#define SERVERPACKET_HPP_
#include "serial_packet_base.hpp" #include "serial_packet_base.hpp"
//NOTE: This is a sanity check struct ServerPacket : SerialPacketBase {
//identify the server
char name[PACKET_STRING_SIZE];
int playerCount;
int version;
};
#endif
@@ -1,72 +0,0 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "character_packet.hpp"
#include "serial_utility.hpp"
void CharacterPacket::Serialize(void* buffer) {
serializeCopy(&buffer, &type, sizeof(SerialPacketType));
//identify the character
serializeCopy(&buffer, &characterIndex, sizeof(int));
serializeCopy(&buffer, handle, PACKET_STRING_SIZE);
serializeCopy(&buffer, avatar, PACKET_STRING_SIZE);
//the owner
serializeCopy(&buffer, &accountIndex, sizeof(int));
//location
serializeCopy(&buffer, &roomIndex, sizeof(int));
serializeCopy(&buffer, &origin.x, sizeof(double));
serializeCopy(&buffer, &origin.y, sizeof(double));
serializeCopy(&buffer, &motion.x, sizeof(double));
serializeCopy(&buffer, &motion.y, sizeof(double));
//stats structure
serializeCopyStatistics(&buffer, &stats);
//TODO: gameplay components: equipment, items, buffs, debuffs
}
void CharacterPacket::Deserialize(void* buffer) {
deserializeCopy(&buffer, &type, sizeof(SerialPacketType));
//identify the character
deserializeCopy(&buffer, &characterIndex, sizeof(int));
deserializeCopy(&buffer, handle, PACKET_STRING_SIZE);
deserializeCopy(&buffer, avatar, PACKET_STRING_SIZE);
//the owner
deserializeCopy(&buffer, &accountIndex, sizeof(int));
//location
deserializeCopy(&buffer, &roomIndex, sizeof(int));
deserializeCopy(&buffer, &origin.x, sizeof(double));
deserializeCopy(&buffer, &origin.y, sizeof(double));
deserializeCopy(&buffer, &motion.x, sizeof(double));
deserializeCopy(&buffer, &motion.y, sizeof(double));
//stats structure
deserializeCopyStatistics(&buffer, &stats);
//TODO: gameplay components: equipment, items, buffs, debuffs
}
@@ -1,87 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013, 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 CHARACTERPACKET_HPP_
#define CHARACTERPACKET_HPP_
#include "serial_packet_base.hpp"
#include "vector2.hpp"
#include "statistics.hpp"
#include <cstring>
class CharacterPacket : public SerialPacketBase {
public:
CharacterPacket() {}
~CharacterPacket() {}
//indentity
int SetCharacterIndex(int i) { return characterIndex = i; }
const char* SetHandle(const char* s)
{ return strncpy(handle, s, PACKET_STRING_SIZE); }
const char* SetAvatar(const char* s)
{ return strncpy(handle, s, PACKET_STRING_SIZE); }
int SetAccountIndex(int i) { return accountIndex = i; }
int GetCharacterIndex() { return characterIndex; }
const char* GetHandle() { return handle; }
const char* GetAvatar() { return avatar; }
int GetAccountIndex() { return accountIndex; }
//location
int SetRoomIndex(int i) { return roomIndex = i; }
Vector2 SetOrigin(Vector2 v) { return origin = v; }
Vector2 SetMotion(Vector2 v) { return motion = v; }
int GetRoomIndex() { return roomIndex; }
Vector2 GetOrigin() { return origin; }
Vector2 GetMotion() { return motion; }
//gameplay
Statistics* GetStatistics() { return &stats; }
virtual void Serialize(void* buffer) override;
virtual void Deserialize(void* buffer) override;
private:
//identify the character
int characterIndex;
char handle[PACKET_STRING_SIZE+1];
char avatar[PACKET_STRING_SIZE+1];
//the owner
int accountIndex;
//location
int roomIndex;
Vector2 origin;
Vector2 motion;
//gameplay
Statistics stats;
//TODO: gameplay components: equipment, items, buffs, debuffs
};
#endif
@@ -1,79 +0,0 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "region_packet.hpp"
#include "serial_utility.hpp"
void RegionPacket::Serialize(void* buffer) {
serializeCopy(&buffer, &type, sizeof(SerialPacketType));
//format
serializeCopy(&buffer, &roomIndex, sizeof(int));
serializeCopy(&buffer, &x, sizeof(int));
serializeCopy(&buffer, &y, sizeof(int));
if (type != SerialPacketType::REGION_CONTENT) {
return;
}
//tiles
for (int i = 0; i < REGION_WIDTH; i++) {
for (int j = 0; j < REGION_HEIGHT; j++) {
for (int k = 0; k < REGION_DEPTH; k++) {
*reinterpret_cast<Region::type_t*>(buffer) = region->GetTile(i, j, k);
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
}
}
}
//solids
serializeCopy(&buffer, region->GetSolidBitset(), REGION_SOLID_FOOTPRINT);
}
void RegionPacket::Deserialize(void* buffer) {
deserializeCopy(&buffer, &type, sizeof(SerialPacketType));
//format
deserializeCopy(&buffer, &roomIndex, sizeof(int));
deserializeCopy(&buffer, &x, sizeof(int));
deserializeCopy(&buffer, &y, sizeof(int));
if (type != SerialPacketType::REGION_CONTENT) {
return;
}
//an object to work on
region = new Region(x, y);
//tiles
for (int i = 0; i < REGION_WIDTH; i++) {
for (int j = 0; j < REGION_HEIGHT; j++) {
for (int k = 0; k < REGION_DEPTH; k++) {
region->SetTile(i, j, k, *reinterpret_cast<Region::type_t*>(buffer));
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
}
}
}
//solids
deserializeCopy(&buffer, region->GetSolidBitset(), REGION_SOLID_FOOTPRINT);
}
@@ -1,67 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013, 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 REGIONPACKET_HPP_
#define REGIONPACKET_HPP_
#include "serial_packet_base.hpp"
#include "region.hpp"
#include <cmath>
#include <cstring>
//define the memory footprint for the region's members
constexpr int REGION_TILE_FOOTPRINT = sizeof(Region::type_t) * REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH;
constexpr int REGION_SOLID_FOOTPRINT = ceil(REGION_WIDTH * REGION_HEIGHT / 8.0);
constexpr int REGION_METADATA_FOOTPRINT = sizeof(int) * 3;
class RegionPacket : public SerialPacketBase {
public:
RegionPacket() {}
~RegionPacket() {}
//location
int SetRoomIndex(int i) { return roomIndex = i; }
int SetX(int i) { return x = i; }
int SetY(int i) { return y = i; }
int GetRoomIndex() { return roomIndex; }
int GetX() { return x; }
int GetY() { return y; }
//the region itself
Region* SetRegion(Region* r) { return region = r; }
Region* GetRegion() { return region; }
virtual void Serialize(void* buffer) override;
virtual void Deserialize(void* buffer) override;
private:
//location/identify the region
int roomIndex;
int x, y;
//the data
Region* region;
};
#endif
+37
View File
@@ -0,0 +1,37 @@
#config
INCLUDES+=. ../packet ../../gameplay ../../map ../../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)/,libcommon.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
+182
View File
@@ -0,0 +1,182 @@
/* 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 "serial.hpp"
#include "serial_util.hpp"
//simple type functions
void serializeType(SerialPacketBase* packet, void* buffer) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
}
void deserializeType(SerialPacketBase* packet, void* buffer) {
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
}
//main switch functions
void serializePacket(SerialPacketBase* packet, void* buffer) {
switch(packet->type) {
//no extra data
case SerialPacketType::NONE:
case SerialPacketType::PING:
case SerialPacketType::PONG:
case SerialPacketType::BROADCAST_REQUEST:
//all rejections
case SerialPacketType::JOIN_REJECTION:
case SerialPacketType::CHARACTER_REJECTION:
case SerialPacketType::ENEMY_REJECTION:
case SerialPacketType::COMBAT_REJECTION:
serializeType(packet, buffer);
break;
//character info
case SerialPacketType::CHARACTER_NEW:
case SerialPacketType::CHARACTER_DELETE:
case SerialPacketType::CHARACTER_UPDATE:
case SerialPacketType::CHARACTER_STATS_REQUEST:
case SerialPacketType::CHARACTER_STATS_RESPONSE:
serializeCharacter(static_cast<CharacterPacket*>(packet), buffer);
break;
//client info
case SerialPacketType::JOIN_REQUEST:
case SerialPacketType::JOIN_RESPONSE:
case SerialPacketType::SYNCHRONIZE:
case SerialPacketType::DISCONNECT:
case SerialPacketType::SHUTDOWN:
serializeClient(static_cast<ClientPacket*>(packet), buffer);
break;
//combat info
case SerialPacketType::COMBAT_NEW:
case SerialPacketType::COMBAT_DELETE:
case SerialPacketType::COMBAT_UPDATE:
case SerialPacketType::COMBAT_ENTER_REQUEST:
case SerialPacketType::COMBAT_ENTER_RESPONSE:
case SerialPacketType::COMBAT_EXIT_REQUEST:
case SerialPacketType::COMBAT_EXIT_RESPONSE:
serializeCombat(static_cast<CombatPacket*>(packet), buffer);
break;
//enemy info
case SerialPacketType::ENEMY_NEW:
case SerialPacketType::ENEMY_DELETE:
case SerialPacketType::ENEMY_UPDATE:
case SerialPacketType::ENEMY_STATS_REQUEST:
case SerialPacketType::ENEMY_STATS_RESPONSE:
serializeEnemy(static_cast<EnemyPacket*>(packet), buffer);
break;
//region info
case SerialPacketType::REGION_REQUEST:
serializeRegionFormat(static_cast<RegionPacket*>(packet), buffer);
break;
case SerialPacketType::REGION_CONTENT:
serializeRegionContent(static_cast<RegionPacket*>(packet), buffer);
break;
//server info
case SerialPacketType::BROADCAST_RESPONSE:
serializeServer(static_cast<ServerPacket*>(packet), buffer);
break;
}
}
void deserializePacket(SerialPacketBase* packet, void* buffer) {
//find the type, so that you can actually deserialize the packet!
deserializeType(packet, buffer);
switch(packet->type) {
//no extra data
case SerialPacketType::NONE:
case SerialPacketType::PING:
case SerialPacketType::PONG:
case SerialPacketType::BROADCAST_REQUEST:
//all rejections
case SerialPacketType::JOIN_REJECTION:
case SerialPacketType::CHARACTER_REJECTION:
case SerialPacketType::ENEMY_REJECTION:
case SerialPacketType::COMBAT_REJECTION:
//NOTHING
break;
//character info
case SerialPacketType::CHARACTER_NEW:
case SerialPacketType::CHARACTER_DELETE:
case SerialPacketType::CHARACTER_UPDATE:
case SerialPacketType::CHARACTER_STATS_REQUEST:
case SerialPacketType::CHARACTER_STATS_RESPONSE:
deserializeCharacter(static_cast<CharacterPacket*>(packet), buffer);
break;
//client info
case SerialPacketType::JOIN_REQUEST:
case SerialPacketType::JOIN_RESPONSE:
case SerialPacketType::SYNCHRONIZE:
case SerialPacketType::DISCONNECT:
case SerialPacketType::SHUTDOWN:
deserializeClient(static_cast<ClientPacket*>(packet), buffer);
break;
//combat info
case SerialPacketType::COMBAT_NEW:
case SerialPacketType::COMBAT_DELETE:
case SerialPacketType::COMBAT_UPDATE:
case SerialPacketType::COMBAT_ENTER_REQUEST:
case SerialPacketType::COMBAT_ENTER_RESPONSE:
case SerialPacketType::COMBAT_EXIT_REQUEST:
case SerialPacketType::COMBAT_EXIT_RESPONSE:
serializeCombat(static_cast<CombatPacket*>(packet), buffer);
break;
//enemy info
case SerialPacketType::ENEMY_NEW:
case SerialPacketType::ENEMY_DELETE:
case SerialPacketType::ENEMY_UPDATE:
case SerialPacketType::ENEMY_STATS_REQUEST:
case SerialPacketType::ENEMY_STATS_RESPONSE:
serializeEnemy(static_cast<EnemyPacket*>(packet), buffer);
break;
//region info
case SerialPacketType::REGION_REQUEST:
deserializeRegionFormat(static_cast<RegionPacket*>(packet), buffer);
break;
case SerialPacketType::REGION_CONTENT:
deserializeRegionContent(static_cast<RegionPacket*>(packet), buffer);
break;
//server info
case SerialPacketType::BROADCAST_RESPONSE:
deserializeServer(static_cast<ServerPacket*>(packet), buffer);
break;
}
}
+67
View File
@@ -0,0 +1,67 @@
/* 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 SERIALIZE_HPP_
#define SERIALIZE_HPP_
#include "serial_packet.hpp"
#include "region.hpp"
#include "statistics.hpp"
//Primary interface functions
void serializePacket(SerialPacketBase*, void* dest);
void deserializePacket(SerialPacketBase*, void* src);
void serializeType(SerialPacketBase*, void*);
void deserializeType(SerialPacketBase*, void*);
//utility functions, exposed
void serializeCharacter(CharacterPacket*, void*);
void serializeClient(ClientPacket*, void*);
void serializeCombat(CombatPacket*, void*);
void serializeEnemy(EnemyPacket*, void*);
void serializeRegionFormat(RegionPacket*, void*);
void serializeRegionContent(RegionPacket*, void*);
void serializeServer(ServerPacket*, void*);
void serializeStatistics(Statistics*, void*);
void deserializeCharacter(CharacterPacket*, void*);
void deserializeClient(ClientPacket*, void*);
void deserializeCombat(CombatPacket*, void*);
void deserializeEnemy(EnemyPacket*, void*);
void deserializeRegionFormat(RegionPacket*, void*);
void deserializeRegionContent(RegionPacket*, void*);
void deserializeServer(ServerPacket*, void*);
void deserializeStatistics(Statistics*, void*);
/* DOCS: Keep PACKET_BUFFER_SIZE up to date
* DOCS: SerialPacketType::REGION_CONTENT is currently the largest type of packet, read more
* The metadata used are:
* SerialPacketType
* room index
* X & Y positon
* The rest is taken up by the Regions's content.
*/
constexpr int PACKET_BUFFER_SIZE = sizeof(SerialPacketType) + sizeof(int) * 3 + REGION_FOOTPRINT;
#endif
@@ -0,0 +1,74 @@
/* 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 "serial.hpp"
#include "serial_util.hpp"
void serializeCharacter(CharacterPacket* packet, void* buffer) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//identify the character
SERIALIZE(buffer, &packet->characterIndex, sizeof(int));
SERIALIZE(buffer, &packet->handle, PACKET_STRING_SIZE);
SERIALIZE(buffer, &packet->avatar, PACKET_STRING_SIZE);
//the owner
SERIALIZE(buffer, &packet->accountIndex, sizeof(int));
//location
SERIALIZE(buffer, &packet->roomIndex, sizeof(int));
SERIALIZE(buffer, &packet->origin.x, sizeof(double));
SERIALIZE(buffer, &packet->origin.y, sizeof(double));
SERIALIZE(buffer, &packet->motion.x, sizeof(double));
SERIALIZE(buffer, &packet->motion.y, sizeof(double));
//stats structure
serializeStatistics(&packet->stats, buffer);
buffer = reinterpret_cast<char*>(buffer) + sizeof(Statistics);
//TODO: gameplay components: equipment, items, buffs, debuffs
}
void deserializeCharacter(CharacterPacket* packet, void* buffer) {
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//identify the character
DESERIALIZE(buffer, &packet->characterIndex, sizeof(int));
DESERIALIZE(buffer, &packet->handle, PACKET_STRING_SIZE);
DESERIALIZE(buffer, &packet->avatar, PACKET_STRING_SIZE);
//the owner
DESERIALIZE(buffer, &packet->accountIndex, sizeof(int));
//location
DESERIALIZE(buffer, &packet->roomIndex, sizeof(int));
DESERIALIZE(buffer, &packet->origin.x, sizeof(double));
DESERIALIZE(buffer, &packet->origin.y, sizeof(double));
DESERIALIZE(buffer, &packet->motion.x, sizeof(double));
DESERIALIZE(buffer, &packet->motion.y, sizeof(double));
//stats structure
deserializeStatistics(&packet->stats, buffer);
buffer = reinterpret_cast<char*>(buffer) + sizeof(Statistics);
//TODO: gameplay components: equipment, items, buffs, debuffs
}
@@ -19,45 +19,24 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#ifndef SINGLETON_HPP_ #include "serial.hpp"
#define SINGLETON_HPP_
#include <stdexcept> #include "serial_util.hpp"
template<typename T> void serializeClient(ClientPacket* packet, void* buffer) {
class Singleton { SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
public:
static T& GetSingleton() {
if (!ptr) {
throw(std::logic_error("This singleton has not been created"));
}
return *ptr;
}
static void Create() {
if (ptr) {
throw(std::logic_error("This singleton has already been created"));
}
ptr = new T();
}
static void Delete() {
if (!ptr) {
throw(std::logic_error("A non-existant singleton cannot be deleted"));
}
delete ptr;
ptr = nullptr;
}
protected: SERIALIZE(buffer, &packet->clientIndex, sizeof(int));
Singleton() = default; SERIALIZE(buffer, &packet->accountIndex, sizeof(int));
Singleton(Singleton const&) = default; SERIALIZE(buffer, &packet->username, PACKET_STRING_SIZE);
Singleton(Singleton&&) = default; // SERIALIZE(buffer, &packet->password, PACKET_STRING_SIZE);
~Singleton() = default; }
private: void deserializeClient(ClientPacket* packet, void* buffer) {
static T* ptr; DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
};
template<typename T> DESERIALIZE(buffer, &packet->clientIndex, sizeof(int));
T* Singleton<T>::ptr = nullptr; DESERIALIZE(buffer, &packet->accountIndex, sizeof(int));
DESERIALIZE(buffer, &packet->username, PACKET_STRING_SIZE);
#endif // DESERIALIZE(buffer, &packet->password, PACKET_STRING_SIZE);
}
+64
View File
@@ -0,0 +1,64 @@
/* 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 "serial.hpp"
#include "serial_util.hpp"
void serializeCombat(CombatPacket* packet, void* buffer) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//identify the combat instance
SERIALIZE(buffer, &packet->combatIndex, sizeof(int));
SERIALIZE(buffer, &packet->difficulty, sizeof(int));
SERIALIZE(buffer, &packet->terrainType, sizeof(TerrainType));
//combatants
SERIALIZE(buffer, &packet->characterArray, sizeof(int) * COMBAT_MAX_CHARACTERS);
SERIALIZE(buffer, &packet->enemyArray, sizeof(int) * COMBAT_MAX_ENEMIES);
//location
SERIALIZE(buffer, &packet->mapIndex, sizeof(int));
SERIALIZE(buffer, &packet->origin.x, sizeof(double));
SERIALIZE(buffer, &packet->origin.y, sizeof(double));
//TODO: gameplay components: rewards
}
void deserializeCombat(CombatPacket* packet, void* buffer) {
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//identify the combat instance
DESERIALIZE(buffer, &packet->combatIndex, sizeof(int));
DESERIALIZE(buffer, &packet->difficulty, sizeof(int));
DESERIALIZE(buffer, &packet->terrainType, sizeof(TerrainType));
//combatants
DESERIALIZE(buffer, &packet->characterArray, sizeof(int) * COMBAT_MAX_CHARACTERS);
DESERIALIZE(buffer, &packet->enemyArray, sizeof(int) * COMBAT_MAX_ENEMIES);
//location
DESERIALIZE(buffer, &packet->mapIndex, sizeof(int));
DESERIALIZE(buffer, &packet->origin.x, sizeof(double));
DESERIALIZE(buffer, &packet->origin.y, sizeof(double));
//TODO: gameplay components: rewards
}
+56
View File
@@ -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.
*/
#include "serial.hpp"
#include "serial_util.hpp"
void serializeEnemy(EnemyPacket* packet, void* buffer) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//identify the enemy
SERIALIZE(buffer, &packet->enemyIndex, sizeof(int));
SERIALIZE(buffer, &packet->handle, PACKET_STRING_SIZE);
SERIALIZE(buffer, &packet->avatar, PACKET_STRING_SIZE);
//gameplay
//stats structure
serializeStatistics(&packet->stats, buffer);
buffer = reinterpret_cast<char*>(buffer) + sizeof(Statistics);
//TODO: gameplay components: equipment, items, buffs, debuffs, rewards
}
void deserializeEnemy(EnemyPacket* packet, void* buffer) {
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//identify the enemy
DESERIALIZE(buffer, &packet->enemyIndex, sizeof(int));
DESERIALIZE(buffer, &packet->handle, PACKET_STRING_SIZE);
DESERIALIZE(buffer, &packet->avatar, PACKET_STRING_SIZE);
//stats structure
deserializeStatistics(&packet->stats, buffer);
buffer = reinterpret_cast<char*>(buffer) + sizeof(Statistics);
//TODO: gameplay components: equipment, items, buffs, debuffs, rewards
}
+89
View File
@@ -0,0 +1,89 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "serial.hpp"
#include "serial_util.hpp"
void serializeRegionFormat(RegionPacket* packet, void* buffer) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//format
SERIALIZE(buffer, &packet->roomIndex, sizeof(int));
SERIALIZE(buffer, &packet->x, sizeof(int));
SERIALIZE(buffer, &packet->y, sizeof(int));
}
void serializeRegionContent(RegionPacket* packet, void* buffer) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//format
SERIALIZE(buffer, &packet->roomIndex, sizeof(int));
SERIALIZE(buffer, &packet->x, sizeof(int));
SERIALIZE(buffer, &packet->y, sizeof(int));
//tiles
for (register int i = 0; i < REGION_WIDTH; i++) {
for (register int j = 0; j < REGION_HEIGHT; j++) {
for (register int k = 0; k < REGION_DEPTH; k++) {
*reinterpret_cast<Region::type_t*>(buffer) = packet->region->GetTile(i, j, k);
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
}
}
}
//solids
SERIALIZE(buffer, packet->region->GetSolidBitset(), REGION_SOLID_FOOTPRINT);
}
void deserializeRegionFormat(RegionPacket* packet, void* buffer) {
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//format
DESERIALIZE(buffer, &packet->roomIndex, sizeof(int));
DESERIALIZE(buffer, &packet->x, sizeof(int));
DESERIALIZE(buffer, &packet->y, sizeof(int));
}
void deserializeRegionContent(RegionPacket* packet, void* buffer) {
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//format
DESERIALIZE(buffer, &packet->roomIndex, sizeof(int));
DESERIALIZE(buffer, &packet->x, sizeof(int));
DESERIALIZE(buffer, &packet->y, sizeof(int));
//an object to work on
packet->region = new Region(packet->x, packet->y);
//tiles
for (register int i = 0; i < REGION_WIDTH; i++) {
for (register int j = 0; j < REGION_HEIGHT; j++) {
for (register int k = 0; k < REGION_DEPTH; k++) {
packet->region->SetTile(i, j, k, *reinterpret_cast<Region::type_t*>(buffer));
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
}
}
}
//solids
DESERIALIZE(buffer, packet->region->GetSolidBitset(), REGION_SOLID_FOOTPRINT);
}
@@ -19,24 +19,24 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#include "server_packet.hpp" #include "serial.hpp"
#include "serial_utility.hpp" #include "serial_util.hpp"
void ServerPacket::Serialize(void* buffer) { void serializeServer(ServerPacket* packet, void* buffer) {
serializeCopy(&buffer, &type, sizeof(SerialPacketType)); SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//identify the server //identify the server
serializeCopy(&buffer, name, PACKET_STRING_SIZE); SERIALIZE(buffer, &packet->name, PACKET_STRING_SIZE);
serializeCopy(&buffer, &playerCount, sizeof(int)); SERIALIZE(buffer, &packet->playerCount, sizeof(int));
serializeCopy(&buffer, &version, sizeof(int)); SERIALIZE(buffer, &packet->version, sizeof(int));
} }
void ServerPacket::Deserialize(void* buffer) { void deserializeServer(ServerPacket* packet, void* buffer) {
deserializeCopy(&buffer, &type, sizeof(SerialPacketType)); DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//identify the server //identify the server
deserializeCopy(&buffer, name, PACKET_STRING_SIZE); DESERIALIZE(buffer, &packet->name, PACKET_STRING_SIZE);
deserializeCopy(&buffer, &playerCount, sizeof(int)); DESERIALIZE(buffer, &packet->playerCount, sizeof(int));
deserializeCopy(&buffer, &version, sizeof(int)); DESERIALIZE(buffer, &packet->version, sizeof(int));
} }
@@ -0,0 +1,65 @@
/* 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 "serial.hpp"
#include "serial_util.hpp"
void serializeStatistics(Statistics* stats, void* buffer) {
//integers
SERIALIZE(buffer, &stats->level, sizeof(int));
SERIALIZE(buffer, &stats->exp, sizeof(int));
SERIALIZE(buffer, &stats->maxHP, sizeof(int));
SERIALIZE(buffer, &stats->health, sizeof(int));
SERIALIZE(buffer, &stats->maxMP, sizeof(int));
SERIALIZE(buffer, &stats->mana, sizeof(int));
SERIALIZE(buffer, &stats->attack, sizeof(int));
SERIALIZE(buffer, &stats->defence, sizeof(int));
SERIALIZE(buffer, &stats->intelligence, sizeof(int));
SERIALIZE(buffer, &stats->resistance, sizeof(int));
SERIALIZE(buffer, &stats->speed, sizeof(int));
//floats
SERIALIZE(buffer, &stats->accuracy, sizeof(float));
SERIALIZE(buffer, &stats->evasion, sizeof(float));
SERIALIZE(buffer, &stats->luck, sizeof(float));
}
void deserializeStatistics(Statistics* stats, void* buffer) {
//integers
DESERIALIZE(buffer, &stats->level, sizeof(int));
DESERIALIZE(buffer, &stats->exp, sizeof(int));
DESERIALIZE(buffer, &stats->maxHP, sizeof(int));
DESERIALIZE(buffer, &stats->health, sizeof(int));
DESERIALIZE(buffer, &stats->maxMP, sizeof(int));
DESERIALIZE(buffer, &stats->mana, sizeof(int));
DESERIALIZE(buffer, &stats->attack, sizeof(int));
DESERIALIZE(buffer, &stats->defence, sizeof(int));
DESERIALIZE(buffer, &stats->intelligence, sizeof(int));
DESERIALIZE(buffer, &stats->resistance, sizeof(int));
DESERIALIZE(buffer, &stats->speed, sizeof(int));
//floats
DESERIALIZE(buffer, &stats->accuracy, sizeof(float));
DESERIALIZE(buffer, &stats->evasion, sizeof(float));
DESERIALIZE(buffer, &stats->luck, sizeof(float));
}
+31
View File
@@ -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.
*/
#ifndef SERIALIZEUTIL_HPP_
#define SERIALIZEUTIL_HPP_
#include <cstring>
//NOTE: The strange assignments here used in order to move the void* parameter
#define SERIALIZE(buffer, data, size) memcpy(buffer, data, size); buffer = reinterpret_cast<char*>(buffer) + size;
#define DESERIALIZE(buffer, data, size) memcpy(data, buffer, size); buffer = reinterpret_cast<char*>(buffer) + size;
#endif
-67
View File
@@ -1,67 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013, 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 SERIALPACKET_HPP_
#define SERIALPACKET_HPP_
/* DOCS: serial_packet.hpp is used to define a number of required constants.
* These are used extensively by the server and client
*/
#include "serial_packet_base.hpp"
#include "character_packet.hpp"
#include "client_packet.hpp"
#include "region_packet.hpp"
#include "server_packet.hpp"
//SerialPacketBase is defined in serial_packet_base.hpp
typedef SerialPacketBase SerialPacket;
//DOCS: NETWORK_VERSION is used to discern compatible servers and clients
constexpr int NETWORK_VERSION = 20140831;
//_MaxPacket Should not be used
union _MaxPacket {
CharacterPacket a;
ClientPacket b;
RegionPacket c;
ServerPacket d;
};
constexpr int MAX_PACKET_SIZE = sizeof(_MaxPacket);
/* DOCS: PACKET_BUFFER_SIZE is the memory required to store serialized data
* DOCS: SerialPacketType::REGION_CONTENT is currently the largest packet type
* Serialized RegionPacket structure:
* SerialPacketType
* room index (int)
* X & Y position (int)
* tile data (3 layers)
* solid data (bitset)
*/
constexpr int PACKET_BUFFER_SIZE =
sizeof(SerialPacketType) +
REGION_METADATA_FOOTPRINT +
REGION_TILE_FOOTPRINT +
REGION_SOLID_FOOTPRINT;
#endif
-98
View File
@@ -1,98 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013, 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 SERIALPACKETTYPE_HPP_
#define SERIALPACKETTYPE_HPP_
/* DOCS: The headers indicate what packet type is used for each message
* different messages under the same header will carry different amounts of
* valid data, but it will still be carried in that packet's format.
*/
enum class SerialPacketType {
//default: there is something wrong
NONE = 0,
//-------------------------
//ServerPacket
// name, player count, version
//-------------------------
//heartbeat
PING,
PONG,
//Used for finding available servers
BROADCAST_REQUEST,
BROADCAST_RESPONSE,
//-------------------------
//ClientPacket
// client index, account index, character index
//-------------------------
//Connecting to a server as a client
JOIN_REQUEST,
JOIN_RESPONSE,
JOIN_REJECTION,
//client requests all information from the server
SYNCHRONIZE,
//disconnect from the server
DISCONNECT,
//shut down the server
SHUTDOWN,
//-------------------------
//RegionPacket
// room index, x, y, raw data
//-------------------------
//map data
REGION_REQUEST,
REGION_CONTENT,
//-------------------------
//CharacterPacket
// handle, avatar, character index, account index,
// room index, origin, motion
// statistics
//-------------------------
//controlling characters
CHARACTER_NEW,
CHARACTER_DELETE,
CHARACTER_UPDATE,
//authentication, character index => character stats
CHARACTER_STATS_REQUEST,
CHARACTER_STATS_RESPONSE,
//reject a character request
CHARACTER_REJECTION,
//not used
LAST
};
#endif
-147
View File
@@ -1,147 +0,0 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "serial_utility.hpp"
#include "serial_packet_type.hpp"
#include "server_packet.hpp"
#include "client_packet.hpp"
#include "region_packet.hpp"
#include "character_packet.hpp"
#include <cstring>
void serializePacket(SerialPacketBase* packet, void* data) {
switch(packet->GetType()) {
case SerialPacketType::PING:
case SerialPacketType::PONG:
case SerialPacketType::BROADCAST_REQUEST:
case SerialPacketType::BROADCAST_RESPONSE:
static_cast<ServerPacket*>(packet)->Serialize(data);
break;
case SerialPacketType::JOIN_REQUEST:
case SerialPacketType::JOIN_RESPONSE:
case SerialPacketType::JOIN_REJECTION:
case SerialPacketType::SYNCHRONIZE:
case SerialPacketType::DISCONNECT:
case SerialPacketType::SHUTDOWN:
static_cast<ClientPacket*>(packet)->Serialize(data);
break;
case SerialPacketType::REGION_REQUEST:
case SerialPacketType::REGION_CONTENT:
static_cast<RegionPacket*>(packet)->Serialize(data);
break;
case SerialPacketType::CHARACTER_NEW:
case SerialPacketType::CHARACTER_DELETE:
case SerialPacketType::CHARACTER_UPDATE:
case SerialPacketType::CHARACTER_STATS_REQUEST:
case SerialPacketType::CHARACTER_STATS_RESPONSE:
case SerialPacketType::CHARACTER_REJECTION:
static_cast<CharacterPacket*>(packet)->Serialize(data);
break;
}
}
void deserializePacket(SerialPacketBase* packet, void* data) {
//get the type
SerialPacketType type;
memcpy(&type, data, sizeof(SerialPacketType));
switch(type) {
case SerialPacketType::PING:
case SerialPacketType::PONG:
case SerialPacketType::BROADCAST_REQUEST:
case SerialPacketType::BROADCAST_RESPONSE:
static_cast<ServerPacket*>(packet)->Deserialize(data);
break;
case SerialPacketType::JOIN_REQUEST:
case SerialPacketType::JOIN_RESPONSE:
case SerialPacketType::JOIN_REJECTION:
case SerialPacketType::SYNCHRONIZE:
case SerialPacketType::DISCONNECT:
case SerialPacketType::SHUTDOWN:
static_cast<ClientPacket*>(packet)->Deserialize(data);
break;
case SerialPacketType::REGION_REQUEST:
case SerialPacketType::REGION_CONTENT:
static_cast<RegionPacket*>(packet)->Deserialize(data);
break;
case SerialPacketType::CHARACTER_NEW:
case SerialPacketType::CHARACTER_DELETE:
case SerialPacketType::CHARACTER_UPDATE:
case SerialPacketType::CHARACTER_STATS_REQUEST:
case SerialPacketType::CHARACTER_STATS_RESPONSE:
case SerialPacketType::CHARACTER_REJECTION:
static_cast<CharacterPacket*>(packet)->Deserialize(data);
break;
}
}
void serializeCopy(void** bufferHead, void* data, int size) {
memcpy(*bufferHead, data, size);
(*bufferHead) = static_cast<void*>(static_cast<char*>(*bufferHead) + size);
}
void deserializeCopy(void** bufferHead, void* data, int size) {
memcpy(data, *bufferHead, size);
(*bufferHead) = static_cast<void*>(static_cast<char*>(*bufferHead) + size);
}
void serializeCopyStatistics(void** bufferHead, Statistics* stats) {
//integers
serializeCopy(bufferHead, &stats->level, sizeof(int));
serializeCopy(bufferHead, &stats->exp, sizeof(int));
serializeCopy(bufferHead, &stats->maxHP, sizeof(int));
serializeCopy(bufferHead, &stats->health, sizeof(int));
serializeCopy(bufferHead, &stats->maxMP, sizeof(int));
serializeCopy(bufferHead, &stats->mana, sizeof(int));
serializeCopy(bufferHead, &stats->attack, sizeof(int));
serializeCopy(bufferHead, &stats->defence, sizeof(int));
serializeCopy(bufferHead, &stats->intelligence, sizeof(int));
serializeCopy(bufferHead, &stats->resistance, sizeof(int));
serializeCopy(bufferHead, &stats->speed, sizeof(int));
//floats
serializeCopy(bufferHead, &stats->accuracy, sizeof(float));
serializeCopy(bufferHead, &stats->evasion, sizeof(float));
serializeCopy(bufferHead, &stats->luck, sizeof(float));
}
void deserializeCopyStatistics(void** bufferHead, Statistics* stats) {
//integers
deserializeCopy(bufferHead, &stats->level, sizeof(int));
deserializeCopy(bufferHead, &stats->exp, sizeof(int));
deserializeCopy(bufferHead, &stats->maxHP, sizeof(int));
deserializeCopy(bufferHead, &stats->health, sizeof(int));
deserializeCopy(bufferHead, &stats->maxMP, sizeof(int));
deserializeCopy(bufferHead, &stats->mana, sizeof(int));
deserializeCopy(bufferHead, &stats->attack, sizeof(int));
deserializeCopy(bufferHead, &stats->defence, sizeof(int));
deserializeCopy(bufferHead, &stats->intelligence, sizeof(int));
deserializeCopy(bufferHead, &stats->resistance, sizeof(int));
deserializeCopy(bufferHead, &stats->speed, sizeof(int));
//floats
deserializeCopy(bufferHead, &stats->accuracy, sizeof(float));
deserializeCopy(bufferHead, &stats->evasion, sizeof(float));
deserializeCopy(bufferHead, &stats->luck, sizeof(float));
}
+3 -6
View File
@@ -21,7 +21,7 @@
*/ */
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
#include "serial_utility.hpp" #include "serial.hpp"
#include <stdexcept> #include <stdexcept>
@@ -213,11 +213,8 @@ int UDPNetworkUtility::SendToAllChannels(SerialPacket* serialPacket) {
int UDPNetworkUtility::Receive(SerialPacket* serialPacket) { int UDPNetworkUtility::Receive(SerialPacket* serialPacket) {
memset(packet->data, 0, packet->maxlen); memset(packet->data, 0, packet->maxlen);
int ret = SDLNet_UDP_Recv(socket, packet); int ret = SDLNet_UDP_Recv(socket, packet);
if (ret > 0) { deserializePacket(serialPacket, packet->data);
//BUG: This simply fails serialPacket->srcAddress = packet->address;
deserializePacket(serialPacket, packet->data);
serialPacket->srcAddress = packet->address;
}
if (ret < 0) { if (ret < 0) {
throw(std::runtime_error("Unknown network error occured")); throw(std::runtime_error("Unknown network error occured"));
+6 -11
View File
@@ -22,15 +22,15 @@
#ifndef UDPNETWORKUTILITY_HPP_ #ifndef UDPNETWORKUTILITY_HPP_
#define UDPNETWORKUTILITY_HPP_ #define UDPNETWORKUTILITY_HPP_
//common
#include "serial_packet.hpp"
#include "singleton.hpp"
//APIs
#include "SDL/SDL_net.h" #include "SDL/SDL_net.h"
class UDPNetworkUtility : public Singleton<UDPNetworkUtility> { #include "serial_packet.hpp"
class UDPNetworkUtility {
public: public:
UDPNetworkUtility() = default;
~UDPNetworkUtility() = default;
void Open(int port); void Open(int port);
void Close(); void Close();
@@ -65,11 +65,6 @@ public:
return socket; return socket;
} }
private: private:
friend Singleton<UDPNetworkUtility>;
UDPNetworkUtility() = default;
~UDPNetworkUtility() = default;
UDPsocket socket = nullptr; UDPsocket socket = nullptr;
UDPpacket* packet = nullptr; UDPpacket* packet = nullptr;
}; };
+1 -2
View File
@@ -32,7 +32,6 @@ public:
int w, h; int w, h;
BoundingBox() = default; BoundingBox() = default;
BoundingBox(int i, int j): x(i), y(j), w(0), h(0) {};
BoundingBox(int i, int j, int k, int l): x(i), y(j), w(k), h(l) {}; BoundingBox(int i, int j, int k, int l): x(i), y(j), w(k), h(l) {};
~BoundingBox() = default; ~BoundingBox() = default;
BoundingBox& operator=(BoundingBox const&) = default; BoundingBox& operator=(BoundingBox const&) = default;
@@ -63,7 +62,7 @@ public:
}; };
//This is explicitly a POD //This is explicitly a POD
static_assert(std::is_pod<BoundingBox>::value, "BoundingBox is not a POD"); static_assert(std::is_pod<Vector2>::value, "BoundingBox is not a POD");
#include "vector2.hpp" #include "vector2.hpp"
-130
View File
@@ -1,130 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013, 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 "config_utility.hpp"
#include <cstdlib>
#include <fstream>
#include <stdexcept>
void ConfigUtility::Load(std::string fname) {
//clear the stored configuration
configMap.clear();
//pass to the recursive method
configMap = Read(fname);
}
ConfigUtility::table_t ConfigUtility::Read(std::string fname) {
//read in and return this file's data
table_t retTable;
std::ifstream is(fname);
if (!is.is_open()) {
std::string msg;
msg += "Failed to open a config file: ";
msg += fname;
throw(std::runtime_error(msg));
}
std::string key, val;
while(true) { //forever
//eat whitespace
while(isspace(is.peek())) {
is.ignore();
}
//end of file
if (is.eof()) {
break;
}
//skip comment lines
if (is.peek() == '#') {
while(is.peek() != '\n' && !is.eof()) {
is.ignore();
}
continue;
}
//read in the pair
getline(is, key,'=');
getline(is, val);
//trim the strings at the start & end
while(key.size() && isspace(*key.begin())) key.erase(0, 1);
while(val.size() && isspace(*val.begin())) val.erase(0, 1);
while(key.size() && isspace(*(key.end()-1))) key.erase(key.end() - 1);
while(val.size() && isspace(*(val.end()-1))) val.erase(val.end() - 1);
//disallow empty/wiped values
if (key.size() == 0) {
continue;
}
//save the pair
retTable[key] = val;
}
is.close();
//load in any subordinate config files
//TODO: Possibility of nesting config levels?
if (retTable.find("config.next") != retTable.end()) {
table_t subTable = Read(retTable["config.next"]);
retTable.insert(subTable.begin(), subTable.end());
}
return retTable;
}
//-------------------------
//Convert to a type
//-------------------------
std::string& ConfigUtility::String(std::string s) {
return configMap[s];
}
int ConfigUtility::Integer(std::string s) {
table_t::iterator it = configMap.find(s);
if (it == configMap.end()) {
return 0;
}
return atoi(it->second.c_str());
}
double ConfigUtility::Double(std::string s) {
table_t::iterator it = configMap.find(s);
if (it == configMap.end()) {
return 0.0;
}
return atof(it->second.c_str());
}
bool ConfigUtility::Boolean(std::string s) {
table_t::iterator it = configMap.find(s);
if (it == configMap.end()) {
return false;
}
return it->second == "true";
}
-58
View File
@@ -1,58 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013, 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 CONFIGUTILITY_HPP_
#define CONFIGUTILITY_HPP_
#include "singleton.hpp"
#include <map>
#include <string>
class ConfigUtility : public Singleton<ConfigUtility> {
public:
void Load(std::string fname);
//convert to a type
std::string& String(std::string);
int Integer(std::string);
double Double(std::string);
bool Boolean(std::string);
//shorthand
inline std::string& operator[](std::string s) { return configMap[s]; }
inline int Int(std::string s) { return Integer(s); }
inline bool Bool(std::string s) { return Boolean(s); }
private:
typedef std::map<std::string, std::string> table_t;
friend Singleton<ConfigUtility>;
ConfigUtility() = default;
~ConfigUtility() = default;
table_t Read(std::string fname);
table_t configMap;
};
#endif
+13
View File
@@ -23,6 +23,19 @@
#include <algorithm> #include <algorithm>
int snapToBase(int base, int x) {
//snap to a grid
if (x < 0) {
++x;
return x / base * base - base;
}
return x / base * base;
}
double snapToBase(double base, double x) {
return floor(x / base) * base;
}
std::string truncatePath(std::string pathname) { std::string truncatePath(std::string pathname) {
return std::string( return std::string(
std::find_if( std::find_if(
+3
View File
@@ -24,6 +24,9 @@
#include <string> #include <string>
int snapToBase(int base, int x);
double snapToBase(double base, double x);
std::string truncatePath(std::string pathname); std::string truncatePath(std::string pathname);
//fixing known bugs in g++ //fixing known bugs in g++
-15
View File
@@ -1,15 +0,0 @@
Future versions (to be determined) may be released under a modified version of the Uplink Developer's License.
The current version of Tortuga is released under the zlib license.
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.
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.
+5 -11
View File
@@ -3,6 +3,11 @@
#MKDIR=mkdir #MKDIR=mkdir
#RM=del /y #RM=del /y
#CXXFLAGS+=-static-libgcc -static-libstdc++ -g -fno-inline-functions -Wall
CXXFLAGS+=-static-libgcc -static-libstdc++
export
OUTDIR=out OUTDIR=out
all: $(OUTDIR) all: $(OUTDIR)
@@ -10,17 +15,6 @@ all: $(OUTDIR)
$(MAKE) -C server $(MAKE) -C server
$(MAKE) -C client $(MAKE) -C client
debug: export CXXFLAGS+=-g
debug: clean all
release: export CXXFLAGS+=-static-libgcc -static-libstdc++
release: clean all package
#For use on my machine ONLY
package:
rar a -r -ep Tortuga.rar $(OUTDIR)/*.exe $(OUTDIR)/*.dll
rar a -r Tortuga.rar rsc/* copyright.txt
$(OUTDIR): $(OUTDIR):
mkdir $(OUTDIR) mkdir $(OUTDIR)
-31
View File
@@ -1,31 +0,0 @@
#configuration of the programs
#server specific settings
server.host = 255.255.255.255
server.port = 21795
server.name = local
server.dbname = database.db
#client specific settings
#client.screen.w = 800
#client.screen.h = 600
client.screen.f = false
client.username = Kayne Ruse
client.handle = Ratstail91
client.avatar = elliot2.bmp
#directories
dir.fonts = rsc/graphics/fonts/
dir.logos = rsc/graphics/logos/
dir.sprites = rsc/graphics/sprites/
dir.tilesets = rsc/graphics/tilesets/
dir.interface = rsc/graphics/interface/
dir.scripts = rsc/scripts/
dir.maps = rsc/maps/
#map system
map.savename = servermap
#debugging
+16 -23
View File
@@ -4,7 +4,15 @@ print("Lua script check")
function math.sqr(x) return x*x end function math.sqr(x) return x*x end
function math.dist(x, y, i, j) return math.sqrt(math.sqr(x - i) + math.sqr(y - j)) end function math.dist(x, y, i, j) return math.sqrt(math.sqr(x - i) + math.sqr(y - j)) end
--tile macros, mapped to the tilesheet --objects to work on
--TODO: sheet is not accessable in the server
local sheet = TileSheet.GetTileSheet()
local pager = RegionPager.GetRegionPager()
--the selected tilesheet
TileSheet.Load(sheet, config.dir.tilesets .. "terrain.bmp", 32, 32)
--tile macros, mapped to this tilesheet
local base = 14 local base = 14
local shift = 36 local shift = 36
tiles = { tiles = {
@@ -15,11 +23,12 @@ tiles = {
water = base + shift * 4 water = base + shift * 4
} }
--custom generation systems here --TODO: could set custom generation systems here, that differ from the global generators, etc.
function islandGenerator(region) --TODO: I need a way to allow for different generation algorithms for different pager objects
io.write("Generating (", Region.GetX(region), ", ", Region.GetY(region), ")\n") --TODO: This design requires only one pager, but this is not good.
for i = 1, Region.GetWidth(region) do function Region.Create(region)
for j = 1, Region.GetHeight(region) do for i = 1, Region.GetWidth() do
for j = 1, Region.GetHeight() do
local dist = math.dist(0, 0, i + Region.GetX(region) -1, j + Region.GetY(region) -1) local dist = math.dist(0, 0, i + Region.GetX(region) -1, j + Region.GetY(region) -1)
if dist < 10 then if dist < 10 then
Region.SetTile(region, i, j, 1, tiles.plains) Region.SetTile(region, i, j, 1, tiles.plains)
@@ -33,20 +42,4 @@ function islandGenerator(region)
end end
end end
--Get some regions print("Finished the lua script")
--BUG: The server fails without at least one room
--TODO: Create rooms with names?
newRoom = RoomManager.CreateRoom()
pager = Room.GetPager(newRoom)
RegionPager.SetOnCreate(pager, islandGenerator)
--[[
regionTable = {
RegionPager.GetRegion(pager, Region.GetWidth() * 0, Region.GetHeight() * 0),
RegionPager.GetRegion(pager, Region.GetWidth() *-1, Region.GetHeight() * 0),
RegionPager.GetRegion(pager, Region.GetWidth() * 0, Region.GetHeight() *-1),
RegionPager.GetRegion(pager, Region.GetWidth() *-1, Region.GetHeight() *-1)
}
]]
print("Finished the lua script")
+60
View File
@@ -0,0 +1,60 @@
--[[
--reroute the program while in development
config = {debug = true}
dofile("../rsc/setup.lua")
--]]
--catch the debug signal if the program was rerouted
local debug = false
if config ~= nil then
debug = config.debug
end
--the program's configuration
config = {
--common stuff
debug = debug,
dir = {
fonts = "rsc/graphics/fonts/",
logos = "rsc/graphics/logos/",
sprites = "rsc/graphics/sprites/",
tilesets = "rsc/graphics/tilesets/",
interface = "rsc/graphics/interface/",
scripts = "rsc/scripts/",
maps = "rsc/maps/"
},
--client specific stuff
client = {
screen = {
width = 800,
height = 600,
fullscreen = false
},
username = "Kayne",
handle = "Ratstail91",
avatar = "elliot2.bmp",
--NOTE: these generally go here
-- clientIndex
-- accountIndex
-- characterIndex
},
--server specific stuff
server = {
mapname = "mapsave",
host = "255.255.255.255",
port = 21795,
name = "local",
dbname = "database.db"
}
}
--development environment
if config.debug then
for k, v in pairs(config.dir) do
config.dir[k] = string.format("../%s", v)
end
end
+3 -23
View File
@@ -24,35 +24,15 @@
#include <string> #include <string>
class AccountData { struct AccountData {
public:
AccountData() = default;
~AccountData() = default;
//accessors and mutators
int SetClientIndex(int i) { return clientIndex = i; }
int GetClientIndex() { return clientIndex; }
std::string SetUsername(std::string s) { return username = s; }
std::string GetUsername() { return username; }
//database stuff
bool GetBlackListed() { return blackListed; }
bool GetWhiteListed() { return whiteListed; }
bool GetModerator() { return mod; }
bool GetAdministrator() { return admin; }
private:
friend class AccountManager;
int clientIndex;
std::string username; std::string username;
//TODO: password //TODO: password
bool blackListed = false; bool blackListed = false;
bool whiteListed = true; bool whiteListed = true;
bool mod = false; bool mod = false;
bool admin = false; bool admin = false;
int clientIndex;
}; };
#endif #endif
+4 -7
View File
@@ -23,14 +23,16 @@
#define ACCOUNTMANAGER_HPP_ #define ACCOUNTMANAGER_HPP_
#include "account_data.hpp" #include "account_data.hpp"
#include "singleton.hpp"
#include "sqlite3/sqlite3.h" #include "sqlite3/sqlite3.h"
#include <map> #include <map>
class AccountManager : public Singleton<AccountManager> { class AccountManager {
public: public:
AccountManager() = default;
~AccountManager() { UnloadAll(); };
//public access methods //public access methods
int CreateAccount(std::string username, int clientIndex); int CreateAccount(std::string username, int clientIndex);
int LoadAccount(std::string username, int clientIndex); int LoadAccount(std::string username, int clientIndex);
@@ -48,11 +50,6 @@ public:
sqlite3* GetDatabase(); sqlite3* GetDatabase();
private: private:
friend Singleton<AccountManager>;
AccountManager() = default;
~AccountManager() = default;
std::map<int, AccountData> accountMap; std::map<int, AccountData> accountMap;
sqlite3* database = nullptr; sqlite3* database = nullptr;
}; };
+1 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. ../../common/utilities INCLUDES+=.
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
+14 -28
View File
@@ -31,41 +31,27 @@
#include <string> #include <string>
#include <cmath> #include <cmath>
class CharacterData { struct CharacterData {
public: //metadata
CharacterData() = default; int owner;
~CharacterData() = default; std::string handle;
std::string avatar;
//location and movement
int SetRoomIndex(int i) { return roomIndex = i; }
Vector2 SetOrigin(Vector2 v) { return origin = v; }
Vector2 SetMotion(Vector2 v) { return motion = v; }
int GetRoomIndex() { return roomIndex; }
Vector2 GetOrigin() { return origin; }
Vector2 GetMotion() { return motion; }
//accessors and mutators
Statistics* GetBaseStats() { return &baseStats; }
//database stuff
int GetOwner() { return owner; }
std::string GetHandle() { return handle; }
std::string GetAvatar() { return avatar; }
private:
friend class CharacterManager;
//world position //world position
int roomIndex = 0; int roomIndex = 0;
Vector2 origin = {0.0,0.0}; Vector2 origin = {0.0,0.0};
Vector2 motion = {0.0,0.0}; Vector2 motion = {0.0,0.0};
Statistics baseStats; //base statistics
Statistics stats;
int owner; //TODO: gameplay components: equipment, items, buffs, debuffs
std::string handle;
std::string avatar; //active gameplay members
//NOTE: these are lost when unloaded
bool inCombat = false;
int atbGauge = 0;
//TODO: stored command
}; };
#endif #endif
+29 -29
View File
@@ -58,7 +58,7 @@ static const char* DELETE_CHARACTER = "DELETE FROM Characters WHERE uid = ?;";
//Define the methods //Define the methods
//------------------------- //-------------------------
//NOTE: default baseStats as a parameter would be good for different beggining states or multiple classes //NOTE: default stats as a parameter would be good for different beggining states or multiple classes
int CharacterManager::CreateCharacter(int owner, std::string handle, std::string avatar) { int CharacterManager::CreateCharacter(int owner, std::string handle, std::string avatar) {
//Create the character, failing if it exists //Create the character, failing if it exists
sqlite3_stmt* statement = nullptr; sqlite3_stmt* statement = nullptr;
@@ -142,20 +142,20 @@ int CharacterManager::LoadCharacter(int owner, std::string handle, std::string a
newChar.origin.y = (double)sqlite3_column_int(statement, 7); newChar.origin.y = (double)sqlite3_column_int(statement, 7);
//statistics //statistics
newChar.baseStats.level = sqlite3_column_int(statement, 8); newChar.stats.level = sqlite3_column_int(statement, 8);
newChar.baseStats.exp = sqlite3_column_int(statement, 9); newChar.stats.exp = sqlite3_column_int(statement, 9);
newChar.baseStats.maxHP = sqlite3_column_int(statement, 10); newChar.stats.maxHP = sqlite3_column_int(statement, 10);
newChar.baseStats.health = sqlite3_column_int(statement, 11); newChar.stats.health = sqlite3_column_int(statement, 11);
newChar.baseStats.maxMP = sqlite3_column_int(statement, 12); newChar.stats.maxMP = sqlite3_column_int(statement, 12);
newChar.baseStats.mana = sqlite3_column_int(statement, 13); newChar.stats.mana = sqlite3_column_int(statement, 13);
newChar.baseStats.attack = sqlite3_column_int(statement, 14); newChar.stats.attack = sqlite3_column_int(statement, 14);
newChar.baseStats.defence = sqlite3_column_int(statement, 15); newChar.stats.defence = sqlite3_column_int(statement, 15);
newChar.baseStats.intelligence = sqlite3_column_int(statement, 16); newChar.stats.intelligence = sqlite3_column_int(statement, 16);
newChar.baseStats.resistance = sqlite3_column_int(statement, 17); newChar.stats.resistance = sqlite3_column_int(statement, 17);
newChar.baseStats.speed = sqlite3_column_int(statement, 18); newChar.stats.speed = sqlite3_column_int(statement, 18);
newChar.baseStats.accuracy = sqlite3_column_double(statement, 19); newChar.stats.accuracy = sqlite3_column_double(statement, 19);
newChar.baseStats.evasion = sqlite3_column_double(statement, 20); newChar.stats.evasion = sqlite3_column_double(statement, 20);
newChar.baseStats.luck = sqlite3_column_double(statement, 21); newChar.stats.luck = sqlite3_column_double(statement, 21);
//TODO: gameplay components: equipment, items, buffs, debuffs //TODO: gameplay components: equipment, items, buffs, debuffs
@@ -199,20 +199,20 @@ int CharacterManager::SaveCharacter(int uid) {
ret |= sqlite3_bind_int(statement, 4, (int)character.origin.y) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 4, (int)character.origin.y) != SQLITE_OK;
//statistics //statistics
ret |= sqlite3_bind_int(statement, 5, character.baseStats.level) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 5, character.stats.level) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 6, character.baseStats.exp) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 6, character.stats.exp) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 7, character.baseStats.maxHP) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 7, character.stats.maxHP) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 8, character.baseStats.health) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 8, character.stats.health) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 9, character.baseStats.maxMP) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 9, character.stats.maxMP) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 10, character.baseStats.mana) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 10, character.stats.mana) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 11, character.baseStats.attack) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 11, character.stats.attack) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 12, character.baseStats.defence) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 12, character.stats.defence) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 13, character.baseStats.intelligence) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 13, character.stats.intelligence) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 14, character.baseStats.resistance) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 14, character.stats.resistance) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 15, character.baseStats.speed) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 15, character.stats.speed) != SQLITE_OK;
ret |= sqlite3_bind_double(statement, 16, character.baseStats.accuracy) != SQLITE_OK; ret |= sqlite3_bind_double(statement, 16, character.stats.accuracy) != SQLITE_OK;
ret |= sqlite3_bind_double(statement, 17, character.baseStats.evasion) != SQLITE_OK; ret |= sqlite3_bind_double(statement, 17, character.stats.evasion) != SQLITE_OK;
ret |= sqlite3_bind_double(statement, 18, character.baseStats.luck) != SQLITE_OK; ret |= sqlite3_bind_double(statement, 18, character.stats.luck) != SQLITE_OK;
//TODO: gameplay components: equipment, items, buffs, debuffs //TODO: gameplay components: equipment, items, buffs, debuffs
+4 -7
View File
@@ -23,15 +23,17 @@
#define CHARACTERMANAGER_HPP_ #define CHARACTERMANAGER_HPP_
#include "character_data.hpp" #include "character_data.hpp"
#include "singleton.hpp"
#include "sqlite3/sqlite3.h" #include "sqlite3/sqlite3.h"
#include <map> #include <map>
#include <functional> #include <functional>
class CharacterManager : public Singleton<CharacterManager> { class CharacterManager {
public: public:
CharacterManager() = default;
~CharacterManager() { UnloadAll(); };
//public access methods //public access methods
int CreateCharacter(int owner, std::string handle, std::string avatar); int CreateCharacter(int owner, std::string handle, std::string avatar);
int LoadCharacter(int owner, std::string handle, std::string avatar); int LoadCharacter(int owner, std::string handle, std::string avatar);
@@ -51,11 +53,6 @@ public:
sqlite3* GetDatabase(); sqlite3* GetDatabase();
private: private:
friend Singleton<CharacterManager>;
CharacterManager() = default;
~CharacterManager() = default;
std::map<int, CharacterData> characterMap; std::map<int, CharacterData> characterMap;
sqlite3* database = nullptr; sqlite3* database = nullptr;
}; };
+52
View File
@@ -0,0 +1,52 @@
/* 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 COMBATDATA_HPP_
#define COMBATDATA_HPP_
#include "vector2.hpp"
#include "combat_defines.hpp"
//gameplay members
#include "character_data.hpp"
#include "enemy_data.hpp"
//std namespace
#include <chrono>
#include <array>
#include <utility>
struct CombatData {
typedef std::chrono::steady_clock Clock;
std::array<CharacterData, COMBAT_MAX_CHARACTERS> characterArray;
std::array<EnemyData, COMBAT_MAX_ENEMIES> enemyArray;
//world interaction
int mapIndex = 0;
Vector2 origin = {0.0,0.0};
Vector2 bounds = {0.0,0.0};
//time interval
Clock::time_point lastTick = Clock::now();
};
#endif
+54
View File
@@ -0,0 +1,54 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "combat_manager.hpp"
//-------------------------
//public access methods
//-------------------------
//TODO
//-------------------------
//accessors and mutators
//-------------------------
CombatData* CombatManager::GetCombat(int uid) {
std::map<int, CombatData>::iterator it = combatMap.find(uid);
if (it == combatMap.end()) {
return nullptr;
}
return &it->second;
}
std::map<int, CombatData>* CombatManager::GetContainer() {
return &combatMap;
}
lua_State* CombatManager::SetLuaState(lua_State* L) {
return luaState = L;
}
lua_State* CombatManager::GetLuaState() {
return luaState;
}
+51
View File
@@ -0,0 +1,51 @@
/* 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 COMBATMANAGER_HPP_
#define COMBATMANAGER_HPP_
#include "combat_data.hpp"
#include "lua/lua.hpp"
#include <map>
class CombatManager {
public:
CombatManager() = default;
~CombatManager() = default;
//public access methods
//TODO
//accessors and mutators
CombatData* GetCombat(int uid);
std::map<int, CombatData>* GetContainer();
lua_State* SetLuaState(lua_State*);
lua_State* GetLuaState();
private:
std::map<int, CombatData> combatMap;
lua_State* luaState = nullptr;
};
#endif
+37
View File
@@ -0,0 +1,37 @@
#config
INCLUDES+=. ../../common/gameplay ../../common/utilities ../characters ../enemies
LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
#source
CXXSRC=$(wildcard *.cpp)
#objects
OBJDIR=obj
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
#output
OUTDIR=..
OUT=$(addprefix $(OUTDIR)/,server.a)
#targets
all: $(OBJ) $(OUT)
ar -crs $(OUT) $(OBJ)
$(OBJ): | $(OBJDIR)
$(OUT): | $(OUTDIR)
$(OBJDIR):
mkdir $(OBJDIR)
$(OUTDIR):
mkdir $(OUTDIR)
$(OBJDIR)/%.o: %.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<
clean:
$(RM) *.o *.a *.exe
rebuild: clean all
@@ -19,24 +19,29 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#ifndef SERIALIZEUTILITY_HPP_ #ifndef ENEMYDATA_HPP_
#define SERIALIZEUTILITY_HPP_ #define ENEMYDATA_HPP_
#include "serial_packet_base.hpp"
#include "vector2.hpp"
#include "statistics.hpp" #include "statistics.hpp"
//NOTE: The naming conventions here are fucking terrible //std namespace
#include <string>
//BUGFIX: There's really no way to escape this :( struct EnemyData {
void serializePacket(SerialPacketBase* packet, void* data); //metadata
void deserializePacket(SerialPacketBase* packet, void* data); std::string handle;
std::string avatar;
//raw memcpy //gameplay
void serializeCopy(void** bufferHead, void* data, int size); Statistics stats;
void deserializeCopy(void** bufferHead, void* data, int size);
void serializeCopyStatistics(void** bufferHead, Statistics* stats); //TODO: gameplay components: equipment, items, buffs, debuffs, rewards
void deserializeCopyStatistics(void** bufferHead, Statistics* stats);
//active gameplay members
//NOTE: these are lost when unloaded
int tableIndex;
int atbGauge = 0;
};
#endif #endif
@@ -19,22 +19,36 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#include "client_packet.hpp" #include "enemy_manager.hpp"
#include "serial_utility.hpp" //-------------------------
//public access methods
//-------------------------
void ClientPacket::Serialize(void* buffer) { //TODO
serializeCopy(&buffer, &type, sizeof(SerialPacketType));
serializeCopy(&buffer, &clientIndex, sizeof(int)); //-------------------------
serializeCopy(&buffer, &accountIndex, sizeof(int)); //accessors and mutators
serializeCopy(&buffer, username, PACKET_STRING_SIZE); //-------------------------
EnemyData* EnemyManager::GetEnemy(int uid) {
std::map<int, EnemyData>::iterator it = enemyMap.find(uid);
if (it == enemyMap.end()) {
return nullptr;
}
return &it->second;
} }
void ClientPacket::Deserialize(void* buffer) { std::map<int, EnemyData>* EnemyManager::GetContainer() {
deserializeCopy(&buffer, &type, sizeof(SerialPacketType)); return &enemyMap;
}
deserializeCopy(&buffer, &clientIndex, sizeof(int));
deserializeCopy(&buffer, &accountIndex, sizeof(int)); lua_State* EnemyManager::SetLuaState(lua_State* L) {
deserializeCopy(&buffer, username, PACKET_STRING_SIZE); return luaState = L;
}
lua_State* EnemyManager::GetLuaState() {
return luaState;
} }
+51
View File
@@ -0,0 +1,51 @@
/* 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 ENEMYMANAGER_HPP_
#define ENEMYMANAGER_HPP_
#include "enemy_data.hpp"
#include "lua/lua.hpp"
#include <map>
class EnemyManager {
public:
EnemyManager() = default;
~EnemyManager() = default;
//public access methods
//TODO
//accessors and mutators
EnemyData* GetEnemy(int uid);
std::map<int, EnemyData>* GetContainer();
lua_State* SetLuaState(lua_State*);
lua_State* GetLuaState();
private:
std::map<int, EnemyData> enemyMap;
lua_State* luaState = nullptr;
};
#endif
+37
View File
@@ -0,0 +1,37 @@
#config
INCLUDES+=. ../mapgen ../../common/gameplay ../../common/map ../../common/utilities
LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
#source
CXXSRC=$(wildcard *.cpp)
#objects
OBJDIR=obj
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
#output
OUTDIR=..
OUT=$(addprefix $(OUTDIR)/,server.a)
#targets
all: $(OBJ) $(OUT)
ar -crs $(OUT) $(OBJ)
$(OBJ): | $(OBJDIR)
$(OUT): | $(OUTDIR)
$(OBJDIR):
mkdir $(OBJDIR)
$(OUTDIR):
mkdir $(OUTDIR)
$(OBJDIR)/%.o: %.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<
clean:
$(RM) *.o *.a *.exe
rebuild: clean all
+2 -4
View File
@@ -38,9 +38,8 @@
#include "region_api.hpp" #include "region_api.hpp"
#include "region_pager_api.hpp" #include "region_pager_api.hpp"
#include "tile_sheet_api.hpp"
#include "room_api.hpp" #include "room_api.hpp"
#include "room_manager_api.hpp" #include "room_mgr_api.hpp"
//these libs are loaded by lua.c and are readily available to any Lua program //these libs are loaded by lua.c and are readily available to any Lua program
static const luaL_Reg loadedlibs[] = { static const luaL_Reg loadedlibs[] = {
@@ -59,9 +58,8 @@ static const luaL_Reg loadedlibs[] = {
//Tortuga's API //Tortuga's API
{TORTUGA_REGION_NAME, openRegionAPI}, {TORTUGA_REGION_NAME, openRegionAPI},
{TORTUGA_REGION_PAGER_NAME, openRegionPagerAPI}, {TORTUGA_REGION_PAGER_NAME, openRegionPagerAPI},
{TORTUGA_TILE_SHEET_NAME, openTileSheetAPI},
{TORTUGA_ROOM_NAME, openRoomAPI}, {TORTUGA_ROOM_NAME, openRoomAPI},
{TORTUGA_ROOM_MANAGER_NAME, openRoomManagerAPI}, {TORTUGA_ROOM_MGR_NAME, openRoomMgrAPI},
{NULL, NULL} {NULL, NULL}
}; };
+1 -24
View File
@@ -21,10 +21,6 @@
*/ */
#include "server_application.hpp" #include "server_application.hpp"
//singletons
#include "config_utility.hpp"
#include "udp_network_utility.hpp"
#include <stdexcept> #include <stdexcept>
#include <iostream> #include <iostream>
@@ -32,29 +28,10 @@ using namespace std;
int main(int argc, char** argv) { int main(int argc, char** argv) {
try { try {
//create the singletons ServerApplication app;
AccountManager::Create();
CharacterManager::Create();
ConfigUtility::Create();
RoomManager::Create();
UDPNetworkUtility::Create();
//call the server's routines
ServerApplication::Create();
ServerApplication& app = ServerApplication::GetSingleton();
app.Init(argc, argv); app.Init(argc, argv);
app.Proc(); app.Proc();
app.Quit(); app.Quit();
ServerApplication::Delete();
//delete the singletons
AccountManager::Delete();
CharacterManager::Delete();
ConfigUtility::Delete();
RoomManager::Delete();
UDPNetworkUtility::Delete();
} }
catch(exception& e) { catch(exception& e) {
cerr << "Fatal exception thrown: " << e.what() << endl; cerr << "Fatal exception thrown: " << e.what() << endl;
+3 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. accounts characters rooms ../common/debugging ../common/gameplay ../common/map ../common/network ../common/network/packet_types ../common/utilities INCLUDES+=. accounts characters combat enemies mapgen mapgen/generators rooms ../common/debugging ../common/gameplay ../common/map ../common/network ../common/network/packet ../common/network/serial ../common/utilities
LIBS+=server.a ../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua -lsqlite3 LIBS+=server.a ../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua -lsqlite3
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
@@ -18,6 +18,8 @@ OUT=$(addprefix $(OUTDIR)/,server)
all: $(OBJ) $(OUT) all: $(OBJ) $(OUT)
$(MAKE) -C accounts $(MAKE) -C accounts
$(MAKE) -C characters $(MAKE) -C characters
$(MAKE) -C combat
$(MAKE) -C enemies
$(MAKE) -C rooms $(MAKE) -C rooms
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS) $(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)

Some files were not shown because too many files have changed in this diff Show More