Merge branch 'upgrade', updated to SDL 2.0, among many other improvements

This commit is contained in:
2015-08-24 14:45:43 +10:00
164 changed files with 946 additions and 5147 deletions
+6
View File
@@ -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
+6 -3
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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;
} }
+14 -13
View File
@@ -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
+1 -4
View File
@@ -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
+8 -7
View File
@@ -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;
} }
+2 -5
View File
@@ -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
+2 -2
View File
@@ -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;
} }
+2 -5
View File
@@ -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
+2 -2
View File
@@ -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() {
+3 -5
View File
@@ -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
+1
View File
@@ -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;
+1 -4
View File
@@ -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
+24 -21
View File
@@ -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
+6 -5
View File
@@ -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);
+3 -3
View File
@@ -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";
} }
+63 -48
View File
@@ -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;
+2 -2
View File
@@ -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;
+2 -2
View File
@@ -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);
+1
View File
@@ -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
View File
@@ -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)
+44 -30
View File
@@ -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) {
// //
} }
+22 -25
View File
@@ -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
+98 -80
View File
@@ -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);
} }
+35 -30
View File
@@ -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
+56 -43
View File
@@ -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;
+22 -21
View File
@@ -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 -1
View File
@@ -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))
+37 -25
View File
@@ -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) {
// //
} }
+22 -22
View File
@@ -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
+21 -8
View File
@@ -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);
} }
+10 -9
View File
@@ -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
-32
View File
@@ -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 $@ $<
-45
View File
@@ -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;
}
-54
View File
@@ -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
-42
View File
@@ -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
-32
View File
@@ -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 $@ $<
-145
View File
@@ -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);
}
-73
View File
@@ -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
-32
View File
@@ -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 $@ $<
-102
View File
@@ -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;
}
-66
View File
@@ -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 &image; } //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
-61
View File
@@ -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);
}
}
}
}
-54
View File
@@ -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 &image; }
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
-8
View File
@@ -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
-32
View File
@@ -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 $@ $<
-82
View File
@@ -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;
}
-63
View File
@@ -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
-99
View File
@@ -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;
}
-30
View File
@@ -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
-172
View File
@@ -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 (&region) == 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;
}
-30
View File
@@ -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
-106
View File
@@ -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 &regionList.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 &regionList.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 &regionList;
}
-61
View File
@@ -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
-200
View File
@@ -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 &regionList.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 &regionList.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*>(&region));
//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();
}
-69
View File
@@ -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
-33
View File
@@ -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
-32
View File
@@ -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
-66
View File
@@ -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
-187
View File
@@ -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
-105
View File
@@ -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));
}
}
-37
View File
@@ -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
-224
View File
@@ -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;
}
-77
View File
@@ -1,77 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013-2015
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#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
-81
View File
@@ -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;
}
}
-94
View File
@@ -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
-32
View File
@@ -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 $@ $<
-139
View File
@@ -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;
}
-92
View File
@@ -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
-60
View File
@@ -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();
}
-54
View File
@@ -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
-78
View File
@@ -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
-188
View File
@@ -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";
}
-55
View File
@@ -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
-48
View File
@@ -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
-30
View File
@@ -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);
}
-31
View File
@@ -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
-32
View File
@@ -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 $@ $<
-63
View File
@@ -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
-114
View File
@@ -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