Merge branch 'upgrade', updated to SDL 2.0, among many other improvements
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
[submodule "common"]
|
||||||
|
path = common
|
||||||
|
url = https://github.com/Ratstail91/Tortuga.git
|
||||||
|
[submodule "bin"]
|
||||||
|
path = bin
|
||||||
|
url = https://github.com/Ratstail91/Tortuga.git
|
||||||
@@ -11,19 +11,22 @@ This game is inspired by classic 2D RPGs (Final Fantasy, The Legend of Zelda), a
|
|||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
* [Tortuga Wiki](https://github.com/Ratstail91/Tortuga/wiki) - Full documentation
|
* [Tortuga Wiki](https://github.com/Ratstail91/Tortuga/wiki) - Full documentation (incomplete)
|
||||||
* [Tortuga Bug Tracker](https://github.com/Ratstail91/Tortuga/issues) - A list of all known bugs and issues
|
* [Tortuga Bug Tracker](https://github.com/Ratstail91/Tortuga/issues) - A list of all known bugs and issues
|
||||||
|
|
||||||
## External Dependencies
|
## External Dependencies
|
||||||
|
|
||||||
* [SDL 1.2](http://www.libsdl.org/) - Simple DirectMedia Layer API
|
* [SDL 2.0](http://www.libsdl.org/) - Simple DirectMedia Layer API
|
||||||
|
* [SDL_image 2.0](https://www.libsdl.org/projects/SDL_image/) - An SDL Extension for loading multiple image file formats
|
||||||
* [SDL_net 2.0](http://www.libsdl.org/projects/SDL_net/) - SDL's networking extension
|
* [SDL_net 2.0](http://www.libsdl.org/projects/SDL_net/) - SDL's networking extension
|
||||||
|
* [SDL_ttf 2.0](https://www.libsdl.org/projects/SDL_ttf/) - An SDL extention for rendering fonts
|
||||||
* [lua 5.2](http://www.lua.org/) - The lua programming language
|
* [lua 5.2](http://www.lua.org/) - The lua programming language
|
||||||
* [SQLite3](http://www.sqlite.org/) - A lightweight SQL database engine
|
* [SQLite3](http://www.sqlite.org/) - A lightweight SQL database engine
|
||||||
|
|
||||||
## Tools
|
## Tools
|
||||||
|
|
||||||
* [WinRAR](http://www.rarlab.com/) - The best compression tool available IMO; only needed for Windows distribution
|
* [WinRAR](http://www.rarlab.com/) - A free archive tool; needed for Windows distribution
|
||||||
|
* [tar](http://www.gnu.org/software/tar/manual/) - The GNU archive tool; needed for Linux distribution
|
||||||
* [Dropbox](https://www.dropbox.com/) - For hosting and distribution
|
* [Dropbox](https://www.dropbox.com/) - For hosting and distribution
|
||||||
|
|
||||||
## Copyright
|
## Copyright
|
||||||
|
|||||||
Submodule
+1
Submodule bin added at a788d998fa
+54
-89
@@ -21,120 +21,85 @@
|
|||||||
*/
|
*/
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
|
|
||||||
#include <stdexcept>
|
SDL_Renderer* BaseScene::rendererHandle = nullptr;
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Static declarations
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
SDL_Surface* BaseScene::screen = nullptr;
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Public access members
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
BaseScene::BaseScene() {
|
BaseScene::BaseScene() {
|
||||||
//
|
//EMPTY
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseScene::~BaseScene() {
|
BaseScene::~BaseScene() {
|
||||||
//
|
//EMPTY
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseScene::RenderFrame(SDL_Renderer* renderer) {
|
||||||
|
//EMPTY
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseScene::SetRenderer(SDL_Renderer* r) {
|
||||||
|
rendererHandle = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Renderer* BaseScene::GetRenderer() {
|
||||||
|
return rendererHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseScene::SetSceneSignal(SceneSignal signal) {
|
||||||
|
sceneSignal = signal;
|
||||||
|
}
|
||||||
|
|
||||||
|
SceneSignal BaseScene::GetSceneSignal() {
|
||||||
|
return sceneSignal;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Program control
|
//frame phases
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
SDL_Surface* BaseScene::SetScreen(int w, int h, int bpp, Uint32 flags) {
|
void BaseScene::FrameStart() {
|
||||||
if (!bpp) {
|
//EMPTY
|
||||||
bpp = SDL_GetVideoInfo()->vfmt->BitsPerPixel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
screen = SDL_SetVideoMode(w, h, bpp, flags);
|
void BaseScene::Update() {
|
||||||
|
//EMPTY
|
||||||
if (!screen) {
|
|
||||||
throw(std::runtime_error("Failed to create the screen surface"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return screen;
|
void BaseScene::FrameEnd() {
|
||||||
}
|
//EMPTY
|
||||||
|
|
||||||
SDL_Surface* BaseScene::GetScreen() {
|
|
||||||
return screen;
|
|
||||||
}
|
|
||||||
|
|
||||||
SceneList BaseScene::SetNextScene(SceneList sceneIndex) {
|
|
||||||
return nextScene = sceneIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
SceneList BaseScene::GetNextScene() const {
|
|
||||||
return nextScene;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Frame loop
|
//input events
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void BaseScene::RunFrame() {
|
void BaseScene::QuitEvent() {
|
||||||
FrameStart();
|
sceneSignal = SceneSignal::QUIT;
|
||||||
HandleEvents();
|
|
||||||
Update();
|
|
||||||
FrameEnd();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseScene::RenderFrame() {
|
void BaseScene::MouseMotion(SDL_MouseMotionEvent const& event) {
|
||||||
SDL_FillRect(screen, 0, 0);
|
//EMPTY
|
||||||
Render(screen);
|
|
||||||
SDL_Flip(screen);
|
|
||||||
SDL_Delay(10);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
void BaseScene::MouseButtonDown(SDL_MouseButtonEvent const& event) {
|
||||||
//Event handlers
|
//EMPTY
|
||||||
//-------------------------
|
}
|
||||||
|
|
||||||
void BaseScene::HandleEvents() {
|
void BaseScene::MouseButtonUp(SDL_MouseButtonEvent const& event) {
|
||||||
SDL_Event event;
|
//EMPTY
|
||||||
|
}
|
||||||
|
|
||||||
while(SDL_PollEvent(&event)) {
|
void BaseScene::MouseWheel(SDL_MouseWheelEvent const& event) {
|
||||||
switch(event.type) {
|
//EMPTY
|
||||||
case SDL_QUIT:
|
}
|
||||||
|
|
||||||
|
void BaseScene::KeyDown(SDL_KeyboardEvent const& event) {
|
||||||
|
//preference as a default
|
||||||
|
switch(event.keysym.sym) {
|
||||||
|
case SDLK_ESCAPE:
|
||||||
QuitEvent();
|
QuitEvent();
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case SDL_VIDEORESIZE:
|
}
|
||||||
SetScreen(event.resize.w, event.resize.h, 0, screen->flags);
|
|
||||||
break;
|
void BaseScene::KeyUp(SDL_KeyboardEvent const& event) {
|
||||||
|
//EMPTY
|
||||||
case SDL_MOUSEMOTION:
|
|
||||||
MouseMotion(event.motion);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
|
||||||
MouseButtonDown(event.button);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_MOUSEBUTTONUP:
|
|
||||||
MouseButtonUp(event.button);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_KEYDOWN:
|
|
||||||
KeyDown(event.key);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_KEYUP:
|
|
||||||
KeyUp(event.key);
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifdef USE_EVENT_JOYSTICK
|
|
||||||
//EMPTY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_EVENT_UNKNOWN
|
|
||||||
default:
|
|
||||||
UnknownEvent(event);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}//switch
|
|
||||||
}//while
|
|
||||||
}
|
}
|
||||||
|
|||||||
+25
-38
@@ -19,56 +19,43 @@
|
|||||||
* 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 BASESCENE_HPP_
|
#pragma once
|
||||||
#define BASESCENE_HPP_
|
|
||||||
|
|
||||||
#include "scene_list.hpp"
|
#include "scene_signal.hpp"
|
||||||
|
|
||||||
#include "SDL/SDL.h"
|
#include "SDL2/SDL.h"
|
||||||
|
|
||||||
class BaseScene {
|
class BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
|
||||||
BaseScene();
|
BaseScene();
|
||||||
virtual ~BaseScene();
|
virtual ~BaseScene();
|
||||||
|
|
||||||
//Program control
|
virtual void RenderFrame(SDL_Renderer*);
|
||||||
static SDL_Surface* SetScreen(int w, int h, int bpp = 0, Uint32 flags = SDL_HWSURFACE|SDL_DOUBLEBUF);
|
static void SetRenderer(SDL_Renderer*);
|
||||||
static SDL_Surface* GetScreen();
|
SceneSignal GetSceneSignal();
|
||||||
|
|
||||||
SceneList SetNextScene(SceneList sceneIndex);
|
//frame phases
|
||||||
SceneList GetNextScene() const;
|
virtual void FrameStart();
|
||||||
|
virtual void Update();
|
||||||
|
virtual void FrameEnd();
|
||||||
|
|
||||||
//Frame loop
|
//input events
|
||||||
virtual void RunFrame();
|
virtual void QuitEvent();
|
||||||
virtual void RenderFrame();
|
virtual void MouseMotion(SDL_MouseMotionEvent const& event);
|
||||||
|
virtual void MouseButtonDown(SDL_MouseButtonEvent const& event);
|
||||||
|
virtual void MouseButtonUp(SDL_MouseButtonEvent const& event);
|
||||||
|
virtual void MouseWheel(SDL_MouseWheelEvent const& event);
|
||||||
|
virtual void KeyDown(SDL_KeyboardEvent const& event);
|
||||||
|
virtual void KeyUp(SDL_KeyboardEvent const& event);
|
||||||
|
|
||||||
|
//TODO: (9) joystick and controller events
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void FrameStart() {}
|
//control
|
||||||
virtual void HandleEvents();
|
static SDL_Renderer* GetRenderer();
|
||||||
virtual void Update() {}
|
void SetSceneSignal(SceneSignal);
|
||||||
virtual void FrameEnd() {}
|
|
||||||
virtual void Render(SDL_Surface* const screen) {}
|
|
||||||
|
|
||||||
//Event handlers
|
|
||||||
virtual void QuitEvent() { SetNextScene(SceneList::QUIT); }
|
|
||||||
virtual void MouseMotion(SDL_MouseMotionEvent const&) {}
|
|
||||||
virtual void MouseButtonDown(SDL_MouseButtonEvent const&) {}
|
|
||||||
virtual void MouseButtonUp(SDL_MouseButtonEvent const&) {}
|
|
||||||
virtual void KeyDown(SDL_KeyboardEvent const&) {}
|
|
||||||
virtual void KeyUp(SDL_KeyboardEvent const&) {}
|
|
||||||
|
|
||||||
#ifdef USE_EVENT_JOYSTICK
|
|
||||||
//EMPTY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_EVENT_UNKNOWN
|
|
||||||
virtual void UnknownEvent(SDL_Event const&) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static SDL_Surface* screen;
|
static SDL_Renderer* rendererHandle;
|
||||||
SceneList nextScene = SceneList::CONTINUE;
|
SceneSignal sceneSignal = SceneSignal::CONTINUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
+1
-4
@@ -19,11 +19,8 @@
|
|||||||
* 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 CHANNELS_HPP_
|
#pragma once
|
||||||
#define CHANNELS_HPP_
|
|
||||||
|
|
||||||
enum Channels {
|
enum Channels {
|
||||||
SERVER = 0
|
SERVER = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
+235
-86
@@ -24,22 +24,14 @@
|
|||||||
#include "serial_packet.hpp"
|
#include "serial_packet.hpp"
|
||||||
#include "config_utility.hpp"
|
#include "config_utility.hpp"
|
||||||
|
|
||||||
#include <stdexcept>
|
//for handling platforms
|
||||||
|
#include "SDL2/SDL_syswm.h"
|
||||||
|
#include "SDL2/SDL_version.h"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <stdexcept>
|
||||||
//-------------------------
|
|
||||||
//Scene headers
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
//Add the custom scene headers here
|
|
||||||
#include "splash_screen.hpp"
|
|
||||||
#include "main_menu.hpp"
|
|
||||||
#include "options_menu.hpp"
|
|
||||||
#include "lobby_menu.hpp"
|
|
||||||
#include "world.hpp"
|
|
||||||
#include "disconnected_screen.hpp"
|
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Public access members
|
//Public access members
|
||||||
@@ -52,58 +44,147 @@ void ClientApplication::Init(int argc, char* argv[]) {
|
|||||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
config.Load("rsc/config.cfg", false, argc, argv);
|
config.Load("rsc/config.cfg", false, argc, argv);
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//create and check the window
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
//get the config values
|
||||||
|
int w = config.Int("client.screen.w");
|
||||||
|
int h = config.Int("client.screen.h");
|
||||||
|
int f = config.Boolean("client.screen.f") ? SDL_WINDOW_FULLSCREEN : 0;
|
||||||
|
|
||||||
|
//BUG: fullscreen is disabled
|
||||||
|
f = 0;
|
||||||
|
|
||||||
|
//default sizes
|
||||||
|
w = w ? w : 800;
|
||||||
|
h = h ? h : 600;
|
||||||
|
|
||||||
|
window = SDL_CreateWindow(argv[0], SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w, h, f);
|
||||||
|
|
||||||
|
if (!window) {
|
||||||
|
std::ostringstream msg;
|
||||||
|
msg << "Failed to create the window: " << SDL_GetError();
|
||||||
|
throw(std::runtime_error(msg.str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "Initialized the window" << std::endl;
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//DEBUG: detecting platforms, versions & appropriate fonts
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
SDL_SysWMinfo windowInfo;
|
||||||
|
SDL_VERSION(&windowInfo.version);
|
||||||
|
if (SDL_GetWindowWMInfo(window, &windowInfo)) {
|
||||||
|
//
|
||||||
|
std::string platform;
|
||||||
|
std::string fontPath;
|
||||||
|
|
||||||
|
//get the info
|
||||||
|
switch(windowInfo.subsystem) {
|
||||||
|
case SDL_SYSWM_WINDOWS:
|
||||||
|
platform = "Microsoft Windows";
|
||||||
|
fontPath = "C:/Windows/Fonts/arialbd.ttf";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_SYSWM_X11:
|
||||||
|
platform = "X Window System";
|
||||||
|
fontPath = "/usr/share/fonts/truetype/msttcorefonts/Arial_Bold.ttf";
|
||||||
|
break;
|
||||||
|
|
||||||
|
//NOTE: OS X is currently unsupported, but it could be
|
||||||
|
case SDL_SYSWM_COCOA:
|
||||||
|
platform = "Apple OS X";
|
||||||
|
fontPath = "/System/Library/Fonts/arialbd.ttf";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
platform = "an unsupported platform";
|
||||||
|
}
|
||||||
|
|
||||||
|
//final output
|
||||||
|
std::cout << "SDL Version ";
|
||||||
|
std::cout << (int)windowInfo.version.major << ".";
|
||||||
|
std::cout << (int)windowInfo.version.minor << ".";
|
||||||
|
std::cout << (int)windowInfo.version.patch << " on ";
|
||||||
|
std::cout << platform << std::endl;
|
||||||
|
|
||||||
|
//handle the default font paths
|
||||||
|
if (config["client.font"].size() == 0) {
|
||||||
|
config["client.font"] = fontPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::ostringstream msg;
|
||||||
|
msg << "Failed to retrieve window info: " << SDL_GetError();
|
||||||
|
throw(msg.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//create and check the renderer
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
renderer = SDL_CreateRenderer(window, -1, 0);
|
||||||
|
|
||||||
|
if (!renderer) {
|
||||||
|
std::ostringstream msg;
|
||||||
|
msg << "Failed to create the renderer: " << SDL_GetError();
|
||||||
|
throw(std::runtime_error(msg.str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
//screen scaling
|
||||||
|
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best");
|
||||||
|
SDL_RenderSetLogicalSize(renderer, w, h);
|
||||||
|
|
||||||
|
//set the hook for the renderer
|
||||||
|
BaseScene::SetRenderer(renderer);
|
||||||
|
|
||||||
|
std::cout << "Initialized the renderer" << std::endl;
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Initialize the APIs
|
//Initialize the APIs
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
//initialize SDL
|
|
||||||
if (SDL_Init(SDL_INIT_VIDEO)) {
|
|
||||||
std::ostringstream os;
|
|
||||||
os << "Failed to initialize SDL: " << SDL_GetError();
|
|
||||||
throw(std::runtime_error(os.str()));
|
|
||||||
}
|
|
||||||
std::cout << "Initialized SDL" << std::endl;
|
|
||||||
|
|
||||||
//initialize SDL_net
|
//initialize SDL_net
|
||||||
if (SDLNet_Init()) {
|
if (SDLNet_Init()) {
|
||||||
throw(std::runtime_error("Failed to initialize SDL_net"));
|
std::ostringstream msg;
|
||||||
|
msg << "Failed to initialize SDL_net 2.0: " << SDL_GetError();
|
||||||
|
throw(std::runtime_error(msg.str()));
|
||||||
}
|
}
|
||||||
UDPNetworkUtility::GetSingleton().Open(0);
|
UDPNetworkUtility::GetSingleton().Open(0);
|
||||||
std::cout << "Initialized SDL_net" << std::endl;
|
|
||||||
|
|
||||||
//-------------------------
|
std::cout << "Initialized SDL_net 2.0" << std::endl;
|
||||||
//Setup the screen
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
int w = config.Int("client.screen.w");
|
//setting up SDL2_ttf
|
||||||
int h = config.Int("client.screen.h");
|
if (TTF_Init()) {
|
||||||
int f = config.Bool("client.screen.f") ? SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN : SDL_HWSURFACE|SDL_DOUBLEBUF;
|
std::ostringstream msg;
|
||||||
|
msg << "Failed to initialize SDL_ttf 2.0: " << SDL_GetError();
|
||||||
|
throw(std::runtime_error(msg.str()));
|
||||||
|
}
|
||||||
|
|
||||||
BaseScene::SetScreen(w ? w : 800, h ? h : 600, 0, f);
|
std::cout << "Initialized SDL_ttf 2.0" << std::endl;
|
||||||
std::cout << "Initialized the screen" << std::endl;
|
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//debug output
|
//debug output
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
#define DEBUG_OUTPUT_VAR(x) std::cout << "\t" << #x << ": " << x << std::endl;
|
#define DEBUG_INTERNAL_VAR(x) std::cout << "\t" << #x << ": " << x << std::endl;
|
||||||
|
|
||||||
std::cout << "Internal sizes:" << std::endl;
|
std::cout << "Internal sizes:" << std::endl;
|
||||||
|
|
||||||
DEBUG_OUTPUT_VAR(NETWORK_VERSION);
|
DEBUG_INTERNAL_VAR(NETWORK_VERSION);
|
||||||
DEBUG_OUTPUT_VAR(sizeof(Region::type_t));
|
DEBUG_INTERNAL_VAR(sizeof(Region::type_t));
|
||||||
DEBUG_OUTPUT_VAR(sizeof(Region));
|
DEBUG_INTERNAL_VAR(sizeof(Region));
|
||||||
DEBUG_OUTPUT_VAR(REGION_WIDTH);
|
DEBUG_INTERNAL_VAR(REGION_WIDTH);
|
||||||
DEBUG_OUTPUT_VAR(REGION_HEIGHT);
|
DEBUG_INTERNAL_VAR(REGION_HEIGHT);
|
||||||
DEBUG_OUTPUT_VAR(REGION_DEPTH);
|
DEBUG_INTERNAL_VAR(REGION_DEPTH);
|
||||||
DEBUG_OUTPUT_VAR(REGION_TILE_FOOTPRINT);
|
DEBUG_INTERNAL_VAR(REGION_TILE_FOOTPRINT);
|
||||||
DEBUG_OUTPUT_VAR(REGION_SOLID_FOOTPRINT);
|
DEBUG_INTERNAL_VAR(REGION_SOLID_FOOTPRINT);
|
||||||
DEBUG_OUTPUT_VAR(PACKET_STRING_SIZE);
|
DEBUG_INTERNAL_VAR(PACKET_STRING_SIZE);
|
||||||
DEBUG_OUTPUT_VAR(PACKET_BUFFER_SIZE);
|
DEBUG_INTERNAL_VAR(PACKET_BUFFER_SIZE);
|
||||||
DEBUG_OUTPUT_VAR(MAX_PACKET_SIZE);
|
DEBUG_INTERNAL_VAR(MAX_PACKET_SIZE);
|
||||||
DEBUG_OUTPUT_VAR(static_cast<int>(SerialPacketType::LAST));
|
DEBUG_INTERNAL_VAR(static_cast<int>(SerialPacketType::LAST));
|
||||||
|
|
||||||
#undef DEBUG_OUTPUT_VAR
|
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//finalize the startup
|
//finalize the startup
|
||||||
@@ -119,88 +200,156 @@ void ClientApplication::Init(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ClientApplication::Proc() {
|
void ClientApplication::Proc() {
|
||||||
LoadScene(SceneList::FIRST);
|
//load the first scene
|
||||||
|
ProcessSceneSignal(SceneSignal::FIRST);
|
||||||
|
|
||||||
//prepare the time system
|
//fixed frame rate
|
||||||
typedef std::chrono::steady_clock Clock;
|
typedef std::chrono::steady_clock Clock;
|
||||||
|
|
||||||
Clock::time_point simTime = Clock::now();
|
Clock::time_point simTime = Clock::now();
|
||||||
Clock::time_point realTime;
|
Clock::time_point realTime;
|
||||||
|
constexpr std::chrono::duration<int, std::milli> frameDelay(16); //~60FPS
|
||||||
|
|
||||||
//The main loop
|
//the game loop continues until the scenes signal QUIT
|
||||||
while(activeScene->GetNextScene() != SceneList::QUIT) {
|
while(activeScene->GetSceneSignal() != SceneSignal::QUIT) {
|
||||||
//switch scenes when necessary
|
//switch scenes if necessary
|
||||||
if (activeScene->GetNextScene() != SceneList::CONTINUE) {
|
if(activeScene->GetSceneSignal() != SceneSignal::CONTINUE) {
|
||||||
LoadScene(activeScene->GetNextScene());
|
ProcessSceneSignal(activeScene->GetSceneSignal());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//update the current time
|
//update the current time
|
||||||
realTime = Clock::now();
|
realTime = Clock::now();
|
||||||
|
|
||||||
//simulate game time
|
//simulate the game or give the machine a break
|
||||||
if (simTime < realTime) {
|
if (simTime < realTime) {
|
||||||
while(simTime < realTime) {
|
while(simTime < realTime) {
|
||||||
//call each user defined function
|
//call the user defined functions
|
||||||
activeScene->RunFrame();
|
activeScene->FrameStart();
|
||||||
//~60 FPS
|
ProcessEvents();
|
||||||
simTime += std::chrono::duration<int, std::milli>(16);
|
activeScene->Update();
|
||||||
|
activeScene->FrameEnd();
|
||||||
|
|
||||||
|
//step to the next frame
|
||||||
|
simTime += frameDelay;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//give the machine a break
|
SDL_Delay(1);
|
||||||
SDL_Delay(10);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//draw the game to the screen
|
SDL_RenderClear(renderer);
|
||||||
activeScene->RenderFrame();
|
activeScene->RenderFrame(renderer);
|
||||||
|
SDL_RenderPresent(renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
UnloadScene();
|
//cleanup
|
||||||
|
ClearScene();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientApplication::Quit() {
|
void ClientApplication::Quit() {
|
||||||
|
//clean up after the program
|
||||||
std::cout << "Shutting down" << std::endl;
|
std::cout << "Shutting down" << std::endl;
|
||||||
UDPNetworkUtility::GetSingleton().Close();
|
UDPNetworkUtility::GetSingleton().Close();
|
||||||
|
TTF_Quit();
|
||||||
SDLNet_Quit();
|
SDLNet_Quit();
|
||||||
SDL_Quit();
|
BaseScene::SetRenderer(nullptr);
|
||||||
|
SDL_DestroyRenderer(renderer);
|
||||||
|
SDL_DestroyWindow(window);
|
||||||
std::cout << "Clean exit" << std::endl;
|
std::cout << "Clean exit" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Private access members
|
//Scene management
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void ClientApplication::LoadScene(SceneList sceneIndex) {
|
void ClientApplication::ProcessEvents() {
|
||||||
//BUG: #16 Resources are being reloaded between scenes
|
SDL_Event event;
|
||||||
UnloadScene();
|
while(SDL_PollEvent(&event)) {
|
||||||
switch(sceneIndex) {
|
switch(event.type) {
|
||||||
//add scene creation calls here
|
case SDL_QUIT:
|
||||||
case SceneList::FIRST:
|
activeScene->QuitEvent();
|
||||||
case SceneList::SPLASHSCREEN:
|
|
||||||
activeScene = new SplashScreen();
|
|
||||||
break;
|
break;
|
||||||
case SceneList::MAINMENU:
|
|
||||||
activeScene = new MainMenu();
|
case SDL_MOUSEMOTION:
|
||||||
|
activeScene->MouseMotion(event.motion);
|
||||||
break;
|
break;
|
||||||
case SceneList::OPTIONSMENU:
|
|
||||||
activeScene = new OptionsMenu();
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
|
activeScene->MouseButtonDown(event.button);
|
||||||
break;
|
break;
|
||||||
case SceneList::LOBBYMENU:
|
|
||||||
activeScene = new LobbyMenu(&clientIndex, &accountIndex);
|
case SDL_MOUSEBUTTONUP:
|
||||||
|
activeScene->MouseButtonUp(event.button);
|
||||||
break;
|
break;
|
||||||
case SceneList::WORLD:
|
|
||||||
activeScene = new World(&clientIndex, &accountIndex);
|
case SDL_MOUSEWHEEL:
|
||||||
|
activeScene->MouseWheel(event.wheel);
|
||||||
break;
|
break;
|
||||||
case SceneList::DISCONNECTEDSCREEN:
|
|
||||||
activeScene = new DisconnectedScreen();
|
case SDL_KEYDOWN:
|
||||||
|
activeScene->KeyDown(event.key);
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
throw(std::logic_error("Failed to recognize the scene index"));
|
case SDL_KEYUP:
|
||||||
|
activeScene->KeyUp(event.key);
|
||||||
|
break;
|
||||||
|
|
||||||
|
//TODO: (9) joystick and controller events
|
||||||
|
|
||||||
|
//window events are handled internally
|
||||||
|
case SDL_WINDOWEVENT:
|
||||||
|
switch(event.window.event) {
|
||||||
|
case SDL_WINDOWEVENT_RESIZED:
|
||||||
|
SDL_RenderSetLogicalSize(renderer, event.window.data1, event.window.data2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientApplication::UnloadScene() {
|
//Add the custom scene headers here
|
||||||
|
#include "splash_screen.hpp"
|
||||||
|
#include "main_menu.hpp"
|
||||||
|
#include "options_menu.hpp"
|
||||||
|
#include "lobby_menu.hpp"
|
||||||
|
#include "world.hpp"
|
||||||
|
#include "disconnected_screen.hpp"
|
||||||
|
|
||||||
|
void ClientApplication::ProcessSceneSignal(SceneSignal signal) {
|
||||||
|
//BUG: #16 Resources are being reloaded between scenes
|
||||||
|
ClearScene();
|
||||||
|
switch(signal) {
|
||||||
|
//add scene creation calls here
|
||||||
|
case SceneSignal::FIRST:
|
||||||
|
case SceneSignal::SPLASHSCREEN:
|
||||||
|
activeScene = new SplashScreen(window);
|
||||||
|
break;
|
||||||
|
case SceneSignal::MAINMENU:
|
||||||
|
activeScene = new MainMenu();
|
||||||
|
break;
|
||||||
|
case SceneSignal::OPTIONSMENU:
|
||||||
|
activeScene = new OptionsMenu();
|
||||||
|
break;
|
||||||
|
case SceneSignal::LOBBYMENU:
|
||||||
|
activeScene = new LobbyMenu(&clientIndex, &accountIndex);
|
||||||
|
break;
|
||||||
|
case SceneSignal::WORLD:
|
||||||
|
activeScene = new World(&clientIndex, &accountIndex);
|
||||||
|
break;
|
||||||
|
case SceneSignal::DISCONNECTEDSCREEN:
|
||||||
|
activeScene = new DisconnectedScreen();
|
||||||
|
break;
|
||||||
|
default: {
|
||||||
|
std::ostringstream msg;
|
||||||
|
msg << "Failed to recognize the scene signal: " << signal;
|
||||||
|
throw(std::logic_error(msg.str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientApplication::ClearScene() {
|
||||||
delete activeScene;
|
delete activeScene;
|
||||||
activeScene = nullptr;
|
activeScene = nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,21 +19,19 @@
|
|||||||
* 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 CLIENTAPPLICATION_HPP_
|
#pragma once
|
||||||
#define CLIENTAPPLICATION_HPP_
|
|
||||||
|
|
||||||
#include "scene_list.hpp"
|
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
|
#include "scene_signal.hpp"
|
||||||
|
#include "singleton.hpp"
|
||||||
#include "udp_network_utility.hpp"
|
#include "udp_network_utility.hpp"
|
||||||
|
|
||||||
#include "singleton.hpp"
|
#include "SDL2/SDL.h"
|
||||||
|
#include "SDL2/SDL_net.h"
|
||||||
#include <map>
|
#include "SDL2/SDL_ttf.h"
|
||||||
|
|
||||||
class ClientApplication: public Singleton<ClientApplication> {
|
class ClientApplication: public Singleton<ClientApplication> {
|
||||||
public:
|
public:
|
||||||
//public methods
|
|
||||||
void Init(int argc, char* argv[]);
|
void Init(int argc, char* argv[]);
|
||||||
void Proc();
|
void Proc();
|
||||||
void Quit();
|
void Quit();
|
||||||
@@ -44,15 +42,18 @@ private:
|
|||||||
ClientApplication() = default;
|
ClientApplication() = default;
|
||||||
~ClientApplication() = default;
|
~ClientApplication() = default;
|
||||||
|
|
||||||
//Private access members
|
//scene management
|
||||||
void LoadScene(SceneList sceneIndex);
|
void ProcessEvents();
|
||||||
void UnloadScene();
|
void ProcessSceneSignal(SceneSignal);
|
||||||
|
void ClearScene();
|
||||||
|
|
||||||
BaseScene* activeScene = nullptr;
|
BaseScene* activeScene = nullptr;
|
||||||
|
|
||||||
|
//TODO: (9) build a "window" class?
|
||||||
|
SDL_Window* window = nullptr;
|
||||||
|
SDL_Renderer* renderer = nullptr;
|
||||||
|
|
||||||
//shared parameters
|
//shared parameters
|
||||||
int clientIndex = -1;
|
int clientIndex = -1;
|
||||||
int accountIndex = -1;
|
int accountIndex = -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -19,8 +19,7 @@
|
|||||||
* 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 TERMINALERROR_HPP_
|
#pragma once
|
||||||
#define TERMINALERROR_HPP_
|
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -30,5 +29,3 @@ public:
|
|||||||
explicit terminal_error(const std::string& str): runtime_error(str) {}
|
explicit terminal_error(const std::string& str): runtime_error(str) {}
|
||||||
explicit terminal_error(const char* cstr): runtime_error(cstr) {}
|
explicit terminal_error(const char* cstr): runtime_error(cstr) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "base_character.hpp"
|
#include "base_character.hpp"
|
||||||
|
|
||||||
|
//TODO: (3) remove this
|
||||||
#include "config_utility.hpp"
|
#include "config_utility.hpp"
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
@@ -30,16 +31,16 @@
|
|||||||
void BaseCharacter::CorrectSprite() {
|
void BaseCharacter::CorrectSprite() {
|
||||||
//NOTE: These must correspond to the sprite sheet in use
|
//NOTE: These must correspond to the sprite sheet in use
|
||||||
if (motion.y > 0) {
|
if (motion.y > 0) {
|
||||||
sprite.SetYIndex(0);
|
sprite.SetIndexY(0);
|
||||||
}
|
}
|
||||||
else if (motion.y < 0) {
|
else if (motion.y < 0) {
|
||||||
sprite.SetYIndex(1);
|
sprite.SetIndexY(1);
|
||||||
}
|
}
|
||||||
else if (motion.x > 0) {
|
else if (motion.x > 0) {
|
||||||
sprite.SetYIndex(3);
|
sprite.SetIndexY(3);
|
||||||
}
|
}
|
||||||
else if (motion.x < 0) {
|
else if (motion.x < 0) {
|
||||||
sprite.SetYIndex(2);
|
sprite.SetIndexY(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
//animation
|
//animation
|
||||||
@@ -48,7 +49,7 @@ void BaseCharacter::CorrectSprite() {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sprite.SetDelay(0);
|
sprite.SetDelay(0);
|
||||||
sprite.SetXIndex(0);
|
sprite.SetIndexX(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,9 +73,9 @@ std::string BaseCharacter::GetHandle() const {
|
|||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string BaseCharacter::SetAvatar(std::string s) {
|
std::string BaseCharacter::SetAvatar(SDL_Renderer* const renderer, std::string s) {
|
||||||
avatar = s;
|
avatar = s;
|
||||||
sprite.LoadSurface(ConfigUtility::GetSingleton()["dir.sprites"] + avatar, CHARACTER_CELLS_X, CHARACTER_CELLS_Y);
|
sprite.Load(renderer, ConfigUtility::GetSingleton()["dir.sprites"] + avatar, CHARACTER_CELLS_X, CHARACTER_CELLS_Y);
|
||||||
return avatar;
|
return avatar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,7 @@
|
|||||||
* 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 BASECHARACTER_HPP_
|
#pragma once
|
||||||
#define BASECHARACTER_HPP_
|
|
||||||
|
|
||||||
//components
|
//components
|
||||||
#include "character_defines.hpp"
|
#include "character_defines.hpp"
|
||||||
@@ -42,7 +41,7 @@ public:
|
|||||||
int GetOwner();
|
int GetOwner();
|
||||||
std::string SetHandle(std::string s);
|
std::string SetHandle(std::string s);
|
||||||
std::string GetHandle() const;
|
std::string GetHandle() const;
|
||||||
std::string SetAvatar(std::string s);
|
std::string SetAvatar(SDL_Renderer* const, std::string s);
|
||||||
std::string GetAvatar() const;
|
std::string GetAvatar() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -51,5 +50,3 @@ protected:
|
|||||||
std::string handle;
|
std::string handle;
|
||||||
std::string avatar;
|
std::string avatar;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -35,9 +35,9 @@ std::string BaseMonster::GetHandle() const {
|
|||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string BaseMonster::SetAvatar(std::string s) {
|
std::string BaseMonster::SetAvatar(SDL_Renderer* const renderer, std::string s) {
|
||||||
avatar = s;
|
avatar = s;
|
||||||
sprite.LoadSurface(ConfigUtility::GetSingleton()["dir.sprites"] + avatar, 4, 1);
|
sprite.Load(renderer, ConfigUtility::GetSingleton()["dir.sprites"] + avatar, 4, 1);
|
||||||
return avatar;
|
return avatar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,7 @@
|
|||||||
* 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 BASEMONSTER_HPP_
|
#pragma once
|
||||||
#define BASEMONSTER_HPP_
|
|
||||||
|
|
||||||
#include "entity.hpp"
|
#include "entity.hpp"
|
||||||
|
|
||||||
@@ -33,7 +32,7 @@ public:
|
|||||||
|
|
||||||
std::string SetHandle(std::string s);
|
std::string SetHandle(std::string s);
|
||||||
std::string GetHandle() const;
|
std::string GetHandle() const;
|
||||||
std::string SetAvatar(std::string s);
|
std::string SetAvatar(SDL_Renderer* const, std::string s);
|
||||||
std::string GetAvatar() const;
|
std::string GetAvatar() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -41,5 +40,3 @@ protected:
|
|||||||
std::string handle;
|
std::string handle;
|
||||||
std::string avatar;
|
std::string avatar;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -26,8 +26,8 @@ void Entity::Update() {
|
|||||||
sprite.Update(0.016);
|
sprite.Update(0.016);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::DrawTo(SDL_Surface* const dest, int camX, int camY) {
|
void Entity::DrawTo(SDL_Renderer* const renderer, int camX, int camY) {
|
||||||
sprite.DrawTo(dest, origin.x - camX, origin.y - camY);
|
sprite.DrawTo(renderer, origin.x - camX, origin.y - camY);
|
||||||
}
|
}
|
||||||
|
|
||||||
SpriteSheet* Entity::GetSprite() {
|
SpriteSheet* Entity::GetSprite() {
|
||||||
|
|||||||
@@ -19,18 +19,18 @@
|
|||||||
* 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 ENTITY_HPP_
|
#pragma once
|
||||||
#define ENTITY_HPP_
|
|
||||||
|
|
||||||
#include "bounding_box.hpp"
|
#include "bounding_box.hpp"
|
||||||
#include "sprite_sheet.hpp"
|
#include "sprite_sheet.hpp"
|
||||||
#include "vector2.hpp"
|
#include "vector2.hpp"
|
||||||
|
|
||||||
//The base class for all objects in the world
|
//The base class for all objects in the world
|
||||||
|
//TODO: (9) write a better hierarchy
|
||||||
class Entity {
|
class Entity {
|
||||||
public:
|
public:
|
||||||
virtual void Update();
|
virtual void Update();
|
||||||
virtual void DrawTo(SDL_Surface* const, int camX, int camY);
|
virtual void DrawTo(SDL_Renderer* const, int camX, int camY);
|
||||||
|
|
||||||
SpriteSheet* GetSprite();
|
SpriteSheet* GetSprite();
|
||||||
|
|
||||||
@@ -52,5 +52,3 @@ protected:
|
|||||||
Vector2 motion;
|
Vector2 motion;
|
||||||
BoundingBox bounds;
|
BoundingBox bounds;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -26,6 +26,7 @@
|
|||||||
bool LocalCharacter::ProcessCollisionGrid(std::list<BoundingBox> boxList) {
|
bool LocalCharacter::ProcessCollisionGrid(std::list<BoundingBox> boxList) {
|
||||||
for(auto& box : boxList) {
|
for(auto& box : boxList) {
|
||||||
if (box.CheckOverlap(origin + bounds)) {
|
if (box.CheckOverlap(origin + bounds)) {
|
||||||
|
//TODO: (9) write a better collision system
|
||||||
origin -= motion;
|
origin -= motion;
|
||||||
motion = {0, 0};
|
motion = {0, 0};
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -19,8 +19,7 @@
|
|||||||
* 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 LOCALCHARACTER_HPP_
|
#pragma once
|
||||||
#define LOCALCHARACTER_HPP_
|
|
||||||
|
|
||||||
#include "base_character.hpp"
|
#include "base_character.hpp"
|
||||||
#include "bounding_box.hpp"
|
#include "bounding_box.hpp"
|
||||||
@@ -38,5 +37,3 @@ public:
|
|||||||
private:
|
private:
|
||||||
//NOTE: NO MEMBERS
|
//NOTE: NO MEMBERS
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -19,8 +19,7 @@
|
|||||||
* 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 INWORLD_HPP_
|
#pragma once
|
||||||
#define INWORLD_HPP_
|
|
||||||
|
|
||||||
//maps
|
//maps
|
||||||
#include "region_pager_base.hpp"
|
#include "region_pager_base.hpp"
|
||||||
@@ -32,9 +31,9 @@
|
|||||||
|
|
||||||
//graphics
|
//graphics
|
||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
#include "raster_font.hpp"
|
|
||||||
#include "button.hpp"
|
#include "button.hpp"
|
||||||
#include "tile_sheet.hpp"
|
#include "tile_sheet.hpp"
|
||||||
|
#include "text_line.hpp"
|
||||||
|
|
||||||
//common
|
//common
|
||||||
#include "frame_rate.hpp"
|
#include "frame_rate.hpp"
|
||||||
@@ -44,6 +43,10 @@
|
|||||||
#include "base_monster.hpp"
|
#include "base_monster.hpp"
|
||||||
#include "local_character.hpp"
|
#include "local_character.hpp"
|
||||||
|
|
||||||
|
#include "SDL2/SDL.h"
|
||||||
|
#include "SDL2/SDL_net.h"
|
||||||
|
#include "SDL2/SDL_ttf.h"
|
||||||
|
|
||||||
//STL
|
//STL
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
@@ -55,21 +58,22 @@ public:
|
|||||||
World(int* const argClientIndex, int* const argAccountIndex);
|
World(int* const argClientIndex, int* const argAccountIndex);
|
||||||
~World();
|
~World();
|
||||||
|
|
||||||
protected:
|
void RenderFrame(SDL_Renderer* renderer) override;
|
||||||
//Frame loop
|
|
||||||
void FrameStart();
|
|
||||||
void Update();
|
|
||||||
void FrameEnd();
|
|
||||||
void RenderFrame();
|
|
||||||
void Render(SDL_Surface* const);
|
|
||||||
|
|
||||||
//Event handlers
|
private:
|
||||||
|
//frame phases
|
||||||
|
void FrameStart() override;
|
||||||
|
void Update() override;
|
||||||
|
void FrameEnd() override;
|
||||||
|
|
||||||
|
//input events
|
||||||
void QuitEvent();
|
void QuitEvent();
|
||||||
void MouseMotion(SDL_MouseMotionEvent const&);
|
void MouseMotion(SDL_MouseMotionEvent const& event) override;
|
||||||
void MouseButtonDown(SDL_MouseButtonEvent const&);
|
void MouseButtonDown(SDL_MouseButtonEvent const& event) override;
|
||||||
void MouseButtonUp(SDL_MouseButtonEvent const&);
|
void MouseButtonUp(SDL_MouseButtonEvent const& event) override;
|
||||||
void KeyDown(SDL_KeyboardEvent const&);
|
void MouseWheel(SDL_MouseWheelEvent const& event) override;
|
||||||
void KeyUp(SDL_KeyboardEvent const&);
|
void KeyDown(SDL_KeyboardEvent const& event) override;
|
||||||
|
void KeyUp(SDL_KeyboardEvent const& event) override;
|
||||||
|
|
||||||
//handle incoming traffic
|
//handle incoming traffic
|
||||||
void HandlePacket(SerialPacket* const);
|
void HandlePacket(SerialPacket* const);
|
||||||
@@ -132,17 +136,18 @@ protected:
|
|||||||
int roomIndex = -1;
|
int roomIndex = -1;
|
||||||
|
|
||||||
//graphics
|
//graphics
|
||||||
Image buttonImage;
|
|
||||||
RasterFont font;
|
|
||||||
TileSheet tileSheet;
|
TileSheet tileSheet;
|
||||||
|
|
||||||
//map
|
//map
|
||||||
RegionPagerBase regionPager;
|
RegionPagerBase regionPager;
|
||||||
|
|
||||||
//UI
|
//UI
|
||||||
|
Image buttonImage;
|
||||||
|
TTF_Font* font = nullptr;
|
||||||
Button disconnectButton;
|
Button disconnectButton;
|
||||||
Button shutDownButton;
|
Button shutdownButton;
|
||||||
FrameRate fps;
|
FrameRate fps;
|
||||||
|
TextLine fpsTextLine;
|
||||||
|
|
||||||
//the camera structure
|
//the camera structure
|
||||||
struct {
|
struct {
|
||||||
@@ -166,5 +171,3 @@ protected:
|
|||||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton();
|
UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ void World::hCharacterCreate(CharacterPacket* const argPacket) {
|
|||||||
|
|
||||||
//fill the character's info
|
//fill the character's info
|
||||||
character->SetHandle(argPacket->handle);
|
character->SetHandle(argPacket->handle);
|
||||||
character->SetAvatar(argPacket->avatar);
|
character->SetAvatar(GetRenderer(), argPacket->avatar);
|
||||||
character->SetOwner(argPacket->accountIndex);
|
character->SetOwner(argPacket->accountIndex);
|
||||||
character->SetOrigin(argPacket->origin);
|
character->SetOrigin(argPacket->origin);
|
||||||
character->SetMotion(argPacket->motion);
|
character->SetMotion(argPacket->motion);
|
||||||
@@ -82,8 +82,8 @@ void World::hCharacterCreate(CharacterPacket* const argPacket) {
|
|||||||
localCharacter = static_cast<LocalCharacter*>(character);
|
localCharacter = static_cast<LocalCharacter*>(character);
|
||||||
|
|
||||||
//focus the camera on this character's sprite
|
//focus the camera on this character's sprite
|
||||||
camera.marginX = (camera.width / 2 - localCharacter->GetSprite()->GetImage()->GetClipW() / 2);
|
camera.marginX = (camera.width / 2 - localCharacter->GetSprite()->GetClipW() / 2);
|
||||||
camera.marginY = (camera.height/ 2 - localCharacter->GetSprite()->GetImage()->GetClipH() / 2);
|
camera.marginY = (camera.height/ 2 - localCharacter->GetSprite()->GetClipH() / 2);
|
||||||
|
|
||||||
//focus on this character's info
|
//focus on this character's info
|
||||||
characterIndex = argPacket->characterIndex;
|
characterIndex = argPacket->characterIndex;
|
||||||
@@ -135,6 +135,7 @@ void World::hCharacterDelete(CharacterPacket* const argPacket) {
|
|||||||
|
|
||||||
void World::hQueryCharacterExists(CharacterPacket* const argPacket) {
|
void World::hQueryCharacterExists(CharacterPacket* const argPacket) {
|
||||||
//prevent a double message about this player's character
|
//prevent a double message about this player's character
|
||||||
|
//TODO: why is this commented out?
|
||||||
// if (argPacket->accountIndex == accountIndex) {
|
// if (argPacket->accountIndex == accountIndex) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
@@ -152,7 +153,7 @@ void World::hQueryCharacterExists(CharacterPacket* const argPacket) {
|
|||||||
character->SetMotion(argPacket->motion);
|
character->SetMotion(argPacket->motion);
|
||||||
character->SetBounds({CHARACTER_BOUNDS_X, CHARACTER_BOUNDS_Y, CHARACTER_BOUNDS_WIDTH, CHARACTER_BOUNDS_HEIGHT});
|
character->SetBounds({CHARACTER_BOUNDS_X, CHARACTER_BOUNDS_Y, CHARACTER_BOUNDS_WIDTH, CHARACTER_BOUNDS_HEIGHT});
|
||||||
character->SetHandle(argPacket->handle);
|
character->SetHandle(argPacket->handle);
|
||||||
character->SetAvatar(argPacket->avatar);
|
character->SetAvatar(GetRenderer(), argPacket->avatar);
|
||||||
character->SetOwner(argPacket->accountIndex);
|
character->SetOwner(argPacket->accountIndex);
|
||||||
character->CorrectSprite();
|
character->CorrectSprite();
|
||||||
|
|
||||||
@@ -222,7 +223,7 @@ std::list<BoundingBox> World::GenerateCollisionGrid(Entity* ptr, int tileWidth,
|
|||||||
//inner loop
|
//inner loop
|
||||||
wallBounds.y = snapToBase((double)wallBounds.h, ptr->GetOrigin().y);
|
wallBounds.y = snapToBase((double)wallBounds.h, ptr->GetOrigin().y);
|
||||||
while(wallBounds.y < (ptr->GetOrigin() + ptr->GetBounds()).y + ptr->GetBounds().h) {
|
while(wallBounds.y < (ptr->GetOrigin() + ptr->GetBounds()).y + ptr->GetBounds().h) {
|
||||||
//check to see if this tile is solid
|
//check to see if this tile is solid (non-existant tiles are always false)
|
||||||
if (regionPager.GetSolid(wallBounds.x / wallBounds.w, wallBounds.y / wallBounds.h)) {
|
if (regionPager.GetSolid(wallBounds.x / wallBounds.w, wallBounds.y / wallBounds.h)) {
|
||||||
//push onto the box set
|
//push onto the box set
|
||||||
boxList.push_front(wallBounds);
|
boxList.push_front(wallBounds);
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ void World::CheckHeartBeat() {
|
|||||||
if (attemptedBeats > 2) {
|
if (attemptedBeats > 2) {
|
||||||
//escape to the disconnect screen
|
//escape to the disconnect screen
|
||||||
SendDisconnectRequest();
|
SendDisconnectRequest();
|
||||||
SetNextScene(SceneList::DISCONNECTEDSCREEN);
|
SetSceneSignal(SceneSignal::DISCONNECTEDSCREEN);
|
||||||
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "Error: Lost connection to the server";
|
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "Error: Lost connection to the server";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -122,13 +122,13 @@ void World::hLogoutResponse(ClientPacket* const argPacket) {
|
|||||||
|
|
||||||
void World::hDisconnectResponse(ClientPacket* const argPacket) {
|
void World::hDisconnectResponse(ClientPacket* const argPacket) {
|
||||||
hLogoutResponse(argPacket);//shortcut
|
hLogoutResponse(argPacket);//shortcut
|
||||||
SetNextScene(SceneList::DISCONNECTEDSCREEN);
|
SetSceneSignal(SceneSignal::DISCONNECTEDSCREEN);
|
||||||
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "You have successfully logged out";
|
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "You have successfully logged out";
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::hAdminDisconnectForced(ClientPacket* const argPacket) {
|
void World::hAdminDisconnectForced(ClientPacket* const argPacket) {
|
||||||
hDisconnectResponse(argPacket);//shortcut
|
hDisconnectResponse(argPacket);//shortcut
|
||||||
SetNextScene(SceneList::DISCONNECTEDSCREEN);
|
SetSceneSignal(SceneSignal::DISCONNECTEDSCREEN);
|
||||||
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "You have been forcibly disconnected by the server";
|
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "You have been forcibly disconnected by the server";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,29 +40,31 @@ World::World(int* const argClientIndex, int* const argAccountIndex):
|
|||||||
accountIndex(*argAccountIndex)
|
accountIndex(*argAccountIndex)
|
||||||
{
|
{
|
||||||
//setup the utility objects
|
//setup the utility objects
|
||||||
buttonImage.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_red.png");
|
||||||
buttonImage.SetClipH(buttonImage.GetClipH()/3);
|
font = TTF_OpenFont(config["client.font"].c_str(), 12);
|
||||||
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp");
|
|
||||||
|
|
||||||
//pass the utility objects
|
//check that the font loaded
|
||||||
disconnectButton.SetImage(&buttonImage);
|
if (!font) {
|
||||||
disconnectButton.SetFont(&font);
|
std::ostringstream msg;
|
||||||
shutDownButton.SetImage(&buttonImage);
|
msg << "Failed to load a font file; " << SDL_GetError();
|
||||||
shutDownButton.SetFont(&font);
|
throw(std::runtime_error(msg.str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
//setup the buttons
|
||||||
|
disconnectButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||||
|
disconnectButton.SetText(GetRenderer(), font, "Disconnect", COLOR_BLUE);
|
||||||
|
shutdownButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||||
|
shutdownButton.SetText(GetRenderer(), font, "Shutdown", COLOR_BLUE);
|
||||||
|
|
||||||
//set the button positions
|
//set the button positions
|
||||||
disconnectButton.SetX(50);
|
disconnectButton.SetX(50);
|
||||||
disconnectButton.SetY(50 + buttonImage.GetClipH() * 0);
|
disconnectButton.SetY(50);
|
||||||
shutDownButton.SetX(50);
|
shutdownButton.SetX(50);
|
||||||
shutDownButton.SetY(50 + buttonImage.GetClipH() * 1);
|
shutdownButton.SetY(70);
|
||||||
|
|
||||||
//set the button texts
|
|
||||||
disconnectButton.SetText("Disconnect");
|
|
||||||
shutDownButton.SetText("Shut Down");
|
|
||||||
|
|
||||||
//load the tilesheet
|
//load the tilesheet
|
||||||
//TODO: (2) Tile size and tile sheet should be loaded elsewhere
|
//TODO: (2) Tile size and tile sheet should be loaded elsewhere
|
||||||
tileSheet.Load(config["dir.tilesets"] + "overworld.bmp", 32, 32);
|
tileSheet.Load(GetRenderer(), config["dir.tilesets"] + "overworld.png", 32, 32);
|
||||||
|
|
||||||
//Send the character data
|
//Send the character data
|
||||||
CharacterPacket newPacket;
|
CharacterPacket newPacket;
|
||||||
@@ -73,8 +75,7 @@ World::World(int* const argClientIndex, int* const argAccountIndex):
|
|||||||
network.SendTo(Channels::SERVER, &newPacket);
|
network.SendTo(Channels::SERVER, &newPacket);
|
||||||
|
|
||||||
//set the camera's values
|
//set the camera's values
|
||||||
camera.width = GetScreen()->w;
|
SDL_RenderGetLogicalSize(GetRenderer(), &camera.width, &camera.height);
|
||||||
camera.height = GetScreen()->h;
|
|
||||||
|
|
||||||
//debug
|
//debug
|
||||||
//
|
//
|
||||||
@@ -82,6 +83,7 @@ World::World(int* const argClientIndex, int* const argAccountIndex):
|
|||||||
|
|
||||||
World::~World() {
|
World::~World() {
|
||||||
//unload the local data
|
//unload the local data
|
||||||
|
TTF_CloseFont(font);
|
||||||
characterMap.clear();
|
characterMap.clear();
|
||||||
monsterMap.clear();
|
monsterMap.clear();
|
||||||
}
|
}
|
||||||
@@ -160,17 +162,10 @@ void World::FrameEnd() {
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::RenderFrame() {
|
void World::RenderFrame(SDL_Renderer* renderer) {
|
||||||
// SDL_FillRect(GetScreen(), 0, 0);
|
|
||||||
Render(GetScreen());
|
|
||||||
SDL_Flip(GetScreen());
|
|
||||||
fps.Calculate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void World::Render(SDL_Surface* const screen) {
|
|
||||||
//draw the map
|
//draw the map
|
||||||
for (std::list<Region>::iterator it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); it++) {
|
for (std::list<Region>::iterator it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); it++) {
|
||||||
tileSheet.DrawRegionTo(screen, &(*it), camera.x, camera.y);
|
tileSheet.DrawRegionTo(renderer, &(*it), camera.x, camera.y);
|
||||||
|
|
||||||
//debugging
|
//debugging
|
||||||
// std::ostringstream msg;
|
// std::ostringstream msg;
|
||||||
@@ -181,18 +176,24 @@ void World::Render(SDL_Surface* const screen) {
|
|||||||
//draw the entities
|
//draw the entities
|
||||||
for (auto& it : characterMap) {
|
for (auto& it : characterMap) {
|
||||||
//BUG: #29 Characters (and other entities) are drawn out of order
|
//BUG: #29 Characters (and other entities) are drawn out of order
|
||||||
it.second.DrawTo(screen, camera.x, camera.y);
|
it.second.DrawTo(renderer, camera.x, camera.y);
|
||||||
}
|
}
|
||||||
for (auto& it : monsterMap) {
|
for (auto& it : monsterMap) {
|
||||||
it.second.DrawTo(screen, camera.x, camera.y);
|
it.second.DrawTo(renderer, camera.x, camera.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
//draw UI
|
//draw UI
|
||||||
disconnectButton.DrawTo(screen);
|
disconnectButton.DrawTo(renderer);
|
||||||
shutDownButton.DrawTo(screen);
|
shutdownButton.DrawTo(renderer);
|
||||||
|
|
||||||
|
//FPS
|
||||||
|
fpsTextLine.DrawTo(renderer, 0, 0);
|
||||||
|
int fpsRet = fps.Calculate();
|
||||||
|
if (fpsRet != -1) {
|
||||||
std::ostringstream msg;
|
std::ostringstream msg;
|
||||||
msg << fps.GetFrameRate();
|
msg << "FPS: " << fpsRet;
|
||||||
font.DrawStringTo(msg.str(), screen, 0, 0);
|
fpsTextLine.SetText(renderer, font, msg.str(), {255, 255, 255, 255});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
@@ -202,31 +203,40 @@ void World::Render(SDL_Surface* const screen) {
|
|||||||
void World::QuitEvent() {
|
void World::QuitEvent() {
|
||||||
//two-step logout
|
//two-step logout
|
||||||
SendDisconnectRequest();
|
SendDisconnectRequest();
|
||||||
SetNextScene(SceneList::QUIT);
|
SetSceneSignal(SceneSignal::QUIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
void World::MouseMotion(SDL_MouseMotionEvent const& event) {
|
||||||
disconnectButton.MouseMotion(motion);
|
disconnectButton.MouseMotion(event);
|
||||||
shutDownButton.MouseMotion(motion);
|
shutdownButton.MouseMotion(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
void World::MouseButtonDown(SDL_MouseButtonEvent const& event) {
|
||||||
disconnectButton.MouseButtonDown(button);
|
disconnectButton.MouseButtonDown(event);
|
||||||
shutDownButton.MouseButtonDown(button);
|
shutdownButton.MouseButtonDown(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
void World::MouseButtonUp(SDL_MouseButtonEvent const& event) {
|
||||||
if (disconnectButton.MouseButtonUp(button) == Button::State::HOVER && button.button == SDL_BUTTON_LEFT) {
|
if (disconnectButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||||
SendLogoutRequest();
|
SendLogoutRequest();
|
||||||
}
|
}
|
||||||
if (shutDownButton.MouseButtonUp(button) == Button::State::HOVER && button.button == SDL_BUTTON_LEFT) {
|
if (shutdownButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||||
SendAdminShutdownRequest();
|
SendAdminShutdownRequest();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::KeyDown(SDL_KeyboardEvent const& key) {
|
void World::MouseWheel(SDL_MouseWheelEvent const& event) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::KeyDown(SDL_KeyboardEvent const& event) {
|
||||||
|
//BUGFIX: SDL2 introduced key repeats, so I need to ignore it
|
||||||
|
if (event.repeat) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//hotkeys
|
//hotkeys
|
||||||
switch(key.keysym.sym) {
|
switch(event.keysym.sym) {
|
||||||
case SDLK_ESCAPE:
|
case SDLK_ESCAPE:
|
||||||
//TODO: (3) the escape key should actually control menus and stuff
|
//TODO: (3) the escape key should actually control menus and stuff
|
||||||
SendLogoutRequest();
|
SendLogoutRequest();
|
||||||
@@ -238,7 +248,7 @@ void World::KeyDown(SDL_KeyboardEvent const& key) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Vector2 motion = localCharacter->GetMotion();
|
Vector2 motion = localCharacter->GetMotion();
|
||||||
switch(key.keysym.sym) {
|
switch(event.keysym.sym) {
|
||||||
case SDLK_w:
|
case SDLK_w:
|
||||||
motion.y -= CHARACTER_WALKING_SPEED;
|
motion.y -= CHARACTER_WALKING_SPEED;
|
||||||
break;
|
break;
|
||||||
@@ -265,13 +275,18 @@ void World::KeyDown(SDL_KeyboardEvent const& key) {
|
|||||||
SendLocalCharacterMovement();
|
SendLocalCharacterMovement();
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::KeyUp(SDL_KeyboardEvent const& key) {
|
void World::KeyUp(SDL_KeyboardEvent const& event) {
|
||||||
|
//BUGFIX: SDL2 introduced key repeats, so I need to ignore it
|
||||||
|
if (event.repeat) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//character movement
|
//character movement
|
||||||
if (!localCharacter) {
|
if (!localCharacter) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Vector2 motion = localCharacter->GetMotion();
|
Vector2 motion = localCharacter->GetMotion();
|
||||||
switch(key.keysym.sym) {
|
switch(event.keysym.sym) {
|
||||||
case SDLK_w:
|
case SDLK_w:
|
||||||
motion.y = std::min(0.0, motion.y += CHARACTER_WALKING_SPEED);
|
motion.y = std::min(0.0, motion.y += CHARACTER_WALKING_SPEED);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -29,12 +29,13 @@
|
|||||||
//static functions
|
//static functions
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
|
//TODO: (3) proper checksum
|
||||||
static int regionChecksum(Region* const region) {
|
static int regionChecksum(Region* const region) {
|
||||||
int sum = 0;
|
int sum = 0;
|
||||||
for(int i = 0; i < REGION_WIDTH; i++) {
|
for(int i = 0; i < REGION_WIDTH; i++) {
|
||||||
for (int j = 0; j < REGION_HEIGHT; j++) {
|
for (int j = 0; j < REGION_HEIGHT; j++) {
|
||||||
for (int k = 0; k < REGION_DEPTH; k++) {
|
for (int k = 0; k < REGION_DEPTH; k++) {
|
||||||
sum += region->GetTile(i, j, k);
|
sum |= region->GetTile(i, j, k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -103,7 +104,6 @@ void World::UpdateMap() {
|
|||||||
}
|
}
|
||||||
else if (regionChecksum(region) == 0) {
|
else if (regionChecksum(region) == 0) {
|
||||||
//checksum failed
|
//checksum failed
|
||||||
//NOTE: this patches bug #45, but does not resolve it
|
|
||||||
regionPager.UnloadIf([region](Region const& ref) -> bool {
|
regionPager.UnloadIf([region](Region const& ref) -> bool {
|
||||||
//remove the erroneous region
|
//remove the erroneous region
|
||||||
return region == &ref;
|
return region == &ref;
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ void World::hMonsterCreate(MonsterPacket* const argPacket) {
|
|||||||
|
|
||||||
//fill the monster's info
|
//fill the monster's info
|
||||||
monster->SetHandle(argPacket->handle);
|
monster->SetHandle(argPacket->handle);
|
||||||
monster->SetAvatar(argPacket->avatar);
|
monster->SetAvatar(GetRenderer(), argPacket->avatar);
|
||||||
monster->SetBounds(argPacket->bounds);
|
monster->SetBounds(argPacket->bounds);
|
||||||
monster->SetOrigin(argPacket->origin);
|
monster->SetOrigin(argPacket->origin);
|
||||||
monster->SetMotion(argPacket->motion);
|
monster->SetMotion(argPacket->motion);
|
||||||
@@ -89,7 +89,7 @@ void World::hQueryMonsterExists(MonsterPacket* const argPacket) {
|
|||||||
|
|
||||||
//fill the monster's info
|
//fill the monster's info
|
||||||
monster->SetHandle(argPacket->handle);
|
monster->SetHandle(argPacket->handle);
|
||||||
monster->SetAvatar(argPacket->avatar);
|
monster->SetAvatar(GetRenderer(), argPacket->avatar);
|
||||||
monster->SetBounds(argPacket->bounds);
|
monster->SetBounds(argPacket->bounds);
|
||||||
monster->SetOrigin(argPacket->origin);
|
monster->SetOrigin(argPacket->origin);
|
||||||
monster->SetMotion(argPacket->motion);
|
monster->SetMotion(argPacket->motion);
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ int main(int argc, char* argv[]) {
|
|||||||
app.Proc();
|
app.Proc();
|
||||||
app.Quit();
|
app.Quit();
|
||||||
|
|
||||||
|
//control the position of the app's destructor
|
||||||
ClientApplication::DeleteSingleton();
|
ClientApplication::DeleteSingleton();
|
||||||
|
|
||||||
//delete the singletons
|
//delete the singletons
|
||||||
|
|||||||
+7
-3
@@ -1,16 +1,20 @@
|
|||||||
#include directories
|
#include directories
|
||||||
INCLUDES+=SDL . client_utilities entities gameplay_scenes menu_scenes ../common/debugging ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet_types ../common/ui ../common/utilities
|
INCLUDES+=. client_utilities entities gameplay_scenes menu_scenes ../common/debugging ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet_types ../common/ui ../common/utilities
|
||||||
|
|
||||||
#libraries
|
#libraries
|
||||||
#the order of the $(LIBS) is important, at least for MinGW
|
#the order of the $(LIBS) is important, at least for MinGW
|
||||||
LIBS+=client.a ../libcommon.a -lSDL_net
|
LIBS+=client.a ../common/libcommon.a -lSDL2_net
|
||||||
ifeq ($(OS),Windows_NT)
|
ifeq ($(OS),Windows_NT)
|
||||||
LIBS+=-lwsock32 -liphlpapi -lmingw32
|
LIBS+=-lwsock32 -liphlpapi -lmingw32
|
||||||
endif
|
endif
|
||||||
LIBS+=-lSDLmain -lSDL
|
LIBS+=-lSDL2main -lSDL2 -lSDL2_image -lSDL2_ttf
|
||||||
|
|
||||||
#flags
|
#flags
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
ifeq ($(shell uname), Linux)
|
||||||
|
#read data about the current install
|
||||||
|
CXXFLAGS+=$(shell sdl-config --cflags --static-libs)
|
||||||
|
endif
|
||||||
|
|
||||||
#source
|
#source
|
||||||
CXXSRC=$(wildcard *.cpp)
|
CXXSRC=$(wildcard *.cpp)
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include "config_utility.hpp"
|
#include "config_utility.hpp"
|
||||||
#include "udp_network_utility.hpp"
|
#include "udp_network_utility.hpp"
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
@@ -35,20 +36,27 @@ DisconnectedScreen::DisconnectedScreen() {
|
|||||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
|
|
||||||
//setup the utility objects
|
//setup the utility objects
|
||||||
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
//TODO: (1) resource tool, to prevent reloading like this
|
||||||
image.SetClipH(image.GetClipH()/3);
|
image.Load(GetRenderer(), config["dir.interface"] + "button_red.png");
|
||||||
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp");
|
font = TTF_OpenFont(config["client.font"].c_str(), 12);
|
||||||
|
|
||||||
//pass the utility objects
|
//check that the font loaded
|
||||||
backButton.SetImage(&image);
|
if (!font) {
|
||||||
backButton.SetFont(&font);
|
std::ostringstream msg;
|
||||||
|
msg << "Failed to load a font file; " << SDL_GetError();
|
||||||
|
throw(std::runtime_error(msg.str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
//setup the button
|
||||||
|
backButton.SetBackgroundTexture(GetRenderer(), image.GetTexture());
|
||||||
|
backButton.SetText(GetRenderer(), font, "Back", COLOR_BLUE);
|
||||||
|
|
||||||
//set the button positions
|
//set the button positions
|
||||||
backButton.SetX(50);
|
backButton.SetX(50);
|
||||||
backButton.SetY(50 + image.GetClipH() * 0);
|
backButton.SetY(50);
|
||||||
|
|
||||||
//set the button texts
|
//set the disconnection message text
|
||||||
backButton.SetText("Back");
|
textLine.SetText(GetRenderer(), font, config["client.disconnectMessage"], {255, 255, 255, 255});
|
||||||
|
|
||||||
//full reset
|
//full reset
|
||||||
UDPNetworkUtility::GetSingleton().Unbind(Channels::SERVER);
|
UDPNetworkUtility::GetSingleton().Unbind(Channels::SERVER);
|
||||||
@@ -58,59 +66,65 @@ DisconnectedScreen::DisconnectedScreen() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DisconnectedScreen::~DisconnectedScreen() {
|
DisconnectedScreen::~DisconnectedScreen() {
|
||||||
//
|
TTF_CloseFont(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Frame loop
|
//Frame loop
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
|
void DisconnectedScreen::FrameStart() {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
void DisconnectedScreen::Update() {
|
void DisconnectedScreen::Update() {
|
||||||
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);
|
SetSceneSignal(SceneSignal::MAINMENU);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Eat incoming packets
|
//Eat incoming packets
|
||||||
while(UDPNetworkUtility::GetSingleton().Receive());
|
while(UDPNetworkUtility::GetSingleton().Receive());
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisconnectedScreen::Render(SDL_Surface* const screen) {
|
void DisconnectedScreen::FrameEnd() {
|
||||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
//
|
||||||
|
}
|
||||||
|
|
||||||
backButton.DrawTo(screen);
|
void DisconnectedScreen::RenderFrame(SDL_Renderer* renderer) {
|
||||||
font.DrawStringTo(config["client.disconnectMessage"], screen, 50, 30);
|
backButton.DrawTo(renderer);
|
||||||
|
textLine.DrawTo(renderer, 50, 30);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Event handlers
|
//Event handlers
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void DisconnectedScreen::QuitEvent() {
|
void DisconnectedScreen::MouseMotion(SDL_MouseMotionEvent const& event) {
|
||||||
SetNextScene(SceneList::QUIT);
|
backButton.MouseMotion(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisconnectedScreen::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
void DisconnectedScreen::MouseButtonDown(SDL_MouseButtonEvent const& event) {
|
||||||
backButton.MouseMotion(motion);
|
backButton.MouseButtonDown(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisconnectedScreen::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
void DisconnectedScreen::MouseButtonUp(SDL_MouseButtonEvent const& event) {
|
||||||
backButton.MouseButtonDown(button);
|
if (backButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||||
}
|
SetSceneSignal(SceneSignal::MAINMENU);
|
||||||
|
|
||||||
void DisconnectedScreen::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
|
||||||
if (backButton.MouseButtonUp(button) == Button::State::HOVER) {
|
|
||||||
SetNextScene(SceneList::MAINMENU);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisconnectedScreen::KeyDown(SDL_KeyboardEvent const& key) {
|
void DisconnectedScreen::MouseWheel(SDL_MouseWheelEvent const& event) {
|
||||||
switch(key.keysym.sym) {
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisconnectedScreen::KeyDown(SDL_KeyboardEvent const& event) {
|
||||||
|
switch(event.keysym.sym) {
|
||||||
case SDLK_ESCAPE:
|
case SDLK_ESCAPE:
|
||||||
SetNextScene(SceneList::MAINMENU);
|
SetSceneSignal(SceneSignal::MAINMENU);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisconnectedScreen::KeyUp(SDL_KeyboardEvent const& key) {
|
void DisconnectedScreen::KeyUp(SDL_KeyboardEvent const& event) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,18 +19,15 @@
|
|||||||
* 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 DISCONNECTEDSCREEN_HPP_
|
#pragma once
|
||||||
#define DISCONNECTEDSCREEN_HPP_
|
|
||||||
|
|
||||||
//graphics
|
|
||||||
#include "image.hpp"
|
|
||||||
#include "raster_font.hpp"
|
|
||||||
#include "button.hpp"
|
|
||||||
|
|
||||||
//client
|
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
|
#include "button.hpp"
|
||||||
|
#include "image.hpp"
|
||||||
|
#include "text_line.hpp"
|
||||||
|
|
||||||
|
#include "SDL2/SDL_ttf.h"
|
||||||
|
|
||||||
//std namespace
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
class DisconnectedScreen : public BaseScene {
|
class DisconnectedScreen : public BaseScene {
|
||||||
@@ -39,28 +36,28 @@ public:
|
|||||||
DisconnectedScreen();
|
DisconnectedScreen();
|
||||||
~DisconnectedScreen();
|
~DisconnectedScreen();
|
||||||
|
|
||||||
protected:
|
void RenderFrame(SDL_Renderer* renderer) override;
|
||||||
//Frame loop
|
|
||||||
void Update();
|
|
||||||
void Render(SDL_Surface* const);
|
|
||||||
|
|
||||||
//Event handlers
|
protected:
|
||||||
void QuitEvent();
|
//frame phases
|
||||||
void MouseMotion(SDL_MouseMotionEvent const&);
|
void FrameStart() override;
|
||||||
void MouseButtonDown(SDL_MouseButtonEvent const&);
|
void Update() override;
|
||||||
void MouseButtonUp(SDL_MouseButtonEvent const&);
|
void FrameEnd() override;
|
||||||
void KeyDown(SDL_KeyboardEvent const&);
|
|
||||||
void KeyUp(SDL_KeyboardEvent const&);
|
//input events
|
||||||
|
void MouseMotion(SDL_MouseMotionEvent const& event) override;
|
||||||
|
void MouseButtonDown(SDL_MouseButtonEvent const& event) override;
|
||||||
|
void MouseButtonUp(SDL_MouseButtonEvent const& event) override;
|
||||||
|
void MouseWheel(SDL_MouseWheelEvent const& event) override;
|
||||||
|
void KeyDown(SDL_KeyboardEvent const& event) override;
|
||||||
|
void KeyUp(SDL_KeyboardEvent const& event) override;
|
||||||
|
|
||||||
//graphics
|
//graphics
|
||||||
Image image;
|
Image image;
|
||||||
RasterFont font;
|
TTF_Font* font = nullptr;
|
||||||
|
|
||||||
//UI
|
|
||||||
Button backButton;
|
Button backButton;
|
||||||
|
TextLine textLine;
|
||||||
|
|
||||||
//auto return
|
//auto return
|
||||||
std::chrono::steady_clock::time_point startTick;
|
std::chrono::steady_clock::time_point startTick;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include "channels.hpp"
|
#include "channels.hpp"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
@@ -39,33 +40,37 @@ LobbyMenu::LobbyMenu(int* const argClientIndex, int* const argAccountIndex):
|
|||||||
accountIndex = -1;
|
accountIndex = -1;
|
||||||
|
|
||||||
//setup the utility objects
|
//setup the utility objects
|
||||||
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_red.png");
|
||||||
image.SetClipH(image.GetClipH()/3);
|
font = TTF_OpenFont(config["client.font"].c_str(), 12);
|
||||||
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp");
|
|
||||||
|
|
||||||
//pass the utility objects
|
//check that the font loaded
|
||||||
search.SetImage(&image);
|
if (!font) {
|
||||||
search.SetFont(&font);
|
std::ostringstream msg;
|
||||||
join.SetImage(&image);
|
msg << "Failed to load a font file; " << SDL_GetError();
|
||||||
join.SetFont(&font);
|
throw(std::runtime_error(msg.str()));
|
||||||
back.SetImage(&image);
|
}
|
||||||
back.SetFont(&font);
|
|
||||||
|
|
||||||
//set the button positions
|
//setup the buttons
|
||||||
search.SetX(50);
|
searchButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||||
search.SetY(50 + image.GetClipH() * 0);
|
searchButton.SetText(GetRenderer(), font, "Search", COLOR_BLUE);
|
||||||
join.SetX(50);
|
joinButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||||
join.SetY(50 + image.GetClipH() * 1);
|
joinButton.SetText(GetRenderer(), font, "Join", COLOR_BLUE);
|
||||||
back.SetX(50);
|
backButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||||
back.SetY(50 + image.GetClipH() * 2);
|
backButton.SetText(GetRenderer(), font, "Back", COLOR_BLUE);
|
||||||
|
|
||||||
//set the button texts
|
//set the button positions (assumed)
|
||||||
search.SetText("Search");
|
searchButton.SetX(50);
|
||||||
join.SetText("Join");
|
searchButton.SetY(50);
|
||||||
back.SetText("Back");
|
joinButton.SetX(50);
|
||||||
|
joinButton.SetY(70);
|
||||||
|
backButton.SetX(50);
|
||||||
|
backButton.SetY(90);
|
||||||
|
|
||||||
//set the server list's position
|
//pseudo-list selection
|
||||||
listBox = {300, 50, 200, font.GetCharH()};
|
boundingBox = {300, 50, 200, 12};
|
||||||
|
|
||||||
|
//hacked together a highlight box
|
||||||
|
highlightImage.Create(GetRenderer(), 300, 12, {49, 150, 5, 255});
|
||||||
|
|
||||||
//Eat incoming packets
|
//Eat incoming packets
|
||||||
while(network.Receive());
|
while(network.Receive());
|
||||||
@@ -75,7 +80,7 @@ LobbyMenu::LobbyMenu(int* const argClientIndex, int* const argAccountIndex):
|
|||||||
}
|
}
|
||||||
|
|
||||||
LobbyMenu::~LobbyMenu() {
|
LobbyMenu::~LobbyMenu() {
|
||||||
//
|
TTF_CloseFont(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
@@ -99,39 +104,25 @@ void LobbyMenu::FrameEnd() {
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::Render(SDL_Surface* const screen) {
|
void LobbyMenu::RenderFrame(SDL_Renderer* renderer) {
|
||||||
//TODO: (2) I need a proper UI system for the entire client and the editor
|
//TODO: (2) I need a proper UI system for the entire client and the editor
|
||||||
|
|
||||||
//UI
|
//UI
|
||||||
search.DrawTo(screen);
|
searchButton.DrawTo(renderer);
|
||||||
join.DrawTo(screen);
|
joinButton.DrawTo(renderer);
|
||||||
back.DrawTo(screen);
|
backButton.DrawTo(renderer);
|
||||||
|
|
||||||
//TODO: (3) draw headers for the server list
|
//TODO: (3) draw headers for the server list
|
||||||
//TODO: (3) ping/delay displayed in the server list
|
//TODO: (3) ping/delay displayed in the server list
|
||||||
for (int i = 0; i < serverInfo.size(); i++) {
|
for (int i = 0; i < serverVector.size(); i++) {
|
||||||
//draw the selected server's highlight
|
//draw the selected server's highlight
|
||||||
if (selection == &serverInfo[i]) {
|
if (selection == &serverVector[i]) {
|
||||||
SDL_Rect r = {
|
highlightImage.DrawTo(renderer, boundingBox.x, boundingBox.y + boundingBox.h * i);
|
||||||
(Sint16)listBox.x, (Sint16)listBox.y,
|
|
||||||
(Uint16)listBox.w, (Uint16)listBox.h
|
|
||||||
};
|
|
||||||
r.y += i * listBox.h;
|
|
||||||
SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 49, 150, 5));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//draw the server name
|
//draw the server's info
|
||||||
font.DrawStringTo(serverInfo[i].name, screen, listBox.x, listBox.y + i*listBox.h);
|
serverVector[i].nameImage.DrawTo(renderer, boundingBox.x, boundingBox.y + boundingBox.h * i);
|
||||||
|
serverVector[i].playerCountImage.DrawTo(renderer, boundingBox.x+300, boundingBox.y + boundingBox.h * i);
|
||||||
//draw the player count
|
|
||||||
std::ostringstream msg;
|
|
||||||
msg << serverInfo[i].playerCount;
|
|
||||||
font.DrawStringTo(msg.str(), screen, listBox.x + listBox.w, listBox.y + i*listBox.h);
|
|
||||||
|
|
||||||
//compatible?
|
|
||||||
if (!serverInfo[i].compatible) {
|
|
||||||
font.DrawStringTo("?", screen, listBox.x - font.GetCharW(), listBox.y + i*listBox.h);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,49 +130,54 @@ void LobbyMenu::Render(SDL_Surface* const screen) {
|
|||||||
//Event handlers
|
//Event handlers
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void LobbyMenu::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
void LobbyMenu::MouseMotion(SDL_MouseMotionEvent const& event) {
|
||||||
search.MouseMotion(motion);
|
searchButton.MouseMotion(event);
|
||||||
join.MouseMotion(motion);
|
joinButton.MouseMotion(event);
|
||||||
back.MouseMotion(motion);
|
backButton.MouseMotion(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
void LobbyMenu::MouseButtonDown(SDL_MouseButtonEvent const& event) {
|
||||||
search.MouseButtonDown(button);
|
searchButton.MouseButtonDown(event);
|
||||||
join.MouseButtonDown(button);
|
joinButton.MouseButtonDown(event);
|
||||||
back.MouseButtonDown(button);
|
backButton.MouseButtonDown(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& event) {
|
||||||
if (search.MouseButtonUp(button) == Button::State::HOVER) {
|
if (searchButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||||
SendBroadcastRequest();
|
SendBroadcastRequest();
|
||||||
}
|
}
|
||||||
else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) {
|
if (joinButton.MouseButtonUp(event) == Button::State::RELEASED && selection && selection->compatible) {
|
||||||
SendJoinRequest();
|
SendJoinRequest();
|
||||||
}
|
}
|
||||||
else if (back.MouseButtonUp(button) == Button::State::HOVER) {
|
if (backButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||||
SetNextScene(SceneList::MAINMENU);
|
SetSceneSignal(SceneSignal::MAINMENU);
|
||||||
}
|
}
|
||||||
|
|
||||||
//has the user selected a server on the list?
|
//has the user selected a server on the list?
|
||||||
BoundingBox tmpBox = listBox;
|
BoundingBox tmpBox = boundingBox;
|
||||||
tmpBox.h *= serverInfo.size();
|
tmpBox.h *= serverVector.size(); //within the list bounds
|
||||||
if (tmpBox.CheckOverlap({button.x, button.y})) {
|
if (tmpBox.CheckOverlap({event.x, event.y})) {
|
||||||
selection = &serverInfo[(button.y - listBox.y)/listBox.h];
|
//NOTE: this memory trick requires a vector
|
||||||
|
selection = &serverVector[(event.y - boundingBox.y)/boundingBox.h];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
selection = nullptr;
|
selection = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::KeyDown(SDL_KeyboardEvent const& key) {
|
void LobbyMenu::MouseWheel(SDL_MouseWheelEvent const& event) {
|
||||||
switch(key.keysym.sym) {
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
void LobbyMenu::KeyDown(SDL_KeyboardEvent const& event) {
|
||||||
|
switch(event.keysym.sym) {
|
||||||
case SDLK_ESCAPE:
|
case SDLK_ESCAPE:
|
||||||
SetNextScene(SceneList::MAINMENU);
|
SetSceneSignal(SceneSignal::MAINMENU);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) {
|
void LobbyMenu::KeyUp(SDL_KeyboardEvent const& event) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,17 +218,38 @@ 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;
|
ServerInfo newServer;
|
||||||
server.address = argPacket->srcAddress;
|
|
||||||
server.name = argPacket->name;
|
|
||||||
server.playerCount = argPacket->playerCount;
|
|
||||||
server.version = argPacket->version;
|
|
||||||
|
|
||||||
//Checking compatibility
|
newServer.address = argPacket->srcAddress;
|
||||||
server.compatible = server.version == NETWORK_VERSION;
|
newServer.name = argPacket->name;
|
||||||
|
newServer.playerCount = argPacket->playerCount;
|
||||||
|
newServer.version = argPacket->version;
|
||||||
|
newServer.compatible = newServer.version == NETWORK_VERSION;
|
||||||
|
|
||||||
//push
|
//push
|
||||||
serverInfo.push_back(server);
|
serverVector.push_back(newServer);
|
||||||
|
|
||||||
|
//BUGFIX: since TextLine lacks the memory management of Image, I'll wait until after the line is in the vector to handle these
|
||||||
|
|
||||||
|
//fancy colors
|
||||||
|
SDL_Color color;
|
||||||
|
if (newServer.compatible) {
|
||||||
|
color = {255, 255, 255, 255};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
color = {255, 0, 0, 255};
|
||||||
|
}
|
||||||
|
|
||||||
|
//fancy itoa
|
||||||
|
auto itoa_base10 = [](int i) -> std::string {
|
||||||
|
char str[20];
|
||||||
|
sprintf(str, "%d", i);
|
||||||
|
return std::string(str);
|
||||||
|
};
|
||||||
|
|
||||||
|
//text graphics
|
||||||
|
serverVector.back().nameImage.SetText(GetRenderer(), font, newServer.name, color);
|
||||||
|
serverVector.back().playerCountImage.SetText(GetRenderer(), font, itoa_base10(newServer.playerCount), color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::HandleJoinResponse(ClientPacket* const argPacket) {
|
void LobbyMenu::HandleJoinResponse(ClientPacket* const argPacket) {
|
||||||
@@ -249,7 +266,7 @@ void LobbyMenu::HandleLoginResponse(ClientPacket* const argPacket) {
|
|||||||
throw(std::runtime_error("Client index invalid during login"));
|
throw(std::runtime_error("Client index invalid during login"));
|
||||||
}
|
}
|
||||||
accountIndex = argPacket->accountIndex;
|
accountIndex = argPacket->accountIndex;
|
||||||
SetNextScene(SceneList::WORLD);
|
SetSceneSignal(SceneSignal::WORLD);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::HandleJoinRejection(TextPacket* const argPacket) {
|
void LobbyMenu::HandleJoinRejection(TextPacket* const argPacket) {
|
||||||
@@ -271,7 +288,7 @@ void LobbyMenu::SendBroadcastRequest() {
|
|||||||
network.SendTo(config["server.host"].c_str(), config.Int("server.port"), &packet);
|
network.SendTo(config["server.host"].c_str(), config.Int("server.port"), &packet);
|
||||||
|
|
||||||
//reset the server list
|
//reset the server list
|
||||||
serverInfo.clear();
|
serverVector.clear();
|
||||||
selection = nullptr;
|
selection = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,10 +304,11 @@ void LobbyMenu::SendJoinRequest() {
|
|||||||
|
|
||||||
void LobbyMenu::SendLoginRequest() {
|
void LobbyMenu::SendLoginRequest() {
|
||||||
//NOTE: high cohesion
|
//NOTE: high cohesion
|
||||||
|
//TODO: (9) have a separate login screen
|
||||||
ClientPacket packet;
|
ClientPacket packet;
|
||||||
packet.type = SerialPacketType::LOGIN_REQUEST;
|
packet.type = SerialPacketType::LOGIN_REQUEST;
|
||||||
packet.clientIndex = clientIndex;
|
packet.clientIndex = clientIndex;
|
||||||
strncpy(packet.username, config["client.username"].c_str(), PACKET_STRING_SIZE);
|
strncpy(packet.username, config["client.username"].c_str(), PACKET_STRING_SIZE+1);
|
||||||
|
|
||||||
network.SendTo(Channels::SERVER, &packet);
|
network.SendTo(Channels::SERVER, &packet);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,14 +19,15 @@
|
|||||||
* 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 LOBBYMENU_HPP_
|
#pragma once
|
||||||
#define LOBBYMENU_HPP_
|
|
||||||
|
|
||||||
//graphics & ui
|
//graphics & ui
|
||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
#include "raster_font.hpp"
|
|
||||||
#include "button.hpp"
|
#include "button.hpp"
|
||||||
#include "bounding_box.hpp"
|
#include "bounding_box.hpp"
|
||||||
|
#include "text_line.hpp"
|
||||||
|
|
||||||
|
#include "SDL2/SDL_ttf.h"
|
||||||
|
|
||||||
//utilities
|
//utilities
|
||||||
#include "config_utility.hpp"
|
#include "config_utility.hpp"
|
||||||
@@ -45,19 +46,21 @@ public:
|
|||||||
LobbyMenu(int* const argClientIndex, int* const argAccountIndex);
|
LobbyMenu(int* const argClientIndex, int* const argAccountIndex);
|
||||||
~LobbyMenu();
|
~LobbyMenu();
|
||||||
|
|
||||||
protected:
|
void RenderFrame(SDL_Renderer* renderer) override;
|
||||||
//Frame loop
|
|
||||||
void FrameStart();
|
|
||||||
void Update();
|
|
||||||
void FrameEnd();
|
|
||||||
void Render(SDL_Surface* const);
|
|
||||||
|
|
||||||
//Event handlers
|
protected:
|
||||||
void MouseMotion(SDL_MouseMotionEvent const&);
|
//frame phases
|
||||||
void MouseButtonDown(SDL_MouseButtonEvent const&);
|
void FrameStart() override;
|
||||||
void MouseButtonUp(SDL_MouseButtonEvent const&);
|
void Update() override;
|
||||||
void KeyDown(SDL_KeyboardEvent const&);
|
void FrameEnd() override;
|
||||||
void KeyUp(SDL_KeyboardEvent const&);
|
|
||||||
|
//input events
|
||||||
|
void MouseMotion(SDL_MouseMotionEvent const& event) override;
|
||||||
|
void MouseButtonDown(SDL_MouseButtonEvent const& event) override;
|
||||||
|
void MouseButtonUp(SDL_MouseButtonEvent const& event) override;
|
||||||
|
void MouseWheel(SDL_MouseWheelEvent const& event) override;
|
||||||
|
void KeyDown(SDL_KeyboardEvent const& event) override;
|
||||||
|
void KeyUp(SDL_KeyboardEvent const& event) override;
|
||||||
|
|
||||||
//Network handlers
|
//Network handlers
|
||||||
void HandlePacket(SerialPacket* const);
|
void HandlePacket(SerialPacket* const);
|
||||||
@@ -78,15 +81,13 @@ protected:
|
|||||||
int& clientIndex;
|
int& clientIndex;
|
||||||
int& accountIndex;
|
int& accountIndex;
|
||||||
|
|
||||||
//members
|
//define the list object
|
||||||
Image image;
|
struct ServerInfo {
|
||||||
RasterFont font;
|
//graphics
|
||||||
Button search;
|
TextLine nameImage;
|
||||||
Button join;
|
TextLine playerCountImage;
|
||||||
Button back;
|
|
||||||
|
|
||||||
//server list
|
//networking
|
||||||
struct ServerInformation {
|
|
||||||
IPaddress address;
|
IPaddress address;
|
||||||
std::string name;
|
std::string name;
|
||||||
int playerCount;
|
int playerCount;
|
||||||
@@ -94,12 +95,16 @@ protected:
|
|||||||
bool compatible;
|
bool compatible;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<ServerInformation> serverInfo;
|
//members
|
||||||
|
Image buttonImage;
|
||||||
|
Image highlightImage;
|
||||||
|
TTF_Font* font = nullptr;
|
||||||
|
Button searchButton;
|
||||||
|
Button joinButton;
|
||||||
|
Button backButton;
|
||||||
|
|
||||||
//NOTE: a terrible hack
|
std::vector<ServerInfo> serverVector;
|
||||||
//I'd love a proper gui system for this
|
ServerInfo* selection = nullptr;
|
||||||
BoundingBox listBox;
|
|
||||||
ServerInformation* selection = nullptr;
|
BoundingBox boundingBox;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -23,6 +23,9 @@
|
|||||||
|
|
||||||
#include "config_utility.hpp"
|
#include "config_utility.hpp"
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Public access members
|
//Public access members
|
||||||
//-------------------------
|
//-------------------------
|
||||||
@@ -31,37 +34,43 @@ MainMenu::MainMenu() {
|
|||||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
|
|
||||||
//setup the utility objects
|
//setup the utility objects
|
||||||
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_red.png");
|
||||||
image.SetClipH(image.GetClipH()/3);
|
font = TTF_OpenFont(config["client.font"].c_str(), 12);
|
||||||
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp");
|
|
||||||
|
|
||||||
//pass the utility objects
|
//check that the font loaded
|
||||||
startButton.SetImage(&image);
|
if (!font) {
|
||||||
startButton.SetFont(&font);
|
std::ostringstream msg;
|
||||||
optionsButton.SetImage(&image);
|
msg << "Failed to load a font file; " << SDL_GetError();
|
||||||
optionsButton.SetFont(&font);
|
throw(std::runtime_error(msg.str()));
|
||||||
quitButton.SetImage(&image);
|
}
|
||||||
quitButton.SetFont(&font);
|
|
||||||
|
//setup the buttons
|
||||||
|
startButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||||
|
startButton.SetText(GetRenderer(), font, "Start", COLOR_BLUE);
|
||||||
|
optionsButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||||
|
optionsButton.SetText(GetRenderer(), font, "Options", COLOR_BLUE);
|
||||||
|
quitButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||||
|
quitButton.SetText(GetRenderer(), font, "Quit", COLOR_BLUE);
|
||||||
|
|
||||||
//set the button positions
|
//set the button positions
|
||||||
startButton.SetX(50);
|
startButton.SetX(50);
|
||||||
startButton.SetY(50 + image.GetClipH() * 0);
|
startButton.SetY(50 + 20 * 0);
|
||||||
optionsButton.SetX(50);
|
optionsButton.SetX(50);
|
||||||
optionsButton.SetY(50 + image.GetClipH() * 1);
|
optionsButton.SetY(50 + 20 * 1);
|
||||||
quitButton.SetX(50);
|
quitButton.SetX(50);
|
||||||
quitButton.SetY(50 + image.GetClipH() * 2);
|
quitButton.SetY(50 + 20 * 2);
|
||||||
|
|
||||||
//set the button texts
|
//text box
|
||||||
startButton.SetText("Start");
|
textBox.PushLine(GetRenderer(), font, "Thanks for playing!", {255, 255, 255, 255});
|
||||||
optionsButton.SetText("Options");
|
textBox.PushLine(GetRenderer(), font, "You can get the latest version at: ", {255, 255, 255, 255});
|
||||||
quitButton.SetText("Quit");
|
textBox.PushLine(GetRenderer(), font, "krgamestudios.com", {255, 255, 255, 255}); //TODO: (9) click to open the website/update
|
||||||
|
|
||||||
//debug
|
//debug
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
MainMenu::~MainMenu() {
|
MainMenu::~MainMenu() {
|
||||||
//
|
TTF_CloseFont(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
@@ -80,52 +89,56 @@ void MainMenu::FrameEnd() {
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenu::Render(SDL_Surface* const screen) {
|
void MainMenu::RenderFrame(SDL_Renderer* renderer) {
|
||||||
startButton.DrawTo(screen);
|
startButton.DrawTo(renderer);
|
||||||
optionsButton.DrawTo(screen);
|
optionsButton.DrawTo(renderer);
|
||||||
quitButton.DrawTo(screen);
|
quitButton.DrawTo(renderer);
|
||||||
|
|
||||||
//text
|
int h = -1;
|
||||||
font.DrawStringTo("Thanks for playing!", screen, 50, screen->h - 50 - image.GetClipH() * 2);
|
SDL_RenderGetLogicalSize(GetRenderer(), nullptr, &h);
|
||||||
font.DrawStringTo("You can get the latest version at: ", screen, 50, screen->h - 50 - image.GetClipH() * 1);
|
|
||||||
font.DrawStringTo("krgamestudios.com", screen, 50, screen->h - 50 - image.GetClipH() * 0);
|
textBox.DrawTo(renderer, 50, h-50, -12);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Event handlers
|
//Event handlers
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void MainMenu::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
void MainMenu::MouseMotion(SDL_MouseMotionEvent const& event) {
|
||||||
startButton.MouseMotion(motion);
|
startButton.MouseMotion(event);
|
||||||
optionsButton.MouseMotion(motion);
|
optionsButton.MouseMotion(event);
|
||||||
quitButton.MouseMotion(motion);
|
quitButton.MouseMotion(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
void MainMenu::MouseButtonDown(SDL_MouseButtonEvent const& event) {
|
||||||
startButton.MouseButtonDown(button);
|
startButton.MouseButtonDown(event);
|
||||||
optionsButton.MouseButtonDown(button);
|
optionsButton.MouseButtonDown(event);
|
||||||
quitButton.MouseButtonDown(button);
|
quitButton.MouseButtonDown(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
void MainMenu::MouseButtonUp(SDL_MouseButtonEvent const& event) {
|
||||||
//TODO: (2) Buttons should only register as "selected" when the left button is used
|
//TODO: (2) Buttons should only register as "selected" when the left button is used
|
||||||
if (startButton.MouseButtonUp(button) == Button::State::HOVER) {
|
if (startButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||||
SetNextScene(SceneList::LOBBYMENU);
|
SetSceneSignal(SceneSignal::LOBBYMENU);
|
||||||
}
|
}
|
||||||
if (optionsButton.MouseButtonUp(button) == Button::State::HOVER) {
|
if (optionsButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||||
SetNextScene(SceneList::OPTIONSMENU);
|
SetSceneSignal(SceneSignal::OPTIONSMENU);
|
||||||
}
|
}
|
||||||
if (quitButton.MouseButtonUp(button) == Button::State::HOVER) {
|
if (quitButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||||
QuitEvent();
|
QuitEvent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenu::KeyDown(SDL_KeyboardEvent const& key) {
|
void MainMenu::MouseWheel(SDL_MouseWheelEvent const& event) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenu::KeyUp(SDL_KeyboardEvent const& key) {
|
void MainMenu::KeyDown(SDL_KeyboardEvent const& event) {
|
||||||
switch(key.keysym.sym) {
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainMenu::KeyUp(SDL_KeyboardEvent const& event) {
|
||||||
|
switch(event.keysym.sym) {
|
||||||
case SDLK_ESCAPE:
|
case SDLK_ESCAPE:
|
||||||
QuitEvent();
|
QuitEvent();
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -19,14 +19,14 @@
|
|||||||
* 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 MAINMENU_HPP_
|
#pragma once
|
||||||
#define MAINMENU_HPP_
|
|
||||||
|
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
|
|
||||||
#include "image.hpp"
|
|
||||||
#include "raster_font.hpp"
|
|
||||||
#include "button.hpp"
|
#include "button.hpp"
|
||||||
|
#include "image.hpp"
|
||||||
|
#include "text_box.hpp"
|
||||||
|
|
||||||
|
#include "SDL2/SDL_ttf.h"
|
||||||
|
|
||||||
class MainMenu : public BaseScene {
|
class MainMenu : public BaseScene {
|
||||||
public:
|
public:
|
||||||
@@ -34,26 +34,27 @@ public:
|
|||||||
MainMenu();
|
MainMenu();
|
||||||
~MainMenu();
|
~MainMenu();
|
||||||
|
|
||||||
protected:
|
void RenderFrame(SDL_Renderer* renderer) override;
|
||||||
//Frame loop
|
|
||||||
void FrameStart();
|
|
||||||
void Update();
|
|
||||||
void FrameEnd();
|
|
||||||
void Render(SDL_Surface* const);
|
|
||||||
|
|
||||||
//Event handlers
|
protected:
|
||||||
void MouseMotion(SDL_MouseMotionEvent const&);
|
//frame phases
|
||||||
void MouseButtonDown(SDL_MouseButtonEvent const&);
|
void FrameStart() override;
|
||||||
void MouseButtonUp(SDL_MouseButtonEvent const&);
|
void Update() override;
|
||||||
void KeyDown(SDL_KeyboardEvent const&);
|
void FrameEnd() override;
|
||||||
void KeyUp(SDL_KeyboardEvent const&);
|
|
||||||
|
//input events
|
||||||
|
void MouseMotion(SDL_MouseMotionEvent const& event) override;
|
||||||
|
void MouseButtonDown(SDL_MouseButtonEvent const& event) override;
|
||||||
|
void MouseButtonUp(SDL_MouseButtonEvent const& event) override;
|
||||||
|
void MouseWheel(SDL_MouseWheelEvent const& event) override;
|
||||||
|
void KeyDown(SDL_KeyboardEvent const& event) override;
|
||||||
|
void KeyUp(SDL_KeyboardEvent const& event) override;
|
||||||
|
|
||||||
//members
|
//members
|
||||||
Image image;
|
Image buttonImage;
|
||||||
RasterFont font;
|
TTF_Font* font = nullptr;
|
||||||
Button startButton;
|
Button startButton;
|
||||||
Button optionsButton;
|
Button optionsButton;
|
||||||
Button quitButton;
|
Button quitButton;
|
||||||
|
TextBox textBox;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. .. ../../common/graphics ../../common/map ../../common/network ../../common/network/packet_types ../../common/ui ../../common/utilities
|
INCLUDES+=. .. ../client_utilities ../../common/graphics ../../common/map ../../common/network ../../common/network/packet_types ../../common/ui ../../common/utilities
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,9 @@
|
|||||||
|
|
||||||
#include "config_utility.hpp"
|
#include "config_utility.hpp"
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Public access members
|
//Public access members
|
||||||
//-------------------------
|
//-------------------------
|
||||||
@@ -31,24 +34,30 @@ OptionsMenu::OptionsMenu() {
|
|||||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
|
|
||||||
//setup the utility objects
|
//setup the utility objects
|
||||||
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_red.png");
|
||||||
image.SetClipH(image.GetClipH()/3);
|
font = TTF_OpenFont(config["client.font"].c_str(), 12);
|
||||||
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp");
|
|
||||||
|
|
||||||
//pass the utility objects
|
//check that the font loaded
|
||||||
backButton.SetImage(&image);
|
if (!font) {
|
||||||
backButton.SetFont(&font);
|
std::ostringstream msg;
|
||||||
|
msg << "Failed to load a font file; " << SDL_GetError();
|
||||||
|
throw(std::runtime_error(msg.str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
//setup the button
|
||||||
|
backButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||||
|
backButton.SetText(GetRenderer(), font, "Back", COLOR_BLUE);
|
||||||
|
|
||||||
//set the button positions
|
//set the button positions
|
||||||
backButton.SetX(50);
|
backButton.SetX(50);
|
||||||
backButton.SetY(50 + image.GetClipH() * 0);
|
backButton.SetY(50);
|
||||||
|
|
||||||
//set the button texts
|
//text line
|
||||||
backButton.SetText("Back");
|
textLine.SetText(GetRenderer(), font, "This code is fucking hard to refactor.", {255, 255, 255, 255});
|
||||||
}
|
}
|
||||||
|
|
||||||
OptionsMenu::~OptionsMenu() {
|
OptionsMenu::~OptionsMenu() {
|
||||||
//
|
TTF_CloseFont(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
@@ -67,38 +76,41 @@ void OptionsMenu::FrameEnd() {
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsMenu::Render(SDL_Surface* const screen) {
|
void OptionsMenu::RenderFrame(SDL_Renderer* renderer) {
|
||||||
backButton.DrawTo(screen);
|
backButton.DrawTo(renderer);
|
||||||
|
textLine.DrawTo(renderer, 50, 30);
|
||||||
font.DrawStringTo("Oh, were you looking for the options screen?", screen, 50, 30);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Event handlers
|
//Event handlers
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void OptionsMenu::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
void OptionsMenu::MouseMotion(SDL_MouseMotionEvent const& event) {
|
||||||
backButton.MouseMotion(motion);
|
backButton.MouseMotion(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
void OptionsMenu::MouseButtonDown(SDL_MouseButtonEvent const& event) {
|
||||||
backButton.MouseButtonDown(button);
|
backButton.MouseButtonDown(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
void OptionsMenu::MouseButtonUp(SDL_MouseButtonEvent const& event) {
|
||||||
if (backButton.MouseButtonUp(button) == Button::State::HOVER) {
|
if (backButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||||
SetNextScene(SceneList::MAINMENU);
|
SetSceneSignal(SceneSignal::MAINMENU);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsMenu::KeyDown(SDL_KeyboardEvent const& key) {
|
void OptionsMenu::MouseWheel(SDL_MouseWheelEvent const& event) {
|
||||||
switch(key.keysym.sym) {
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
void OptionsMenu::KeyDown(SDL_KeyboardEvent const& event) {
|
||||||
|
switch(event.keysym.sym) {
|
||||||
case SDLK_ESCAPE:
|
case SDLK_ESCAPE:
|
||||||
SetNextScene(SceneList::MAINMENU);
|
SetSceneSignal(SceneSignal::MAINMENU);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsMenu::KeyUp(SDL_KeyboardEvent const& key) {
|
void OptionsMenu::KeyUp(SDL_KeyboardEvent const& event) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,15 +19,14 @@
|
|||||||
* 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 OPTIONSMENU_HPP_
|
#pragma once
|
||||||
#define OPTIONSMENU_HPP_
|
|
||||||
|
#include "button.hpp"
|
||||||
|
#include "image.hpp"
|
||||||
|
#include "text_line.hpp"
|
||||||
|
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
|
|
||||||
#include "image.hpp"
|
|
||||||
#include "raster_font.hpp"
|
|
||||||
#include "button.hpp"
|
|
||||||
|
|
||||||
//NOTE: The options screen needs to be USED
|
//NOTE: The options screen needs to be USED
|
||||||
class OptionsMenu : public BaseScene {
|
class OptionsMenu : public BaseScene {
|
||||||
public:
|
public:
|
||||||
@@ -35,24 +34,25 @@ public:
|
|||||||
OptionsMenu();
|
OptionsMenu();
|
||||||
~OptionsMenu();
|
~OptionsMenu();
|
||||||
|
|
||||||
protected:
|
void RenderFrame(SDL_Renderer* renderer) override;
|
||||||
//Frame loop
|
|
||||||
void FrameStart();
|
|
||||||
void Update();
|
|
||||||
void FrameEnd();
|
|
||||||
void Render(SDL_Surface* const);
|
|
||||||
|
|
||||||
//Event handlers
|
private:
|
||||||
void MouseMotion(SDL_MouseMotionEvent const&);
|
//frame phases
|
||||||
void MouseButtonDown(SDL_MouseButtonEvent const&);
|
void FrameStart() override;
|
||||||
void MouseButtonUp(SDL_MouseButtonEvent const&);
|
void Update() override;
|
||||||
void KeyDown(SDL_KeyboardEvent const&);
|
void FrameEnd() override;
|
||||||
void KeyUp(SDL_KeyboardEvent const&);
|
|
||||||
|
//input events
|
||||||
|
void MouseMotion(SDL_MouseMotionEvent const& event) override;
|
||||||
|
void MouseButtonDown(SDL_MouseButtonEvent const& event) override;
|
||||||
|
void MouseButtonUp(SDL_MouseButtonEvent const& event) override;
|
||||||
|
void MouseWheel(SDL_MouseWheelEvent const& event) override;
|
||||||
|
void KeyDown(SDL_KeyboardEvent const& event) override;
|
||||||
|
void KeyUp(SDL_KeyboardEvent const& event) override;
|
||||||
|
|
||||||
//members
|
//members
|
||||||
Image image;
|
Image buttonImage;
|
||||||
RasterFont font;
|
TTF_Font* font = nullptr;
|
||||||
Button backButton;
|
Button backButton;
|
||||||
|
TextLine textLine;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -27,25 +27,38 @@
|
|||||||
//Public access members
|
//Public access members
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
SplashScreen::SplashScreen() {
|
SplashScreen::SplashScreen(SDL_Window* w) {
|
||||||
logo.LoadSurface(ConfigUtility::GetSingleton()["dir.logos"] + "krstudios.bmp");
|
//fit the screen to the logo
|
||||||
|
//NOTE: not using this window trick
|
||||||
|
window = w;
|
||||||
|
SDL_GetWindowSize(window, &windowWidth, &windowHeight);
|
||||||
|
|
||||||
|
logo.Load(GetRenderer(), ConfigUtility::GetSingleton()["dir.logos"] + "krstudios.png");
|
||||||
|
|
||||||
|
// SDL_SetWindowSize(window, logo.GetClipW(), logo.GetClipH());
|
||||||
|
// SDL_RenderSetLogicalSize(GetRenderer(), logo.GetClipW(), logo.GetClipH());
|
||||||
|
|
||||||
startTick = std::chrono::steady_clock::now();
|
startTick = std::chrono::steady_clock::now();
|
||||||
}
|
}
|
||||||
|
|
||||||
SplashScreen::~SplashScreen() {
|
SplashScreen::~SplashScreen() {
|
||||||
//
|
// SDL_SetWindowSize(window, windowWidth, windowHeight);
|
||||||
|
// SDL_RenderSetLogicalSize(GetRenderer(), windowWidth, windowHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Frame loop
|
//Frame loop
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void SplashScreen::Update() {
|
void SplashScreen::FrameStart() {
|
||||||
if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(1)) {
|
//TODO: (0) config flag to change the delay
|
||||||
SetNextScene(SceneList::MAINMENU);
|
if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(3)) {
|
||||||
|
SetSceneSignal(SceneSignal::MAINMENU);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SplashScreen::Render(SDL_Surface* const screen) {
|
void SplashScreen::RenderFrame(SDL_Renderer* renderer) {
|
||||||
logo.DrawTo(screen, (screen->w - logo.GetClipW()) / 2, (screen->h - logo.GetClipH()) / 2);
|
int w = 0, h = 0;
|
||||||
|
SDL_RenderGetLogicalSize(renderer, &w, &h);
|
||||||
|
logo.DrawTo(renderer, (w - logo.GetClipW()) / 2, (h - logo.GetClipH()) / 2);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,11 +19,9 @@
|
|||||||
* 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 SPLASHSCREEN_HPP_
|
#pragma once
|
||||||
#define SPLASHSCREEN_HPP_
|
|
||||||
|
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
|
|
||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@@ -31,17 +29,20 @@
|
|||||||
class SplashScreen : public BaseScene {
|
class SplashScreen : public BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
//Public access members
|
||||||
SplashScreen();
|
SplashScreen(SDL_Window*);
|
||||||
~SplashScreen();
|
~SplashScreen();
|
||||||
|
|
||||||
protected:
|
void RenderFrame(SDL_Renderer* renderer) override;
|
||||||
|
|
||||||
|
private:
|
||||||
//Frame loop
|
//Frame loop
|
||||||
void Update();
|
void FrameStart() override;
|
||||||
void Render(SDL_Surface* const);
|
|
||||||
|
|
||||||
//members
|
//members
|
||||||
std::chrono::steady_clock::time_point startTick;
|
std::chrono::steady_clock::time_point startTick;
|
||||||
Image logo;
|
Image logo;
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
//screws with the window
|
||||||
|
SDL_Window* window = nullptr;
|
||||||
|
int windowWidth, windowHeight;
|
||||||
|
};
|
||||||
|
|||||||
@@ -19,16 +19,15 @@
|
|||||||
* 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 SCENELIST_HPP_
|
#pragma once
|
||||||
#define SCENELIST_HPP_
|
|
||||||
|
|
||||||
enum class SceneList {
|
enum SceneSignal {
|
||||||
//these are reserved
|
//reserved members for internal use
|
||||||
QUIT,
|
QUIT = -1,
|
||||||
CONTINUE,
|
CONTINUE = 0,
|
||||||
FIRST,
|
FIRST = 1,
|
||||||
|
|
||||||
//custom indexes
|
//custom scenes
|
||||||
SPLASHSCREEN,
|
SPLASHSCREEN,
|
||||||
MAINMENU,
|
MAINMENU,
|
||||||
OPTIONSMENU,
|
OPTIONSMENU,
|
||||||
@@ -36,5 +35,3 @@ enum class SceneList {
|
|||||||
WORLD,
|
WORLD,
|
||||||
DISCONNECTEDSCREEN,
|
DISCONNECTEDSCREEN,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
Submodule
+1
Submodule common added at e7d3205a96
@@ -1,32 +0,0 @@
|
|||||||
#config
|
|
||||||
INCLUDES+=.
|
|
||||||
LIBS+=
|
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
|
||||||
|
|
||||||
#source
|
|
||||||
CXXSRC=$(wildcard *.cpp)
|
|
||||||
|
|
||||||
#objects
|
|
||||||
OBJDIR=obj
|
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
|
||||||
|
|
||||||
#output
|
|
||||||
OUTDIR=../..
|
|
||||||
OUT=$(addprefix $(OUTDIR)/,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 $@ $<
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "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) {
|
|
||||||
os << t.GetName() << ": ";
|
|
||||||
os << std::chrono::duration_cast<std::chrono::microseconds>(t.GetTime()).count();
|
|
||||||
os << "us";
|
|
||||||
return os;
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef TIMER_HPP_
|
|
||||||
#define TIMER_HPP_
|
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
#include <string>
|
|
||||||
#include <ostream>
|
|
||||||
|
|
||||||
class Timer {
|
|
||||||
public:
|
|
||||||
typedef std::chrono::high_resolution_clock Clock;
|
|
||||||
|
|
||||||
Timer();
|
|
||||||
Timer(std::string s);
|
|
||||||
~Timer() = default;
|
|
||||||
|
|
||||||
void Start();
|
|
||||||
void Stop();
|
|
||||||
|
|
||||||
//accessors and mutators
|
|
||||||
Clock::duration GetTime() { return timeSpan; }
|
|
||||||
|
|
||||||
std::string SetName(std::string s) { return name = s; }
|
|
||||||
std::string GetName() { return name; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string name;
|
|
||||||
Clock::time_point start;
|
|
||||||
Clock::duration timeSpan;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& os, Timer& t);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef CHARACTERDEFINES_HPP_
|
|
||||||
#define CHARACTERDEFINES_HPP_
|
|
||||||
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
//the speeds that the characters move
|
|
||||||
constexpr double CHARACTER_WALKING_SPEED = 2.24;
|
|
||||||
constexpr double CHARACTER_WALKING_MOD = 1.0/sqrt(2.0);
|
|
||||||
constexpr double CHARACTER_WALKING_NEGATIVE_MOD = 1.0 - CHARACTER_WALKING_MOD;
|
|
||||||
|
|
||||||
//the bounds for the character objects, mapped to the default sprites
|
|
||||||
constexpr int CHARACTER_BOUNDS_X = 0;
|
|
||||||
constexpr int CHARACTER_BOUNDS_Y = 16;
|
|
||||||
constexpr int CHARACTER_BOUNDS_WIDTH = 32;
|
|
||||||
constexpr int CHARACTER_BOUNDS_HEIGHT = 32;
|
|
||||||
|
|
||||||
//the character's sprite format
|
|
||||||
constexpr int CHARACTER_CELLS_X = 4;
|
|
||||||
constexpr int CHARACTER_CELLS_Y = 4;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#config
|
|
||||||
INCLUDES+=.
|
|
||||||
LIBS+=
|
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
|
||||||
|
|
||||||
#source
|
|
||||||
CXXSRC=$(wildcard *.cpp)
|
|
||||||
|
|
||||||
#objects
|
|
||||||
OBJDIR=obj
|
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
|
||||||
|
|
||||||
#output
|
|
||||||
OUTDIR=../..
|
|
||||||
OUT=$(addprefix $(OUTDIR)/,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 $@ $<
|
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "image.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
Image& Image::operator=(Image const& rhs) {
|
|
||||||
//don't screw yourself
|
|
||||||
if (this == &rhs) {
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
FreeSurface();
|
|
||||||
|
|
||||||
//Copy the other Image's stuff
|
|
||||||
surface = rhs.surface;
|
|
||||||
clip = rhs.clip;
|
|
||||||
local = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Image& Image::operator=(Image&& rhs) {
|
|
||||||
//don't screw yourself
|
|
||||||
if (this == &rhs) {
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
FreeSurface();
|
|
||||||
|
|
||||||
//Steal the other Image's stuff
|
|
||||||
surface = rhs.surface;
|
|
||||||
clip = rhs.clip;
|
|
||||||
local = rhs.local;
|
|
||||||
|
|
||||||
rhs.surface = nullptr;
|
|
||||||
rhs.clip = {0, 0, 0, 0};
|
|
||||||
rhs.local = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Surface* Image::LoadSurface(std::string fname) {
|
|
||||||
FreeSurface();
|
|
||||||
SDL_Surface* p = SDL_LoadBMP(fname.c_str());
|
|
||||||
if (!p) {
|
|
||||||
std::ostringstream os;
|
|
||||||
os << "Failed to load file: " << fname;
|
|
||||||
throw(std::runtime_error(os.str()));
|
|
||||||
}
|
|
||||||
surface = p;
|
|
||||||
clip = {0, 0, (Uint16)surface->w, (Uint16)surface->h};
|
|
||||||
local = true;
|
|
||||||
SetTransparentColor(255, 0, 255); //default
|
|
||||||
return surface;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Surface* Image::CreateSurface(Uint16 w, Uint16 h) {
|
|
||||||
FreeSurface();
|
|
||||||
Uint32 rmask, gmask, bmask, amask;
|
|
||||||
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
|
|
||||||
rmask = 0xff000000;
|
|
||||||
gmask = 0x00ff0000;
|
|
||||||
bmask = 0x0000ff00;
|
|
||||||
amask = 0x000000ff;
|
|
||||||
#else
|
|
||||||
rmask = 0x000000ff;
|
|
||||||
gmask = 0x0000ff00;
|
|
||||||
bmask = 0x00ff0000;
|
|
||||||
amask = 0xff000000;
|
|
||||||
#endif
|
|
||||||
SDL_Surface* p = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, rmask, gmask, bmask, amask);
|
|
||||||
if (!p) {
|
|
||||||
throw(std::runtime_error("Failed to create Image surface"));
|
|
||||||
}
|
|
||||||
surface = p;
|
|
||||||
clip = {0, 0, (Uint16)surface->w, (Uint16)surface->h};
|
|
||||||
local = true;
|
|
||||||
SetTransparentColor(255, 0, 255); //default
|
|
||||||
return surface;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Surface* Image::SetSurface(SDL_Surface* p) {
|
|
||||||
FreeSurface();
|
|
||||||
if (!p) {
|
|
||||||
throw(std::invalid_argument("No surface pointer provided"));
|
|
||||||
}
|
|
||||||
surface = p;
|
|
||||||
clip = {0, 0, (Uint16)surface->w, (Uint16)surface->h};
|
|
||||||
local = false;
|
|
||||||
return surface;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Image::FreeSurface() {
|
|
||||||
if (local) {
|
|
||||||
SDL_FreeSurface(surface);
|
|
||||||
local = false;
|
|
||||||
}
|
|
||||||
surface = nullptr;
|
|
||||||
clip = {0, 0, 0, 0};
|
|
||||||
}
|
|
||||||
|
|
||||||
void Image::DrawTo(SDL_Surface* dest, Sint16 x, Sint16 y) {
|
|
||||||
if (!surface) {
|
|
||||||
throw(std::logic_error("No image surface to draw"));
|
|
||||||
}
|
|
||||||
SDL_Rect sclip = clip, dclip = {x,y};
|
|
||||||
SDL_BlitSurface(surface, &sclip, dest, &dclip);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Image::SetTransparentColor(Uint8 r, Uint8 g, Uint8 b) {
|
|
||||||
if (!surface) {
|
|
||||||
throw(std::logic_error("Failed to set the transparent color"));
|
|
||||||
}
|
|
||||||
if (!local) {
|
|
||||||
throw(std::logic_error("Cannot set the transparent color of a non-local surface"));
|
|
||||||
}
|
|
||||||
SDL_SetColorKey(surface, SDL_SRCCOLORKEY, SDL_MapRGB(surface->format, r, g, b));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Image::ClearTransparentColor() {
|
|
||||||
if (!surface) {
|
|
||||||
throw(std::logic_error("Failed to clear the transparent color"));
|
|
||||||
}
|
|
||||||
if (!local) {
|
|
||||||
throw(std::logic_error("Cannot clear the transparent color of a non-local surface"));
|
|
||||||
}
|
|
||||||
SDL_SetColorKey(surface, 0, 0);
|
|
||||||
}
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef IMAGE_HPP_
|
|
||||||
#define IMAGE_HPP_
|
|
||||||
|
|
||||||
#include "SDL/SDL.h"
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
class Image {
|
|
||||||
public:
|
|
||||||
Image() = default;
|
|
||||||
Image(Image const& rhs) { *this = rhs; }
|
|
||||||
Image(Image&& rhs) { *this = std::move(rhs); }
|
|
||||||
Image(std::string fname) { LoadSurface(fname); }
|
|
||||||
Image(Uint16 w, Uint16 h) { CreateSurface(w, h); }
|
|
||||||
Image(SDL_Surface* p) { SetSurface(p); }
|
|
||||||
~Image() { FreeSurface(); }
|
|
||||||
|
|
||||||
Image& operator=(Image const&);
|
|
||||||
Image& operator=(Image&&);
|
|
||||||
|
|
||||||
SDL_Surface* LoadSurface(std::string fname);
|
|
||||||
SDL_Surface* CreateSurface(Uint16 w, Uint16 h);
|
|
||||||
SDL_Surface* SetSurface(SDL_Surface*);
|
|
||||||
SDL_Surface* GetSurface() const { return surface; }
|
|
||||||
void FreeSurface();
|
|
||||||
|
|
||||||
void DrawTo(SDL_Surface* const, Sint16 x, Sint16 y);
|
|
||||||
|
|
||||||
//Clip handlers
|
|
||||||
SDL_Rect SetClip(SDL_Rect r) { return clip = r; }
|
|
||||||
SDL_Rect GetClip() const { return clip; }
|
|
||||||
|
|
||||||
Sint16 SetClipX(Sint16 x) { return clip.x = x; }
|
|
||||||
Sint16 SetClipY(Sint16 y) { return clip.y = y; }
|
|
||||||
Uint16 SetClipW(Uint16 w) { return clip.w = w; }
|
|
||||||
Uint16 SetClipH(Uint16 h) { return clip.h = h; }
|
|
||||||
|
|
||||||
Sint16 GetClipX() const { return clip.x; }
|
|
||||||
Sint16 GetClipY() const { return clip.y; }
|
|
||||||
Uint16 GetClipW() const { return clip.w; }
|
|
||||||
Uint16 GetClipH() const { return clip.h; }
|
|
||||||
|
|
||||||
bool GetLocal() const { return local; }
|
|
||||||
|
|
||||||
void SetTransparentColor(Uint8 r, Uint8 g, Uint8 b);
|
|
||||||
void ClearTransparentColor();
|
|
||||||
protected:
|
|
||||||
SDL_Surface* surface = nullptr;
|
|
||||||
SDL_Rect clip = {0, 0, 0, 0};
|
|
||||||
bool local = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#config
|
|
||||||
INCLUDES+=. ../map
|
|
||||||
LIBS+=
|
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
|
||||||
|
|
||||||
#source
|
|
||||||
CXXSRC=$(wildcard *.cpp)
|
|
||||||
|
|
||||||
#objects
|
|
||||||
OBJDIR=obj
|
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
|
||||||
|
|
||||||
#output
|
|
||||||
OUTDIR=../..
|
|
||||||
OUT=$(addprefix $(OUTDIR)/,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 $@ $<
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "sprite_sheet.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
void SpriteSheet::Update(double delta) {
|
|
||||||
if (delay && (tick += delta) >= delay) {
|
|
||||||
if (++xIndex >= xCount) {
|
|
||||||
xIndex = 0;
|
|
||||||
}
|
|
||||||
tick = 0;
|
|
||||||
}
|
|
||||||
image.SetClipX(xIndex * image.GetClipW());
|
|
||||||
image.SetClipY(yIndex * image.GetClipH());
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Surface* SpriteSheet::LoadSurface(std::string fname, Uint16 xCellCount, Uint16 yCellCount) {
|
|
||||||
image.LoadSurface(fname);
|
|
||||||
|
|
||||||
xCount = xCellCount;
|
|
||||||
yCount = yCellCount;
|
|
||||||
|
|
||||||
image.SetClipW(image.GetSurface()->w / xCount);
|
|
||||||
image.SetClipH(image.GetSurface()->h / yCount);
|
|
||||||
|
|
||||||
xIndex = yIndex = 0;
|
|
||||||
delay = tick = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Surface* SpriteSheet::SetSurface(SDL_Surface* surface, Uint16 xCellCount, Uint16 yCellCount) {
|
|
||||||
image.SetSurface(surface);
|
|
||||||
|
|
||||||
xCount = xCellCount;
|
|
||||||
yCount = yCellCount;
|
|
||||||
|
|
||||||
image.SetClipW(image.GetSurface()->w / xCount);
|
|
||||||
image.SetClipH(image.GetSurface()->h / yCount);
|
|
||||||
|
|
||||||
xIndex = yIndex = 0;
|
|
||||||
delay = tick = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpriteSheet::FreeSurface() {
|
|
||||||
image.FreeSurface();
|
|
||||||
xCount = yCount = 0;
|
|
||||||
xIndex = yIndex = 0;
|
|
||||||
delay = tick = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Uint16 SpriteSheet::SetXCount(Uint16 i) {
|
|
||||||
xIndex = 0;
|
|
||||||
return xCount = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
Uint16 SpriteSheet::SetYCount(Uint16 i) {
|
|
||||||
yIndex = 0;
|
|
||||||
return yCount = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
Uint16 SpriteSheet::SetXIndex(Uint16 i) {
|
|
||||||
if (i > xCount) {
|
|
||||||
std::ostringstream os;
|
|
||||||
os << "Cannot set x index to " << i;
|
|
||||||
throw(std::invalid_argument(os.str()));
|
|
||||||
}
|
|
||||||
return xIndex = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
Uint16 SpriteSheet::SetYIndex(Uint16 i) {
|
|
||||||
if (i > yCount) {
|
|
||||||
std::ostringstream os;
|
|
||||||
os << "Cannot set y index to " << i;
|
|
||||||
throw(std::invalid_argument(os.str()));
|
|
||||||
}
|
|
||||||
return yIndex = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
double SpriteSheet::SetDelay(double d) {
|
|
||||||
tick = 0;
|
|
||||||
return delay = d;
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef SPRITESHEET_HPP_
|
|
||||||
#define SPRITESHEET_HPP_
|
|
||||||
|
|
||||||
#include "image.hpp"
|
|
||||||
|
|
||||||
class SpriteSheet {
|
|
||||||
public:
|
|
||||||
SpriteSheet() = default;
|
|
||||||
SpriteSheet(std::string fname, Uint16 xCellCount, Uint16 yCellCount) { LoadSurface(fname, xCellCount, yCellCount); }
|
|
||||||
SpriteSheet(SDL_Surface* surface, Uint16 xCellCount, Uint16 yCellCount) { SetSurface(surface, xCellCount, yCellCount); }
|
|
||||||
~SpriteSheet() { FreeSurface(); };
|
|
||||||
|
|
||||||
void Update(double delta);
|
|
||||||
|
|
||||||
SDL_Surface* LoadSurface(std::string fname, Uint16 xCellCount, Uint16 yCellCount);
|
|
||||||
SDL_Surface* SetSurface(SDL_Surface* surface, Uint16 xCellCount, Uint16 yCellCount);
|
|
||||||
SDL_Surface* GetSurface() { return image.GetSurface(); }
|
|
||||||
void FreeSurface();
|
|
||||||
|
|
||||||
void DrawTo(SDL_Surface* const dest, Sint16 x, Sint16 y) { image.DrawTo(dest, x, y); }
|
|
||||||
|
|
||||||
//accessors and mutators
|
|
||||||
Image* GetImage() { return ℑ } //OO breaker
|
|
||||||
|
|
||||||
Uint16 SetXCount(Uint16);
|
|
||||||
Uint16 SetYCount(Uint16);
|
|
||||||
Uint16 SetXIndex(Uint16);
|
|
||||||
Uint16 SetYIndex(Uint16);
|
|
||||||
|
|
||||||
Uint16 GetXCount() const { return xCount; }
|
|
||||||
Uint16 GetYCount() const { return yCount; }
|
|
||||||
Uint16 GetXIndex() const { return xIndex; }
|
|
||||||
Uint16 GetYIndex() const { return yIndex; }
|
|
||||||
|
|
||||||
double SetDelay(double d);
|
|
||||||
double GetDelay() const { return delay; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
Image image;
|
|
||||||
Uint16 xCount = 0, yCount = 0; //number of cells
|
|
||||||
Uint16 xIndex = 0, yIndex = 0; //current cell being drawn
|
|
||||||
double delay = 0.0, tick = 0.0;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "tile_sheet.hpp"
|
|
||||||
|
|
||||||
void TileSheet::Load(std::string fname, int tileWidth, int tileHeight) {
|
|
||||||
image.LoadSurface(fname);
|
|
||||||
image.SetClipW(tileWidth);
|
|
||||||
image.SetClipH(tileHeight);
|
|
||||||
xCount = image.GetSurface()->w / image.GetClipW();
|
|
||||||
yCount = image.GetSurface()->h / image.GetClipH();
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheet::Unload() {
|
|
||||||
image.FreeSurface();
|
|
||||||
xCount = yCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheet::DrawTileTo(SDL_Surface* const dest, int x, int y, Region::type_t tile) {
|
|
||||||
//0 is invisible
|
|
||||||
if (tile == 0) return;
|
|
||||||
image.SetClipX((tile-1) % xCount * image.GetClipW());
|
|
||||||
image.SetClipY((tile-1) / xCount * image.GetClipH());
|
|
||||||
image.DrawTo(dest, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheet::DrawRegionTo(SDL_Surface* const dest, Region* const region, int camX, int camY) {
|
|
||||||
Region::type_t tile = 0;
|
|
||||||
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) {
|
|
||||||
tile = region->GetTile(i, j, k);
|
|
||||||
//0 is invisible
|
|
||||||
if (tile == 0) continue;
|
|
||||||
image.SetClipX((tile-1) % xCount * image.GetClipW());
|
|
||||||
image.SetClipY((tile-1) / xCount * image.GetClipH());
|
|
||||||
image.DrawTo(dest,
|
|
||||||
(region->GetX() + i) * image.GetClipW() - camX,
|
|
||||||
(region->GetY() + j) * image.GetClipH() - camY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef TILESHEET_HPP_
|
|
||||||
#define TILESHEET_HPP_
|
|
||||||
|
|
||||||
#include "region.hpp"
|
|
||||||
|
|
||||||
#include "image.hpp"
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
class TileSheet {
|
|
||||||
public:
|
|
||||||
TileSheet() = default;
|
|
||||||
TileSheet(std::string f, int w, int h) { Load(f, w, h); }
|
|
||||||
~TileSheet() = default;
|
|
||||||
|
|
||||||
void Load(std::string fname, int tileWidth, int tileHeight);
|
|
||||||
void Unload();
|
|
||||||
|
|
||||||
void DrawTileTo(SDL_Surface* const dest, int x, int y, Region::type_t tile);
|
|
||||||
void DrawRegionTo(SDL_Surface* const dest, Region* const region, int camX, int camY);
|
|
||||||
|
|
||||||
//accessors
|
|
||||||
Image* GetImage() { return ℑ }
|
|
||||||
int GetXCount() { return xCount; }
|
|
||||||
int GetYCount() { return yCount; }
|
|
||||||
int GetTileW() { return image.GetClipW(); }
|
|
||||||
int GetTileH() { return image.GetClipH(); }
|
|
||||||
private:
|
|
||||||
Image image;
|
|
||||||
int xCount = 0, yCount = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
all:
|
|
||||||
$(MAKE) -C debugging
|
|
||||||
$(MAKE) -C gameplay
|
|
||||||
$(MAKE) -C graphics
|
|
||||||
$(MAKE) -C map
|
|
||||||
$(MAKE) -C network
|
|
||||||
$(MAKE) -C ui
|
|
||||||
$(MAKE) -C utilities
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#config
|
|
||||||
INCLUDES+=. ../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 $@ $<
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "region.hpp"
|
|
||||||
|
|
||||||
#include <cmath>
|
|
||||||
#include <cstring>
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
int snapToBase(int base, int x) {
|
|
||||||
return floor((double)x / base) * base;
|
|
||||||
}
|
|
||||||
|
|
||||||
Region::Region(int argX, int argY): x(argX), y(argY) {
|
|
||||||
if (x != snapToBase(REGION_WIDTH, x) || y != snapToBase(REGION_HEIGHT, y)) {
|
|
||||||
throw(std::invalid_argument("Region location is off grid"));
|
|
||||||
}
|
|
||||||
memset(tiles, 0, REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH*sizeof(type_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
Region::Region(Region const& rhs): x(rhs.x), y(rhs.y) {
|
|
||||||
memcpy(tiles, rhs.tiles, REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH*sizeof(type_t));
|
|
||||||
solid = rhs.solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
Region::type_t Region::SetTile(int x, int y, int z, type_t v) {
|
|
||||||
if (x < 0 || y < 0 || z < 0 || x >= REGION_WIDTH || y >= REGION_HEIGHT || z >= REGION_DEPTH) {
|
|
||||||
throw(std::out_of_range("Region::SetTile() argument out of range"));
|
|
||||||
}
|
|
||||||
return tiles[x][y][z] = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
Region::type_t Region::GetTile(int x, int y, int z) {
|
|
||||||
if (x < 0 || y < 0 || z < 0 || x >= REGION_WIDTH || y >= REGION_HEIGHT || z >= REGION_DEPTH) {
|
|
||||||
throw(std::out_of_range("Region::GetTile() argument out of range"));
|
|
||||||
}
|
|
||||||
return tiles[x][y][z];
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Region::SetSolid(int x, int y, bool b) {
|
|
||||||
if (x < 0 || y < 0 || x >= REGION_WIDTH || y >= REGION_HEIGHT) {
|
|
||||||
throw(std::out_of_range("Region::SetSolid() argument out of range"));
|
|
||||||
}
|
|
||||||
return solid[x * REGION_WIDTH + y] = b;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Region::GetSolid(int x, int y) {
|
|
||||||
if (x < 0 || y < 0 || x >= REGION_WIDTH || y >= REGION_HEIGHT) {
|
|
||||||
throw(std::out_of_range("Region::GetSolid() argument out of range"));
|
|
||||||
}
|
|
||||||
return solid[x * REGION_WIDTH + y];
|
|
||||||
}
|
|
||||||
|
|
||||||
int Region::GetX() const {
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Region::GetY() const {
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::bitset<REGION_WIDTH*REGION_HEIGHT>* Region::GetSolidBitset() {
|
|
||||||
return &solid;
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef REGION_HPP_
|
|
||||||
#define REGION_HPP_
|
|
||||||
|
|
||||||
#include <bitset>
|
|
||||||
|
|
||||||
//the region's storage format
|
|
||||||
constexpr int REGION_WIDTH = 20;
|
|
||||||
constexpr int REGION_HEIGHT = 20;
|
|
||||||
constexpr int REGION_DEPTH = 3;
|
|
||||||
|
|
||||||
//utility function
|
|
||||||
int snapToBase(int base, int x);
|
|
||||||
|
|
||||||
class Region {
|
|
||||||
public:
|
|
||||||
typedef unsigned char type_t;
|
|
||||||
|
|
||||||
Region() = delete;
|
|
||||||
Region(int x, int y);
|
|
||||||
Region(Region const&);
|
|
||||||
~Region() = default;
|
|
||||||
|
|
||||||
type_t SetTile(int x, int y, int z, type_t v);
|
|
||||||
type_t GetTile(int x, int y, int z);
|
|
||||||
|
|
||||||
bool SetSolid(int x, int y, bool b);
|
|
||||||
bool GetSolid(int x, int y);
|
|
||||||
|
|
||||||
//accessors
|
|
||||||
int GetX() const;
|
|
||||||
int GetY() const;
|
|
||||||
|
|
||||||
std::bitset<REGION_WIDTH*REGION_HEIGHT>* GetSolidBitset();
|
|
||||||
private:
|
|
||||||
const int x;
|
|
||||||
const int y;
|
|
||||||
|
|
||||||
type_t tiles[REGION_WIDTH][REGION_HEIGHT][REGION_DEPTH];
|
|
||||||
std::bitset<REGION_WIDTH*REGION_HEIGHT> solid;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "region_api.hpp"
|
|
||||||
|
|
||||||
#include "region.hpp"
|
|
||||||
|
|
||||||
static int setTile(lua_State* L) {
|
|
||||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
|
||||||
int ret = region->SetTile(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_tointeger(L, 4)-1, lua_tointeger(L, 5));
|
|
||||||
lua_pushinteger(L, ret);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getTile(lua_State* L) {
|
|
||||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
|
||||||
int ret = region->GetTile(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_tointeger(L, 4)-1);
|
|
||||||
lua_pushinteger(L, ret);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int setSolid(lua_State* L) {
|
|
||||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
|
||||||
bool ret = region->SetSolid(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_toboolean(L, 4));
|
|
||||||
lua_pushboolean(L, ret);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getSolid(lua_State* L) {
|
|
||||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
|
||||||
bool ret = region->GetSolid(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1);
|
|
||||||
lua_pushboolean(L, ret);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getX(lua_State* L) {
|
|
||||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
|
||||||
lua_pushinteger(L, region->GetX());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getY(lua_State* L) {
|
|
||||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
|
||||||
lua_pushinteger(L, region->GetY());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getWidth(lua_State* L) {
|
|
||||||
lua_pushinteger(L, REGION_WIDTH);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getHeight(lua_State* L) {
|
|
||||||
lua_pushinteger(L, REGION_HEIGHT);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getDepth(lua_State* L) {
|
|
||||||
lua_pushinteger(L, REGION_DEPTH);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const luaL_Reg regionLib[] = {
|
|
||||||
{"SetTile",setTile},
|
|
||||||
{"GetTile",getTile},
|
|
||||||
{"SetSolid",setSolid},
|
|
||||||
{"GetSolid",getSolid},
|
|
||||||
{"GetX",getX},
|
|
||||||
{"GetY",getY},
|
|
||||||
|
|
||||||
//the global macros
|
|
||||||
{"GetWidth",getWidth},
|
|
||||||
{"GetHeight",getHeight},
|
|
||||||
{"GetDepth",getDepth},
|
|
||||||
{nullptr, nullptr}
|
|
||||||
};
|
|
||||||
|
|
||||||
LUAMOD_API int openRegionAPI(lua_State* L) {
|
|
||||||
luaL_newlib(L, regionLib);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef REGIONAPI_HPP_
|
|
||||||
#define REGIONAPI_HPP_
|
|
||||||
|
|
||||||
#include "lua.hpp"
|
|
||||||
|
|
||||||
#define TORTUGA_REGION_API "region"
|
|
||||||
LUAMOD_API int openRegionAPI(lua_State* L);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,172 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "region_pager_api.hpp"
|
|
||||||
|
|
||||||
#include "region_pager_lua.hpp"
|
|
||||||
#include "region.hpp"
|
|
||||||
|
|
||||||
//DOCS: These glue functions simply wrap RegionPagerLua's methods
|
|
||||||
//NOTE: zero indexing is used here, but not in the region API
|
|
||||||
|
|
||||||
static int setTile(lua_State* L) {
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
|
||||||
int ret = pager->SetTile(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5));
|
|
||||||
lua_pushinteger(L, ret);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getTile(lua_State* L) {
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
|
||||||
int ret = pager->GetTile(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4));
|
|
||||||
lua_pushinteger(L, ret);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int setSolid(lua_State* L) {
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
|
||||||
bool ret = pager->SetSolid(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_toboolean(L, 4));
|
|
||||||
lua_pushboolean(L, ret);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getSolid(lua_State* L) {
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
|
||||||
bool ret = pager->GetSolid(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
|
||||||
lua_pushboolean(L, ret);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getRegion(lua_State* L) {
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
|
||||||
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
|
||||||
lua_pushlightuserdata(L, region);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int loadRegion(lua_State* L) {
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
|
||||||
Region* region = pager->LoadRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
|
||||||
lua_pushlightuserdata(L, region);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int saveRegion(lua_State* L) {
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
|
||||||
Region* region = pager->SaveRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
|
||||||
lua_pushlightuserdata(L, region);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int createRegion(lua_State* L) {
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
|
||||||
Region* region = pager->CreateRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
|
||||||
lua_pushlightuserdata(L, region);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int unloadRegion(lua_State* L) {
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
|
||||||
|
|
||||||
//two argument types: coords & the region itself
|
|
||||||
switch(lua_type(L, 2)) {
|
|
||||||
case LUA_TNUMBER:
|
|
||||||
pager->UnloadIf([&](Region const& region) -> bool {
|
|
||||||
int x = lua_tointeger(L, 2);
|
|
||||||
int y = lua_tointeger(L, 3);
|
|
||||||
return region.GetX() == x && region.GetY() == y;
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case LUA_TLIGHTUSERDATA:
|
|
||||||
pager->UnloadIf([&](Region const& region) -> bool {
|
|
||||||
return (®ion) == lua_touserdata(L, 2);
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
//debugging
|
|
||||||
static int containerSize(lua_State* L) {
|
|
||||||
RegionPagerLua* pager = static_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
|
||||||
lua_pushinteger(L, pager->GetContainer()->size());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const luaL_Reg regionPagerLib[] = {
|
|
||||||
//curry
|
|
||||||
{"SetTile", setTile},
|
|
||||||
{"GetTile", getTile},
|
|
||||||
{"SetSolid", setSolid},
|
|
||||||
{"GetSolid", getSolid},
|
|
||||||
|
|
||||||
//access and control
|
|
||||||
{"GetRegion", getRegion},
|
|
||||||
{"LoadRegion", loadRegion},
|
|
||||||
{"SaveRegion", saveRegion},
|
|
||||||
{"CreateRegion", createRegion},
|
|
||||||
{"UnloadRegion", unloadRegion},
|
|
||||||
|
|
||||||
//triggers
|
|
||||||
{"SetOnLoad",setOnLoad},
|
|
||||||
{"SetOnSave",setOnSave},
|
|
||||||
{"SetOnCreate",setOnCreate},
|
|
||||||
{"SetOnUnload",setOnUnload},
|
|
||||||
|
|
||||||
//debugging
|
|
||||||
{"ContainerSize", containerSize},
|
|
||||||
|
|
||||||
//sentinel
|
|
||||||
{nullptr, nullptr}
|
|
||||||
};
|
|
||||||
|
|
||||||
LUAMOD_API int openRegionPagerAPI(lua_State* L) {
|
|
||||||
luaL_newlib(L, regionPagerLib);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef REGIONPAGERAPI_HPP_
|
|
||||||
#define REGIONPAGERAPI_HPP_
|
|
||||||
|
|
||||||
#include "lua.hpp"
|
|
||||||
|
|
||||||
#define TORTUGA_REGION_PAGER_API "region_pager"
|
|
||||||
LUAMOD_API int openRegionPagerAPI(lua_State* L);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "region_pager_base.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
RegionPagerBase::~RegionPagerBase() {
|
|
||||||
UnloadAll();
|
|
||||||
};
|
|
||||||
|
|
||||||
Region::type_t RegionPagerBase::SetTile(int x, int y, int z, Region::type_t v) {
|
|
||||||
Region* ptr = GetRegion(x, y);
|
|
||||||
return ptr->SetTile(x - ptr->GetX(), y - ptr->GetY(), z, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
Region::type_t RegionPagerBase::GetTile(int x, int y, int z) {
|
|
||||||
Region* ptr = GetRegion(x, y);
|
|
||||||
return ptr->GetTile(x - ptr->GetX(), y - ptr->GetY(), z);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RegionPagerBase::SetSolid(int x, int y, int b) {
|
|
||||||
Region* ptr = GetRegion(x, y);
|
|
||||||
return ptr->SetSolid(x - ptr->GetX(), y - ptr->GetY(), b);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RegionPagerBase::GetSolid(int x, int y) {
|
|
||||||
Region* ptr = GetRegion(x, y);
|
|
||||||
return ptr->GetSolid(x - ptr->GetX(), y - ptr->GetY());
|
|
||||||
}
|
|
||||||
|
|
||||||
Region* RegionPagerBase::GetRegion(int x, int y) {
|
|
||||||
x = snapToBase(REGION_WIDTH, x);
|
|
||||||
y = snapToBase(REGION_HEIGHT, y);
|
|
||||||
|
|
||||||
//get the region by various means
|
|
||||||
Region* ptr = nullptr;
|
|
||||||
ptr = FindRegion(x, y);
|
|
||||||
if (ptr) return ptr;
|
|
||||||
ptr = LoadRegion(x, y);
|
|
||||||
if (ptr) return ptr;
|
|
||||||
return CreateRegion(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
Region* RegionPagerBase::FindRegion(int x, int y) {
|
|
||||||
//find the region
|
|
||||||
std::list<Region>::iterator it = find_if(regionList.begin(), regionList.end(), [x, y](Region& region) -> bool {
|
|
||||||
return region.GetX() == x && region.GetY() == y;
|
|
||||||
});
|
|
||||||
return it != regionList.end() ? &(*it) : nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
Region* RegionPagerBase::PushRegion(Region* const ptr) {
|
|
||||||
//BUG: #45 Some regions are occasionally losing their tile data
|
|
||||||
regionList.push_front(*ptr);
|
|
||||||
return ®ionList.front();
|
|
||||||
}
|
|
||||||
|
|
||||||
Region* RegionPagerBase::LoadRegion(int x, int y) {
|
|
||||||
//EMPTY, intended for override
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
Region* RegionPagerBase::SaveRegion(int x, int y) {
|
|
||||||
//EMPTY, intended for override
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
Region* RegionPagerBase::CreateRegion(int x, int y) {
|
|
||||||
if (FindRegion(x, y)) {
|
|
||||||
throw(std::logic_error("Cannot overwrite an existing region"));
|
|
||||||
}
|
|
||||||
regionList.emplace_front(x, y);
|
|
||||||
return ®ionList.front();
|
|
||||||
}
|
|
||||||
|
|
||||||
void RegionPagerBase::UnloadIf(std::function<bool(Region const&)> fn) {
|
|
||||||
regionList.remove_if(fn);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RegionPagerBase::UnloadAll() {
|
|
||||||
regionList.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::list<Region>* RegionPagerBase::GetContainer() {
|
|
||||||
return ®ionList;
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef REGIONPAGERBASE_HPP_
|
|
||||||
#define REGIONPAGERBASE_HPP_
|
|
||||||
|
|
||||||
#include "region.hpp"
|
|
||||||
|
|
||||||
#include <functional>
|
|
||||||
#include <list>
|
|
||||||
|
|
||||||
class RegionPagerBase {
|
|
||||||
public:
|
|
||||||
RegionPagerBase() = default;
|
|
||||||
virtual ~RegionPagerBase();
|
|
||||||
|
|
||||||
//tile manipulation
|
|
||||||
virtual Region::type_t SetTile(int x, int y, int z, Region::type_t v);
|
|
||||||
virtual Region::type_t GetTile(int x, int y, int z);
|
|
||||||
|
|
||||||
//solid manipulation
|
|
||||||
virtual bool SetSolid(int x, int y, int b);
|
|
||||||
virtual bool GetSolid(int x, int y);
|
|
||||||
|
|
||||||
//region manipulation
|
|
||||||
virtual Region* GetRegion(int x, int y);
|
|
||||||
virtual Region* FindRegion(int x, int y);
|
|
||||||
virtual Region* PushRegion(Region* const);
|
|
||||||
|
|
||||||
virtual Region* LoadRegion(int x, int y);
|
|
||||||
virtual Region* SaveRegion(int x, int y);
|
|
||||||
virtual Region* CreateRegion(int x, int y);
|
|
||||||
|
|
||||||
virtual void UnloadIf(std::function<bool(Region const&)> fn);
|
|
||||||
virtual void UnloadAll();
|
|
||||||
|
|
||||||
//accessors & mutators
|
|
||||||
std::list<Region>* GetContainer();
|
|
||||||
protected:
|
|
||||||
std::list<Region> regionList;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,200 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "region_pager_lua.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
//DOCS: Load, Save and Create fail unless the lua function has been set
|
|
||||||
//DOCS: UnloadIf and UnloadAll will still continue without the function set
|
|
||||||
|
|
||||||
RegionPagerLua::~RegionPagerLua() {
|
|
||||||
//unload all regions
|
|
||||||
UnloadAll();
|
|
||||||
//clear any stored functions
|
|
||||||
luaL_unref(lua, LUA_REGISTRYINDEX, loadRef);
|
|
||||||
luaL_unref(lua, LUA_REGISTRYINDEX, saveRef);
|
|
||||||
luaL_unref(lua, LUA_REGISTRYINDEX, createRef);
|
|
||||||
luaL_unref(lua, LUA_REGISTRYINDEX, unloadRef);
|
|
||||||
}
|
|
||||||
|
|
||||||
//return the loaded region, or nullptr on failure
|
|
||||||
Region* RegionPagerLua::LoadRegion(int x, int y) {
|
|
||||||
//get the pager's function from the registry
|
|
||||||
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
|
|
||||||
Region tmpRegion(x, y);
|
|
||||||
lua_pushlightuserdata(lua, &tmpRegion);
|
|
||||||
|
|
||||||
//call the funtion, 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);
|
|
||||||
regionList.push_front(tmpRegion);
|
|
||||||
return ®ionList.front();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
lua_pop(lua, 1);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//return the saved region, or nullptr on failure
|
|
||||||
Region* RegionPagerLua::SaveRegion(int x, int y) {
|
|
||||||
//get the pager's function from the registry
|
|
||||||
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);
|
|
||||||
if (!ptr) {
|
|
||||||
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 the created region, or nullptr on failure
|
|
||||||
Region* RegionPagerLua::CreateRegion(int x, int y) {
|
|
||||||
if (FindRegion(x, y)) {
|
|
||||||
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
|
|
||||||
Region tmpRegion(x, y);
|
|
||||||
lua_pushlightuserdata(lua, &tmpRegion);
|
|
||||||
|
|
||||||
//call the function, 1 arg, 0 return
|
|
||||||
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
|
|
||||||
}
|
|
||||||
|
|
||||||
//return the new region
|
|
||||||
regionList.push_front(tmpRegion);
|
|
||||||
return ®ionList.front();
|
|
||||||
}
|
|
||||||
|
|
||||||
//no return
|
|
||||||
void RegionPagerLua::UnloadIf(std::function<bool(Region const&)> fn) {
|
|
||||||
//get the pager's function from the registry
|
|
||||||
lua_rawgeti(lua, LUA_REGISTRYINDEX, unloadRef);
|
|
||||||
|
|
||||||
//check if this function is available
|
|
||||||
if (lua_isnil(lua, -1)) {
|
|
||||||
lua_pop(lua, 1);
|
|
||||||
//remove the regions anyway
|
|
||||||
regionList.remove_if(fn);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//run each region through this lambda
|
|
||||||
regionList.remove_if([&](Region& region) -> bool {
|
|
||||||
if (fn(region)) {
|
|
||||||
|
|
||||||
//push a copy of the function onto the stack with the region
|
|
||||||
lua_pushvalue(lua, -1);
|
|
||||||
lua_pushlightuserdata(lua, static_cast<void*>(®ion));
|
|
||||||
|
|
||||||
//call the function, 1 arg, 0 return
|
|
||||||
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
|
|
||||||
}
|
|
||||||
|
|
||||||
//signal to the container
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//signal to the container
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
//pop the base copy of the function
|
|
||||||
lua_pop(lua, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RegionPagerLua::UnloadAll() {
|
|
||||||
//get the pager's function from the registry
|
|
||||||
lua_rawgeti(lua, LUA_REGISTRYINDEX, unloadRef);
|
|
||||||
|
|
||||||
//check if this function is available
|
|
||||||
if (lua_isnil(lua, -1)) {
|
|
||||||
lua_pop(lua, 1);
|
|
||||||
//remove the regions anyway
|
|
||||||
regionList.clear();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto& it : regionList) {
|
|
||||||
//push a copy of the function onto the stack with the region
|
|
||||||
lua_pushvalue(lua, -1);
|
|
||||||
lua_pushlightuserdata(lua, &it);
|
|
||||||
|
|
||||||
//call the function, 1 arg, 0 return
|
|
||||||
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//pop the base copy of the function
|
|
||||||
lua_pop(lua, 1);
|
|
||||||
|
|
||||||
//remove from memory
|
|
||||||
regionList.clear();
|
|
||||||
}
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef REGIONPAGERLUA_HPP_
|
|
||||||
#define REGIONPAGERLUA_HPP_
|
|
||||||
|
|
||||||
#include "region_pager_base.hpp"
|
|
||||||
|
|
||||||
#include "lua.hpp"
|
|
||||||
|
|
||||||
#include <functional>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
class RegionPagerLua : public RegionPagerBase {
|
|
||||||
public:
|
|
||||||
RegionPagerLua() = default;
|
|
||||||
~RegionPagerLua();
|
|
||||||
|
|
||||||
//region manipulation
|
|
||||||
Region* LoadRegion(int x, int y) override;
|
|
||||||
Region* SaveRegion(int x, int y) override;
|
|
||||||
Region* CreateRegion(int x, int y) override;
|
|
||||||
|
|
||||||
void UnloadIf(std::function<bool(Region const&)> fn) override;
|
|
||||||
void UnloadAll() override;
|
|
||||||
|
|
||||||
//accessors & mutators
|
|
||||||
lua_State* SetLuaState(lua_State* L) { return lua = L; }
|
|
||||||
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:
|
|
||||||
lua_State* lua = nullptr;
|
|
||||||
|
|
||||||
int loadRef = LUA_NOREF;
|
|
||||||
int saveRef = LUA_NOREF;
|
|
||||||
int createRef = LUA_NOREF;
|
|
||||||
int unloadRef = LUA_NOREF;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#config
|
|
||||||
INCLUDES+=. packet_types ../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)
|
|
||||||
$(MAKE) -C packet_types
|
|
||||||
|
|
||||||
$(OBJ): | $(OBJDIR)
|
|
||||||
|
|
||||||
$(OUT): | $(OUTDIR)
|
|
||||||
|
|
||||||
$(OBJDIR):
|
|
||||||
mkdir $(OBJDIR)
|
|
||||||
|
|
||||||
$(OUTDIR):
|
|
||||||
mkdir $(OUTDIR)
|
|
||||||
|
|
||||||
$(OBJDIR)/%.o: %.cpp
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "character_packet.hpp"
|
|
||||||
|
|
||||||
#include "serial_utility.hpp"
|
|
||||||
|
|
||||||
void serializeCharacter(void* buffer, CharacterPacket* packet) {
|
|
||||||
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//identify the character
|
|
||||||
serialCopy(&buffer, &packet->characterIndex, sizeof(int));
|
|
||||||
serialCopy(&buffer, packet->handle, PACKET_STRING_SIZE);
|
|
||||||
serialCopy(&buffer, packet->avatar, PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//the owner
|
|
||||||
serialCopy(&buffer, &packet->accountIndex, sizeof(int));
|
|
||||||
|
|
||||||
//location
|
|
||||||
serialCopy(&buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
|
|
||||||
serialCopy(&buffer, &packet->origin.x, sizeof(double));
|
|
||||||
serialCopy(&buffer, &packet->origin.y, sizeof(double));
|
|
||||||
|
|
||||||
serialCopy(&buffer, &packet->motion.x, sizeof(double));
|
|
||||||
serialCopy(&buffer, &packet->motion.y, sizeof(double));
|
|
||||||
|
|
||||||
serialCopy(&buffer, &packet->bounds.x, sizeof(int));
|
|
||||||
serialCopy(&buffer, &packet->bounds.y, sizeof(int));
|
|
||||||
serialCopy(&buffer, &packet->bounds.w, sizeof(int));
|
|
||||||
serialCopy(&buffer, &packet->bounds.h, sizeof(int));
|
|
||||||
|
|
||||||
//gameplay components: equipment, items, buffs, debuffs...
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeCharacter(void* buffer, CharacterPacket* packet) {
|
|
||||||
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//identify the character
|
|
||||||
deserialCopy(&buffer, &packet->characterIndex, sizeof(int));
|
|
||||||
deserialCopy(&buffer, packet->handle, PACKET_STRING_SIZE);
|
|
||||||
deserialCopy(&buffer, packet->avatar, PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//the owner
|
|
||||||
deserialCopy(&buffer, &packet->accountIndex, sizeof(int));
|
|
||||||
|
|
||||||
//location
|
|
||||||
deserialCopy(&buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
|
|
||||||
deserialCopy(&buffer, &packet->origin.x, sizeof(double));
|
|
||||||
deserialCopy(&buffer, &packet->origin.y, sizeof(double));
|
|
||||||
|
|
||||||
deserialCopy(&buffer, &packet->motion.x, sizeof(double));
|
|
||||||
deserialCopy(&buffer, &packet->motion.y, sizeof(double));
|
|
||||||
|
|
||||||
deserialCopy(&buffer, &packet->bounds.x, sizeof(int));
|
|
||||||
deserialCopy(&buffer, &packet->bounds.y, sizeof(int));
|
|
||||||
deserialCopy(&buffer, &packet->bounds.w, sizeof(int));
|
|
||||||
deserialCopy(&buffer, &packet->bounds.h, sizeof(int));
|
|
||||||
|
|
||||||
//gameplay components: equipment, items, buffs, debuffs...
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef CHARACTERPACKET_HPP_
|
|
||||||
#define CHARACTERPACKET_HPP_
|
|
||||||
|
|
||||||
#include "serial_packet_base.hpp"
|
|
||||||
|
|
||||||
#include "bounding_box.hpp"
|
|
||||||
#include "vector2.hpp"
|
|
||||||
|
|
||||||
struct CharacterPacket : SerialPacketBase {
|
|
||||||
//identify the character
|
|
||||||
int characterIndex;
|
|
||||||
char handle[PACKET_STRING_SIZE];
|
|
||||||
char avatar[PACKET_STRING_SIZE];
|
|
||||||
|
|
||||||
//the owner
|
|
||||||
int accountIndex;
|
|
||||||
|
|
||||||
//location
|
|
||||||
int roomIndex;
|
|
||||||
Vector2 origin;
|
|
||||||
Vector2 motion;
|
|
||||||
BoundingBox bounds;
|
|
||||||
};
|
|
||||||
|
|
||||||
void serializeCharacter(void* buffer, CharacterPacket* packet);
|
|
||||||
void deserializeCharacter(void* buffer, CharacterPacket* packet);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "client_packet.hpp"
|
|
||||||
|
|
||||||
#include "serial_utility.hpp"
|
|
||||||
|
|
||||||
void serializeClient(void* buffer, ClientPacket* packet) {
|
|
||||||
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
serialCopy(&buffer, &packet->clientIndex, sizeof(int));
|
|
||||||
serialCopy(&buffer, &packet->accountIndex, sizeof(int));
|
|
||||||
serialCopy(&buffer, packet->username, PACKET_STRING_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeClient(void* buffer, ClientPacket* packet) {
|
|
||||||
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
deserialCopy(&buffer, &packet->clientIndex, sizeof(int));
|
|
||||||
deserialCopy(&buffer, &packet->accountIndex, sizeof(int));
|
|
||||||
deserialCopy(&buffer, packet->username, PACKET_STRING_SIZE);
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef CLIENTPACKET_HPP_
|
|
||||||
#define CLIENTPACKET_HPP_
|
|
||||||
|
|
||||||
#include "serial_packet_base.hpp"
|
|
||||||
|
|
||||||
struct ClientPacket : SerialPacketBase {
|
|
||||||
int clientIndex;
|
|
||||||
int accountIndex;
|
|
||||||
char username[PACKET_STRING_SIZE];
|
|
||||||
//TODO: (3) password, auth token
|
|
||||||
};
|
|
||||||
|
|
||||||
void serializeClient(void* buffer, ClientPacket* packet);
|
|
||||||
void deserializeClient(void* buffer, ClientPacket* packet);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#config
|
|
||||||
INCLUDES+=. .. ../../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 $@ $<
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "monster_packet.hpp"
|
|
||||||
|
|
||||||
#include "serial_utility.hpp"
|
|
||||||
|
|
||||||
void serializeMonster(void* buffer, MonsterPacket* packet) {
|
|
||||||
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//identify the monster
|
|
||||||
serialCopy(&buffer, &packet->monsterIndex, sizeof(int));
|
|
||||||
serialCopy(&buffer, packet->handle, PACKET_STRING_SIZE);
|
|
||||||
serialCopy(&buffer, packet->avatar, PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//bounds
|
|
||||||
serialCopy(&buffer, &packet->bounds.x, sizeof(int));
|
|
||||||
serialCopy(&buffer, &packet->bounds.y, sizeof(int));
|
|
||||||
serialCopy(&buffer, &packet->bounds.w, sizeof(int));
|
|
||||||
serialCopy(&buffer, &packet->bounds.h, sizeof(int));
|
|
||||||
|
|
||||||
|
|
||||||
//location
|
|
||||||
serialCopy(&buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
serialCopy(&buffer, &packet->origin.x, sizeof(double));
|
|
||||||
serialCopy(&buffer, &packet->origin.y, sizeof(double));
|
|
||||||
serialCopy(&buffer, &packet->motion.x, sizeof(double));
|
|
||||||
serialCopy(&buffer, &packet->motion.y, sizeof(double));
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeMonster(void* buffer, MonsterPacket* packet) {
|
|
||||||
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//identify the monster
|
|
||||||
deserialCopy(&buffer, &packet->monsterIndex, sizeof(int));
|
|
||||||
deserialCopy(&buffer, packet->handle, PACKET_STRING_SIZE);
|
|
||||||
deserialCopy(&buffer, packet->avatar, PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//bounds
|
|
||||||
deserialCopy(&buffer, &packet->bounds.x, sizeof(int));
|
|
||||||
deserialCopy(&buffer, &packet->bounds.y, sizeof(int));
|
|
||||||
deserialCopy(&buffer, &packet->bounds.w, sizeof(int));
|
|
||||||
deserialCopy(&buffer, &packet->bounds.h, sizeof(int));
|
|
||||||
|
|
||||||
|
|
||||||
//location
|
|
||||||
deserialCopy(&buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
deserialCopy(&buffer, &packet->origin.x, sizeof(double));
|
|
||||||
deserialCopy(&buffer, &packet->origin.y, sizeof(double));
|
|
||||||
deserialCopy(&buffer, &packet->motion.x, sizeof(double));
|
|
||||||
deserialCopy(&buffer, &packet->motion.y, sizeof(double));
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef MONSTERPACKET_HPP_
|
|
||||||
#define MONSTERPACKET_HPP_
|
|
||||||
|
|
||||||
#include "serial_packet_base.hpp"
|
|
||||||
|
|
||||||
#include "bounding_box.hpp"
|
|
||||||
#include "vector2.hpp"
|
|
||||||
|
|
||||||
struct MonsterPacket : SerialPacketBase {
|
|
||||||
//identify the monster
|
|
||||||
int monsterIndex;
|
|
||||||
char handle[PACKET_STRING_SIZE];
|
|
||||||
char avatar[PACKET_STRING_SIZE];
|
|
||||||
BoundingBox bounds;
|
|
||||||
|
|
||||||
//location
|
|
||||||
int roomIndex;
|
|
||||||
Vector2 origin;
|
|
||||||
Vector2 motion;
|
|
||||||
};
|
|
||||||
|
|
||||||
void serializeMonster(void* buffer, MonsterPacket* packet);
|
|
||||||
void deserializeMonster(void* buffer, MonsterPacket* packet);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "region_packet.hpp"
|
|
||||||
|
|
||||||
#include "serial_utility.hpp"
|
|
||||||
|
|
||||||
void serializeRegion(void* buffer, RegionPacket* packet) {
|
|
||||||
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//format
|
|
||||||
serialCopy(&buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
serialCopy(&buffer, &packet->x, sizeof(int));
|
|
||||||
serialCopy(&buffer, &packet->y, sizeof(int));
|
|
||||||
|
|
||||||
if (packet->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) = packet->region->GetTile(i, j, k);
|
|
||||||
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//solids
|
|
||||||
serialCopy(&buffer, packet->region->GetSolidBitset(), REGION_SOLID_FOOTPRINT);
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeRegion(void* buffer, RegionPacket* packet) {
|
|
||||||
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//format
|
|
||||||
deserialCopy(&buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
deserialCopy(&buffer, &packet->x, sizeof(int));
|
|
||||||
deserialCopy(&buffer, &packet->y, sizeof(int));
|
|
||||||
|
|
||||||
if (packet->type != SerialPacketType::REGION_CONTENT) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//an object to work on
|
|
||||||
packet->region = new Region(packet->x, packet->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++) {
|
|
||||||
packet->region->SetTile(i, j, k, *reinterpret_cast<Region::type_t*>(buffer));
|
|
||||||
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//solids
|
|
||||||
deserialCopy(&buffer, packet->region->GetSolidBitset(), REGION_SOLID_FOOTPRINT);
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef REGIONPACKET_HPP_
|
|
||||||
#define REGIONPACKET_HPP_
|
|
||||||
|
|
||||||
#include "serial_packet_base.hpp"
|
|
||||||
|
|
||||||
#include "region.hpp"
|
|
||||||
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
//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;
|
|
||||||
|
|
||||||
struct RegionPacket : SerialPacketBase {
|
|
||||||
//location/identify the region
|
|
||||||
int roomIndex;
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
//the data
|
|
||||||
Region* region;
|
|
||||||
};
|
|
||||||
|
|
||||||
void serializeRegion(void* buffer, RegionPacket* packet);
|
|
||||||
void deserializeRegion(void* buffer, RegionPacket* packet);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "serial_packet_base.hpp"
|
|
||||||
|
|
||||||
//sanity check
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef SERIALPACKETBASE_HPP_
|
|
||||||
#define SERIALPACKETBASE_HPP_
|
|
||||||
|
|
||||||
#include "serial_packet_type.hpp"
|
|
||||||
|
|
||||||
#include "SDL_net.h"
|
|
||||||
|
|
||||||
constexpr int PACKET_STRING_SIZE = 100;
|
|
||||||
|
|
||||||
struct SerialPacketBase {
|
|
||||||
//members
|
|
||||||
SerialPacketType type;
|
|
||||||
IPaddress srcAddress;
|
|
||||||
|
|
||||||
virtual ~SerialPacketBase() {};
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "server_packet.hpp"
|
|
||||||
|
|
||||||
#include "serial_utility.hpp"
|
|
||||||
|
|
||||||
void serializeServer(void* buffer, ServerPacket* packet) {
|
|
||||||
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//identify the server
|
|
||||||
serialCopy(&buffer, packet->name, PACKET_STRING_SIZE);
|
|
||||||
serialCopy(&buffer, &packet->playerCount, sizeof(int));
|
|
||||||
serialCopy(&buffer, &packet->version, sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeServer(void* buffer, ServerPacket* packet) {
|
|
||||||
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//identify the server
|
|
||||||
deserialCopy(&buffer, packet->name, PACKET_STRING_SIZE);
|
|
||||||
deserialCopy(&buffer, &packet->playerCount, sizeof(int));
|
|
||||||
deserialCopy(&buffer, &packet->version, sizeof(int));
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef SERVERPACKET_HPP_
|
|
||||||
#define SERVERPACKET_HPP_
|
|
||||||
|
|
||||||
#include "serial_packet_base.hpp"
|
|
||||||
|
|
||||||
struct ServerPacket : SerialPacketBase {
|
|
||||||
//identify the server
|
|
||||||
char name[PACKET_STRING_SIZE];
|
|
||||||
int playerCount;
|
|
||||||
int version;
|
|
||||||
};
|
|
||||||
|
|
||||||
void serializeServer(void* buffer, ServerPacket* packet);
|
|
||||||
void deserializeServer(void* buffer, ServerPacket* packet);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "text_packet.hpp"
|
|
||||||
|
|
||||||
#include "serial_utility.hpp"
|
|
||||||
|
|
||||||
void serializeText(void* buffer, TextPacket* packet) {
|
|
||||||
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//content
|
|
||||||
serialCopy(&buffer, packet->name, PACKET_STRING_SIZE);
|
|
||||||
serialCopy(&buffer, packet->text, PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//location
|
|
||||||
serialCopy(&buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
serialCopy(&buffer, &packet->origin.x, sizeof(double));
|
|
||||||
serialCopy(&buffer, &packet->origin.y, sizeof(double));
|
|
||||||
serialCopy(&buffer, &packet->range, sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeText(void* buffer, TextPacket* packet) {
|
|
||||||
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//content
|
|
||||||
deserialCopy(&buffer, packet->name, PACKET_STRING_SIZE);
|
|
||||||
deserialCopy(&buffer, packet->text, PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//location
|
|
||||||
deserialCopy(&buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
deserialCopy(&buffer, &packet->origin.x, sizeof(double));
|
|
||||||
deserialCopy(&buffer, &packet->origin.y, sizeof(double));
|
|
||||||
deserialCopy(&buffer, &packet->range, sizeof(int));
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef TEXTPACKET_HPP_
|
|
||||||
#define TEXTPACKET_HPP_
|
|
||||||
|
|
||||||
#include "serial_packet_base.hpp"
|
|
||||||
|
|
||||||
#include "vector2.hpp"
|
|
||||||
|
|
||||||
struct TextPacket : SerialPacketBase {
|
|
||||||
char name[PACKET_STRING_SIZE];
|
|
||||||
char text[PACKET_STRING_SIZE];
|
|
||||||
int roomIndex;
|
|
||||||
Vector2 origin;
|
|
||||||
int range;
|
|
||||||
};
|
|
||||||
|
|
||||||
void serializeText(void* buffer, TextPacket* packet);
|
|
||||||
void deserializeText(void* buffer, TextPacket* packet);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef SERIALPACKET_HPP_
|
|
||||||
#define SERIALPACKET_HPP_
|
|
||||||
|
|
||||||
#include "serial_packet_base.hpp"
|
|
||||||
#include "character_packet.hpp"
|
|
||||||
#include "client_packet.hpp"
|
|
||||||
#include "monster_packet.hpp"
|
|
||||||
#include "region_packet.hpp"
|
|
||||||
#include "server_packet.hpp"
|
|
||||||
#include "text_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 = 20150304;
|
|
||||||
|
|
||||||
union MaxPacket {
|
|
||||||
CharacterPacket a;
|
|
||||||
ClientPacket b;
|
|
||||||
MonsterPacket c;
|
|
||||||
RegionPacket d;
|
|
||||||
ServerPacket e;
|
|
||||||
TextPacket f;
|
|
||||||
};
|
|
||||||
|
|
||||||
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
|
|
||||||
@@ -1,187 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef 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.
|
|
||||||
* FORMAT_* is for internal use, deviding the different format bounds.
|
|
||||||
*/
|
|
||||||
|
|
||||||
enum class SerialPacketType {
|
|
||||||
//default: there is something wrong
|
|
||||||
NONE,
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//ServerPacket
|
|
||||||
// name, player count, version
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
FORMAT_SERVER,
|
|
||||||
|
|
||||||
//heartbeat
|
|
||||||
PING,
|
|
||||||
PONG,
|
|
||||||
|
|
||||||
//Used for finding available servers
|
|
||||||
BROADCAST_REQUEST,
|
|
||||||
BROADCAST_RESPONSE,
|
|
||||||
|
|
||||||
FORMAT_END_SERVER,
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//ClientPacket
|
|
||||||
// client index, account index, username
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
FORMAT_CLIENT,
|
|
||||||
|
|
||||||
//Connecting to a server as a client
|
|
||||||
JOIN_REQUEST,
|
|
||||||
JOIN_RESPONSE,
|
|
||||||
|
|
||||||
//disconnect from the server
|
|
||||||
DISCONNECT_REQUEST,
|
|
||||||
DISCONNECT_RESPONSE,
|
|
||||||
ADMIN_DISCONNECT_FORCED,
|
|
||||||
|
|
||||||
//load the account
|
|
||||||
LOGIN_REQUEST,
|
|
||||||
LOGIN_RESPONSE,
|
|
||||||
|
|
||||||
//unload the account
|
|
||||||
LOGOUT_REQUEST,
|
|
||||||
LOGOUT_RESPONSE,
|
|
||||||
|
|
||||||
//shut down the server
|
|
||||||
ADMIN_SHUTDOWN_REQUEST,
|
|
||||||
|
|
||||||
FORMAT_END_CLIENT,
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//RegionPacket
|
|
||||||
// room index, x, y, raw data
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
FORMAT_REGION,
|
|
||||||
|
|
||||||
//map data
|
|
||||||
REGION_REQUEST,
|
|
||||||
REGION_CONTENT,
|
|
||||||
|
|
||||||
FORMAT_END_REGION,
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//CharacterPacket
|
|
||||||
// character index,
|
|
||||||
// handle, avatar,
|
|
||||||
// account index (owner),
|
|
||||||
// room index, origin, motion
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
FORMAT_CHARACTER,
|
|
||||||
|
|
||||||
//full data update
|
|
||||||
CHARACTER_UPDATE,
|
|
||||||
|
|
||||||
//character management
|
|
||||||
CHARACTER_CREATE,
|
|
||||||
CHARACTER_DELETE,
|
|
||||||
CHARACTER_LOAD,
|
|
||||||
CHARACTER_UNLOAD,
|
|
||||||
|
|
||||||
//find out info from the server
|
|
||||||
QUERY_CHARACTER_EXISTS,
|
|
||||||
QUERY_CHARACTER_STATS,
|
|
||||||
QUERY_CHARACTER_LOCATION,
|
|
||||||
|
|
||||||
//actions taken
|
|
||||||
CHARACTER_MOVEMENT,
|
|
||||||
CHARACTER_ATTACK,
|
|
||||||
CHARACTER_DAMAGE,
|
|
||||||
|
|
||||||
//admin control
|
|
||||||
// ADMIN_SET_CHARACTER_ORIGIN,
|
|
||||||
|
|
||||||
FORMAT_END_CHARACTER,
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//MonsterPacket
|
|
||||||
// monster index,
|
|
||||||
// handle, avatar
|
|
||||||
// bounds
|
|
||||||
// room index, origin, motion
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
FORMAT_MONSTER,
|
|
||||||
|
|
||||||
//full data update
|
|
||||||
MONSTER_UPDATE,
|
|
||||||
|
|
||||||
//character management
|
|
||||||
MONSTER_CREATE,
|
|
||||||
MONSTER_DELETE,
|
|
||||||
|
|
||||||
//find out info from the server
|
|
||||||
QUERY_MONSTER_EXISTS,
|
|
||||||
QUERY_MONSTER_STATS,
|
|
||||||
QUERY_MONSTER_LOCATION,
|
|
||||||
|
|
||||||
//actions taken
|
|
||||||
MONSTER_MOVEMENT,
|
|
||||||
MONSTER_ATTACK,
|
|
||||||
MONSTER_DAMAGE,
|
|
||||||
|
|
||||||
FORMAT_END_MONSTER,
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//TextPacket
|
|
||||||
// name, text
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
FORMAT_TEXT,
|
|
||||||
|
|
||||||
//general speech
|
|
||||||
TEXT_BROADCAST,
|
|
||||||
TEXT_SPEECH,
|
|
||||||
TEXT_WHISPER,
|
|
||||||
|
|
||||||
//rejection/error messages
|
|
||||||
JOIN_REJECTION,
|
|
||||||
LOGIN_REJECTION,
|
|
||||||
REGION_REJECTION,
|
|
||||||
CHARACTER_REJECTION,
|
|
||||||
MONSTER_REJECTION,
|
|
||||||
SHUTDOWN_REJECTION,
|
|
||||||
QUERY_REJECTION,
|
|
||||||
|
|
||||||
FORMAT_END_TEXT,
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//not used
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
LAST
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "serial_utility.hpp"
|
|
||||||
|
|
||||||
//packet types
|
|
||||||
#include "character_packet.hpp"
|
|
||||||
#include "client_packet.hpp"
|
|
||||||
#include "monster_packet.hpp"
|
|
||||||
#include "region_packet.hpp"
|
|
||||||
#include "server_packet.hpp"
|
|
||||||
#include "text_packet.hpp"
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
//macros
|
|
||||||
#define BOUNDS(type, lower, upper) ((type) > (lower) && (type) < (upper))
|
|
||||||
|
|
||||||
//raw memory copy
|
|
||||||
void serialCopy(void** buffer, void* data, int size) {
|
|
||||||
memcpy(*buffer, data, size);
|
|
||||||
*buffer = reinterpret_cast<char*>(*buffer) + size;
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserialCopy(void** buffer, void* data, int size) {
|
|
||||||
memcpy(data, *buffer, size);
|
|
||||||
*buffer = reinterpret_cast<char*>(*buffer) + size;
|
|
||||||
}
|
|
||||||
|
|
||||||
//DOCS: The server and client MUST use the correct packet types
|
|
||||||
|
|
||||||
//main switch functions
|
|
||||||
void serializePacket(void* buffer, SerialPacketBase* packet) {
|
|
||||||
if (BOUNDS(packet->type, SerialPacketType::FORMAT_SERVER, SerialPacketType::FORMAT_END_SERVER)) {
|
|
||||||
serializeServer(buffer, static_cast<ServerPacket*>(packet));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BOUNDS(packet->type, SerialPacketType::FORMAT_CLIENT, SerialPacketType::FORMAT_END_CLIENT)) {
|
|
||||||
serializeClient(buffer, static_cast<ClientPacket*>(packet));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BOUNDS(packet->type, SerialPacketType::FORMAT_REGION, SerialPacketType::FORMAT_END_REGION)) {
|
|
||||||
serializeRegion(buffer, static_cast<RegionPacket*>(packet));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BOUNDS(packet->type, SerialPacketType::FORMAT_CHARACTER, SerialPacketType::FORMAT_END_CHARACTER)) {
|
|
||||||
serializeCharacter(buffer, static_cast<CharacterPacket*>(packet));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BOUNDS(packet->type, SerialPacketType::FORMAT_MONSTER, SerialPacketType::FORMAT_END_MONSTER)) {
|
|
||||||
serializeMonster(buffer, static_cast<MonsterPacket*>(packet));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BOUNDS(packet->type, SerialPacketType::FORMAT_TEXT, SerialPacketType::FORMAT_END_TEXT)) {
|
|
||||||
serializeText(buffer, static_cast<TextPacket*>(packet));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializePacket(void* buffer, SerialPacketBase* packet) {
|
|
||||||
//find the type, so that you can actually deserialize the packet!
|
|
||||||
SerialPacketType type;
|
|
||||||
memcpy(&type, buffer, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
if (BOUNDS(type, SerialPacketType::FORMAT_SERVER, SerialPacketType::FORMAT_END_SERVER)) {
|
|
||||||
deserializeServer(buffer, static_cast<ServerPacket*>(packet));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BOUNDS(type, SerialPacketType::FORMAT_CLIENT, SerialPacketType::FORMAT_END_CLIENT)) {
|
|
||||||
deserializeClient(buffer, static_cast<ClientPacket*>(packet));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BOUNDS(type, SerialPacketType::FORMAT_REGION, SerialPacketType::FORMAT_END_REGION)) {
|
|
||||||
deserializeRegion(buffer, static_cast<RegionPacket*>(packet));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BOUNDS(type, SerialPacketType::FORMAT_CHARACTER, SerialPacketType::FORMAT_END_CHARACTER)) {
|
|
||||||
deserializeCharacter(buffer, static_cast<CharacterPacket*>(packet));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BOUNDS(type, SerialPacketType::FORMAT_MONSTER, SerialPacketType::FORMAT_END_MONSTER)) {
|
|
||||||
deserializeMonster(buffer, static_cast<MonsterPacket*>(packet));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BOUNDS(type, SerialPacketType::FORMAT_TEXT, SerialPacketType::FORMAT_END_TEXT)) {
|
|
||||||
deserializeText(buffer, static_cast<TextPacket*>(packet));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef SERIALIZEUTILITY_HPP_
|
|
||||||
#define SERIALIZEUTILITY_HPP_
|
|
||||||
|
|
||||||
#include "serial_packet_base.hpp"
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
//raw memory copy
|
|
||||||
void serialCopy(void** buffer, void* data, int size);
|
|
||||||
void deserialCopy(void** buffer, void* data, int size);
|
|
||||||
|
|
||||||
//primary functions
|
|
||||||
void serializePacket(void* buffer, SerialPacketBase* packet);
|
|
||||||
void deserializePacket(void* buffer, SerialPacketBase* packet);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,224 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "udp_network_utility.hpp"
|
|
||||||
|
|
||||||
#include "serial_packet.hpp"
|
|
||||||
#include "serial_utility.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
//DOCS: memset() is used before sending a packet to remove old data; you don't want to send sensitive data over the network
|
|
||||||
//NOTE: don't confuse SerialPacketBase with UDPpacket
|
|
||||||
|
|
||||||
void UDPNetworkUtility::Open(int port) {
|
|
||||||
socket = SDLNet_UDP_Open(port);
|
|
||||||
packet = SDLNet_AllocPacket(PACKET_BUFFER_SIZE);
|
|
||||||
if (!socket || !packet) {
|
|
||||||
Close();
|
|
||||||
throw(std::runtime_error("Failed to open UDPNetworkUtility"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UDPNetworkUtility::Close() {
|
|
||||||
SDLNet_UDP_Close(socket);
|
|
||||||
SDLNet_FreePacket(packet);
|
|
||||||
socket = nullptr;
|
|
||||||
packet = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//bind to a channel
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
int UDPNetworkUtility::Bind(const char* ip, int port, int channel) {
|
|
||||||
IPaddress add;
|
|
||||||
if (SDLNet_ResolveHost(&add, ip, port) == -1) {
|
|
||||||
throw(std::runtime_error("Failed to resolve a host"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return Bind(add, channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
int UDPNetworkUtility::Bind(IPaddress add, int channel) {
|
|
||||||
int ret = SDLNet_UDP_Bind(socket, channel, &add);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
throw(std::runtime_error("Failed to bind to a channel"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UDPNetworkUtility::Unbind(int channel) {
|
|
||||||
SDLNet_UDP_Unbind(socket, channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//send a buffer
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
int UDPNetworkUtility::SendTo(const char* ip, int port, void* data, int len) {
|
|
||||||
IPaddress add;
|
|
||||||
if (SDLNet_ResolveHost(&add, ip, port) == -1) {
|
|
||||||
throw(std::runtime_error("Failed to resolve a host"));
|
|
||||||
}
|
|
||||||
|
|
||||||
SendTo(add, data, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
int UDPNetworkUtility::SendTo(IPaddress add, void* data, int len) {
|
|
||||||
if (len > packet->maxlen) {
|
|
||||||
throw(std::runtime_error("The buffer is to large for the UDPpacket"));
|
|
||||||
}
|
|
||||||
memset(packet->data, 0, packet->maxlen);
|
|
||||||
memcpy(packet->data, data, len);
|
|
||||||
packet->len = len;
|
|
||||||
packet->address = add;
|
|
||||||
|
|
||||||
int ret = SDLNet_UDP_Send(socket, -1, packet);
|
|
||||||
|
|
||||||
if (ret <= 0) {
|
|
||||||
throw(std::runtime_error("Failed to send a packet"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int UDPNetworkUtility::SendTo(int channel, void* data, int len) {
|
|
||||||
if (len > packet->maxlen) {
|
|
||||||
throw(std::runtime_error("The buffer is to large for the UDPpacket"));
|
|
||||||
}
|
|
||||||
memset(packet->data, 0, packet->maxlen);
|
|
||||||
memcpy(packet->data, data, len);
|
|
||||||
packet->len = len;
|
|
||||||
|
|
||||||
int ret = SDLNet_UDP_Send(socket, channel, packet);
|
|
||||||
|
|
||||||
if (ret <= 0) {
|
|
||||||
throw(std::runtime_error("Failed to send a packet"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int UDPNetworkUtility::SendToAllChannels(void* data, int len) {
|
|
||||||
if (len > packet->maxlen) {
|
|
||||||
throw(std::runtime_error("The buffer is to large for the UDPpacket"));
|
|
||||||
}
|
|
||||||
memset(packet->data, 0, packet->maxlen);
|
|
||||||
memcpy(packet->data, data, len);
|
|
||||||
packet->len = len;
|
|
||||||
|
|
||||||
int sent = 0;
|
|
||||||
|
|
||||||
//send to all bound channels
|
|
||||||
for (int i = 0; i < SDLNET_MAX_UDPCHANNELS; i++) {
|
|
||||||
if (SDLNet_UDP_GetPeerAddress(socket, i)) {
|
|
||||||
sent += SDLNet_UDP_Send(socket, i, packet);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return sent;
|
|
||||||
}
|
|
||||||
|
|
||||||
int UDPNetworkUtility::Receive() {
|
|
||||||
memset(packet->data, 0, packet->maxlen);
|
|
||||||
int ret = SDLNet_UDP_Recv(socket, packet);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
throw(std::runtime_error("Unknown network error occured"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//send a SerialPacketBase
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
int UDPNetworkUtility::SendTo(const char* ip, int port, SerialPacketBase* serialPacket) {
|
|
||||||
IPaddress add;
|
|
||||||
if (SDLNet_ResolveHost(&add, ip, port) == -1) {
|
|
||||||
throw(std::runtime_error("Failed to resolve a host"));
|
|
||||||
}
|
|
||||||
|
|
||||||
SendTo(add, serialPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
int UDPNetworkUtility::SendTo(IPaddress add, SerialPacketBase* serialPacket) {
|
|
||||||
memset(packet->data, 0, packet->maxlen);
|
|
||||||
serializePacket(packet->data, serialPacket);
|
|
||||||
packet->len = PACKET_BUFFER_SIZE;
|
|
||||||
packet->address = add;
|
|
||||||
|
|
||||||
int ret = SDLNet_UDP_Send(socket, -1, packet);
|
|
||||||
|
|
||||||
if (ret <= 0) {
|
|
||||||
throw(std::runtime_error("Failed to send a packet"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int UDPNetworkUtility::SendTo(int channel, SerialPacketBase* serialPacket) {
|
|
||||||
memset(packet->data, 0, packet->maxlen);
|
|
||||||
serializePacket(packet->data, serialPacket);
|
|
||||||
packet->len = PACKET_BUFFER_SIZE;
|
|
||||||
|
|
||||||
int ret = SDLNet_UDP_Send(socket, channel, packet);
|
|
||||||
|
|
||||||
if (ret <= 0) {
|
|
||||||
throw(std::runtime_error("Failed to send a packet"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int UDPNetworkUtility::SendToAllChannels(SerialPacketBase* serialPacket) {
|
|
||||||
memset(packet->data, 0, packet->maxlen);
|
|
||||||
serializePacket(packet->data, serialPacket);
|
|
||||||
packet->len = PACKET_BUFFER_SIZE;
|
|
||||||
|
|
||||||
int sent = 0;
|
|
||||||
|
|
||||||
//send to all bound channels
|
|
||||||
for (int i = 0; i < SDLNET_MAX_UDPCHANNELS; i++) {
|
|
||||||
if (SDLNet_UDP_GetPeerAddress(socket, i)) {
|
|
||||||
sent += SDLNet_UDP_Send(socket, i, packet);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return sent;
|
|
||||||
}
|
|
||||||
|
|
||||||
int UDPNetworkUtility::Receive(SerialPacketBase* serialPacket) {
|
|
||||||
memset(packet->data, 0, packet->maxlen);
|
|
||||||
int ret = SDLNet_UDP_Recv(socket, packet);
|
|
||||||
deserializePacket(packet->data, serialPacket);
|
|
||||||
serialPacket->srcAddress = packet->address;
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
throw(std::runtime_error("Unknown network error occured"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef UDPNETWORKUTILITY_HPP_
|
|
||||||
#define UDPNETWORKUTILITY_HPP_
|
|
||||||
|
|
||||||
//common
|
|
||||||
#include "serial_packet_base.hpp"
|
|
||||||
#include "singleton.hpp"
|
|
||||||
|
|
||||||
//APIs
|
|
||||||
#include "SDL_net.h"
|
|
||||||
|
|
||||||
class UDPNetworkUtility : public Singleton<UDPNetworkUtility> {
|
|
||||||
public:
|
|
||||||
void Open(int port);
|
|
||||||
void Close();
|
|
||||||
|
|
||||||
//bind to a channel
|
|
||||||
int Bind(const char* ip, int port, int channel = -1);
|
|
||||||
int Bind(IPaddress add, int channel = -1);
|
|
||||||
void Unbind(int channel);
|
|
||||||
|
|
||||||
IPaddress* GetIPAddress(int channel) {
|
|
||||||
return SDLNet_UDP_GetPeerAddress(socket, channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
//send a buffer
|
|
||||||
int SendTo(const char* ip, int port, void* data, int len);
|
|
||||||
int SendTo(IPaddress add, void* data, int len);
|
|
||||||
int SendTo(int channel, void* data, int len);
|
|
||||||
int SendToAllChannels(void* data, int len);
|
|
||||||
int Receive();
|
|
||||||
|
|
||||||
//send a SerialPacketBase
|
|
||||||
int SendTo(const char* ip, int port, SerialPacketBase* serialPacket);
|
|
||||||
int SendTo(IPaddress add, SerialPacketBase* serialPacket);
|
|
||||||
int SendTo(int channel, SerialPacketBase* serialPacket);
|
|
||||||
int SendToAllChannels(SerialPacketBase* serialPacket);
|
|
||||||
int Receive(SerialPacketBase* serialPacket);
|
|
||||||
|
|
||||||
//accessors
|
|
||||||
UDPpacket* GetPacket() const {
|
|
||||||
return packet;
|
|
||||||
}
|
|
||||||
UDPsocket GetSocket() const {
|
|
||||||
return socket;
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
friend Singleton<UDPNetworkUtility>;
|
|
||||||
|
|
||||||
UDPNetworkUtility() = default;
|
|
||||||
~UDPNetworkUtility() = default;
|
|
||||||
|
|
||||||
UDPsocket socket = nullptr;
|
|
||||||
UDPpacket* packet = nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "button.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
Button::State Button::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
|
||||||
return CalcState(motion.x, motion.y, motion.state & SDL_BUTTON_LMASK);
|
|
||||||
}
|
|
||||||
|
|
||||||
Button::State Button::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
|
||||||
if (button.button == SDL_BUTTON_LEFT) {
|
|
||||||
return CalcState(button.x, button.y, true);
|
|
||||||
}
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
Button::State Button::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
|
||||||
if (button.button == SDL_BUTTON_LEFT) {
|
|
||||||
return CalcState(button.x, button.y, false);
|
|
||||||
}
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Button::DrawTo(SDL_Surface* const dest) {
|
|
||||||
if (!image || !font) {
|
|
||||||
throw(std::runtime_error("Surface not set for Button"));
|
|
||||||
}
|
|
||||||
image->SetClipY(state * image->GetClipH());
|
|
||||||
image->DrawTo(dest, x, y);
|
|
||||||
font->DrawStringTo(text, dest, textX + x, textY + y);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Button::SetText(std::string t) {
|
|
||||||
if (!image || !font) {
|
|
||||||
throw(std::runtime_error("Surface not set for Button"));
|
|
||||||
}
|
|
||||||
//one line, cache the position
|
|
||||||
text = t;
|
|
||||||
textX = (image->GetClipW() / 2) - (font->GetCharW() * text.size() / 2);
|
|
||||||
textY = (image->GetClipH() / 2) - (font->GetCharH() / 2);
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
Button::State Button::CalcState(Sint16 i, Sint16 j, bool leftPressed) {
|
|
||||||
if (!image || !font) {
|
|
||||||
throw(std::runtime_error("Surface not set for Button"));
|
|
||||||
}
|
|
||||||
//if out of bounds
|
|
||||||
if (i < x || i >= (x + image->GetClipW()) ||
|
|
||||||
j < y || j >= (y + image->GetClipH())
|
|
||||||
) {
|
|
||||||
return state = State::NORMAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leftPressed) {
|
|
||||||
return state = State::PRESSED;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return state = State::HOVER;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef BUTTON_HPP_
|
|
||||||
#define BUTTON_HPP_
|
|
||||||
|
|
||||||
#include "image.hpp"
|
|
||||||
#include "raster_font.hpp"
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
/* 3-phases, no toggle, centred text
|
|
||||||
* This class uses the size of the provided image as its bounds. Also,
|
|
||||||
* The provided image should be formatted correctly.
|
|
||||||
*
|
|
||||||
* The button's image should be divided into 3 sections virtucally,
|
|
||||||
* which act as the different button images. The clip width & height of the
|
|
||||||
* Image should be set manually, and the height should be 1/3 of the total
|
|
||||||
* graphical data.
|
|
||||||
*/
|
|
||||||
class Button {
|
|
||||||
public:
|
|
||||||
enum State {
|
|
||||||
NORMAL = 0, HOVER = 1, PRESSED = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
Button() = default;
|
|
||||||
~Button() = default;
|
|
||||||
|
|
||||||
//handle input
|
|
||||||
State MouseMotion(SDL_MouseMotionEvent const&);
|
|
||||||
State MouseButtonDown(SDL_MouseButtonEvent const&);
|
|
||||||
State MouseButtonUp(SDL_MouseButtonEvent const&);
|
|
||||||
|
|
||||||
//yet another draw function
|
|
||||||
void DrawTo(SDL_Surface* const);
|
|
||||||
|
|
||||||
//accessors and mutators
|
|
||||||
Image* SetImage(Image* const ptr) { return image = ptr; }
|
|
||||||
Image* GetImage() { return image; }
|
|
||||||
RasterFont* SetFont(RasterFont* const ptr) { return font = ptr; }
|
|
||||||
RasterFont* GetFont() { return font; }
|
|
||||||
|
|
||||||
Sint16 SetX(Sint16 i) { return x = i; }
|
|
||||||
Sint16 SetY(Sint16 i) { return y = i; }
|
|
||||||
Sint16 GetX() const { return x; }
|
|
||||||
Sint16 GetY() const { return y; }
|
|
||||||
|
|
||||||
Sint16 SetTextX(Sint16 i) { return textX = i; }
|
|
||||||
Sint16 SetTextY(Sint16 i) { return textY = i; }
|
|
||||||
Sint16 GetTextX() const { return textX; }
|
|
||||||
Sint16 GetTextY() const { return textY; }
|
|
||||||
|
|
||||||
State SetState(State s) { return state = s; }
|
|
||||||
State GetState() const { return state; }
|
|
||||||
|
|
||||||
std::string SetText(std::string);
|
|
||||||
std::string GetText() const { return text; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
State CalcState(Sint16 x, Sint16 y, bool leftPressed);
|
|
||||||
|
|
||||||
//point to the provided external objects
|
|
||||||
Image* image = nullptr;
|
|
||||||
RasterFont* font = nullptr;
|
|
||||||
|
|
||||||
//positions
|
|
||||||
Sint16 x = 0, y = 0;
|
|
||||||
Sint16 textX = 0, textY = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
State state = State::NORMAL;
|
|
||||||
std::string text;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#config
|
|
||||||
INCLUDES+=. ../graphics
|
|
||||||
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 $@ $<
|
|
||||||
@@ -1,139 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "menu_bar.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
void MenuBar::DrawTo(SDL_Surface* const dest) {
|
|
||||||
for (auto& i : entries) {
|
|
||||||
i.DrawTo(dest);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuBar::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
|
||||||
for (auto& i : entries) {
|
|
||||||
i.MouseMotion(motion);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuBar::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
|
||||||
for (auto& i : entries) {
|
|
||||||
i.MouseButtonDown(button);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuBar::MouseButtonUp(SDL_MouseButtonEvent const& button, int* entry, int* butt) {
|
|
||||||
*entry = *butt = -1;
|
|
||||||
int ret = -1;
|
|
||||||
for (auto& i : entries) {
|
|
||||||
ret = i.MouseButtonUp(button);
|
|
||||||
|
|
||||||
if (ret != -1) {
|
|
||||||
*entry = (&i - entries.data());
|
|
||||||
*butt = ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuBar::SetEntries(std::vector<std::vector<std::string>> info) {
|
|
||||||
if (!image || !font) {
|
|
||||||
throw(std::runtime_error("Surfaces not loaded into the menu bar"));
|
|
||||||
}
|
|
||||||
|
|
||||||
entries.clear();
|
|
||||||
for (int i = 0; i < info.size(); i++) {
|
|
||||||
//create the entry & the main button
|
|
||||||
entries.push_back(MenuBarEntry());
|
|
||||||
entries[i].mainButton.SetImage(image);
|
|
||||||
entries[i].mainButton.SetFont(font);
|
|
||||||
entries[i].mainButton.SetText(info[i][0]);
|
|
||||||
entries[i].mainButton.SetX(i * image->GetClipW());
|
|
||||||
entries[i].mainButton.SetY(0);
|
|
||||||
for (int j = 0; j < info[i].size()-1; j++) {
|
|
||||||
//create each drop button in this entry
|
|
||||||
entries[i].dropButtons.push_back(Button());
|
|
||||||
entries[i].dropButtons[j].SetImage(image);
|
|
||||||
entries[i].dropButtons[j].SetFont(font);
|
|
||||||
entries[i].dropButtons[j].SetText(info[i][j+1]);
|
|
||||||
entries[i].dropButtons[j].SetX(i * image->GetClipW());
|
|
||||||
entries[i].dropButtons[j].SetY((j+1) * image->GetClipH());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuBar::MenuBarEntry::DrawTo(SDL_Surface* const dest) {
|
|
||||||
//only draw the dropButtons in the user has this menu open
|
|
||||||
mainButton.DrawTo(dest);
|
|
||||||
|
|
||||||
if (!open) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto& i : dropButtons) {
|
|
||||||
i.DrawTo(dest);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuBar::MenuBarEntry::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
|
||||||
//open the menu
|
|
||||||
bool o = mainButton.MouseMotion(motion) == Button::State::PRESSED;
|
|
||||||
|
|
||||||
if (!(open |= o)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto& i : dropButtons) {
|
|
||||||
//dragging down the menu
|
|
||||||
o |= i.MouseMotion(motion) == Button::State::PRESSED;
|
|
||||||
}
|
|
||||||
|
|
||||||
open = o;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuBar::MenuBarEntry::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
|
||||||
//open the menu
|
|
||||||
if (!(open = mainButton.MouseButtonDown(button) == Button::State::PRESSED)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//update the others anyway
|
|
||||||
for (auto& i : dropButtons) {
|
|
||||||
i.MouseButtonDown(button);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int MenuBar::MenuBarEntry::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
|
||||||
int ret = -1;
|
|
||||||
mainButton.MouseButtonUp(button);
|
|
||||||
|
|
||||||
for (auto& i : dropButtons) {
|
|
||||||
//the user just released this button
|
|
||||||
if (i.GetState() != i.MouseButtonUp(button) && i.GetState() == Button::State::HOVER && open) {
|
|
||||||
//get this button's index
|
|
||||||
ret = (&i - dropButtons.data());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open = false;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef MENUBAR_HPP_
|
|
||||||
#define MENUBAR_HPP_
|
|
||||||
|
|
||||||
#include "image.hpp"
|
|
||||||
#include "raster_font.hpp"
|
|
||||||
#include "button.hpp"
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
/* I've redesigned this so that the contents of the menu bar can't change during run time.
|
|
||||||
* This is more restrictive but I'm focusing on getting this working first.
|
|
||||||
* The Image and Font pointers must be set before the text data is entered.
|
|
||||||
*
|
|
||||||
* This class needs a rewrite.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//TODO: This thing is fucking terrible, fix it and the button class
|
|
||||||
class MenuBar {
|
|
||||||
public:
|
|
||||||
MenuBar() = default;
|
|
||||||
~MenuBar() = default;
|
|
||||||
|
|
||||||
//yet another draw function
|
|
||||||
void DrawTo(SDL_Surface* const dest);
|
|
||||||
|
|
||||||
//user inputs
|
|
||||||
void MouseMotion(SDL_MouseMotionEvent const&);
|
|
||||||
void MouseButtonDown(SDL_MouseButtonEvent const&);
|
|
||||||
void MouseButtonUp(SDL_MouseButtonEvent const&, int* entry, int* button);
|
|
||||||
|
|
||||||
//manage the entries & buttons
|
|
||||||
void SetEntries(std::vector<std::vector<std::string>> info);
|
|
||||||
void ClearEntries() { entries.clear(); }
|
|
||||||
|
|
||||||
//Accessors and mutators
|
|
||||||
Image* SetImage(Image* const ptr) { return image = ptr; }
|
|
||||||
Image* GetImage() { return image; }
|
|
||||||
RasterFont* SetFont(RasterFont* const ptr) { return font = ptr; }
|
|
||||||
RasterFont* GetFont() { return font; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
class MenuBarEntry;
|
|
||||||
|
|
||||||
std::vector<MenuBarEntry> entries;
|
|
||||||
|
|
||||||
Image* image = nullptr;
|
|
||||||
RasterFont* font = nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
class MenuBar::MenuBarEntry {
|
|
||||||
public:
|
|
||||||
MenuBarEntry() = default;
|
|
||||||
~MenuBarEntry() = default;
|
|
||||||
|
|
||||||
void DrawTo(SDL_Surface* const dest);
|
|
||||||
|
|
||||||
void MouseMotion(SDL_MouseMotionEvent const&);
|
|
||||||
void MouseButtonDown(SDL_MouseButtonEvent const&);
|
|
||||||
int MouseButtonUp(SDL_MouseButtonEvent const&);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Button mainButton;
|
|
||||||
|
|
||||||
std::vector<Button> dropButtons;
|
|
||||||
bool open = false;
|
|
||||||
|
|
||||||
friend class MenuBar;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "raster_font.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
/* It might be more efficient to render to a different surface (like an Image)
|
|
||||||
* rather than calling this function with all of it's '%' and '/'.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void RasterFont::DrawStringTo(std::string s, SDL_Surface* const dest, Sint16 x, Sint16 y) {
|
|
||||||
if (!image.GetSurface()) {
|
|
||||||
throw(std::runtime_error("RasterFont not loaded"));
|
|
||||||
}
|
|
||||||
const Uint16 w = image.GetClipW();
|
|
||||||
const Uint16 h = image.GetClipH();
|
|
||||||
for (int i = 0; i < s.size(); i++) {
|
|
||||||
image.SetClipX(s[i] % 16 * w);
|
|
||||||
image.SetClipY(s[i] / 16 * h);
|
|
||||||
image.DrawTo(dest, x + i * w, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: This class can only take a raster font with 16*16 characters, and the
|
|
||||||
* indevidual characters must have the same dimensions. Overall this class is too
|
|
||||||
* restrictive; I suggest using a 3rd party library.
|
|
||||||
*/
|
|
||||||
|
|
||||||
SDL_Surface* RasterFont::LoadSurface(std::string fname) {
|
|
||||||
image.LoadSurface(fname);
|
|
||||||
image.SetClipW(image.GetSurface()->w/16);
|
|
||||||
image.SetClipH(image.GetSurface()->h/16);
|
|
||||||
return image.GetSurface();
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Surface* RasterFont::SetSurface(SDL_Surface* p) {
|
|
||||||
image.SetSurface(p);
|
|
||||||
image.SetClipW(image.GetSurface()->w/16);
|
|
||||||
image.SetClipH(image.GetSurface()->h/16);
|
|
||||||
return image.GetSurface();
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef RASTERFONT_HPP_
|
|
||||||
#define RASTERFONT_HPP_
|
|
||||||
|
|
||||||
#include "image.hpp"
|
|
||||||
|
|
||||||
class RasterFont {
|
|
||||||
public:
|
|
||||||
RasterFont() = default;
|
|
||||||
RasterFont(RasterFont const& rhs) { *this = rhs; }
|
|
||||||
RasterFont(RasterFont&& rhs) { *this = std::move(rhs); }
|
|
||||||
RasterFont(std::string fname) { LoadSurface(fname); }
|
|
||||||
RasterFont(SDL_Surface* p) { SetSurface(p); }
|
|
||||||
~RasterFont() = default;
|
|
||||||
|
|
||||||
RasterFont& operator=(RasterFont const& rhs) { image = rhs.image; }
|
|
||||||
RasterFont& operator=(RasterFont&& rhs) { image = std::move(rhs.image); }
|
|
||||||
|
|
||||||
void DrawStringTo(std::string, SDL_Surface* const, Sint16 x, Sint16 y);
|
|
||||||
|
|
||||||
//Accessors and Mutators
|
|
||||||
SDL_Surface* LoadSurface(std::string);
|
|
||||||
SDL_Surface* SetSurface(SDL_Surface*);
|
|
||||||
SDL_Surface* GetSurface() const { return image.GetSurface(); }
|
|
||||||
void FreeSurface() { image.FreeSurface(); }
|
|
||||||
|
|
||||||
Uint16 GetCharW() const { return image.GetClipW(); }
|
|
||||||
Uint16 GetCharH() const { return image.GetClipH(); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
Image image;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef BOUNDINGBOX_HPP_
|
|
||||||
#define BOUNDINGBOX_HPP_
|
|
||||||
|
|
||||||
#include <type_traits>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
class BoundingBox {
|
|
||||||
public:
|
|
||||||
//This is explicitly a POD
|
|
||||||
int x, y;
|
|
||||||
int w, h;
|
|
||||||
|
|
||||||
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() = default;
|
|
||||||
BoundingBox& operator=(BoundingBox const&) = default;
|
|
||||||
|
|
||||||
int Size() {
|
|
||||||
return std::max(w*h,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CheckOverlap(BoundingBox rhs) {
|
|
||||||
return !(
|
|
||||||
x >= rhs.x + rhs.w ||
|
|
||||||
y >= rhs.y + rhs.h ||
|
|
||||||
rhs.x >= x + w ||
|
|
||||||
rhs.y >= y + h);
|
|
||||||
}
|
|
||||||
|
|
||||||
BoundingBox CalcOverlap(BoundingBox rhs) {
|
|
||||||
if (!CheckOverlap(rhs)) {
|
|
||||||
return {0, 0, 0, 0};
|
|
||||||
}
|
|
||||||
BoundingBox ret;
|
|
||||||
ret.x = std::max(x, rhs.x);
|
|
||||||
ret.y = std::max(y, rhs.y);
|
|
||||||
ret.w = std::min(x+w, rhs.x+rhs.w) - ret.x;
|
|
||||||
ret.h = std::min(y+h, rhs.y+rhs.h) - ret.y;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//This is explicitly a POD
|
|
||||||
static_assert(std::is_pod<BoundingBox>::value, "BoundingBox is not a POD");
|
|
||||||
|
|
||||||
#include "vector2.hpp"
|
|
||||||
|
|
||||||
//operators
|
|
||||||
inline BoundingBox operator+(BoundingBox b, Vector2 v) {
|
|
||||||
return {b.x + (int)v.x, b.y + (int)v.y, b.w, b.h};
|
|
||||||
}
|
|
||||||
inline BoundingBox operator+(Vector2 v, BoundingBox b) {
|
|
||||||
return b + v;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,188 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "config_utility.hpp"
|
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <cstring>
|
|
||||||
#include <fstream>
|
|
||||||
#include <sstream>
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
void ConfigUtility::Load(std::string fname, bool skipMissingFile, int argc, char* argv[]) {
|
|
||||||
//clear the stored configuration
|
|
||||||
configMap.clear();
|
|
||||||
|
|
||||||
//use the default file
|
|
||||||
if (argc < 2) {
|
|
||||||
configMap = Read(fname, skipMissingFile);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//some variables to use
|
|
||||||
table_t redirectedFile;
|
|
||||||
table_t cmdLineParams;
|
|
||||||
char key[256], val[256];
|
|
||||||
bool redirectUsed = false;
|
|
||||||
|
|
||||||
//reading from the command line
|
|
||||||
for (int i = 1; i < argc; ++i) {
|
|
||||||
//read from a specified config file
|
|
||||||
if (!strncmp(argv[i], "-config=", 8)) {
|
|
||||||
//older specified files take precedence
|
|
||||||
table_t tmp = Read(argv[i] + 8, skipMissingFile);
|
|
||||||
redirectedFile.insert(tmp.begin(), tmp.end());
|
|
||||||
redirectUsed = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//set some specific values
|
|
||||||
if (!strncmp(argv[i], "-", 1)) {
|
|
||||||
//wipe the variables
|
|
||||||
memset(key, 0, 256);
|
|
||||||
memset(key, 0, 256);
|
|
||||||
|
|
||||||
//read the key-value pair
|
|
||||||
if (sscanf(argv[i], "-%[^=]=%[^\0]", key, val) != 2) {
|
|
||||||
std::ostringstream os;
|
|
||||||
os << "Failed to read a command line config argument (expected -%s=%s):" << std::endl;
|
|
||||||
os << "\targv[" << i << "]: " << argv[i] << std::endl;
|
|
||||||
os << "\tkey: " << key << std::endl;
|
|
||||||
os << "\tval: " << val << std::endl;
|
|
||||||
throw(std::runtime_error( os.str() ));
|
|
||||||
}
|
|
||||||
cmdLineParams[key] = val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//finally, construct the final config table
|
|
||||||
if (!redirectUsed) {
|
|
||||||
redirectedFile = Read(fname, skipMissingFile);
|
|
||||||
}
|
|
||||||
configMap.insert(cmdLineParams.begin(), cmdLineParams.end());
|
|
||||||
configMap.insert(redirectedFile.begin(), redirectedFile.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigUtility::table_t ConfigUtility::Read(std::string fname, bool skipMissingFile) {
|
|
||||||
//read in and return this file's data
|
|
||||||
table_t retTable;
|
|
||||||
std::ifstream is(fname);
|
|
||||||
|
|
||||||
if (!is.is_open()) {
|
|
||||||
if (skipMissingFile) {
|
|
||||||
return {}; //empty table
|
|
||||||
}
|
|
||||||
std::ostringstream os;
|
|
||||||
os << "Failed to open a config file: " << fname;
|
|
||||||
throw(std::runtime_error( os.str() ));
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
//eat the whitespace 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 pairs
|
|
||||||
if (key.size() == 0 || val.size() == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//save the pair
|
|
||||||
retTable[key] = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
is.close();
|
|
||||||
|
|
||||||
//load in any subordinate config files
|
|
||||||
if (retTable.find("config.next") != retTable.end()) {
|
|
||||||
table_t subTable = Read(retTable["config.next"], skipMissingFile);
|
|
||||||
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";
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef CONFIGUTILITY_HPP_
|
|
||||||
#define CONFIGUTILITY_HPP_
|
|
||||||
|
|
||||||
#include "singleton.hpp"
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
class ConfigUtility: public Singleton<ConfigUtility> {
|
|
||||||
public:
|
|
||||||
void Load(std::string fname, bool skipMissingFile = false, int argc = 0, char* argv[] = nullptr);
|
|
||||||
|
|
||||||
//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>;
|
|
||||||
|
|
||||||
table_t Read(std::string fname, bool skipMissingFile);
|
|
||||||
|
|
||||||
table_t configMap;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef FRAMERATE_HPP_
|
|
||||||
#define FRAMERATE_HPP_
|
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
|
|
||||||
class FrameRate {
|
|
||||||
public:
|
|
||||||
typedef std::chrono::high_resolution_clock Clock;
|
|
||||||
|
|
||||||
FrameRate() = default;
|
|
||||||
int Calculate() {
|
|
||||||
frameCount++;
|
|
||||||
if (Clock::now() - tick >= std::chrono::duration<int>(1)) {
|
|
||||||
lastFrameRate = frameCount;
|
|
||||||
frameCount = 0;
|
|
||||||
tick = Clock::now();
|
|
||||||
}
|
|
||||||
return lastFrameRate;
|
|
||||||
}
|
|
||||||
int GetFrameRate() { return lastFrameRate; }
|
|
||||||
private:
|
|
||||||
int frameCount = 0;
|
|
||||||
int lastFrameRate = 0;
|
|
||||||
Clock::time_point tick = Clock::now();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "ip_operators.hpp"
|
|
||||||
|
|
||||||
bool operator==(IPaddress lhs, IPaddress rhs) {
|
|
||||||
return lhs.host == rhs.host && lhs.port == rhs.port;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(IPaddress lhs, IPaddress rhs) {
|
|
||||||
return !(lhs == rhs);
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef IPOPERATORS_HPP_
|
|
||||||
#define IPOPERATORS_HPP_
|
|
||||||
|
|
||||||
#include "SDL_net.h"
|
|
||||||
|
|
||||||
//these should've come standard
|
|
||||||
bool operator==(IPaddress lhs, IPaddress rhs);
|
|
||||||
bool operator!=(IPaddress lhs, IPaddress rhs);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#config
|
|
||||||
INCLUDES+=.
|
|
||||||
LIBS+=
|
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
|
||||||
|
|
||||||
#source
|
|
||||||
CXXSRC=$(wildcard *.cpp)
|
|
||||||
|
|
||||||
#objects
|
|
||||||
OBJDIR=obj
|
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
|
||||||
|
|
||||||
#output
|
|
||||||
OUTDIR=../..
|
|
||||||
OUT=$(addprefix $(OUTDIR)/,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 $@ $<
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef SINGLETON_HPP_
|
|
||||||
#define SINGLETON_HPP_
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
class Singleton {
|
|
||||||
public:
|
|
||||||
static T& GetSingleton() {
|
|
||||||
if (!ptr) {
|
|
||||||
throw(std::logic_error("This singleton has not been created"));
|
|
||||||
}
|
|
||||||
return *ptr;
|
|
||||||
}
|
|
||||||
static void CreateSingleton() {
|
|
||||||
if (ptr) {
|
|
||||||
throw(std::logic_error("This singleton has already been created"));
|
|
||||||
}
|
|
||||||
ptr = new T();
|
|
||||||
}
|
|
||||||
static void DeleteSingleton() {
|
|
||||||
if (!ptr) {
|
|
||||||
throw(std::logic_error("A non-existant singleton cannot be deleted"));
|
|
||||||
}
|
|
||||||
delete ptr;
|
|
||||||
ptr = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Singleton() = default;
|
|
||||||
Singleton(Singleton const&) = default;
|
|
||||||
Singleton(Singleton&&) = default;
|
|
||||||
~Singleton() = default;
|
|
||||||
|
|
||||||
private:
|
|
||||||
static T* ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
T* Singleton<T>::ptr = nullptr;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef VECTOR2_HPP_
|
|
||||||
#define VECTOR2_HPP_
|
|
||||||
|
|
||||||
#include <type_traits>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
class Vector2 {
|
|
||||||
public:
|
|
||||||
double x, y;
|
|
||||||
|
|
||||||
Vector2() = default;
|
|
||||||
Vector2(double i, double j): x(i), y(j) {};
|
|
||||||
~Vector2() = default;
|
|
||||||
Vector2& operator=(Vector2 const&) = default;
|
|
||||||
|
|
||||||
double Length() const {
|
|
||||||
return sqrt(x*x+y*y);
|
|
||||||
}
|
|
||||||
double SquaredLength() const {
|
|
||||||
return x*x+y*y;
|
|
||||||
}
|
|
||||||
void Normalize() {
|
|
||||||
double l = Length();
|
|
||||||
if (l == 0)
|
|
||||||
throw(std::domain_error("Divide by zero"));
|
|
||||||
x /= l;
|
|
||||||
y /= l;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Arithmetic operators
|
|
||||||
Vector2 operator+(Vector2 v) const {
|
|
||||||
Vector2 ret;
|
|
||||||
ret.x = x + v.x;
|
|
||||||
ret.y = y + v.y;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
Vector2 operator-(Vector2 v) const {
|
|
||||||
Vector2 ret;
|
|
||||||
ret.x = x - v.x;
|
|
||||||
ret.y = y - v.y;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
Vector2 operator*(Vector2 v) const {
|
|
||||||
Vector2 ret;
|
|
||||||
ret.x = x * v.x;
|
|
||||||
ret.y = y * v.y;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
Vector2 operator*(double d) const {
|
|
||||||
Vector2 ret;
|
|
||||||
ret.x = x * d;
|
|
||||||
ret.y = y * d;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector2 operator/(Vector2 v) {
|
|
||||||
if (!v.x || !v.y)
|
|
||||||
throw(std::domain_error("Divide by zero"));
|
|
||||||
Vector2 ret;
|
|
||||||
ret.x = x / v.x;
|
|
||||||
ret.y = y / v.y;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
Vector2 operator/(double d) {
|
|
||||||
if (!d)
|
|
||||||
throw(std::domain_error("Divide by zero"));
|
|
||||||
Vector2 ret;
|
|
||||||
ret.x = x / d;
|
|
||||||
ret.y = y / d;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
//unary operators
|
|
||||||
Vector2 operator-() { return {-x, -y}; }
|
|
||||||
|
|
||||||
//comparison operators
|
|
||||||
bool operator==(Vector2 v) { return (x == v.x && y == v.y); }
|
|
||||||
bool operator!=(Vector2 v) { return (x != v.x || y != v.y); }
|
|
||||||
|
|
||||||
//member templates (curry the above operators)
|
|
||||||
template<typename T> Vector2 operator+=(T t) { return *this = *this + t; }
|
|
||||||
template<typename T> Vector2 operator-=(T t) { return *this = *this - t; }
|
|
||||||
template<typename T> Vector2 operator*=(T t) { return *this = *this * t; }
|
|
||||||
template<typename T> Vector2 operator/=(T t) { return *this = *this / t; }
|
|
||||||
template<typename T> bool operator==(T t) { return (x == t && y == t); }
|
|
||||||
template<typename T> bool operator!=(T t) { return (x != t || y != t); }
|
|
||||||
};
|
|
||||||
|
|
||||||
//This is explicitly a POD
|
|
||||||
static_assert(std::is_pod<Vector2>::value, "Vector2 is not a POD");
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user