diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..7852c2a --- /dev/null +++ b/.gitmodules @@ -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 diff --git a/README.md b/README.md index 63550a1..de55c5e 100644 --- a/README.md +++ b/README.md @@ -11,19 +11,22 @@ This game is inspired by classic 2D RPGs (Final Fantasy, The Legend of Zelda), a ## 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 ## 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_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 * [SQLite3](http://www.sqlite.org/) - A lightweight SQL database engine ## 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 ## Copyright diff --git a/bin b/bin new file mode 160000 index 0000000..a788d99 --- /dev/null +++ b/bin @@ -0,0 +1 @@ +Subproject commit a788d998fa1815c9fa1ff5a8914a46f2ce5545ff diff --git a/client/base_scene.cpp b/client/base_scene.cpp index 816f80b..fc29fab 100644 --- a/client/base_scene.cpp +++ b/client/base_scene.cpp @@ -21,120 +21,85 @@ */ #include "base_scene.hpp" -#include - -//------------------------- -//Static declarations -//------------------------- - -SDL_Surface* BaseScene::screen = nullptr; - -//------------------------- -//Public access members -//------------------------- +SDL_Renderer* BaseScene::rendererHandle = nullptr; BaseScene::BaseScene() { - // + //EMPTY } 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) { - if (!bpp) { - bpp = SDL_GetVideoInfo()->vfmt->BitsPerPixel; +void BaseScene::FrameStart() { + //EMPTY +} + +void BaseScene::Update() { + //EMPTY +} + +void BaseScene::FrameEnd() { + //EMPTY +} + +//------------------------- +//input events +//------------------------- + +void BaseScene::QuitEvent() { + sceneSignal = SceneSignal::QUIT; +} + +void BaseScene::MouseMotion(SDL_MouseMotionEvent const& event) { + //EMPTY +} + +void BaseScene::MouseButtonDown(SDL_MouseButtonEvent const& event) { + //EMPTY +} + +void BaseScene::MouseButtonUp(SDL_MouseButtonEvent const& event) { + //EMPTY +} + +void BaseScene::MouseWheel(SDL_MouseWheelEvent const& event) { + //EMPTY +} + +void BaseScene::KeyDown(SDL_KeyboardEvent const& event) { + //preference as a default + switch(event.keysym.sym) { + case SDLK_ESCAPE: + QuitEvent(); + break; } - - screen = SDL_SetVideoMode(w, h, bpp, flags); - - if (!screen) { - throw(std::runtime_error("Failed to create the screen surface")); - } - - return screen; } -SDL_Surface* BaseScene::GetScreen() { - return screen; -} - -SceneList BaseScene::SetNextScene(SceneList sceneIndex) { - return nextScene = sceneIndex; -} - -SceneList BaseScene::GetNextScene() const { - return nextScene; -} - -//------------------------- -//Frame loop -//------------------------- - -void BaseScene::RunFrame() { - FrameStart(); - HandleEvents(); - Update(); - FrameEnd(); -} - -void BaseScene::RenderFrame() { - SDL_FillRect(screen, 0, 0); - Render(screen); - SDL_Flip(screen); - SDL_Delay(10); -} - -//------------------------- -//Event handlers -//------------------------- - -void BaseScene::HandleEvents() { - SDL_Event event; - - while(SDL_PollEvent(&event)) { - switch(event.type) { - case SDL_QUIT: - QuitEvent(); - break; - - case SDL_VIDEORESIZE: - SetScreen(event.resize.w, event.resize.h, 0, screen->flags); - break; - - 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 +void BaseScene::KeyUp(SDL_KeyboardEvent const& event) { + //EMPTY } diff --git a/client/base_scene.hpp b/client/base_scene.hpp index aae6161..20e4872 100644 --- a/client/base_scene.hpp +++ b/client/base_scene.hpp @@ -19,56 +19,43 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef BASESCENE_HPP_ -#define BASESCENE_HPP_ +#pragma once -#include "scene_list.hpp" +#include "scene_signal.hpp" -#include "SDL/SDL.h" +#include "SDL2/SDL.h" class BaseScene { public: - //Public access members BaseScene(); virtual ~BaseScene(); - //Program control - static SDL_Surface* SetScreen(int w, int h, int bpp = 0, Uint32 flags = SDL_HWSURFACE|SDL_DOUBLEBUF); - static SDL_Surface* GetScreen(); + virtual void RenderFrame(SDL_Renderer*); + static void SetRenderer(SDL_Renderer*); + SceneSignal GetSceneSignal(); - SceneList SetNextScene(SceneList sceneIndex); - SceneList GetNextScene() const; + //frame phases + virtual void FrameStart(); + virtual void Update(); + virtual void FrameEnd(); - //Frame loop - virtual void RunFrame(); - virtual void RenderFrame(); + //input events + virtual void QuitEvent(); + 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: - virtual void FrameStart() {} - virtual void HandleEvents(); - virtual void Update() {} - 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 + //control + static SDL_Renderer* GetRenderer(); + void SetSceneSignal(SceneSignal); private: - static SDL_Surface* screen; - SceneList nextScene = SceneList::CONTINUE; -}; - -#endif + static SDL_Renderer* rendererHandle; + SceneSignal sceneSignal = SceneSignal::CONTINUE; +}; \ No newline at end of file diff --git a/client/channels.hpp b/client/channels.hpp index 431b877..362463a 100644 --- a/client/channels.hpp +++ b/client/channels.hpp @@ -19,11 +19,8 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef CHANNELS_HPP_ -#define CHANNELS_HPP_ +#pragma once enum Channels { SERVER = 0 }; - -#endif diff --git a/client/client_application.cpp b/client/client_application.cpp index 4e7ea67..9d273ae 100644 --- a/client/client_application.cpp +++ b/client/client_application.cpp @@ -24,22 +24,14 @@ #include "serial_packet.hpp" #include "config_utility.hpp" -#include +//for handling platforms +#include "SDL2/SDL_syswm.h" +#include "SDL2/SDL_version.h" + #include #include #include - -//------------------------- -//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" +#include //------------------------- //Public access members @@ -52,58 +44,147 @@ void ClientApplication::Init(int argc, char* argv[]) { ConfigUtility& config = ConfigUtility::GetSingleton(); 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 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 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); - std::cout << "Initialized SDL_net" << std::endl; - //------------------------- - //Setup the screen - //------------------------- + std::cout << "Initialized SDL_net 2.0" << std::endl; - int w = config.Int("client.screen.w"); - int h = config.Int("client.screen.h"); - int f = config.Bool("client.screen.f") ? SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN : SDL_HWSURFACE|SDL_DOUBLEBUF; + //setting up SDL2_ttf + if (TTF_Init()) { + 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 the screen" << std::endl; + std::cout << "Initialized SDL_ttf 2.0" << std::endl; //------------------------- //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; - DEBUG_OUTPUT_VAR(NETWORK_VERSION); - DEBUG_OUTPUT_VAR(sizeof(Region::type_t)); - DEBUG_OUTPUT_VAR(sizeof(Region)); - DEBUG_OUTPUT_VAR(REGION_WIDTH); - DEBUG_OUTPUT_VAR(REGION_HEIGHT); - DEBUG_OUTPUT_VAR(REGION_DEPTH); - DEBUG_OUTPUT_VAR(REGION_TILE_FOOTPRINT); - DEBUG_OUTPUT_VAR(REGION_SOLID_FOOTPRINT); - DEBUG_OUTPUT_VAR(PACKET_STRING_SIZE); - DEBUG_OUTPUT_VAR(PACKET_BUFFER_SIZE); - DEBUG_OUTPUT_VAR(MAX_PACKET_SIZE); - DEBUG_OUTPUT_VAR(static_cast(SerialPacketType::LAST)); - -#undef DEBUG_OUTPUT_VAR + DEBUG_INTERNAL_VAR(NETWORK_VERSION); + DEBUG_INTERNAL_VAR(sizeof(Region::type_t)); + DEBUG_INTERNAL_VAR(sizeof(Region)); + DEBUG_INTERNAL_VAR(REGION_WIDTH); + DEBUG_INTERNAL_VAR(REGION_HEIGHT); + DEBUG_INTERNAL_VAR(REGION_DEPTH); + DEBUG_INTERNAL_VAR(REGION_TILE_FOOTPRINT); + DEBUG_INTERNAL_VAR(REGION_SOLID_FOOTPRINT); + DEBUG_INTERNAL_VAR(PACKET_STRING_SIZE); + DEBUG_INTERNAL_VAR(PACKET_BUFFER_SIZE); + DEBUG_INTERNAL_VAR(MAX_PACKET_SIZE); + DEBUG_INTERNAL_VAR(static_cast(SerialPacketType::LAST)); //------------------------- //finalize the startup @@ -119,88 +200,156 @@ void ClientApplication::Init(int argc, char* argv[]) { } 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; Clock::time_point simTime = Clock::now(); Clock::time_point realTime; + constexpr std::chrono::duration frameDelay(16); //~60FPS - //The main loop - while(activeScene->GetNextScene() != SceneList::QUIT) { - //switch scenes when necessary - if (activeScene->GetNextScene() != SceneList::CONTINUE) { - LoadScene(activeScene->GetNextScene()); + //the game loop continues until the scenes signal QUIT + while(activeScene->GetSceneSignal() != SceneSignal::QUIT) { + //switch scenes if necessary + if(activeScene->GetSceneSignal() != SceneSignal::CONTINUE) { + ProcessSceneSignal(activeScene->GetSceneSignal()); continue; } //update the current time realTime = Clock::now(); - //simulate game time + //simulate the game or give the machine a break if (simTime < realTime) { - while (simTime < realTime) { - //call each user defined function - activeScene->RunFrame(); - //~60 FPS - simTime += std::chrono::duration(16); + while(simTime < realTime) { + //call the user defined functions + activeScene->FrameStart(); + ProcessEvents(); + activeScene->Update(); + activeScene->FrameEnd(); + + //step to the next frame + simTime += frameDelay; } } else { - //give the machine a break - SDL_Delay(10); + SDL_Delay(1); } - //draw the game to the screen - activeScene->RenderFrame(); + SDL_RenderClear(renderer); + activeScene->RenderFrame(renderer); + SDL_RenderPresent(renderer); } - UnloadScene(); + //cleanup + ClearScene(); } void ClientApplication::Quit() { + //clean up after the program std::cout << "Shutting down" << std::endl; UDPNetworkUtility::GetSingleton().Close(); + TTF_Quit(); SDLNet_Quit(); - SDL_Quit(); + BaseScene::SetRenderer(nullptr); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); std::cout << "Clean exit" << std::endl; } //------------------------- -//Private access members +//Scene management //------------------------- -void ClientApplication::LoadScene(SceneList sceneIndex) { - //BUG: #16 Resources are being reloaded between scenes - UnloadScene(); - switch(sceneIndex) { - //add scene creation calls here - case SceneList::FIRST: - case SceneList::SPLASHSCREEN: - activeScene = new SplashScreen(); - break; - case SceneList::MAINMENU: - activeScene = new MainMenu(); - break; - case SceneList::OPTIONSMENU: - activeScene = new OptionsMenu(); - break; - case SceneList::LOBBYMENU: - activeScene = new LobbyMenu(&clientIndex, &accountIndex); - break; - case SceneList::WORLD: - activeScene = new World(&clientIndex, &accountIndex); - break; - case SceneList::DISCONNECTEDSCREEN: - activeScene = new DisconnectedScreen(); - break; - default: - throw(std::logic_error("Failed to recognize the scene index")); +void ClientApplication::ProcessEvents() { + SDL_Event event; + while(SDL_PollEvent(&event)) { + switch(event.type) { + case SDL_QUIT: + activeScene->QuitEvent(); + break; + + case SDL_MOUSEMOTION: + activeScene->MouseMotion(event.motion); + break; + + case SDL_MOUSEBUTTONDOWN: + activeScene->MouseButtonDown(event.button); + break; + + case SDL_MOUSEBUTTONUP: + activeScene->MouseButtonUp(event.button); + break; + + case SDL_MOUSEWHEEL: + activeScene->MouseWheel(event.wheel); + break; + + case SDL_KEYDOWN: + activeScene->KeyDown(event.key); + break; + + 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; activeScene = nullptr; } diff --git a/client/client_application.hpp b/client/client_application.hpp index 6f6fc0b..ea560fe 100644 --- a/client/client_application.hpp +++ b/client/client_application.hpp @@ -19,21 +19,19 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef CLIENTAPPLICATION_HPP_ -#define CLIENTAPPLICATION_HPP_ +#pragma once -#include "scene_list.hpp" #include "base_scene.hpp" - +#include "scene_signal.hpp" +#include "singleton.hpp" #include "udp_network_utility.hpp" -#include "singleton.hpp" - -#include +#include "SDL2/SDL.h" +#include "SDL2/SDL_net.h" +#include "SDL2/SDL_ttf.h" class ClientApplication: public Singleton { public: - //public methods void Init(int argc, char* argv[]); void Proc(); void Quit(); @@ -44,15 +42,18 @@ private: ClientApplication() = default; ~ClientApplication() = default; - //Private access members - void LoadScene(SceneList sceneIndex); - void UnloadScene(); + //scene management + void ProcessEvents(); + void ProcessSceneSignal(SceneSignal); + void ClearScene(); BaseScene* activeScene = nullptr; + //TODO: (9) build a "window" class? + SDL_Window* window = nullptr; + SDL_Renderer* renderer = nullptr; + //shared parameters int clientIndex = -1; int accountIndex = -1; -}; - -#endif +}; \ No newline at end of file diff --git a/client/client_utilities/terminal_error.hpp b/client/client_utilities/terminal_error.hpp index 8a7216b..0735247 100644 --- a/client/client_utilities/terminal_error.hpp +++ b/client/client_utilities/terminal_error.hpp @@ -19,8 +19,7 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef TERMINALERROR_HPP_ -#define TERMINALERROR_HPP_ +#pragma once #include #include @@ -30,5 +29,3 @@ public: explicit terminal_error(const std::string& str): runtime_error(str) {} explicit terminal_error(const char* cstr): runtime_error(cstr) {} }; - -#endif diff --git a/client/entities/base_character.cpp b/client/entities/base_character.cpp index c0e3f99..eb348c0 100644 --- a/client/entities/base_character.cpp +++ b/client/entities/base_character.cpp @@ -21,6 +21,7 @@ */ #include "base_character.hpp" +//TODO: (3) remove this #include "config_utility.hpp" //------------------------- @@ -30,16 +31,16 @@ void BaseCharacter::CorrectSprite() { //NOTE: These must correspond to the sprite sheet in use if (motion.y > 0) { - sprite.SetYIndex(0); + sprite.SetIndexY(0); } else if (motion.y < 0) { - sprite.SetYIndex(1); + sprite.SetIndexY(1); } else if (motion.x > 0) { - sprite.SetYIndex(3); + sprite.SetIndexY(3); } else if (motion.x < 0) { - sprite.SetYIndex(2); + sprite.SetIndexY(2); } //animation @@ -48,7 +49,7 @@ void BaseCharacter::CorrectSprite() { } else { sprite.SetDelay(0); - sprite.SetXIndex(0); + sprite.SetIndexX(0); } } @@ -72,9 +73,9 @@ std::string BaseCharacter::GetHandle() const { return handle; } -std::string BaseCharacter::SetAvatar(std::string s) { +std::string BaseCharacter::SetAvatar(SDL_Renderer* const renderer, std::string 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; } diff --git a/client/entities/base_character.hpp b/client/entities/base_character.hpp index cd38a6a..4dca687 100644 --- a/client/entities/base_character.hpp +++ b/client/entities/base_character.hpp @@ -19,8 +19,7 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef BASECHARACTER_HPP_ -#define BASECHARACTER_HPP_ +#pragma once //components #include "character_defines.hpp" @@ -42,7 +41,7 @@ public: int GetOwner(); std::string SetHandle(std::string s); std::string GetHandle() const; - std::string SetAvatar(std::string s); + std::string SetAvatar(SDL_Renderer* const, std::string s); std::string GetAvatar() const; protected: @@ -51,5 +50,3 @@ protected: std::string handle; std::string avatar; }; - -#endif diff --git a/client/entities/base_monster.cpp b/client/entities/base_monster.cpp index 8d4acec..cda27f8 100644 --- a/client/entities/base_monster.cpp +++ b/client/entities/base_monster.cpp @@ -35,9 +35,9 @@ std::string BaseMonster::GetHandle() const { return handle; } -std::string BaseMonster::SetAvatar(std::string s) { +std::string BaseMonster::SetAvatar(SDL_Renderer* const renderer, std::string s) { avatar = s; - sprite.LoadSurface(ConfigUtility::GetSingleton()["dir.sprites"] + avatar, 4, 1); + sprite.Load(renderer, ConfigUtility::GetSingleton()["dir.sprites"] + avatar, 4, 1); return avatar; } diff --git a/client/entities/base_monster.hpp b/client/entities/base_monster.hpp index 328008a..d99ee55 100644 --- a/client/entities/base_monster.hpp +++ b/client/entities/base_monster.hpp @@ -19,8 +19,7 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef BASEMONSTER_HPP_ -#define BASEMONSTER_HPP_ +#pragma once #include "entity.hpp" @@ -33,7 +32,7 @@ public: std::string SetHandle(std::string s); std::string GetHandle() const; - std::string SetAvatar(std::string s); + std::string SetAvatar(SDL_Renderer* const, std::string s); std::string GetAvatar() const; protected: @@ -41,5 +40,3 @@ protected: std::string handle; std::string avatar; }; - -#endif \ No newline at end of file diff --git a/client/entities/entity.cpp b/client/entities/entity.cpp index da67f27..e44bc4f 100644 --- a/client/entities/entity.cpp +++ b/client/entities/entity.cpp @@ -26,8 +26,8 @@ void Entity::Update() { sprite.Update(0.016); } -void Entity::DrawTo(SDL_Surface* const dest, int camX, int camY) { - sprite.DrawTo(dest, origin.x - camX, origin.y - camY); +void Entity::DrawTo(SDL_Renderer* const renderer, int camX, int camY) { + sprite.DrawTo(renderer, origin.x - camX, origin.y - camY); } SpriteSheet* Entity::GetSprite() { diff --git a/client/entities/entity.hpp b/client/entities/entity.hpp index 77b5c1c..fb0c653 100644 --- a/client/entities/entity.hpp +++ b/client/entities/entity.hpp @@ -19,18 +19,18 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef ENTITY_HPP_ -#define ENTITY_HPP_ +#pragma once #include "bounding_box.hpp" #include "sprite_sheet.hpp" #include "vector2.hpp" //The base class for all objects in the world +//TODO: (9) write a better hierarchy class Entity { public: 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(); @@ -52,5 +52,3 @@ protected: Vector2 motion; BoundingBox bounds; }; - -#endif \ No newline at end of file diff --git a/client/entities/local_character.cpp b/client/entities/local_character.cpp index 16c1eff..283488d 100644 --- a/client/entities/local_character.cpp +++ b/client/entities/local_character.cpp @@ -26,6 +26,7 @@ bool LocalCharacter::ProcessCollisionGrid(std::list boxList) { for(auto& box : boxList) { if (box.CheckOverlap(origin + bounds)) { + //TODO: (9) write a better collision system origin -= motion; motion = {0, 0}; return true; diff --git a/client/entities/local_character.hpp b/client/entities/local_character.hpp index a462ddc..af7f5fa 100644 --- a/client/entities/local_character.hpp +++ b/client/entities/local_character.hpp @@ -19,8 +19,7 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef LOCALCHARACTER_HPP_ -#define LOCALCHARACTER_HPP_ +#pragma once #include "base_character.hpp" #include "bounding_box.hpp" @@ -38,5 +37,3 @@ public: private: //NOTE: NO MEMBERS }; - -#endif \ No newline at end of file diff --git a/client/gameplay_scenes/world.hpp b/client/gameplay_scenes/world.hpp index a2af0a2..c8b8491 100644 --- a/client/gameplay_scenes/world.hpp +++ b/client/gameplay_scenes/world.hpp @@ -19,8 +19,7 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef INWORLD_HPP_ -#define INWORLD_HPP_ +#pragma once //maps #include "region_pager_base.hpp" @@ -32,9 +31,9 @@ //graphics #include "image.hpp" -#include "raster_font.hpp" #include "button.hpp" #include "tile_sheet.hpp" +#include "text_line.hpp" //common #include "frame_rate.hpp" @@ -44,6 +43,10 @@ #include "base_monster.hpp" #include "local_character.hpp" +#include "SDL2/SDL.h" +#include "SDL2/SDL_net.h" +#include "SDL2/SDL_ttf.h" + //STL #include @@ -55,21 +58,22 @@ public: World(int* const argClientIndex, int* const argAccountIndex); ~World(); -protected: - //Frame loop - void FrameStart(); - void Update(); - void FrameEnd(); - void RenderFrame(); - void Render(SDL_Surface* const); + void RenderFrame(SDL_Renderer* renderer) override; - //Event handlers +private: + //frame phases + void FrameStart() override; + void Update() override; + void FrameEnd() override; + + //input events void QuitEvent(); - void MouseMotion(SDL_MouseMotionEvent const&); - void MouseButtonDown(SDL_MouseButtonEvent const&); - void MouseButtonUp(SDL_MouseButtonEvent const&); - void KeyDown(SDL_KeyboardEvent const&); - void KeyUp(SDL_KeyboardEvent const&); + 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; //handle incoming traffic void HandlePacket(SerialPacket* const); @@ -132,17 +136,18 @@ protected: int roomIndex = -1; //graphics - Image buttonImage; - RasterFont font; TileSheet tileSheet; //map RegionPagerBase regionPager; //UI + Image buttonImage; + TTF_Font* font = nullptr; Button disconnectButton; - Button shutDownButton; + Button shutdownButton; FrameRate fps; + TextLine fpsTextLine; //the camera structure struct { @@ -166,5 +171,3 @@ protected: ConfigUtility& config = ConfigUtility::GetSingleton(); UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton(); }; - -#endif diff --git a/client/gameplay_scenes/world_characters.cpp b/client/gameplay_scenes/world_characters.cpp index 377bc05..fc42df4 100644 --- a/client/gameplay_scenes/world_characters.cpp +++ b/client/gameplay_scenes/world_characters.cpp @@ -69,7 +69,7 @@ void World::hCharacterCreate(CharacterPacket* const argPacket) { //fill the character's info character->SetHandle(argPacket->handle); - character->SetAvatar(argPacket->avatar); + character->SetAvatar(GetRenderer(), argPacket->avatar); character->SetOwner(argPacket->accountIndex); character->SetOrigin(argPacket->origin); character->SetMotion(argPacket->motion); @@ -82,8 +82,8 @@ void World::hCharacterCreate(CharacterPacket* const argPacket) { localCharacter = static_cast(character); //focus the camera on this character's sprite - camera.marginX = (camera.width / 2 - localCharacter->GetSprite()->GetImage()->GetClipW() / 2); - camera.marginY = (camera.height/ 2 - localCharacter->GetSprite()->GetImage()->GetClipH() / 2); + camera.marginX = (camera.width / 2 - localCharacter->GetSprite()->GetClipW() / 2); + camera.marginY = (camera.height/ 2 - localCharacter->GetSprite()->GetClipH() / 2); //focus on this character's info characterIndex = argPacket->characterIndex; @@ -135,6 +135,7 @@ void World::hCharacterDelete(CharacterPacket* const argPacket) { void World::hQueryCharacterExists(CharacterPacket* const argPacket) { //prevent a double message about this player's character + //TODO: why is this commented out? // if (argPacket->accountIndex == accountIndex) { // return; // } @@ -152,7 +153,7 @@ void World::hQueryCharacterExists(CharacterPacket* const argPacket) { character->SetMotion(argPacket->motion); character->SetBounds({CHARACTER_BOUNDS_X, CHARACTER_BOUNDS_Y, CHARACTER_BOUNDS_WIDTH, CHARACTER_BOUNDS_HEIGHT}); character->SetHandle(argPacket->handle); - character->SetAvatar(argPacket->avatar); + character->SetAvatar(GetRenderer(), argPacket->avatar); character->SetOwner(argPacket->accountIndex); character->CorrectSprite(); @@ -222,7 +223,7 @@ std::list World::GenerateCollisionGrid(Entity* ptr, int tileWidth, //inner loop wallBounds.y = snapToBase((double)wallBounds.h, ptr->GetOrigin().y); while(wallBounds.y < (ptr->GetOrigin() + ptr->GetBounds()).y + ptr->GetBounds().h) { - //check to see if this tile is solid + //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)) { //push onto the box set boxList.push_front(wallBounds); diff --git a/client/gameplay_scenes/world_connections.cpp b/client/gameplay_scenes/world_connections.cpp index fb30f96..7e6a1fa 100644 --- a/client/gameplay_scenes/world_connections.cpp +++ b/client/gameplay_scenes/world_connections.cpp @@ -52,7 +52,7 @@ void World::CheckHeartBeat() { if (attemptedBeats > 2) { //escape to the disconnect screen SendDisconnectRequest(); - SetNextScene(SceneList::DISCONNECTEDSCREEN); + SetSceneSignal(SceneSignal::DISCONNECTEDSCREEN); ConfigUtility::GetSingleton()["client.disconnectMessage"] = "Error: Lost connection to the server"; } else { @@ -122,13 +122,13 @@ void World::hLogoutResponse(ClientPacket* const argPacket) { void World::hDisconnectResponse(ClientPacket* const argPacket) { hLogoutResponse(argPacket);//shortcut - SetNextScene(SceneList::DISCONNECTEDSCREEN); + SetSceneSignal(SceneSignal::DISCONNECTEDSCREEN); ConfigUtility::GetSingleton()["client.disconnectMessage"] = "You have successfully logged out"; } void World::hAdminDisconnectForced(ClientPacket* const argPacket) { hDisconnectResponse(argPacket);//shortcut - SetNextScene(SceneList::DISCONNECTEDSCREEN); + SetSceneSignal(SceneSignal::DISCONNECTEDSCREEN); ConfigUtility::GetSingleton()["client.disconnectMessage"] = "You have been forcibly disconnected by the server"; } diff --git a/client/gameplay_scenes/world_logic.cpp b/client/gameplay_scenes/world_logic.cpp index a75833e..b09597f 100644 --- a/client/gameplay_scenes/world_logic.cpp +++ b/client/gameplay_scenes/world_logic.cpp @@ -40,29 +40,31 @@ World::World(int* const argClientIndex, int* const argAccountIndex): accountIndex(*argAccountIndex) { //setup the utility objects - buttonImage.LoadSurface(config["dir.interface"] + "button_menu.bmp"); - buttonImage.SetClipH(buttonImage.GetClipH()/3); - font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp"); + buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_red.png"); + font = TTF_OpenFont(config["client.font"].c_str(), 12); - //pass the utility objects - disconnectButton.SetImage(&buttonImage); - disconnectButton.SetFont(&font); - shutDownButton.SetImage(&buttonImage); - shutDownButton.SetFont(&font); + //check that the font loaded + if (!font) { + std::ostringstream msg; + msg << "Failed to load a font file; " << SDL_GetError(); + 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 disconnectButton.SetX(50); - disconnectButton.SetY(50 + buttonImage.GetClipH() * 0); - shutDownButton.SetX(50); - shutDownButton.SetY(50 + buttonImage.GetClipH() * 1); - - //set the button texts - disconnectButton.SetText("Disconnect"); - shutDownButton.SetText("Shut Down"); + disconnectButton.SetY(50); + shutdownButton.SetX(50); + shutdownButton.SetY(70); //load the tilesheet //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 CharacterPacket newPacket; @@ -73,8 +75,7 @@ World::World(int* const argClientIndex, int* const argAccountIndex): network.SendTo(Channels::SERVER, &newPacket); //set the camera's values - camera.width = GetScreen()->w; - camera.height = GetScreen()->h; + SDL_RenderGetLogicalSize(GetRenderer(), &camera.width, &camera.height); //debug // @@ -82,6 +83,7 @@ World::World(int* const argClientIndex, int* const argAccountIndex): World::~World() { //unload the local data + TTF_CloseFont(font); characterMap.clear(); monsterMap.clear(); } @@ -160,17 +162,10 @@ void World::FrameEnd() { // } -void World::RenderFrame() { -// SDL_FillRect(GetScreen(), 0, 0); - Render(GetScreen()); - SDL_Flip(GetScreen()); - fps.Calculate(); -} - -void World::Render(SDL_Surface* const screen) { +void World::RenderFrame(SDL_Renderer* renderer) { //draw the map for (std::list::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 // std::ostringstream msg; @@ -181,18 +176,24 @@ void World::Render(SDL_Surface* const screen) { //draw the entities for (auto& it : characterMap) { //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) { - it.second.DrawTo(screen, camera.x, camera.y); + it.second.DrawTo(renderer, camera.x, camera.y); } //draw UI - disconnectButton.DrawTo(screen); - shutDownButton.DrawTo(screen); - std::ostringstream msg; - msg << fps.GetFrameRate(); - font.DrawStringTo(msg.str(), screen, 0, 0); + disconnectButton.DrawTo(renderer); + shutdownButton.DrawTo(renderer); + + //FPS + fpsTextLine.DrawTo(renderer, 0, 0); + int fpsRet = fps.Calculate(); + if (fpsRet != -1) { + std::ostringstream msg; + msg << "FPS: " << fpsRet; + fpsTextLine.SetText(renderer, font, msg.str(), {255, 255, 255, 255}); + } } //------------------------- @@ -202,31 +203,40 @@ void World::Render(SDL_Surface* const screen) { void World::QuitEvent() { //two-step logout SendDisconnectRequest(); - SetNextScene(SceneList::QUIT); + SetSceneSignal(SceneSignal::QUIT); } -void World::MouseMotion(SDL_MouseMotionEvent const& motion) { - disconnectButton.MouseMotion(motion); - shutDownButton.MouseMotion(motion); +void World::MouseMotion(SDL_MouseMotionEvent const& event) { + disconnectButton.MouseMotion(event); + shutdownButton.MouseMotion(event); } -void World::MouseButtonDown(SDL_MouseButtonEvent const& button) { - disconnectButton.MouseButtonDown(button); - shutDownButton.MouseButtonDown(button); +void World::MouseButtonDown(SDL_MouseButtonEvent const& event) { + disconnectButton.MouseButtonDown(event); + shutdownButton.MouseButtonDown(event); } -void World::MouseButtonUp(SDL_MouseButtonEvent const& button) { - if (disconnectButton.MouseButtonUp(button) == Button::State::HOVER && button.button == SDL_BUTTON_LEFT) { +void World::MouseButtonUp(SDL_MouseButtonEvent const& event) { + if (disconnectButton.MouseButtonUp(event) == Button::State::RELEASED) { SendLogoutRequest(); } - if (shutDownButton.MouseButtonUp(button) == Button::State::HOVER && button.button == SDL_BUTTON_LEFT) { + if (shutdownButton.MouseButtonUp(event) == Button::State::RELEASED) { 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 - switch(key.keysym.sym) { + switch(event.keysym.sym) { case SDLK_ESCAPE: //TODO: (3) the escape key should actually control menus and stuff SendLogoutRequest(); @@ -238,7 +248,7 @@ void World::KeyDown(SDL_KeyboardEvent const& key) { return; } Vector2 motion = localCharacter->GetMotion(); - switch(key.keysym.sym) { + switch(event.keysym.sym) { case SDLK_w: motion.y -= CHARACTER_WALKING_SPEED; break; @@ -265,13 +275,18 @@ void World::KeyDown(SDL_KeyboardEvent const& key) { 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 if (!localCharacter) { return; } Vector2 motion = localCharacter->GetMotion(); - switch(key.keysym.sym) { + switch(event.keysym.sym) { case SDLK_w: motion.y = std::min(0.0, motion.y += CHARACTER_WALKING_SPEED); break; diff --git a/client/gameplay_scenes/world_map.cpp b/client/gameplay_scenes/world_map.cpp index 1265281..d2ec6d1 100644 --- a/client/gameplay_scenes/world_map.cpp +++ b/client/gameplay_scenes/world_map.cpp @@ -29,12 +29,13 @@ //static functions //------------------------- +//TODO: (3) proper checksum static int regionChecksum(Region* const region) { int sum = 0; for(int i = 0; i < REGION_WIDTH; i++) { for (int j = 0; j < REGION_HEIGHT; j++) { 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) { //checksum failed - //NOTE: this patches bug #45, but does not resolve it regionPager.UnloadIf([region](Region const& ref) -> bool { //remove the erroneous region return region == &ref; diff --git a/client/gameplay_scenes/world_monsters.cpp b/client/gameplay_scenes/world_monsters.cpp index ada5786..b4f932c 100644 --- a/client/gameplay_scenes/world_monsters.cpp +++ b/client/gameplay_scenes/world_monsters.cpp @@ -55,7 +55,7 @@ void World::hMonsterCreate(MonsterPacket* const argPacket) { //fill the monster's info monster->SetHandle(argPacket->handle); - monster->SetAvatar(argPacket->avatar); + monster->SetAvatar(GetRenderer(), argPacket->avatar); monster->SetBounds(argPacket->bounds); monster->SetOrigin(argPacket->origin); monster->SetMotion(argPacket->motion); @@ -89,7 +89,7 @@ void World::hQueryMonsterExists(MonsterPacket* const argPacket) { //fill the monster's info monster->SetHandle(argPacket->handle); - monster->SetAvatar(argPacket->avatar); + monster->SetAvatar(GetRenderer(), argPacket->avatar); monster->SetBounds(argPacket->bounds); monster->SetOrigin(argPacket->origin); monster->SetMotion(argPacket->motion); diff --git a/client/main.cpp b/client/main.cpp index 1278f91..5afbd6e 100644 --- a/client/main.cpp +++ b/client/main.cpp @@ -44,6 +44,7 @@ int main(int argc, char* argv[]) { app.Proc(); app.Quit(); + //control the position of the app's destructor ClientApplication::DeleteSingleton(); //delete the singletons diff --git a/client/makefile b/client/makefile index 5013094..bbba8d9 100644 --- a/client/makefile +++ b/client/makefile @@ -1,16 +1,20 @@ #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 #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) LIBS+=-lwsock32 -liphlpapi -lmingw32 endif -LIBS+=-lSDLmain -lSDL +LIBS+=-lSDL2main -lSDL2 -lSDL2_image -lSDL2_ttf #flags 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 CXXSRC=$(wildcard *.cpp) diff --git a/client/menu_scenes/disconnected_screen.cpp b/client/menu_scenes/disconnected_screen.cpp index d3c0fb3..1e447ac 100644 --- a/client/menu_scenes/disconnected_screen.cpp +++ b/client/menu_scenes/disconnected_screen.cpp @@ -25,6 +25,7 @@ #include "config_utility.hpp" #include "udp_network_utility.hpp" +#include #include //------------------------- @@ -35,20 +36,27 @@ DisconnectedScreen::DisconnectedScreen() { ConfigUtility& config = ConfigUtility::GetSingleton(); //setup the utility objects - image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); - image.SetClipH(image.GetClipH()/3); - font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp"); + //TODO: (1) resource tool, to prevent reloading like this + image.Load(GetRenderer(), config["dir.interface"] + "button_red.png"); + font = TTF_OpenFont(config["client.font"].c_str(), 12); - //pass the utility objects - backButton.SetImage(&image); - backButton.SetFont(&font); + //check that the font loaded + if (!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 backButton.SetX(50); - backButton.SetY(50 + image.GetClipH() * 0); + backButton.SetY(50); - //set the button texts - backButton.SetText("Back"); + //set the disconnection message text + textLine.SetText(GetRenderer(), font, config["client.disconnectMessage"], {255, 255, 255, 255}); //full reset UDPNetworkUtility::GetSingleton().Unbind(Channels::SERVER); @@ -58,59 +66,65 @@ DisconnectedScreen::DisconnectedScreen() { } DisconnectedScreen::~DisconnectedScreen() { - // + TTF_CloseFont(font); } //------------------------- //Frame loop //------------------------- +void DisconnectedScreen::FrameStart() { + // +} + void DisconnectedScreen::Update() { if (std::chrono::steady_clock::now() - startTick > std::chrono::duration(10)) { - SetNextScene(SceneList::MAINMENU); + SetSceneSignal(SceneSignal::MAINMENU); } //Eat incoming packets while(UDPNetworkUtility::GetSingleton().Receive()); } -void DisconnectedScreen::Render(SDL_Surface* const screen) { - ConfigUtility& config = ConfigUtility::GetSingleton(); +void DisconnectedScreen::FrameEnd() { + // +} - backButton.DrawTo(screen); - font.DrawStringTo(config["client.disconnectMessage"], screen, 50, 30); +void DisconnectedScreen::RenderFrame(SDL_Renderer* renderer) { + backButton.DrawTo(renderer); + textLine.DrawTo(renderer, 50, 30); } //------------------------- //Event handlers //------------------------- -void DisconnectedScreen::QuitEvent() { - SetNextScene(SceneList::QUIT); +void DisconnectedScreen::MouseMotion(SDL_MouseMotionEvent const& event) { + backButton.MouseMotion(event); } -void DisconnectedScreen::MouseMotion(SDL_MouseMotionEvent const& motion) { - backButton.MouseMotion(motion); +void DisconnectedScreen::MouseButtonDown(SDL_MouseButtonEvent const& event) { + backButton.MouseButtonDown(event); } -void DisconnectedScreen::MouseButtonDown(SDL_MouseButtonEvent const& button) { - backButton.MouseButtonDown(button); -} - -void DisconnectedScreen::MouseButtonUp(SDL_MouseButtonEvent const& button) { - if (backButton.MouseButtonUp(button) == Button::State::HOVER) { - SetNextScene(SceneList::MAINMENU); +void DisconnectedScreen::MouseButtonUp(SDL_MouseButtonEvent const& event) { + if (backButton.MouseButtonUp(event) == Button::State::RELEASED) { + SetSceneSignal(SceneSignal::MAINMENU); } } -void DisconnectedScreen::KeyDown(SDL_KeyboardEvent const& key) { - switch(key.keysym.sym) { +void DisconnectedScreen::MouseWheel(SDL_MouseWheelEvent const& event) { + // +} + +void DisconnectedScreen::KeyDown(SDL_KeyboardEvent const& event) { + switch(event.keysym.sym) { case SDLK_ESCAPE: - SetNextScene(SceneList::MAINMENU); + SetSceneSignal(SceneSignal::MAINMENU); break; } } -void DisconnectedScreen::KeyUp(SDL_KeyboardEvent const& key) { +void DisconnectedScreen::KeyUp(SDL_KeyboardEvent const& event) { // } diff --git a/client/menu_scenes/disconnected_screen.hpp b/client/menu_scenes/disconnected_screen.hpp index a735289..5edf340 100644 --- a/client/menu_scenes/disconnected_screen.hpp +++ b/client/menu_scenes/disconnected_screen.hpp @@ -19,18 +19,15 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef DISCONNECTEDSCREEN_HPP_ -#define DISCONNECTEDSCREEN_HPP_ +#pragma once -//graphics -#include "image.hpp" -#include "raster_font.hpp" -#include "button.hpp" - -//client #include "base_scene.hpp" +#include "button.hpp" +#include "image.hpp" +#include "text_line.hpp" + +#include "SDL2/SDL_ttf.h" -//std namespace #include class DisconnectedScreen : public BaseScene { @@ -39,28 +36,28 @@ public: DisconnectedScreen(); ~DisconnectedScreen(); -protected: - //Frame loop - void Update(); - void Render(SDL_Surface* const); + void RenderFrame(SDL_Renderer* renderer) override; - //Event handlers - void QuitEvent(); - void MouseMotion(SDL_MouseMotionEvent const&); - void MouseButtonDown(SDL_MouseButtonEvent const&); - void MouseButtonUp(SDL_MouseButtonEvent const&); - void KeyDown(SDL_KeyboardEvent const&); - void KeyUp(SDL_KeyboardEvent const&); +protected: + //frame phases + void FrameStart() override; + void Update() override; + void FrameEnd() override; + + //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 Image image; - RasterFont font; - - //UI + TTF_Font* font = nullptr; Button backButton; + TextLine textLine; //auto return std::chrono::steady_clock::time_point startTick; }; - -#endif diff --git a/client/menu_scenes/lobby_menu.cpp b/client/menu_scenes/lobby_menu.cpp index 358d5ca..bd28e51 100644 --- a/client/menu_scenes/lobby_menu.cpp +++ b/client/menu_scenes/lobby_menu.cpp @@ -23,6 +23,7 @@ #include "channels.hpp" +#include #include #include @@ -39,33 +40,37 @@ LobbyMenu::LobbyMenu(int* const argClientIndex, int* const argAccountIndex): accountIndex = -1; //setup the utility objects - image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); - image.SetClipH(image.GetClipH()/3); - font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp"); + buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_red.png"); + font = TTF_OpenFont(config["client.font"].c_str(), 12); - //pass the utility objects - search.SetImage(&image); - search.SetFont(&font); - join.SetImage(&image); - join.SetFont(&font); - back.SetImage(&image); - back.SetFont(&font); + //check that the font loaded + if (!font) { + std::ostringstream msg; + msg << "Failed to load a font file; " << SDL_GetError(); + throw(std::runtime_error(msg.str())); + } - //set the button positions - search.SetX(50); - search.SetY(50 + image.GetClipH() * 0); - join.SetX(50); - join.SetY(50 + image.GetClipH() * 1); - back.SetX(50); - back.SetY(50 + image.GetClipH() * 2); + //setup the buttons + searchButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture()); + searchButton.SetText(GetRenderer(), font, "Search", COLOR_BLUE); + joinButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture()); + joinButton.SetText(GetRenderer(), font, "Join", COLOR_BLUE); + backButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture()); + backButton.SetText(GetRenderer(), font, "Back", COLOR_BLUE); - //set the button texts - search.SetText("Search"); - join.SetText("Join"); - back.SetText("Back"); + //set the button positions (assumed) + searchButton.SetX(50); + searchButton.SetY(50); + joinButton.SetX(50); + joinButton.SetY(70); + backButton.SetX(50); + backButton.SetY(90); - //set the server list's position - listBox = {300, 50, 200, font.GetCharH()}; + //pseudo-list selection + boundingBox = {300, 50, 200, 12}; + + //hacked together a highlight box + highlightImage.Create(GetRenderer(), 300, 12, {49, 150, 5, 255}); //Eat incoming packets while(network.Receive()); @@ -75,7 +80,7 @@ LobbyMenu::LobbyMenu(int* const argClientIndex, int* const argAccountIndex): } 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 //UI - search.DrawTo(screen); - join.DrawTo(screen); - back.DrawTo(screen); + searchButton.DrawTo(renderer); + joinButton.DrawTo(renderer); + backButton.DrawTo(renderer); //TODO: (3) draw headers for 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 - if (selection == &serverInfo[i]) { - SDL_Rect r = { - (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)); + if (selection == &serverVector[i]) { + highlightImage.DrawTo(renderer, boundingBox.x, boundingBox.y + boundingBox.h * i); } - //draw the server name - font.DrawStringTo(serverInfo[i].name, screen, listBox.x, listBox.y + i*listBox.h); - - //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); - } + //draw the server's info + 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); } } @@ -139,49 +130,54 @@ void LobbyMenu::Render(SDL_Surface* const screen) { //Event handlers //------------------------- -void LobbyMenu::MouseMotion(SDL_MouseMotionEvent const& motion) { - search.MouseMotion(motion); - join.MouseMotion(motion); - back.MouseMotion(motion); +void LobbyMenu::MouseMotion(SDL_MouseMotionEvent const& event) { + searchButton.MouseMotion(event); + joinButton.MouseMotion(event); + backButton.MouseMotion(event); } -void LobbyMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) { - search.MouseButtonDown(button); - join.MouseButtonDown(button); - back.MouseButtonDown(button); +void LobbyMenu::MouseButtonDown(SDL_MouseButtonEvent const& event) { + searchButton.MouseButtonDown(event); + joinButton.MouseButtonDown(event); + backButton.MouseButtonDown(event); } -void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { - if (search.MouseButtonUp(button) == Button::State::HOVER) { +void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& event) { + if (searchButton.MouseButtonUp(event) == Button::State::RELEASED) { SendBroadcastRequest(); } - else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) { + if (joinButton.MouseButtonUp(event) == Button::State::RELEASED && selection && selection->compatible) { SendJoinRequest(); } - else if (back.MouseButtonUp(button) == Button::State::HOVER) { - SetNextScene(SceneList::MAINMENU); + if (backButton.MouseButtonUp(event) == Button::State::RELEASED) { + SetSceneSignal(SceneSignal::MAINMENU); } //has the user selected a server on the list? - BoundingBox tmpBox = listBox; - tmpBox.h *= serverInfo.size(); - if (tmpBox.CheckOverlap({button.x, button.y})) { - selection = &serverInfo[(button.y - listBox.y)/listBox.h]; + BoundingBox tmpBox = boundingBox; + tmpBox.h *= serverVector.size(); //within the list bounds + if (tmpBox.CheckOverlap({event.x, event.y})) { + //NOTE: this memory trick requires a vector + selection = &serverVector[(event.y - boundingBox.y)/boundingBox.h]; } else { selection = nullptr; } } -void LobbyMenu::KeyDown(SDL_KeyboardEvent const& key) { - switch(key.keysym.sym) { +void LobbyMenu::MouseWheel(SDL_MouseWheelEvent const& event) { + // +} + +void LobbyMenu::KeyDown(SDL_KeyboardEvent const& event) { + switch(event.keysym.sym) { case SDLK_ESCAPE: - SetNextScene(SceneList::MAINMENU); + SetSceneSignal(SceneSignal::MAINMENU); 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) { //extract the data - ServerInformation server; - server.address = argPacket->srcAddress; - server.name = argPacket->name; - server.playerCount = argPacket->playerCount; - server.version = argPacket->version; + ServerInfo newServer; - //Checking compatibility - server.compatible = server.version == NETWORK_VERSION; + newServer.address = argPacket->srcAddress; + newServer.name = argPacket->name; + newServer.playerCount = argPacket->playerCount; + newServer.version = argPacket->version; + newServer.compatible = newServer.version == NETWORK_VERSION; //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) { @@ -249,7 +266,7 @@ void LobbyMenu::HandleLoginResponse(ClientPacket* const argPacket) { throw(std::runtime_error("Client index invalid during login")); } accountIndex = argPacket->accountIndex; - SetNextScene(SceneList::WORLD); + SetSceneSignal(SceneSignal::WORLD); } 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); //reset the server list - serverInfo.clear(); + serverVector.clear(); selection = nullptr; } @@ -287,10 +304,11 @@ void LobbyMenu::SendJoinRequest() { void LobbyMenu::SendLoginRequest() { //NOTE: high cohesion + //TODO: (9) have a separate login screen ClientPacket packet; packet.type = SerialPacketType::LOGIN_REQUEST; 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); } diff --git a/client/menu_scenes/lobby_menu.hpp b/client/menu_scenes/lobby_menu.hpp index 067af8c..e591346 100644 --- a/client/menu_scenes/lobby_menu.hpp +++ b/client/menu_scenes/lobby_menu.hpp @@ -19,14 +19,15 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef LOBBYMENU_HPP_ -#define LOBBYMENU_HPP_ +#pragma once //graphics & ui #include "image.hpp" -#include "raster_font.hpp" #include "button.hpp" #include "bounding_box.hpp" +#include "text_line.hpp" + +#include "SDL2/SDL_ttf.h" //utilities #include "config_utility.hpp" @@ -45,19 +46,21 @@ public: LobbyMenu(int* const argClientIndex, int* const argAccountIndex); ~LobbyMenu(); -protected: - //Frame loop - void FrameStart(); - void Update(); - void FrameEnd(); - void Render(SDL_Surface* const); + void RenderFrame(SDL_Renderer* renderer) override; - //Event handlers - void MouseMotion(SDL_MouseMotionEvent const&); - void MouseButtonDown(SDL_MouseButtonEvent const&); - void MouseButtonUp(SDL_MouseButtonEvent const&); - void KeyDown(SDL_KeyboardEvent const&); - void KeyUp(SDL_KeyboardEvent const&); +protected: + //frame phases + void FrameStart() override; + void Update() override; + void FrameEnd() override; + + //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 void HandlePacket(SerialPacket* const); @@ -78,15 +81,13 @@ protected: int& clientIndex; int& accountIndex; - //members - Image image; - RasterFont font; - Button search; - Button join; - Button back; + //define the list object + struct ServerInfo { + //graphics + TextLine nameImage; + TextLine playerCountImage; - //server list - struct ServerInformation { + //networking IPaddress address; std::string name; int playerCount; @@ -94,12 +95,16 @@ protected: bool compatible; }; - std::vector serverInfo; + //members + Image buttonImage; + Image highlightImage; + TTF_Font* font = nullptr; + Button searchButton; + Button joinButton; + Button backButton; - //NOTE: a terrible hack - //I'd love a proper gui system for this - BoundingBox listBox; - ServerInformation* selection = nullptr; + std::vector serverVector; + ServerInfo* selection = nullptr; + + BoundingBox boundingBox; }; - -#endif diff --git a/client/menu_scenes/main_menu.cpp b/client/menu_scenes/main_menu.cpp index e6735d1..aff31b8 100644 --- a/client/menu_scenes/main_menu.cpp +++ b/client/menu_scenes/main_menu.cpp @@ -23,6 +23,9 @@ #include "config_utility.hpp" +#include +#include + //------------------------- //Public access members //------------------------- @@ -31,37 +34,43 @@ MainMenu::MainMenu() { ConfigUtility& config = ConfigUtility::GetSingleton(); //setup the utility objects - image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); - image.SetClipH(image.GetClipH()/3); - font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp"); + buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_red.png"); + font = TTF_OpenFont(config["client.font"].c_str(), 12); - //pass the utility objects - startButton.SetImage(&image); - startButton.SetFont(&font); - optionsButton.SetImage(&image); - optionsButton.SetFont(&font); - quitButton.SetImage(&image); - quitButton.SetFont(&font); + //check that the font loaded + if (!font) { + std::ostringstream msg; + msg << "Failed to load a font file; " << SDL_GetError(); + throw(std::runtime_error(msg.str())); + } + + //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 startButton.SetX(50); - startButton.SetY(50 + image.GetClipH() * 0); + startButton.SetY(50 + 20 * 0); optionsButton.SetX(50); - optionsButton.SetY(50 + image.GetClipH() * 1); + optionsButton.SetY(50 + 20 * 1); quitButton.SetX(50); - quitButton.SetY(50 + image.GetClipH() * 2); + quitButton.SetY(50 + 20 * 2); - //set the button texts - startButton.SetText("Start"); - optionsButton.SetText("Options"); - quitButton.SetText("Quit"); + //text box + textBox.PushLine(GetRenderer(), font, "Thanks for playing!", {255, 255, 255, 255}); + textBox.PushLine(GetRenderer(), font, "You can get the latest version at: ", {255, 255, 255, 255}); + textBox.PushLine(GetRenderer(), font, "krgamestudios.com", {255, 255, 255, 255}); //TODO: (9) click to open the website/update //debug // } MainMenu::~MainMenu() { - // + TTF_CloseFont(font); } //------------------------- @@ -80,52 +89,56 @@ void MainMenu::FrameEnd() { // } -void MainMenu::Render(SDL_Surface* const screen) { - startButton.DrawTo(screen); - optionsButton.DrawTo(screen); - quitButton.DrawTo(screen); +void MainMenu::RenderFrame(SDL_Renderer* renderer) { + startButton.DrawTo(renderer); + optionsButton.DrawTo(renderer); + quitButton.DrawTo(renderer); - //text - font.DrawStringTo("Thanks for playing!", screen, 50, screen->h - 50 - image.GetClipH() * 2); - 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); + int h = -1; + SDL_RenderGetLogicalSize(GetRenderer(), nullptr, &h); + + textBox.DrawTo(renderer, 50, h-50, -12); } //------------------------- //Event handlers //------------------------- -void MainMenu::MouseMotion(SDL_MouseMotionEvent const& motion) { - startButton.MouseMotion(motion); - optionsButton.MouseMotion(motion); - quitButton.MouseMotion(motion); +void MainMenu::MouseMotion(SDL_MouseMotionEvent const& event) { + startButton.MouseMotion(event); + optionsButton.MouseMotion(event); + quitButton.MouseMotion(event); } -void MainMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) { - startButton.MouseButtonDown(button); - optionsButton.MouseButtonDown(button); - quitButton.MouseButtonDown(button); +void MainMenu::MouseButtonDown(SDL_MouseButtonEvent const& event) { + startButton.MouseButtonDown(event); + optionsButton.MouseButtonDown(event); + 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 - if (startButton.MouseButtonUp(button) == Button::State::HOVER) { - SetNextScene(SceneList::LOBBYMENU); + if (startButton.MouseButtonUp(event) == Button::State::RELEASED) { + SetSceneSignal(SceneSignal::LOBBYMENU); } - if (optionsButton.MouseButtonUp(button) == Button::State::HOVER) { - SetNextScene(SceneList::OPTIONSMENU); + if (optionsButton.MouseButtonUp(event) == Button::State::RELEASED) { + SetSceneSignal(SceneSignal::OPTIONSMENU); } - if (quitButton.MouseButtonUp(button) == Button::State::HOVER) { + if (quitButton.MouseButtonUp(event) == Button::State::RELEASED) { QuitEvent(); } } -void MainMenu::KeyDown(SDL_KeyboardEvent const& key) { +void MainMenu::MouseWheel(SDL_MouseWheelEvent const& event) { // } -void MainMenu::KeyUp(SDL_KeyboardEvent const& key) { - switch(key.keysym.sym) { +void MainMenu::KeyDown(SDL_KeyboardEvent const& event) { + // +} + +void MainMenu::KeyUp(SDL_KeyboardEvent const& event) { + switch(event.keysym.sym) { case SDLK_ESCAPE: QuitEvent(); break; diff --git a/client/menu_scenes/main_menu.hpp b/client/menu_scenes/main_menu.hpp index d3e7f74..272408c 100644 --- a/client/menu_scenes/main_menu.hpp +++ b/client/menu_scenes/main_menu.hpp @@ -19,14 +19,14 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef MAINMENU_HPP_ -#define MAINMENU_HPP_ +#pragma once #include "base_scene.hpp" - -#include "image.hpp" -#include "raster_font.hpp" #include "button.hpp" +#include "image.hpp" +#include "text_box.hpp" + +#include "SDL2/SDL_ttf.h" class MainMenu : public BaseScene { public: @@ -34,26 +34,27 @@ public: MainMenu(); ~MainMenu(); -protected: - //Frame loop - void FrameStart(); - void Update(); - void FrameEnd(); - void Render(SDL_Surface* const); + void RenderFrame(SDL_Renderer* renderer) override; - //Event handlers - void MouseMotion(SDL_MouseMotionEvent const&); - void MouseButtonDown(SDL_MouseButtonEvent const&); - void MouseButtonUp(SDL_MouseButtonEvent const&); - void KeyDown(SDL_KeyboardEvent const&); - void KeyUp(SDL_KeyboardEvent const&); +protected: + //frame phases + void FrameStart() override; + void Update() override; + void FrameEnd() override; + + //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 - Image image; - RasterFont font; + Image buttonImage; + TTF_Font* font = nullptr; Button startButton; Button optionsButton; Button quitButton; + TextBox textBox; }; - -#endif diff --git a/client/menu_scenes/makefile b/client/menu_scenes/makefile index e006dc4..f03de53 100644 --- a/client/menu_scenes/makefile +++ b/client/menu_scenes/makefile @@ -1,5 +1,5 @@ #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+= CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) diff --git a/client/menu_scenes/options_menu.cpp b/client/menu_scenes/options_menu.cpp index f06b798..dc30b15 100644 --- a/client/menu_scenes/options_menu.cpp +++ b/client/menu_scenes/options_menu.cpp @@ -23,6 +23,9 @@ #include "config_utility.hpp" +#include +#include + //------------------------- //Public access members //------------------------- @@ -31,24 +34,30 @@ OptionsMenu::OptionsMenu() { ConfigUtility& config = ConfigUtility::GetSingleton(); //setup the utility objects - image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); - image.SetClipH(image.GetClipH()/3); - font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp"); + buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_red.png"); + font = TTF_OpenFont(config["client.font"].c_str(), 12); - //pass the utility objects - backButton.SetImage(&image); - backButton.SetFont(&font); + //check that the font loaded + if (!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 backButton.SetX(50); - backButton.SetY(50 + image.GetClipH() * 0); + backButton.SetY(50); - //set the button texts - backButton.SetText("Back"); + //text line + textLine.SetText(GetRenderer(), font, "This code is fucking hard to refactor.", {255, 255, 255, 255}); } OptionsMenu::~OptionsMenu() { - // + TTF_CloseFont(font); } //------------------------- @@ -67,38 +76,41 @@ void OptionsMenu::FrameEnd() { // } -void OptionsMenu::Render(SDL_Surface* const screen) { - backButton.DrawTo(screen); - - font.DrawStringTo("Oh, were you looking for the options screen?", screen, 50, 30); +void OptionsMenu::RenderFrame(SDL_Renderer* renderer) { + backButton.DrawTo(renderer); + textLine.DrawTo(renderer, 50, 30); } //------------------------- //Event handlers //------------------------- -void OptionsMenu::MouseMotion(SDL_MouseMotionEvent const& motion) { - backButton.MouseMotion(motion); +void OptionsMenu::MouseMotion(SDL_MouseMotionEvent const& event) { + backButton.MouseMotion(event); } -void OptionsMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) { - backButton.MouseButtonDown(button); +void OptionsMenu::MouseButtonDown(SDL_MouseButtonEvent const& event) { + backButton.MouseButtonDown(event); } -void OptionsMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { - if (backButton.MouseButtonUp(button) == Button::State::HOVER) { - SetNextScene(SceneList::MAINMENU); +void OptionsMenu::MouseButtonUp(SDL_MouseButtonEvent const& event) { + if (backButton.MouseButtonUp(event) == Button::State::RELEASED) { + SetSceneSignal(SceneSignal::MAINMENU); } } -void OptionsMenu::KeyDown(SDL_KeyboardEvent const& key) { - switch(key.keysym.sym) { +void OptionsMenu::MouseWheel(SDL_MouseWheelEvent const& event) { + // +} + +void OptionsMenu::KeyDown(SDL_KeyboardEvent const& event) { + switch(event.keysym.sym) { case SDLK_ESCAPE: - SetNextScene(SceneList::MAINMENU); + SetSceneSignal(SceneSignal::MAINMENU); break; } } -void OptionsMenu::KeyUp(SDL_KeyboardEvent const& key) { +void OptionsMenu::KeyUp(SDL_KeyboardEvent const& event) { // } diff --git a/client/menu_scenes/options_menu.hpp b/client/menu_scenes/options_menu.hpp index a828627..31507f6 100644 --- a/client/menu_scenes/options_menu.hpp +++ b/client/menu_scenes/options_menu.hpp @@ -19,15 +19,14 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef OPTIONSMENU_HPP_ -#define OPTIONSMENU_HPP_ +#pragma once + +#include "button.hpp" +#include "image.hpp" +#include "text_line.hpp" #include "base_scene.hpp" -#include "image.hpp" -#include "raster_font.hpp" -#include "button.hpp" - //NOTE: The options screen needs to be USED class OptionsMenu : public BaseScene { public: @@ -35,24 +34,25 @@ public: OptionsMenu(); ~OptionsMenu(); -protected: - //Frame loop - void FrameStart(); - void Update(); - void FrameEnd(); - void Render(SDL_Surface* const); + void RenderFrame(SDL_Renderer* renderer) override; - //Event handlers - void MouseMotion(SDL_MouseMotionEvent const&); - void MouseButtonDown(SDL_MouseButtonEvent const&); - void MouseButtonUp(SDL_MouseButtonEvent const&); - void KeyDown(SDL_KeyboardEvent const&); - void KeyUp(SDL_KeyboardEvent const&); +private: + //frame phases + void FrameStart() override; + void Update() override; + void FrameEnd() override; + + //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 - Image image; - RasterFont font; + Image buttonImage; + TTF_Font* font = nullptr; Button backButton; + TextLine textLine; }; - -#endif diff --git a/client/menu_scenes/splash_screen.cpp b/client/menu_scenes/splash_screen.cpp index 5399efd..8be6a34 100644 --- a/client/menu_scenes/splash_screen.cpp +++ b/client/menu_scenes/splash_screen.cpp @@ -27,25 +27,38 @@ //Public access members //------------------------- -SplashScreen::SplashScreen() { - logo.LoadSurface(ConfigUtility::GetSingleton()["dir.logos"] + "krstudios.bmp"); +SplashScreen::SplashScreen(SDL_Window* w) { + //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(); } SplashScreen::~SplashScreen() { - // +// SDL_SetWindowSize(window, windowWidth, windowHeight); +// SDL_RenderSetLogicalSize(GetRenderer(), windowWidth, windowHeight); } //------------------------- //Frame loop //------------------------- -void SplashScreen::Update() { - if (std::chrono::steady_clock::now() - startTick > std::chrono::duration(1)) { - SetNextScene(SceneList::MAINMENU); +void SplashScreen::FrameStart() { + //TODO: (0) config flag to change the delay + if (std::chrono::steady_clock::now() - startTick > std::chrono::duration(3)) { + SetSceneSignal(SceneSignal::MAINMENU); } } -void SplashScreen::Render(SDL_Surface* const screen) { - logo.DrawTo(screen, (screen->w - logo.GetClipW()) / 2, (screen->h - logo.GetClipH()) / 2); +void SplashScreen::RenderFrame(SDL_Renderer* renderer) { + int w = 0, h = 0; + SDL_RenderGetLogicalSize(renderer, &w, &h); + logo.DrawTo(renderer, (w - logo.GetClipW()) / 2, (h - logo.GetClipH()) / 2); } diff --git a/client/menu_scenes/splash_screen.hpp b/client/menu_scenes/splash_screen.hpp index a8bec1b..91cde11 100644 --- a/client/menu_scenes/splash_screen.hpp +++ b/client/menu_scenes/splash_screen.hpp @@ -19,11 +19,9 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef SPLASHSCREEN_HPP_ -#define SPLASHSCREEN_HPP_ +#pragma once #include "base_scene.hpp" - #include "image.hpp" #include @@ -31,17 +29,20 @@ class SplashScreen : public BaseScene { public: //Public access members - SplashScreen(); + SplashScreen(SDL_Window*); ~SplashScreen(); -protected: + void RenderFrame(SDL_Renderer* renderer) override; + +private: //Frame loop - void Update(); - void Render(SDL_Surface* const); + void FrameStart() override; //members std::chrono::steady_clock::time_point startTick; Image logo; -}; -#endif + //screws with the window + SDL_Window* window = nullptr; + int windowWidth, windowHeight; +}; diff --git a/client/scene_list.hpp b/client/scene_signal.hpp similarity index 87% rename from client/scene_list.hpp rename to client/scene_signal.hpp index 2db5145..2604ce4 100644 --- a/client/scene_list.hpp +++ b/client/scene_signal.hpp @@ -19,22 +19,19 @@ * 3. This notice may not be removed or altered from any source * distribution. */ -#ifndef SCENELIST_HPP_ -#define SCENELIST_HPP_ +#pragma once -enum class SceneList { - //these are reserved - QUIT, - CONTINUE, - FIRST, +enum SceneSignal { + //reserved members for internal use + QUIT = -1, + CONTINUE = 0, + FIRST = 1, - //custom indexes + //custom scenes SPLASHSCREEN, MAINMENU, OPTIONSMENU, LOBBYMENU, WORLD, DISCONNECTEDSCREEN, -}; - -#endif +}; \ No newline at end of file diff --git a/common b/common new file mode 160000 index 0000000..e7d3205 --- /dev/null +++ b/common @@ -0,0 +1 @@ +Subproject commit e7d3205a966e6a6d5370755cead42068aeda2143 diff --git a/common/debugging/makefile b/common/debugging/makefile deleted file mode 100644 index 104b518..0000000 --- a/common/debugging/makefile +++ /dev/null @@ -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 $@ $< diff --git a/common/debugging/timer.cpp b/common/debugging/timer.cpp deleted file mode 100644 index b99ee10..0000000 --- a/common/debugging/timer.cpp +++ /dev/null @@ -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(t.GetTime()).count(); - os << "us"; - return os; -} diff --git a/common/debugging/timer.hpp b/common/debugging/timer.hpp deleted file mode 100644 index 847f585..0000000 --- a/common/debugging/timer.hpp +++ /dev/null @@ -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 -#include -#include - -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 diff --git a/common/gameplay/character_defines.hpp b/common/gameplay/character_defines.hpp deleted file mode 100644 index 7b0d7d6..0000000 --- a/common/gameplay/character_defines.hpp +++ /dev/null @@ -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 - -//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 diff --git a/common/gameplay/makefile b/common/gameplay/makefile deleted file mode 100644 index 104b518..0000000 --- a/common/gameplay/makefile +++ /dev/null @@ -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 $@ $< diff --git a/common/graphics/image.cpp b/common/graphics/image.cpp deleted file mode 100644 index 4089814..0000000 --- a/common/graphics/image.cpp +++ /dev/null @@ -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 -#include - -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); -} diff --git a/common/graphics/image.hpp b/common/graphics/image.hpp deleted file mode 100644 index 709490d..0000000 --- a/common/graphics/image.hpp +++ /dev/null @@ -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 - -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 diff --git a/common/graphics/makefile b/common/graphics/makefile deleted file mode 100644 index 0d2afc1..0000000 --- a/common/graphics/makefile +++ /dev/null @@ -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 $@ $< diff --git a/common/graphics/sprite_sheet.cpp b/common/graphics/sprite_sheet.cpp deleted file mode 100644 index 93c1984..0000000 --- a/common/graphics/sprite_sheet.cpp +++ /dev/null @@ -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 -#include - -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; -} diff --git a/common/graphics/sprite_sheet.hpp b/common/graphics/sprite_sheet.hpp deleted file mode 100644 index ea28a86..0000000 --- a/common/graphics/sprite_sheet.hpp +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright: (c) Kayne Ruse 2013-2015 - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. -*/ -#ifndef SPRITESHEET_HPP_ -#define SPRITESHEET_HPP_ - -#include "image.hpp" - -class SpriteSheet { -public: - SpriteSheet() = default; - SpriteSheet(std::string fname, Uint16 xCellCount, Uint16 yCellCount) { LoadSurface(fname, xCellCount, yCellCount); } - SpriteSheet(SDL_Surface* surface, Uint16 xCellCount, Uint16 yCellCount) { SetSurface(surface, xCellCount, yCellCount); } - ~SpriteSheet() { FreeSurface(); }; - - void Update(double delta); - - SDL_Surface* LoadSurface(std::string fname, Uint16 xCellCount, Uint16 yCellCount); - SDL_Surface* SetSurface(SDL_Surface* surface, Uint16 xCellCount, Uint16 yCellCount); - SDL_Surface* GetSurface() { return image.GetSurface(); } - void FreeSurface(); - - void DrawTo(SDL_Surface* const dest, Sint16 x, Sint16 y) { image.DrawTo(dest, x, y); } - - //accessors and mutators - Image* GetImage() { return ℑ } //OO breaker - - Uint16 SetXCount(Uint16); - Uint16 SetYCount(Uint16); - Uint16 SetXIndex(Uint16); - Uint16 SetYIndex(Uint16); - - Uint16 GetXCount() const { return xCount; } - Uint16 GetYCount() const { return yCount; } - Uint16 GetXIndex() const { return xIndex; } - Uint16 GetYIndex() const { return yIndex; } - - double SetDelay(double d); - double GetDelay() const { return delay; } - -private: - Image image; - Uint16 xCount = 0, yCount = 0; //number of cells - Uint16 xIndex = 0, yIndex = 0; //current cell being drawn - double delay = 0.0, tick = 0.0; -}; - -#endif diff --git a/common/graphics/tile_sheet.cpp b/common/graphics/tile_sheet.cpp deleted file mode 100644 index 6f47337..0000000 --- a/common/graphics/tile_sheet.cpp +++ /dev/null @@ -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); - } - } - } -} \ No newline at end of file diff --git a/common/graphics/tile_sheet.hpp b/common/graphics/tile_sheet.hpp deleted file mode 100644 index 6ad94ea..0000000 --- a/common/graphics/tile_sheet.hpp +++ /dev/null @@ -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 - -class TileSheet { -public: - TileSheet() = default; - TileSheet(std::string f, int w, int h) { Load(f, w, h); } - ~TileSheet() = default; - - void Load(std::string fname, int tileWidth, int tileHeight); - void Unload(); - - void DrawTileTo(SDL_Surface* const dest, int x, int y, Region::type_t tile); - void DrawRegionTo(SDL_Surface* const dest, Region* const region, int camX, int camY); - - //accessors - Image* GetImage() { return ℑ } - int GetXCount() { return xCount; } - int GetYCount() { return yCount; } - int GetTileW() { return image.GetClipW(); } - int GetTileH() { return image.GetClipH(); } -private: - Image image; - int xCount = 0, yCount = 0; -}; - -#endif diff --git a/common/makefile b/common/makefile deleted file mode 100644 index e2d1029..0000000 --- a/common/makefile +++ /dev/null @@ -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 diff --git a/common/map/makefile b/common/map/makefile deleted file mode 100644 index 2020f4a..0000000 --- a/common/map/makefile +++ /dev/null @@ -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 $@ $< diff --git a/common/map/region.cpp b/common/map/region.cpp deleted file mode 100644 index 1815d36..0000000 --- a/common/map/region.cpp +++ /dev/null @@ -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 -#include -#include - -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::GetSolidBitset() { - return &solid; -} \ No newline at end of file diff --git a/common/map/region.hpp b/common/map/region.hpp deleted file mode 100644 index fd8c461..0000000 --- a/common/map/region.hpp +++ /dev/null @@ -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 - -//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* GetSolidBitset(); -private: - const int x; - const int y; - - type_t tiles[REGION_WIDTH][REGION_HEIGHT][REGION_DEPTH]; - std::bitset solid; -}; - -#endif diff --git a/common/map/region_api.cpp b/common/map/region_api.cpp deleted file mode 100644 index 1c0f848..0000000 --- a/common/map/region_api.cpp +++ /dev/null @@ -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(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(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(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(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(lua_touserdata(L, 1)); - lua_pushinteger(L, region->GetX()); - return 1; -} - -static int getY(lua_State* L) { - Region* region = reinterpret_cast(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; -} \ No newline at end of file diff --git a/common/map/region_api.hpp b/common/map/region_api.hpp deleted file mode 100644 index 4529f6e..0000000 --- a/common/map/region_api.hpp +++ /dev/null @@ -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 diff --git a/common/map/region_pager_api.cpp b/common/map/region_pager_api.cpp deleted file mode 100644 index fd366db..0000000 --- a/common/map/region_pager_api.cpp +++ /dev/null @@ -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(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(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(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(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(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(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(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(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(lua_touserdata(L, 1)); - - //two argument types: coords & the region itself - switch(lua_type(L, 2)) { - case LUA_TNUMBER: - pager->UnloadIf([&](Region const& region) -> bool { - int x = lua_tointeger(L, 2); - int y = lua_tointeger(L, 3); - return region.GetX() == x && region.GetY() == y; - }); - break; - case LUA_TLIGHTUSERDATA: - pager->UnloadIf([&](Region const& region) -> bool { - return (®ion) == lua_touserdata(L, 2); - }); - break; - } - return 0; -} - -static int setOnLoad(lua_State* L) { - RegionPagerLua* pager = reinterpret_cast(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(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(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(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(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; -} \ No newline at end of file diff --git a/common/map/region_pager_api.hpp b/common/map/region_pager_api.hpp deleted file mode 100644 index ed36740..0000000 --- a/common/map/region_pager_api.hpp +++ /dev/null @@ -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 diff --git a/common/map/region_pager_base.cpp b/common/map/region_pager_base.cpp deleted file mode 100644 index 857dabd..0000000 --- a/common/map/region_pager_base.cpp +++ /dev/null @@ -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 -#include - -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::iterator it = find_if(regionList.begin(), regionList.end(), [x, y](Region& region) -> bool { - return region.GetX() == x && region.GetY() == y; - }); - return it != regionList.end() ? &(*it) : nullptr; -} - -Region* RegionPagerBase::PushRegion(Region* const ptr) { - //BUG: #45 Some regions are occasionally losing their tile data - regionList.push_front(*ptr); - return ®ionList.front(); -} - -Region* RegionPagerBase::LoadRegion(int x, int y) { - //EMPTY, intended for override - return nullptr; -} - -Region* RegionPagerBase::SaveRegion(int x, int y) { - //EMPTY, intended for override - return nullptr; -} - -Region* RegionPagerBase::CreateRegion(int x, int y) { - if (FindRegion(x, y)) { - throw(std::logic_error("Cannot overwrite an existing region")); - } - regionList.emplace_front(x, y); - return ®ionList.front(); -} - -void RegionPagerBase::UnloadIf(std::function fn) { - regionList.remove_if(fn); -} - -void RegionPagerBase::UnloadAll() { - regionList.clear(); -} - -std::list* RegionPagerBase::GetContainer() { - return ®ionList; -} \ No newline at end of file diff --git a/common/map/region_pager_base.hpp b/common/map/region_pager_base.hpp deleted file mode 100644 index cdafa3f..0000000 --- a/common/map/region_pager_base.hpp +++ /dev/null @@ -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 -#include - -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 fn); - virtual void UnloadAll(); - - //accessors & mutators - std::list* GetContainer(); -protected: - std::list regionList; -}; - -#endif diff --git a/common/map/region_pager_lua.cpp b/common/map/region_pager_lua.cpp deleted file mode 100644 index 4e0a973..0000000 --- a/common/map/region_pager_lua.cpp +++ /dev/null @@ -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 - -//DOCS: Load, Save and Create fail unless the lua function has been set -//DOCS: UnloadIf and UnloadAll will still continue without the function set - -RegionPagerLua::~RegionPagerLua() { - //unload all regions - UnloadAll(); - //clear any stored functions - luaL_unref(lua, LUA_REGISTRYINDEX, loadRef); - luaL_unref(lua, LUA_REGISTRYINDEX, saveRef); - luaL_unref(lua, LUA_REGISTRYINDEX, createRef); - luaL_unref(lua, LUA_REGISTRYINDEX, unloadRef); -} - -//return the loaded region, or nullptr on failure -Region* RegionPagerLua::LoadRegion(int x, int y) { - //get the pager's function from the registry - lua_rawgeti(lua, LUA_REGISTRYINDEX, loadRef); - - //check if this function is available - if (lua_isnil(lua, -1)) { - lua_pop(lua, 1); - return nullptr; - } - - //something to work on - Region tmpRegion(x, y); - lua_pushlightuserdata(lua, &tmpRegion); - - //call the funtion, 1 arg, 1 return - if (lua_pcall(lua, 1, 1, 0) != LUA_OK) { - throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); - } - - //check the return value, success or failure - if (lua_toboolean(lua, -1)) { - lua_pop(lua, 1); - regionList.push_front(tmpRegion); - return ®ionList.front(); - } - else { - lua_pop(lua, 1); - return nullptr; - } -} - -//return the saved region, or nullptr on failure -Region* RegionPagerLua::SaveRegion(int x, int y) { - //get the pager's function from the registry - lua_rawgeti(lua, LUA_REGISTRYINDEX, saveRef); - - //check if this function is available - if (lua_isnil(lua, -1)) { - lua_pop(lua, 1); - return nullptr; - } - - //find the specified region - Region* ptr = FindRegion(x, y); - if (!ptr) { - lua_pop(lua, 1); - return nullptr; - } - lua_pushlightuserdata(lua, ptr); - - //call the function, 1 arg, 1 return - if (lua_pcall(lua, 1, 1, 0) != LUA_OK) { - throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); - } - - //check the return value, success or failure - if (lua_toboolean(lua, -1)) { - lua_pop(lua, 1); - return ptr; - } - else { - lua_pop(lua, 1); - return nullptr; - } -} - -//return the created region, or nullptr on failure -Region* RegionPagerLua::CreateRegion(int x, int y) { - if (FindRegion(x, y)) { - throw(std::logic_error("Cannot overwrite an existing region")); - } - - //get the pager's function from the registry - lua_rawgeti(lua, LUA_REGISTRYINDEX, createRef); - - //check if this function is available - if (lua_isnil(lua, -1)) { - lua_pop(lua, 1); - return nullptr; - } - - //something to work on - Region tmpRegion(x, y); - lua_pushlightuserdata(lua, &tmpRegion); - - //call the function, 1 arg, 0 return - if (lua_pcall(lua, 1, 0, 0) != LUA_OK) { - throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); - } - - //return the new region - regionList.push_front(tmpRegion); - return ®ionList.front(); -} - -//no return -void RegionPagerLua::UnloadIf(std::function 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(®ion)); - - //call the function, 1 arg, 0 return - if (lua_pcall(lua, 1, 0, 0) != LUA_OK) { - throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); - } - - //signal to the container - return true; - } - //signal to the container - return false; - }); - - //pop the base copy of the function - lua_pop(lua, 1); -} - -void RegionPagerLua::UnloadAll() { - //get the pager's function from the registry - lua_rawgeti(lua, LUA_REGISTRYINDEX, unloadRef); - - //check if this function is available - if (lua_isnil(lua, -1)) { - lua_pop(lua, 1); - //remove the regions anyway - regionList.clear(); - return; - } - - for (auto& it : regionList) { - //push a copy of the function onto the stack with the region - lua_pushvalue(lua, -1); - lua_pushlightuserdata(lua, &it); - - //call the function, 1 arg, 0 return - if (lua_pcall(lua, 1, 0, 0) != LUA_OK) { - throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); - } - } - - //pop the base copy of the function - lua_pop(lua, 1); - - //remove from memory - regionList.clear(); -} \ No newline at end of file diff --git a/common/map/region_pager_lua.hpp b/common/map/region_pager_lua.hpp deleted file mode 100644 index ea4e76b..0000000 --- a/common/map/region_pager_lua.hpp +++ /dev/null @@ -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 -#include - -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 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 diff --git a/common/network/makefile b/common/network/makefile deleted file mode 100644 index f1d2063..0000000 --- a/common/network/makefile +++ /dev/null @@ -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 $@ $< diff --git a/common/network/packet_types/character_packet.cpp b/common/network/packet_types/character_packet.cpp deleted file mode 100644 index 7906230..0000000 --- a/common/network/packet_types/character_packet.cpp +++ /dev/null @@ -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... -} diff --git a/common/network/packet_types/character_packet.hpp b/common/network/packet_types/character_packet.hpp deleted file mode 100644 index a791bf9..0000000 --- a/common/network/packet_types/character_packet.hpp +++ /dev/null @@ -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 \ No newline at end of file diff --git a/common/network/packet_types/client_packet.cpp b/common/network/packet_types/client_packet.cpp deleted file mode 100644 index a0c6617..0000000 --- a/common/network/packet_types/client_packet.cpp +++ /dev/null @@ -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); -} diff --git a/common/network/packet_types/client_packet.hpp b/common/network/packet_types/client_packet.hpp deleted file mode 100644 index 0195f58..0000000 --- a/common/network/packet_types/client_packet.hpp +++ /dev/null @@ -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 \ No newline at end of file diff --git a/common/network/packet_types/makefile b/common/network/packet_types/makefile deleted file mode 100644 index 241fc55..0000000 --- a/common/network/packet_types/makefile +++ /dev/null @@ -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 $@ $< diff --git a/common/network/packet_types/monster_packet.cpp b/common/network/packet_types/monster_packet.cpp deleted file mode 100644 index c365207..0000000 --- a/common/network/packet_types/monster_packet.cpp +++ /dev/null @@ -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)); -} diff --git a/common/network/packet_types/monster_packet.hpp b/common/network/packet_types/monster_packet.hpp deleted file mode 100644 index 1dfae0c..0000000 --- a/common/network/packet_types/monster_packet.hpp +++ /dev/null @@ -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 \ No newline at end of file diff --git a/common/network/packet_types/region_packet.cpp b/common/network/packet_types/region_packet.cpp deleted file mode 100644 index 4ac1471..0000000 --- a/common/network/packet_types/region_packet.cpp +++ /dev/null @@ -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(buffer) = packet->region->GetTile(i, j, k); - buffer = reinterpret_cast(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(buffer)); - buffer = reinterpret_cast(buffer) + sizeof(Region::type_t); - } - } - } - - //solids - deserialCopy(&buffer, packet->region->GetSolidBitset(), REGION_SOLID_FOOTPRINT); -} \ No newline at end of file diff --git a/common/network/packet_types/region_packet.hpp b/common/network/packet_types/region_packet.hpp deleted file mode 100644 index 3020262..0000000 --- a/common/network/packet_types/region_packet.hpp +++ /dev/null @@ -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 - -//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 \ No newline at end of file diff --git a/common/network/packet_types/serial_packet_base.cpp b/common/network/packet_types/serial_packet_base.cpp deleted file mode 100644 index d90b868..0000000 --- a/common/network/packet_types/serial_packet_base.cpp +++ /dev/null @@ -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 \ No newline at end of file diff --git a/common/network/packet_types/serial_packet_base.hpp b/common/network/packet_types/serial_packet_base.hpp deleted file mode 100644 index 9fc7e8f..0000000 --- a/common/network/packet_types/serial_packet_base.hpp +++ /dev/null @@ -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 diff --git a/common/network/packet_types/server_packet.cpp b/common/network/packet_types/server_packet.cpp deleted file mode 100644 index 562d353..0000000 --- a/common/network/packet_types/server_packet.cpp +++ /dev/null @@ -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)); -} diff --git a/common/network/packet_types/server_packet.hpp b/common/network/packet_types/server_packet.hpp deleted file mode 100644 index 169946e..0000000 --- a/common/network/packet_types/server_packet.hpp +++ /dev/null @@ -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 \ No newline at end of file diff --git a/common/network/packet_types/text_packet.cpp b/common/network/packet_types/text_packet.cpp deleted file mode 100644 index 2ec8ce2..0000000 --- a/common/network/packet_types/text_packet.cpp +++ /dev/null @@ -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)); -} \ No newline at end of file diff --git a/common/network/packet_types/text_packet.hpp b/common/network/packet_types/text_packet.hpp deleted file mode 100644 index 9b9ae4b..0000000 --- a/common/network/packet_types/text_packet.hpp +++ /dev/null @@ -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 diff --git a/common/network/serial_packet.hpp b/common/network/serial_packet.hpp deleted file mode 100644 index dc6083a..0000000 --- a/common/network/serial_packet.hpp +++ /dev/null @@ -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 diff --git a/common/network/serial_packet_type.hpp b/common/network/serial_packet_type.hpp deleted file mode 100644 index 062fa05..0000000 --- a/common/network/serial_packet_type.hpp +++ /dev/null @@ -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 \ No newline at end of file diff --git a/common/network/serial_utility.cpp b/common/network/serial_utility.cpp deleted file mode 100644 index d002891..0000000 --- a/common/network/serial_utility.cpp +++ /dev/null @@ -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 - -//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(*buffer) + size; -} - -void deserialCopy(void** buffer, void* data, int size) { - memcpy(data, *buffer, size); - *buffer = reinterpret_cast(*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(packet)); - } - - if (BOUNDS(packet->type, SerialPacketType::FORMAT_CLIENT, SerialPacketType::FORMAT_END_CLIENT)) { - serializeClient(buffer, static_cast(packet)); - } - - if (BOUNDS(packet->type, SerialPacketType::FORMAT_REGION, SerialPacketType::FORMAT_END_REGION)) { - serializeRegion(buffer, static_cast(packet)); - } - - if (BOUNDS(packet->type, SerialPacketType::FORMAT_CHARACTER, SerialPacketType::FORMAT_END_CHARACTER)) { - serializeCharacter(buffer, static_cast(packet)); - } - - if (BOUNDS(packet->type, SerialPacketType::FORMAT_MONSTER, SerialPacketType::FORMAT_END_MONSTER)) { - serializeMonster(buffer, static_cast(packet)); - } - - if (BOUNDS(packet->type, SerialPacketType::FORMAT_TEXT, SerialPacketType::FORMAT_END_TEXT)) { - serializeText(buffer, static_cast(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(packet)); - } - - if (BOUNDS(type, SerialPacketType::FORMAT_CLIENT, SerialPacketType::FORMAT_END_CLIENT)) { - deserializeClient(buffer, static_cast(packet)); - } - - if (BOUNDS(type, SerialPacketType::FORMAT_REGION, SerialPacketType::FORMAT_END_REGION)) { - deserializeRegion(buffer, static_cast(packet)); - } - - if (BOUNDS(type, SerialPacketType::FORMAT_CHARACTER, SerialPacketType::FORMAT_END_CHARACTER)) { - deserializeCharacter(buffer, static_cast(packet)); - } - - if (BOUNDS(type, SerialPacketType::FORMAT_MONSTER, SerialPacketType::FORMAT_END_MONSTER)) { - deserializeMonster(buffer, static_cast(packet)); - } - - if (BOUNDS(type, SerialPacketType::FORMAT_TEXT, SerialPacketType::FORMAT_END_TEXT)) { - deserializeText(buffer, static_cast(packet)); - } -} \ No newline at end of file diff --git a/common/network/serial_utility.hpp b/common/network/serial_utility.hpp deleted file mode 100644 index 0d3e9c0..0000000 --- a/common/network/serial_utility.hpp +++ /dev/null @@ -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 - -//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 diff --git a/common/network/udp_network_utility.cpp b/common/network/udp_network_utility.cpp deleted file mode 100644 index ec8733f..0000000 --- a/common/network/udp_network_utility.cpp +++ /dev/null @@ -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 - -//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; -} \ No newline at end of file diff --git a/common/network/udp_network_utility.hpp b/common/network/udp_network_utility.hpp deleted file mode 100644 index a4452ae..0000000 --- a/common/network/udp_network_utility.hpp +++ /dev/null @@ -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 { -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() = default; - ~UDPNetworkUtility() = default; - - UDPsocket socket = nullptr; - UDPpacket* packet = nullptr; -}; - -#endif diff --git a/common/ui/button.cpp b/common/ui/button.cpp deleted file mode 100644 index c794c09..0000000 --- a/common/ui/button.cpp +++ /dev/null @@ -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 - -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; - } -} diff --git a/common/ui/button.hpp b/common/ui/button.hpp deleted file mode 100644 index b1d6ff1..0000000 --- a/common/ui/button.hpp +++ /dev/null @@ -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 - -/* 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 diff --git a/common/ui/makefile b/common/ui/makefile deleted file mode 100644 index 03a0db8..0000000 --- a/common/ui/makefile +++ /dev/null @@ -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 $@ $< diff --git a/common/ui/menu_bar.cpp b/common/ui/menu_bar.cpp deleted file mode 100644 index 45358cc..0000000 --- a/common/ui/menu_bar.cpp +++ /dev/null @@ -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 -#include - -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> 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; -} diff --git a/common/ui/menu_bar.hpp b/common/ui/menu_bar.hpp deleted file mode 100644 index ddbb250..0000000 --- a/common/ui/menu_bar.hpp +++ /dev/null @@ -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 -#include - -/* 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> 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 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