Compare commits
82 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ab6207d4f3 | |||
| 1267b30806 | |||
| 5d217d7cf9 | |||
| b74a5aabcd | |||
| 7c88392cf3 | |||
| 20b121766a | |||
| f32b8a9b4f | |||
| ccb7adbd10 | |||
| 8e7af9ce88 | |||
| 752f8f82f9 | |||
| 1f2d0b8e76 | |||
| ec409c8177 | |||
| 82d5a5c181 | |||
| 420d39d467 | |||
| e2e2e243d4 | |||
| 5d0f9e1bb8 | |||
| d3f855c69b | |||
| 8749d1fd93 | |||
| 7205d6692c | |||
| 7b9c016082 | |||
| 235f3b57e0 | |||
| f23b929f8a | |||
| 48b9a9b264 | |||
| d7196df760 | |||
| 957458d489 | |||
| 3b24aae422 | |||
| a751531e18 | |||
| 4794965166 | |||
| a532d33579 | |||
| 8778bfdc4b | |||
| 42b37be6f5 | |||
| cbf8538c24 | |||
| 4ced27a905 | |||
| 57f92a8b2e | |||
| a8bbbeabb7 | |||
| e2f5494380 | |||
| 9a1714a881 | |||
| 18f119224a | |||
| ba384c182a | |||
| 3b90465afd | |||
| 284009baa7 | |||
| be4ec0349b | |||
| 1ed4f85d62 | |||
| 12f86f22de | |||
| 30aa11c083 | |||
| b89f6f2ece | |||
| 5f0cf826d4 | |||
| c2197d5e71 | |||
| 13e67746b4 | |||
| a86a41ad46 | |||
| fd11f4e0e6 | |||
| 19792f8aec | |||
| 0666c69680 | |||
| 16f7f043fc | |||
| bd9d969f8e | |||
| 41626328c9 | |||
| bbd468af1a | |||
| 49b15f4710 | |||
| ff67b62792 | |||
| 3a23ba93af | |||
| 15cd3648a3 | |||
| fe7bbbbb3d | |||
| e6e2421ba0 | |||
| f2119f77a9 | |||
| 50f3a9e74e | |||
| 3eafb57403 | |||
| 47d464ed3a | |||
| f83f5f76c7 | |||
| fd98749995 | |||
| 4b4814e89a | |||
| e7d3205a96 | |||
| a083cce5da | |||
| 37fadc6567 | |||
| 0c1232ae3b | |||
| 540f646209 | |||
| 93a955caf9 | |||
| 2dd2aead13 | |||
| 03e643a17a | |||
| 345980af5e | |||
| 6bcaf460b9 | |||
| 68eddcfcbb | |||
| b33fb66d2a |
@@ -1,6 +1,3 @@
|
||||
[submodule "common"]
|
||||
path = common
|
||||
url = https://github.com/Ratstail91/Tortuga.git
|
||||
[submodule "bin"]
|
||||
path = bin
|
||||
url = https://github.com/Ratstail91/Tortuga.git
|
||||
|
||||
@@ -7,7 +7,7 @@ This game is inspired by classic 2D RPGs (Final Fantasy, The Legend of Zelda), a
|
||||
## Releases
|
||||
|
||||
* The most recent stable build for Windows can be found [here](https://dl.dropboxusercontent.com/u/46669050/Tortuga-win.rar).
|
||||
* The most recent stable build for Linux can be found [here](https://dl.dropboxusercontent.com/u/46669050/Tortuga-linux.tar).
|
||||
* The most recent stable build for Windows can be found [here](https://dl.dropboxusercontent.com/u/46669050/Tortuga-linux.tar).
|
||||
|
||||
## Documentation
|
||||
|
||||
@@ -29,13 +29,17 @@ This game is inspired by classic 2D RPGs (Final Fantasy, The Legend of Zelda), a
|
||||
* [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
|
||||
|
||||
## Using and Including
|
||||
|
||||
* [Coolvetica Typeface](http://typodermicfonts.com/coolvetica/)
|
||||
|
||||
## Copyright
|
||||
|
||||
(Future versions (to be determined) may be released under a modified version of the [Uplink Developer's License](http://www.introversion.co.uk/uplink/developer/license.html).)
|
||||
|
||||
The current version of Tortuga is released under the [zlib license](http://en.wikipedia.org/wiki/Zlib_License).
|
||||
|
||||
Copyright (c) 2013-2015 Kayne Ruse
|
||||
Copyright (c) 2013-2016 Kayne Ruse
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
|
||||
|
||||
@@ -43,4 +47,9 @@ Permission is granted to anyone to use this software for any purpose, including
|
||||
|
||||
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.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
### Items not made by me
|
||||
|
||||
* [Coolvetica Font](http://typodermicfonts.com/coolvetica/)
|
||||
* Creative Commons Artwork from [Artsader](http://www.moosader.com/artsader/)
|
||||
+1
-1
Submodule bin updated: a788d998fa...c653980193
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -44,6 +44,16 @@ void ClientApplication::Init(int argc, char* argv[]) {
|
||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||
config.Load("rsc/config.cfg", false, argc, argv);
|
||||
|
||||
//-------------------------
|
||||
//Initialize SDL
|
||||
//-------------------------
|
||||
|
||||
if (SDL_Init(0)) {
|
||||
std::ostringstream msg;
|
||||
msg << "Failed to initialize SDL: " << SDL_GetError();
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//create and check the window
|
||||
//-------------------------
|
||||
@@ -85,18 +95,15 @@ void ClientApplication::Init(int argc, char* argv[]) {
|
||||
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:
|
||||
@@ -109,16 +116,11 @@ void ClientApplication::Init(int argc, char* argv[]) {
|
||||
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());
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
@@ -256,6 +258,7 @@ void ClientApplication::Quit() {
|
||||
BaseScene::SetRenderer(nullptr);
|
||||
SDL_DestroyRenderer(renderer);
|
||||
SDL_DestroyWindow(window);
|
||||
SDL_Quit();
|
||||
std::cout << "Clean exit" << std::endl;
|
||||
}
|
||||
|
||||
@@ -315,6 +318,7 @@ void ClientApplication::ProcessEvents() {
|
||||
#include "options_menu.hpp"
|
||||
#include "lobby_menu.hpp"
|
||||
#include "world.hpp"
|
||||
#include "combat.hpp"
|
||||
#include "disconnected_screen.hpp"
|
||||
|
||||
void ClientApplication::ProcessSceneSignal(SceneSignal signal) {
|
||||
@@ -338,6 +342,9 @@ void ClientApplication::ProcessSceneSignal(SceneSignal signal) {
|
||||
case SceneSignal::WORLD:
|
||||
activeScene = new World(&clientIndex, &accountIndex);
|
||||
break;
|
||||
case SceneSignal::COMBAT:
|
||||
activeScene = new Combat(&clientIndex, &accountIndex);
|
||||
break;
|
||||
case SceneSignal::DISCONNECTEDSCREEN:
|
||||
activeScene = new DisconnectedScreen();
|
||||
break;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -53,7 +53,7 @@ private:
|
||||
SDL_Window* window = nullptr;
|
||||
SDL_Renderer* renderer = nullptr;
|
||||
|
||||
//shared parameters
|
||||
//global scene parameters
|
||||
int clientIndex = -1;
|
||||
int accountIndex = -1;
|
||||
};
|
||||
@@ -0,0 +1,145 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "image.hpp"
|
||||
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
template<typename T = class Image>
|
||||
class CompositeImage {
|
||||
public:
|
||||
CompositeImage() = default;
|
||||
~CompositeImage() = default;
|
||||
|
||||
void Load(SDL_Renderer* const, std::string spriteDir, std::list<std::string> nameList);
|
||||
void SetTextures(std::map<std::string, Image>& templateImages);
|
||||
void Free();
|
||||
|
||||
void DrawTo(SDL_Renderer* const, Sint16 x, Sint16 y, double scaleX = 1.0, double scaleY = 1.0);
|
||||
|
||||
//accessors & mutators
|
||||
T* Find(std::string name);
|
||||
|
||||
bool Enable(std::string name);
|
||||
bool Disable(std::string name);
|
||||
void EnableAll();
|
||||
void DisableAll();
|
||||
|
||||
std::map<std::string, std::pair<bool, T>>* GetTemplateImages();
|
||||
|
||||
private:
|
||||
std::map<std::string, std::pair<bool, T>> imageMap;
|
||||
};
|
||||
|
||||
|
||||
template<typename T>
|
||||
void CompositeImage<T>::Load(SDL_Renderer* const renderer, std::string spriteDir, std::list<std::string> nameList) {
|
||||
for (auto& it : nameList) {
|
||||
imageMap[it].first = true;
|
||||
imageMap[it].second.Load(renderer, spriteDir + it);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void CompositeImage<T>::SetTextures(std::map<std::string, Image>& templateImages) {
|
||||
for (auto& it : templateImages) {
|
||||
imageMap[it.first].first = true;
|
||||
imageMap[it.first].second.SetTexture(it.second.GetTexture());
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void CompositeImage<T>::Free() {
|
||||
imageMap.clear();
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void CompositeImage<T>::DrawTo(SDL_Renderer* const dest, Sint16 x, Sint16 y, double scaleX, double scaleY) {
|
||||
//draw all members, regardless of internal ordering
|
||||
for (auto& it : imageMap) {
|
||||
if (it.second.first) {
|
||||
it.second.second.DrawTo(dest, x, y, scaleX, scaleY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------
|
||||
//accessors & mutators
|
||||
//-------------------------
|
||||
|
||||
template<typename T>
|
||||
T* CompositeImage<T>::Find(std::string name) {
|
||||
auto it = imageMap.find(name);
|
||||
if (it == imageMap.end()) {
|
||||
return nullptr;
|
||||
}
|
||||
else {
|
||||
return &it->second.second;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool CompositeImage<T>::Enable(std::string name) {
|
||||
auto it = imageMap.find(name);
|
||||
if (it == imageMap.end()) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
imageMap[name].first = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool CompositeImage<T>::Disable(std::string name) {
|
||||
auto it = imageMap.find(name);
|
||||
if (it == imageMap.end()) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
imageMap[name].first = false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void CompositeImage<T>::EnableAll() {
|
||||
for (auto& it : imageMap) {
|
||||
it.second.first = true;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void CompositeImage<T>::DisableAll() {
|
||||
for (auto& it : imageMap) {
|
||||
it.second.first = false;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
std::map<std::string, std::pair<bool, T>>* CompositeImage<T>::GetTemplateImages() {
|
||||
return &imageMap;
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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 "barrier_manager.hpp"
|
||||
|
||||
void BarrierManager::DrawTo(SDL_Renderer* const dest, Sint16 x, Sint16 y, double scaleX, double scaleY) {
|
||||
for (auto& it : barrierMap) {
|
||||
it.second.DrawTo(dest, x, y);
|
||||
}
|
||||
}
|
||||
|
||||
void BarrierManager::LoadBaseImage(SDL_Renderer* renderer, std::string fname) {
|
||||
baseImage.Load(renderer, fname);
|
||||
}
|
||||
|
||||
void BarrierManager::UnloadBaseImage() {
|
||||
baseImage.Free();
|
||||
}
|
||||
|
||||
void BarrierManager::LoadTemplateImages(SDL_Renderer* renderer, std::string spriteDir, std::list<std::string> names) {
|
||||
//sprite names are file names only
|
||||
for (auto& it : names) {
|
||||
templateImages.emplace(it, Image(renderer, spriteDir + it));
|
||||
}
|
||||
}
|
||||
|
||||
void BarrierManager::UnloadTemplateImages() {
|
||||
templateImages.clear();
|
||||
}
|
||||
|
||||
BaseBarrier* BarrierManager::Create(int index) {
|
||||
barrierMap.emplace(index, BaseBarrier(baseImage, templateImages));
|
||||
return &barrierMap[index];
|
||||
}
|
||||
|
||||
void BarrierManager::Unload(int i) {
|
||||
barrierMap.erase(i);
|
||||
}
|
||||
|
||||
void BarrierManager::UnloadAll() {
|
||||
barrierMap.clear();
|
||||
}
|
||||
|
||||
int BarrierManager::Size() {
|
||||
return barrierMap.size();
|
||||
}
|
||||
|
||||
BaseBarrier* BarrierManager::Find(int i) {
|
||||
std::map<int, BaseBarrier>::iterator it = barrierMap.find(i);
|
||||
|
||||
if (it == barrierMap.end()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return &it->second;
|
||||
}
|
||||
|
||||
std::map<int, BaseBarrier>* BarrierManager::GetContainer() {
|
||||
return &barrierMap;
|
||||
}
|
||||
|
||||
std::map<std::string, Image>* BarrierManager::GetTemplateContainer() {
|
||||
return &templateImages;
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "base_barrier.hpp"
|
||||
|
||||
#include <list>
|
||||
#include <string>
|
||||
|
||||
class BarrierManager {
|
||||
public:
|
||||
BarrierManager() = default;
|
||||
~BarrierManager() = default;
|
||||
|
||||
void DrawTo(SDL_Renderer* const, Sint16 x, Sint16 y, double scaleX = 1.0, double scaleY = 1.0);
|
||||
|
||||
//NOTE: don't use these while you have barriers loaded
|
||||
void LoadBaseImage(SDL_Renderer* renderer, std::string fname);
|
||||
void UnloadBaseImage();
|
||||
void LoadTemplateImages(SDL_Renderer* renderer, std::string spriteDir, std::list<std::string> names);
|
||||
void UnloadTemplateImages();
|
||||
|
||||
BaseBarrier* Create(int index);
|
||||
void Unload(int i);
|
||||
void UnloadAll();
|
||||
|
||||
int Size();
|
||||
|
||||
BaseBarrier* Find(int i);
|
||||
std::map<int, BaseBarrier>* GetContainer();
|
||||
std::map<std::string, Image>* GetTemplateContainer();
|
||||
|
||||
private:
|
||||
Image baseImage;
|
||||
std::map<std::string, Image> templateImages;
|
||||
std::map<int, BaseBarrier> barrierMap;
|
||||
};
|
||||
@@ -0,0 +1,105 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "base_barrier.hpp"
|
||||
|
||||
#include "config_utility.hpp"
|
||||
|
||||
#include <cstring>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
BaseBarrier::BaseBarrier(Image& argBaseImage, std::map<std::string, Image>& templateImages) {
|
||||
baseImage.SetTexture(argBaseImage.GetTexture());
|
||||
composite.SetTextures(templateImages);
|
||||
memset(status, 0, sizeof(int) * 8);
|
||||
CorrectSprite();
|
||||
}
|
||||
|
||||
BaseBarrier::~BaseBarrier() {
|
||||
//
|
||||
}
|
||||
|
||||
void BaseBarrier::CorrectSprite() {
|
||||
//TODO: link status to sprite
|
||||
for (int i = 0; i < 8; i++) {
|
||||
//setup the name
|
||||
std::ostringstream os;
|
||||
os << "slot " << i+1;
|
||||
|
||||
switch(status[i]) {
|
||||
case 0:
|
||||
composite.Disable(os.str() + " green.png");
|
||||
composite.Disable(os.str() + " red.png");
|
||||
break;
|
||||
case 1:
|
||||
composite.Enable(os.str() + " green.png");
|
||||
composite.Disable(os.str() + " red.png");
|
||||
break;
|
||||
case 2:
|
||||
composite.Disable(os.str() + " green.png");
|
||||
composite.Enable(os.str() + " red.png");
|
||||
break;
|
||||
default: {
|
||||
std::ostringstream os;
|
||||
os << "index " << i << ", value " << status[i] << std::endl;
|
||||
throw(std::runtime_error("Unknown graphical status in barrier; " + os.str()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BaseBarrier::Update() {
|
||||
//
|
||||
}
|
||||
|
||||
void BaseBarrier::DrawTo(SDL_Renderer* const dest, int camX, int camY) {
|
||||
//ignore the default sprite for now
|
||||
baseImage.DrawTo(dest, origin.x - camX, origin.y - camY);
|
||||
composite.DrawTo(dest, origin.x - camX, origin.y - camY);
|
||||
}
|
||||
|
||||
int BaseBarrier::SetStatus(int k, int v) {
|
||||
if (k >= 8 || k < 0) {
|
||||
return -1;
|
||||
}
|
||||
return status[k] = v;
|
||||
}
|
||||
|
||||
int BaseBarrier::FindStatus(int k) {
|
||||
if (k >= 8 || k < 0) {
|
||||
return -1;
|
||||
}
|
||||
return status[k];
|
||||
}
|
||||
|
||||
int* BaseBarrier::SetStatusArray(int* ptr) {
|
||||
memcpy(status, ptr, sizeof(int) * 8);
|
||||
return status;
|
||||
}
|
||||
|
||||
int* BaseBarrier::GetStatusArray() {
|
||||
return status;
|
||||
}
|
||||
|
||||
CompositeImage<>* BaseBarrier::GetComposite() {
|
||||
return &composite;
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "entity.hpp"
|
||||
|
||||
#include "composite_image.hpp"
|
||||
|
||||
class BaseBarrier: public Entity {
|
||||
public:
|
||||
BaseBarrier() = default;
|
||||
BaseBarrier(Image& baseImage, std::map<std::string, Image>& templateImages);
|
||||
virtual ~BaseBarrier();
|
||||
|
||||
void CorrectSprite();
|
||||
void Update();
|
||||
void DrawTo(SDL_Renderer* const, int camX, int camY);
|
||||
|
||||
int SetStatus(int, int);
|
||||
int FindStatus(int);
|
||||
|
||||
int* SetStatusArray(int*);
|
||||
int* GetStatusArray();
|
||||
|
||||
CompositeImage<>* GetComposite();
|
||||
|
||||
protected:
|
||||
//metadata
|
||||
int status[8];
|
||||
|
||||
Image baseImage;
|
||||
CompositeImage<> composite;
|
||||
};
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -19,28 +19,28 @@
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "base_monster.hpp"
|
||||
#include "base_creature.hpp"
|
||||
|
||||
#include "config_utility.hpp"
|
||||
|
||||
void BaseMonster::CorrectSprite() {
|
||||
//TODO: (9) BaseMonster::CorrectSprite()
|
||||
void BaseCreature::CorrectSprite() {
|
||||
//TODO: (9) BaseCreature::CorrectSprite()
|
||||
}
|
||||
|
||||
std::string BaseMonster::SetHandle(std::string s) {
|
||||
std::string BaseCreature::SetHandle(std::string s) {
|
||||
return handle = s;
|
||||
}
|
||||
|
||||
std::string BaseMonster::GetHandle() const {
|
||||
std::string BaseCreature::GetHandle() const {
|
||||
return handle;
|
||||
}
|
||||
|
||||
std::string BaseMonster::SetAvatar(SDL_Renderer* const renderer, std::string s) {
|
||||
std::string BaseCreature::SetAvatar(SDL_Renderer* const renderer, std::string s) {
|
||||
avatar = s;
|
||||
sprite.Load(renderer, ConfigUtility::GetSingleton()["dir.sprites"] + avatar, 4, 1);
|
||||
sprite.Load(renderer, ConfigUtility::GetSingleton()["dir.sprites"] + avatar, 4, 4);
|
||||
return avatar;
|
||||
}
|
||||
|
||||
std::string BaseMonster::GetAvatar() const {
|
||||
std::string BaseCreature::GetAvatar() const {
|
||||
return avatar;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -23,10 +23,10 @@
|
||||
|
||||
#include "entity.hpp"
|
||||
|
||||
class BaseMonster: public Entity {
|
||||
class BaseCreature: public Entity {
|
||||
public:
|
||||
BaseMonster() = default;
|
||||
virtual ~BaseMonster() = default;
|
||||
BaseCreature() = default;
|
||||
virtual ~BaseCreature() = default;
|
||||
|
||||
void CorrectSprite();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -50,14 +50,14 @@ BoundingBox Entity::SetBounds(BoundingBox b) {
|
||||
return bounds = b;
|
||||
}
|
||||
|
||||
Vector2 Entity::GetOrigin() {
|
||||
Vector2 Entity::GetOrigin() const {
|
||||
return origin;
|
||||
}
|
||||
|
||||
Vector2 Entity::GetMotion() {
|
||||
Vector2 Entity::GetMotion() const {
|
||||
return motion;
|
||||
}
|
||||
|
||||
BoundingBox Entity::GetBounds() {
|
||||
BoundingBox Entity::GetBounds() const {
|
||||
return bounds;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -39,9 +39,9 @@ public:
|
||||
Vector2 SetMotion(Vector2 v);
|
||||
BoundingBox SetBounds(BoundingBox b);
|
||||
|
||||
Vector2 GetOrigin();
|
||||
Vector2 GetMotion();
|
||||
BoundingBox GetBounds();
|
||||
Vector2 GetOrigin() const;
|
||||
Vector2 GetMotion() const;
|
||||
BoundingBox GetBounds() const;
|
||||
|
||||
protected:
|
||||
Entity() = default;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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 "fatal_error.hpp"
|
||||
|
||||
//DOCS: This empty file is used to force an object file
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -24,8 +24,8 @@
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
class terminal_error: public std::runtime_error {
|
||||
class fatal_error: public std::runtime_error {
|
||||
public:
|
||||
explicit terminal_error(const std::string& str): runtime_error(str) {}
|
||||
explicit terminal_error(const char* cstr): runtime_error(cstr) {}
|
||||
explicit fatal_error(const std::string& str): runtime_error(str) {}
|
||||
explicit fatal_error(const char* cstr): runtime_error(cstr) {}
|
||||
};
|
||||
@@ -1,241 +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 "world.hpp"
|
||||
|
||||
#include "channels.hpp"
|
||||
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
//-------------------------
|
||||
//character management
|
||||
//-------------------------
|
||||
|
||||
//DOCS: preexisting characters will result in query responses
|
||||
//DOCS: new characters will result in create messages
|
||||
//DOCS: this client's character will exist in both (skipped)
|
||||
|
||||
void World::hCharacterUpdate(CharacterPacket* const argPacket) {
|
||||
//TODO: (1) Authentication
|
||||
//NOTE: applies to the local character too
|
||||
|
||||
//check that this character exists
|
||||
std::map<int, BaseCharacter>::iterator characterIt = characterMap.find(argPacket->characterIndex);
|
||||
if (characterIt != characterMap.end()) {
|
||||
//update the origin and motion, if there's a difference
|
||||
if (characterIt->second.GetOrigin() != argPacket->origin) {
|
||||
characterIt->second.SetOrigin(argPacket->origin);
|
||||
}
|
||||
if (characterIt->second.GetMotion() != argPacket->motion) {
|
||||
characterIt->second.SetMotion(argPacket->motion);
|
||||
characterIt->second.CorrectSprite(); //only correct the sprite if the motion changes
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void World::hCharacterCreate(CharacterPacket* const argPacket) {
|
||||
//prevent double message
|
||||
if (characterMap.find(argPacket->characterIndex) != characterMap.end()) {
|
||||
std::ostringstream msg;
|
||||
msg << "Double character creation event; ";
|
||||
msg << "Index: " << argPacket->characterIndex << "; ";
|
||||
msg << "Handle: " << argPacket->handle;
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
|
||||
//implicity create and retrieve the entity
|
||||
BaseCharacter* character = &characterMap[argPacket->characterIndex];
|
||||
|
||||
//fill the character's info
|
||||
character->SetHandle(argPacket->handle);
|
||||
character->SetAvatar(GetRenderer(), argPacket->avatar);
|
||||
character->SetOwner(argPacket->accountIndex);
|
||||
character->SetOrigin(argPacket->origin);
|
||||
character->SetMotion(argPacket->motion);
|
||||
character->SetBounds(argPacket->bounds);
|
||||
|
||||
character->CorrectSprite();
|
||||
|
||||
//check for this player's character
|
||||
if (character->GetOwner() == accountIndex) {
|
||||
localCharacter = static_cast<LocalCharacter*>(character);
|
||||
|
||||
//focus the camera on this character's sprite
|
||||
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;
|
||||
roomIndex = argPacket->roomIndex;
|
||||
|
||||
//query the world state (room)
|
||||
CharacterPacket newPacket;
|
||||
memset(&newPacket, 0, MAX_PACKET_SIZE);
|
||||
newPacket.type = SerialPacketType::QUERY_CHARACTER_EXISTS;
|
||||
newPacket.roomIndex = roomIndex;
|
||||
network.SendTo(Channels::SERVER, &newPacket);
|
||||
newPacket.type = SerialPacketType::QUERY_MONSTER_EXISTS;
|
||||
network.SendTo(Channels::SERVER, &newPacket);
|
||||
}
|
||||
|
||||
//debug
|
||||
std::cout << "Character Create, total: " << characterMap.size() << std::endl;
|
||||
}
|
||||
|
||||
void World::hCharacterDelete(CharacterPacket* const argPacket) {
|
||||
//ignore if this character doesn't exist
|
||||
std::map<int, BaseCharacter>::iterator characterIt = characterMap.find(argPacket->characterIndex);
|
||||
if (characterIt == characterMap.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
//check for this player's character
|
||||
if ((*characterIt).second.GetOwner() == accountIndex) {
|
||||
localCharacter = nullptr;
|
||||
|
||||
//clear the camera
|
||||
camera.marginX = 0;
|
||||
camera.marginY = 0;
|
||||
|
||||
//clear the room
|
||||
roomIndex = -1;
|
||||
regionPager.UnloadAll();
|
||||
characterMap.clear();
|
||||
monsterMap.clear();
|
||||
}
|
||||
else {
|
||||
//remove this character
|
||||
characterMap.erase(characterIt);
|
||||
}
|
||||
|
||||
//debug
|
||||
std::cout << "Character Delete, total: " << characterMap.size() << std::endl;
|
||||
}
|
||||
|
||||
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;
|
||||
// }
|
||||
|
||||
//ignore characters in a different room (sub-optimal)
|
||||
if (argPacket->roomIndex != roomIndex) {
|
||||
return;
|
||||
}
|
||||
|
||||
//implicitly construct the character if it doesn't exist
|
||||
BaseCharacter* character = &characterMap[argPacket->characterIndex];
|
||||
|
||||
//set/update the character's info
|
||||
character->SetOrigin(argPacket->origin);
|
||||
character->SetMotion(argPacket->motion);
|
||||
character->SetBounds({CHARACTER_BOUNDS_X, CHARACTER_BOUNDS_Y, CHARACTER_BOUNDS_WIDTH, CHARACTER_BOUNDS_HEIGHT});
|
||||
character->SetHandle(argPacket->handle);
|
||||
character->SetAvatar(GetRenderer(), argPacket->avatar);
|
||||
character->SetOwner(argPacket->accountIndex);
|
||||
character->CorrectSprite();
|
||||
|
||||
//debug
|
||||
std::cout << "Character Query, total: " << characterMap.size() << std::endl;
|
||||
}
|
||||
|
||||
void World::hQueryCharacterStats(CharacterPacket* const argPacket) {
|
||||
//TODO: (9) World::hQueryCharacterStats()
|
||||
}
|
||||
|
||||
void World::hQueryCharacterLocation(CharacterPacket* const argPacket) {
|
||||
//TODO: (9) World::hQueryCharacterLocation()
|
||||
}
|
||||
|
||||
void World::hCharacterMovement(CharacterPacket* const argPacket) {
|
||||
//TODO: (1) Authentication
|
||||
if (argPacket->characterIndex == characterIndex) {
|
||||
return;
|
||||
}
|
||||
|
||||
//check that this character exists
|
||||
std::map<int, BaseCharacter>::iterator characterIt = characterMap.find(argPacket->characterIndex);
|
||||
if (characterIt != characterMap.end()) {
|
||||
//set the origin and motion
|
||||
characterIt->second.SetOrigin(argPacket->origin);
|
||||
characterIt->second.SetMotion(argPacket->motion);
|
||||
characterIt->second.CorrectSprite();
|
||||
}
|
||||
}
|
||||
|
||||
void World::hCharacterAttack(CharacterPacket* const argPacket) {
|
||||
//TODO: (9) World::hCharacterAttack()
|
||||
}
|
||||
|
||||
void World::hCharacterDamage(CharacterPacket* const argPacket) {
|
||||
//TODO: (9) World::hCharacterDamage()
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//player movement & collision
|
||||
//-------------------------
|
||||
|
||||
void World::SendLocalCharacterMovement() {
|
||||
CharacterPacket newPacket;
|
||||
newPacket.type = SerialPacketType::CHARACTER_MOVEMENT;
|
||||
|
||||
newPacket.accountIndex = accountIndex;
|
||||
newPacket.characterIndex = characterIndex;
|
||||
newPacket.roomIndex = roomIndex;
|
||||
newPacket.origin = localCharacter->GetOrigin();
|
||||
newPacket.motion = localCharacter->GetMotion();
|
||||
|
||||
network.SendTo(Channels::SERVER, &newPacket);
|
||||
}
|
||||
|
||||
std::list<BoundingBox> World::GenerateCollisionGrid(Entity* ptr, int tileWidth, int tileHeight) {
|
||||
//prepare for collisions
|
||||
BoundingBox wallBounds = {0, 0, tileWidth, tileHeight};
|
||||
std::list<BoundingBox> boxList;
|
||||
|
||||
//NOTE: for loops were too dense to work with, so I've just used while loops
|
||||
|
||||
//outer loop
|
||||
wallBounds.x = snapToBase((double)wallBounds.w, ptr->GetOrigin().x);
|
||||
while(wallBounds.x < (ptr->GetOrigin() + ptr->GetBounds()).x + ptr->GetBounds().w) {
|
||||
//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 (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);
|
||||
}
|
||||
|
||||
//increment
|
||||
wallBounds.y += wallBounds.h;
|
||||
}
|
||||
|
||||
//increment
|
||||
wallBounds.x += wallBounds.w;
|
||||
}
|
||||
|
||||
return std::move(boxList);
|
||||
}
|
||||
@@ -1,134 +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 "world.hpp"
|
||||
|
||||
#include "channels.hpp"
|
||||
#include "ip_operators.hpp"
|
||||
|
||||
#include <chrono>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
//-------------------------
|
||||
//heartbeat system
|
||||
//-------------------------
|
||||
|
||||
void World::hPing(ServerPacket* const argPacket) {
|
||||
ServerPacket newPacket;
|
||||
newPacket.type = SerialPacketType::PONG;
|
||||
network.SendTo(argPacket->srcAddress, &newPacket);
|
||||
}
|
||||
|
||||
void World::hPong(ServerPacket* const argPacket) {
|
||||
if (*network.GetIPAddress(Channels::SERVER) != argPacket->srcAddress) {
|
||||
throw(std::runtime_error("Heartbeat message received from an unknown source"));
|
||||
}
|
||||
attemptedBeats = 0;
|
||||
lastBeat = Clock::now();
|
||||
}
|
||||
|
||||
void World::CheckHeartBeat() {
|
||||
//check the connection (heartbeat)
|
||||
if (Clock::now() - lastBeat > std::chrono::seconds(3)) {
|
||||
if (attemptedBeats > 2) {
|
||||
//escape to the disconnect screen
|
||||
SendDisconnectRequest();
|
||||
SetSceneSignal(SceneSignal::DISCONNECTEDSCREEN);
|
||||
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "Error: Lost connection to the server";
|
||||
}
|
||||
else {
|
||||
ServerPacket newPacket;
|
||||
newPacket.type = SerialPacketType::PING;
|
||||
network.SendTo(Channels::SERVER, &newPacket);
|
||||
|
||||
attemptedBeats++;
|
||||
lastBeat = Clock::now();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//Connection control
|
||||
//-------------------------
|
||||
|
||||
void World::SendLogoutRequest() {
|
||||
ClientPacket newPacket;
|
||||
|
||||
//send a logout request
|
||||
newPacket.type = SerialPacketType::LOGOUT_REQUEST;
|
||||
newPacket.accountIndex = accountIndex;
|
||||
|
||||
network.SendTo(Channels::SERVER, &newPacket);
|
||||
}
|
||||
|
||||
void World::SendDisconnectRequest() {
|
||||
ClientPacket newPacket;
|
||||
|
||||
//send a disconnect request
|
||||
newPacket.type = SerialPacketType::DISCONNECT_REQUEST;
|
||||
newPacket.clientIndex = clientIndex;
|
||||
|
||||
network.SendTo(Channels::SERVER, &newPacket);
|
||||
}
|
||||
|
||||
void World::SendAdminDisconnectForced() {
|
||||
//TODO: (9) World::SendAdminDisconnectForced()
|
||||
}
|
||||
|
||||
void World::SendAdminShutdownRequest() {
|
||||
ClientPacket newPacket;
|
||||
|
||||
//send a shutdown request
|
||||
newPacket.type = SerialPacketType::ADMIN_SHUTDOWN_REQUEST;
|
||||
newPacket.accountIndex = accountIndex;
|
||||
|
||||
network.SendTo(Channels::SERVER, &newPacket);
|
||||
}
|
||||
|
||||
void World::hLogoutResponse(ClientPacket* const argPacket) {
|
||||
if (localCharacter) {
|
||||
characterMap.erase(characterIndex);
|
||||
localCharacter = nullptr;
|
||||
}
|
||||
|
||||
accountIndex = -1;
|
||||
characterIndex = -1;
|
||||
|
||||
//reset the camera
|
||||
camera.marginX = camera.marginY = 0;
|
||||
|
||||
//because, why not? I guess...
|
||||
SendDisconnectRequest();
|
||||
}
|
||||
|
||||
void World::hDisconnectResponse(ClientPacket* const argPacket) {
|
||||
hLogoutResponse(argPacket);//shortcut
|
||||
SetSceneSignal(SceneSignal::DISCONNECTEDSCREEN);
|
||||
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "You have successfully logged out";
|
||||
}
|
||||
|
||||
void World::hAdminDisconnectForced(ClientPacket* const argPacket) {
|
||||
hDisconnectResponse(argPacket);//shortcut
|
||||
SetSceneSignal(SceneSignal::DISCONNECTEDSCREEN);
|
||||
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "You have been forcibly disconnected by the server";
|
||||
}
|
||||
|
||||
@@ -1,443 +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 "world.hpp"
|
||||
|
||||
#include "channels.hpp"
|
||||
#include "terminal_error.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
//-------------------------
|
||||
//Public access members
|
||||
//-------------------------
|
||||
|
||||
World::World(int* const argClientIndex, int* const argAccountIndex):
|
||||
clientIndex(*argClientIndex),
|
||||
accountIndex(*argAccountIndex)
|
||||
{
|
||||
//setup the utility objects
|
||||
buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_red.png");
|
||||
font = TTF_OpenFont(config["client.font"].c_str(), 12);
|
||||
|
||||
//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);
|
||||
shutdownButton.SetX(50);
|
||||
shutdownButton.SetY(70);
|
||||
|
||||
//load the tilesheet
|
||||
//TODO: (2) Tile size and tile sheet should be loaded elsewhere
|
||||
tileSheet.Load(GetRenderer(), config["dir.tilesets"] + "overworld.png", 32, 32);
|
||||
|
||||
//Send the character data
|
||||
CharacterPacket newPacket;
|
||||
newPacket.type = SerialPacketType::CHARACTER_LOAD;
|
||||
strncpy(newPacket.handle, config["client.handle"].c_str(), PACKET_STRING_SIZE);
|
||||
strncpy(newPacket.avatar, config["client.avatar"].c_str(), PACKET_STRING_SIZE);
|
||||
newPacket.accountIndex = accountIndex;
|
||||
network.SendTo(Channels::SERVER, &newPacket);
|
||||
|
||||
//set the camera's values
|
||||
SDL_RenderGetLogicalSize(GetRenderer(), &camera.width, &camera.height);
|
||||
|
||||
//debug
|
||||
//
|
||||
}
|
||||
|
||||
World::~World() {
|
||||
//unload the local data
|
||||
TTF_CloseFont(font);
|
||||
characterMap.clear();
|
||||
monsterMap.clear();
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//Frame loop
|
||||
//-------------------------
|
||||
|
||||
void World::FrameStart() {
|
||||
//
|
||||
}
|
||||
|
||||
void World::Update() {
|
||||
//create and zero the buffer
|
||||
SerialPacket* packetBuffer = reinterpret_cast<SerialPacket*>(new char[MAX_PACKET_SIZE]);
|
||||
memset(packetBuffer, 0, MAX_PACKET_SIZE);
|
||||
|
||||
try {
|
||||
//suck in and process all waiting packets
|
||||
while(network.Receive(packetBuffer)) {
|
||||
HandlePacket(packetBuffer);
|
||||
}
|
||||
}
|
||||
catch(terminal_error& e) {
|
||||
throw(e);
|
||||
}
|
||||
catch(std::exception& e) {
|
||||
std::cerr << "HandlePacket Error: " << e.what() << std::endl;
|
||||
}
|
||||
|
||||
//free the buffer
|
||||
delete reinterpret_cast<char*>(packetBuffer);
|
||||
|
||||
//heartbeat system
|
||||
CheckHeartBeat();
|
||||
|
||||
//update all entities
|
||||
for (auto& it : characterMap) {
|
||||
it.second.Update();
|
||||
}
|
||||
for (auto& it : monsterMap) {
|
||||
it.second.Update();
|
||||
}
|
||||
|
||||
try {
|
||||
//update the map
|
||||
UpdateMap();
|
||||
}
|
||||
catch(terminal_error& e) {
|
||||
throw(e);
|
||||
}
|
||||
catch(std::exception& e) {
|
||||
std::cerr << "UpdateMap Error: " << e.what() << std::endl;
|
||||
}
|
||||
|
||||
//skip the rest without a local character
|
||||
if (!localCharacter) {
|
||||
return;
|
||||
}
|
||||
|
||||
//get the collidable boxes
|
||||
std::list<BoundingBox> boxList = GenerateCollisionGrid(localCharacter, tileSheet.GetTileW(), tileSheet.GetTileH());
|
||||
|
||||
//process the collisions
|
||||
if (localCharacter->ProcessCollisionGrid(boxList)) {
|
||||
localCharacter->CorrectSprite();
|
||||
SendLocalCharacterMovement();
|
||||
}
|
||||
|
||||
//update the camera
|
||||
camera.x = localCharacter->GetOrigin().x - camera.marginX;
|
||||
camera.y = localCharacter->GetOrigin().y - camera.marginY;
|
||||
}
|
||||
|
||||
void World::FrameEnd() {
|
||||
//
|
||||
}
|
||||
|
||||
void World::RenderFrame(SDL_Renderer* renderer) {
|
||||
//draw the map
|
||||
for (std::list<Region>::iterator it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); it++) {
|
||||
tileSheet.DrawRegionTo(renderer, &(*it), camera.x, camera.y);
|
||||
|
||||
//debugging
|
||||
// std::ostringstream msg;
|
||||
// msg << it->GetX() << ", " << it->GetY();
|
||||
// font.DrawStringTo(msg.str(), screen, it->GetX() * tileSheet.GetImage()->GetClipW() - camera.x, it->GetY() * tileSheet.GetImage()->GetClipH() - camera.y);
|
||||
}
|
||||
|
||||
//draw the entities
|
||||
for (auto& it : characterMap) {
|
||||
//BUG: #29 Characters (and other entities) are drawn out of order
|
||||
it.second.DrawTo(renderer, camera.x, camera.y);
|
||||
}
|
||||
for (auto& it : monsterMap) {
|
||||
it.second.DrawTo(renderer, camera.x, camera.y);
|
||||
}
|
||||
|
||||
//draw UI
|
||||
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});
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//Event handlers
|
||||
//-------------------------
|
||||
|
||||
void World::QuitEvent() {
|
||||
//two-step logout
|
||||
SendDisconnectRequest();
|
||||
SetSceneSignal(SceneSignal::QUIT);
|
||||
}
|
||||
|
||||
void World::MouseMotion(SDL_MouseMotionEvent const& event) {
|
||||
disconnectButton.MouseMotion(event);
|
||||
shutdownButton.MouseMotion(event);
|
||||
}
|
||||
|
||||
void World::MouseButtonDown(SDL_MouseButtonEvent const& event) {
|
||||
disconnectButton.MouseButtonDown(event);
|
||||
shutdownButton.MouseButtonDown(event);
|
||||
}
|
||||
|
||||
void World::MouseButtonUp(SDL_MouseButtonEvent const& event) {
|
||||
if (disconnectButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||
SendLogoutRequest();
|
||||
}
|
||||
if (shutdownButton.MouseButtonUp(event) == Button::State::RELEASED) {
|
||||
SendAdminShutdownRequest();
|
||||
}
|
||||
}
|
||||
|
||||
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(event.keysym.sym) {
|
||||
case SDLK_ESCAPE:
|
||||
//TODO: (3) the escape key should actually control menus and stuff
|
||||
SendLogoutRequest();
|
||||
return;
|
||||
}
|
||||
|
||||
//character movement
|
||||
if (!localCharacter) {
|
||||
return;
|
||||
}
|
||||
Vector2 motion = localCharacter->GetMotion();
|
||||
switch(event.keysym.sym) {
|
||||
case SDLK_w:
|
||||
motion.y -= CHARACTER_WALKING_SPEED;
|
||||
break;
|
||||
case SDLK_a:
|
||||
motion.x -= CHARACTER_WALKING_SPEED;
|
||||
break;
|
||||
case SDLK_s:
|
||||
motion.y += CHARACTER_WALKING_SPEED;
|
||||
break;
|
||||
case SDLK_d:
|
||||
motion.x += CHARACTER_WALKING_SPEED;
|
||||
break;
|
||||
default:
|
||||
//DOCS: prevents wrong keys screwing with character movement
|
||||
return;
|
||||
}
|
||||
//handle diagonals
|
||||
if (motion.x != 0 && motion.y != 0) {
|
||||
motion *= CHARACTER_WALKING_MOD;
|
||||
}
|
||||
//set the info
|
||||
localCharacter->SetMotion(motion);
|
||||
localCharacter->CorrectSprite();
|
||||
SendLocalCharacterMovement();
|
||||
}
|
||||
|
||||
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(event.keysym.sym) {
|
||||
case SDLK_w:
|
||||
motion.y = std::min(0.0, motion.y += CHARACTER_WALKING_SPEED);
|
||||
break;
|
||||
case SDLK_a:
|
||||
motion.x = std::min(0.0, motion.x += CHARACTER_WALKING_SPEED);
|
||||
break;
|
||||
case SDLK_s:
|
||||
motion.y = std::max(0.0, motion.y -= CHARACTER_WALKING_SPEED);
|
||||
break;
|
||||
case SDLK_d:
|
||||
motion.x = std::max(0.0, motion.x -= CHARACTER_WALKING_SPEED);
|
||||
break;
|
||||
default:
|
||||
//DOCS: prevents wrong keys screwing with character movement
|
||||
return;
|
||||
}
|
||||
//BUGFIX: reset cardinal direction speed on key release
|
||||
if (motion.x > 0) {
|
||||
motion.x = CHARACTER_WALKING_SPEED;
|
||||
}
|
||||
else if (motion.x < 0) {
|
||||
motion.x = -CHARACTER_WALKING_SPEED;
|
||||
}
|
||||
if (motion.y > 0) {
|
||||
motion.y = CHARACTER_WALKING_SPEED;
|
||||
}
|
||||
else if (motion.y < 0) {
|
||||
motion.y = -CHARACTER_WALKING_SPEED;
|
||||
}
|
||||
//handle diagonals
|
||||
if (motion.x != 0 && motion.y != 0) {
|
||||
motion *= CHARACTER_WALKING_MOD;
|
||||
}
|
||||
//set the info
|
||||
localCharacter->SetMotion(motion);
|
||||
localCharacter->CorrectSprite();
|
||||
SendLocalCharacterMovement();
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//Direct incoming traffic
|
||||
//-------------------------
|
||||
|
||||
void World::HandlePacket(SerialPacket* const argPacket) {
|
||||
switch(argPacket->type) {
|
||||
//heartbeat system
|
||||
case SerialPacketType::PING:
|
||||
hPing(static_cast<ServerPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::PONG:
|
||||
hPong(static_cast<ServerPacket*>(argPacket));
|
||||
break;
|
||||
|
||||
//game server connections
|
||||
case SerialPacketType::LOGOUT_RESPONSE:
|
||||
hLogoutResponse(static_cast<ClientPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::DISCONNECT_RESPONSE:
|
||||
hDisconnectResponse(static_cast<ClientPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::ADMIN_DISCONNECT_FORCED:
|
||||
hAdminDisconnectForced(static_cast<ClientPacket*>(argPacket));
|
||||
break;
|
||||
|
||||
//map management
|
||||
case SerialPacketType::REGION_CONTENT:
|
||||
hRegionContent(static_cast<RegionPacket*>(argPacket));
|
||||
break;
|
||||
|
||||
//character management
|
||||
case SerialPacketType::CHARACTER_UPDATE:
|
||||
hCharacterUpdate(static_cast<CharacterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::CHARACTER_CREATE:
|
||||
hCharacterCreate(static_cast<CharacterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::CHARACTER_DELETE:
|
||||
hCharacterDelete(static_cast<CharacterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::QUERY_CHARACTER_EXISTS:
|
||||
hQueryCharacterExists(static_cast<CharacterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::QUERY_CHARACTER_STATS:
|
||||
hQueryCharacterStats(static_cast<CharacterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::QUERY_CHARACTER_LOCATION:
|
||||
hQueryCharacterLocation(static_cast<CharacterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::CHARACTER_MOVEMENT:
|
||||
hCharacterMovement(static_cast<CharacterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::CHARACTER_ATTACK:
|
||||
hCharacterAttack(static_cast<CharacterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::CHARACTER_DAMAGE:
|
||||
hCharacterDamage(static_cast<CharacterPacket*>(argPacket));
|
||||
break;
|
||||
|
||||
//monster management
|
||||
case SerialPacketType::MONSTER_CREATE:
|
||||
hMonsterCreate(static_cast<MonsterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::MONSTER_DELETE:
|
||||
hMonsterDelete(static_cast<MonsterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::QUERY_MONSTER_EXISTS:
|
||||
hQueryMonsterExists(static_cast<MonsterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::QUERY_MONSTER_STATS:
|
||||
hQueryMonsterStats(static_cast<MonsterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::QUERY_MONSTER_LOCATION:
|
||||
hQueryMonsterLocation(static_cast<MonsterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::MONSTER_MOVEMENT:
|
||||
hMonsterMovement(static_cast<MonsterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::MONSTER_ATTACK:
|
||||
hMonsterAttack(static_cast<MonsterPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::MONSTER_DAMAGE:
|
||||
hMonsterDamage(static_cast<MonsterPacket*>(argPacket));
|
||||
break;
|
||||
|
||||
//chat
|
||||
case SerialPacketType::TEXT_BROADCAST:
|
||||
hTextBroadcast(static_cast<TextPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::TEXT_SPEECH:
|
||||
hTextSpeech(static_cast<TextPacket*>(argPacket));
|
||||
break;
|
||||
case SerialPacketType::TEXT_WHISPER:
|
||||
hTextWhisper(static_cast<TextPacket*>(argPacket));
|
||||
break;
|
||||
|
||||
//general rejection messages
|
||||
case SerialPacketType::REGION_REJECTION:
|
||||
case SerialPacketType::CHARACTER_REJECTION:
|
||||
case SerialPacketType::QUERY_REJECTION:
|
||||
throw(terminal_error(static_cast<TextPacket*>(argPacket)->text));
|
||||
break;
|
||||
case SerialPacketType::SHUTDOWN_REJECTION:
|
||||
throw(std::runtime_error(static_cast<TextPacket*>(argPacket)->text));
|
||||
break;
|
||||
|
||||
//errors
|
||||
default: {
|
||||
std::ostringstream msg;
|
||||
msg << "Unknown SerialPacketType encountered in World: " << static_cast<int>(argPacket->type);
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1,118 +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 "world.hpp"
|
||||
|
||||
#include "channels.hpp"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
//-------------------------
|
||||
//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);
|
||||
}
|
||||
}
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//map management
|
||||
//-------------------------
|
||||
|
||||
void World::SendRegionRequest(int roomIndex, int x, int y) {
|
||||
RegionPacket packet;
|
||||
|
||||
//pack the region's data
|
||||
packet.type = SerialPacketType::REGION_REQUEST;
|
||||
packet.roomIndex = roomIndex;
|
||||
packet.x = x;
|
||||
packet.y = y;
|
||||
|
||||
network.SendTo(Channels::SERVER, &packet);
|
||||
}
|
||||
|
||||
void World::hRegionContent(RegionPacket* const argPacket) {
|
||||
//checksum
|
||||
if (regionChecksum(argPacket->region) == 0) {
|
||||
std::ostringstream msg;
|
||||
msg << "Received region checksum failed: " << argPacket->x << ", " << argPacket->y;
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
|
||||
//replace existing regions
|
||||
regionPager.UnloadIf([&](Region const& region) -> bool {
|
||||
return region.GetX() == argPacket->x && region.GetY() == argPacket->y;
|
||||
});
|
||||
regionPager.PushRegion(argPacket->region);
|
||||
|
||||
//clean up after the serial code
|
||||
delete argPacket->region;
|
||||
argPacket->region = nullptr;
|
||||
}
|
||||
|
||||
void World::UpdateMap() {
|
||||
if (roomIndex == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
//these represent the zone of regions that the client needs loaded, including the mandatory buffers (+1/-1)
|
||||
int xStart = snapToBase(REGION_WIDTH, camera.x/tileSheet.GetTileW()) - REGION_WIDTH;
|
||||
int xEnd = snapToBase(REGION_WIDTH, (camera.x+camera.width)/tileSheet.GetTileW()) + REGION_WIDTH;
|
||||
|
||||
int yStart = snapToBase(REGION_HEIGHT, camera.y/tileSheet.GetTileH()) - REGION_HEIGHT;
|
||||
int yEnd = snapToBase(REGION_HEIGHT, (camera.y+camera.height)/tileSheet.GetTileH()) + REGION_HEIGHT;
|
||||
|
||||
//prune distant regions
|
||||
regionPager.GetContainer()->remove_if([&](Region const& region) -> bool {
|
||||
return region.GetX() < xStart || region.GetX() > xEnd || region.GetY() < yStart || region.GetY() > yEnd;
|
||||
});
|
||||
|
||||
//request empty regions within this zone
|
||||
for (int i = xStart; i <= xEnd; i += REGION_WIDTH) {
|
||||
for (int j = yStart; j <= yEnd; j += REGION_HEIGHT) {
|
||||
Region* region = regionPager.FindRegion(i, j);
|
||||
if (!region) {
|
||||
//request absent region
|
||||
SendRegionRequest(roomIndex, i, j);
|
||||
}
|
||||
else if (regionChecksum(region) == 0) {
|
||||
//checksum failed
|
||||
regionPager.UnloadIf([region](Region const& ref) -> bool {
|
||||
//remove the erroneous region
|
||||
return region == &ref;
|
||||
});
|
||||
SendRegionRequest(roomIndex, i, j);
|
||||
std::ostringstream msg;
|
||||
msg << "Existing region checksum failed: " << roomIndex << ", " << i << ", " << j;
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,126 +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 "world.hpp"
|
||||
|
||||
#include "channels.hpp"
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
//-------------------------
|
||||
//monster management
|
||||
//-------------------------
|
||||
|
||||
void World::hMonsterCreate(MonsterPacket* const argPacket) {
|
||||
//check for logic errors
|
||||
if (monsterMap.find(argPacket->monsterIndex) != monsterMap.end()) {
|
||||
std::ostringstream msg;
|
||||
msg << "Double monster creation event; ";
|
||||
msg << "Index: " << argPacket->monsterIndex << "; ";
|
||||
msg << "Handle: " << argPacket->handle;
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
|
||||
//ignore monsters from other rooms
|
||||
if (roomIndex != argPacket->roomIndex) {
|
||||
//temporary error checking
|
||||
std::ostringstream msg;
|
||||
msg << "Monster from the wrong room received: ";
|
||||
msg << "monsterIndex: " << argPacket->monsterIndex << ", roomIndex: " << argPacket->roomIndex;
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
|
||||
//implicitly create the element
|
||||
BaseMonster* monster = &monsterMap[argPacket->monsterIndex];
|
||||
|
||||
//fill the monster's info
|
||||
monster->SetHandle(argPacket->handle);
|
||||
monster->SetAvatar(GetRenderer(), argPacket->avatar);
|
||||
monster->SetBounds(argPacket->bounds);
|
||||
monster->SetOrigin(argPacket->origin);
|
||||
monster->SetMotion(argPacket->motion);
|
||||
|
||||
//debug
|
||||
std::cout << "Monster Create, total: " << monsterMap.size() << std::endl;
|
||||
}
|
||||
|
||||
void World::hMonsterDelete(MonsterPacket* const argPacket) {
|
||||
//ignore if this monster doesn't exist
|
||||
std::map<int, BaseMonster>::iterator monsterIt = monsterMap.find(argPacket->monsterIndex);
|
||||
if (monsterIt == monsterMap.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
//remove this monster
|
||||
monsterMap.erase(monsterIt);
|
||||
|
||||
//debug
|
||||
std::cout << "Monster Delete, total: " << monsterMap.size() << std::endl;
|
||||
}
|
||||
|
||||
void World::hQueryMonsterExists(MonsterPacket* const argPacket) {
|
||||
//ignore monsters in a different room (sub-optimal)
|
||||
if (argPacket->roomIndex != roomIndex) {
|
||||
return;
|
||||
}
|
||||
|
||||
//implicitly create the element
|
||||
BaseMonster* monster = &monsterMap[argPacket->monsterIndex];
|
||||
|
||||
//fill the monster's info
|
||||
monster->SetHandle(argPacket->handle);
|
||||
monster->SetAvatar(GetRenderer(), argPacket->avatar);
|
||||
monster->SetBounds(argPacket->bounds);
|
||||
monster->SetOrigin(argPacket->origin);
|
||||
monster->SetMotion(argPacket->motion);
|
||||
|
||||
//debug
|
||||
std::cout << "Monster Query, total: " << monsterMap.size() << std::endl;
|
||||
}
|
||||
|
||||
void World::hQueryMonsterStats(MonsterPacket* const argPacket) {
|
||||
//TODO: (9) World::hQueryMonsterStats()
|
||||
}
|
||||
|
||||
void World::hQueryMonsterLocation(MonsterPacket* const argPacket) {
|
||||
//TODO: (9) World::hQueryMonsterLocation()
|
||||
}
|
||||
|
||||
void World::hMonsterMovement(MonsterPacket* const argPacket) {
|
||||
//ignore if this monster doesn't exist
|
||||
std::map<int, BaseMonster>::iterator monsterIt = monsterMap.find(argPacket->monsterIndex);
|
||||
if (monsterIt == monsterMap.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
monsterIt->second.SetOrigin(argPacket->origin);
|
||||
monsterIt->second.SetOrigin(argPacket->motion);
|
||||
}
|
||||
|
||||
void World::hMonsterAttack(MonsterPacket* const argPacket) {
|
||||
//TODO: (9) World::hMonsterAttack()
|
||||
}
|
||||
|
||||
void World::hMonsterDamage(MonsterPacket* const argPacket) {
|
||||
//TODO: (9) World::hMonsterDamage()
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
|
||||
+2
-4
@@ -1,5 +1,5 @@
|
||||
#include directories
|
||||
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
|
||||
INCLUDES+=. entities 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
|
||||
@@ -29,10 +29,8 @@ OUT=$(addprefix $(OUTDIR)/,client)
|
||||
|
||||
#targets
|
||||
all: $(OBJ) $(OUT)
|
||||
$(MAKE) -C client_utilities
|
||||
$(MAKE) -C entities
|
||||
$(MAKE) -C gameplay_scenes
|
||||
$(MAKE) -C menu_scenes
|
||||
$(MAKE) -C scenes
|
||||
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)
|
||||
|
||||
$(OBJ): | $(OBJDIR)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -33,5 +33,6 @@ enum SceneSignal {
|
||||
OPTIONSMENU,
|
||||
LOBBYMENU,
|
||||
WORLD,
|
||||
COMBAT,
|
||||
DISCONNECTEDSCREEN,
|
||||
};
|
||||
@@ -0,0 +1,77 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "combat.hpp"
|
||||
|
||||
//Public access members
|
||||
Combat::Combat(int* const argClientIndex, int* const argAccountIndex) {
|
||||
//
|
||||
}
|
||||
|
||||
Combat::~Combat() {
|
||||
//
|
||||
}
|
||||
|
||||
void Combat::RenderFrame(SDL_Renderer* renderer) {
|
||||
//
|
||||
}
|
||||
|
||||
//frame phases
|
||||
void Combat::FrameStart() {
|
||||
//
|
||||
}
|
||||
|
||||
void Combat::Update() {
|
||||
//
|
||||
}
|
||||
|
||||
void Combat::FrameEnd() {
|
||||
//
|
||||
}
|
||||
|
||||
//input events
|
||||
void Combat::QuitEvent() {
|
||||
//
|
||||
}
|
||||
|
||||
void Combat::MouseMotion(SDL_MouseMotionEvent const& event) {
|
||||
//
|
||||
}
|
||||
|
||||
void Combat::MouseButtonDown(SDL_MouseButtonEvent const& event) {
|
||||
//
|
||||
}
|
||||
|
||||
void Combat::MouseButtonUp(SDL_MouseButtonEvent const& event) {
|
||||
//
|
||||
}
|
||||
|
||||
void Combat::MouseWheel(SDL_MouseWheelEvent const& event) {
|
||||
//
|
||||
}
|
||||
|
||||
void Combat::KeyDown(SDL_KeyboardEvent const& event) {
|
||||
//
|
||||
}
|
||||
|
||||
void Combat::KeyUp(SDL_KeyboardEvent const& event) {
|
||||
//
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "base_scene.hpp"
|
||||
|
||||
class Combat: public BaseScene {
|
||||
public:
|
||||
//Public access members
|
||||
Combat(int* const argClientIndex, int* const argAccountIndex);
|
||||
~Combat();
|
||||
|
||||
void RenderFrame(SDL_Renderer* renderer) override;
|
||||
|
||||
private:
|
||||
//frame phases
|
||||
void FrameStart() override;
|
||||
void Update() override;
|
||||
void FrameEnd() override;
|
||||
|
||||
//input events
|
||||
void QuitEvent();
|
||||
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;
|
||||
};
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -37,7 +37,7 @@ DisconnectedScreen::DisconnectedScreen() {
|
||||
|
||||
//setup the utility objects
|
||||
//TODO: (1) resource tool, to prevent reloading like this
|
||||
image.Load(GetRenderer(), config["dir.interface"] + "button_red.png");
|
||||
image.Load(GetRenderer(), config["dir.interface"] + "button_blue.png");
|
||||
font = TTF_OpenFont(config["client.font"].c_str(), 12);
|
||||
|
||||
//check that the font loaded
|
||||
@@ -49,7 +49,7 @@ DisconnectedScreen::DisconnectedScreen() {
|
||||
|
||||
//setup the button
|
||||
backButton.SetBackgroundTexture(GetRenderer(), image.GetTexture());
|
||||
backButton.SetText(GetRenderer(), font, "Back", COLOR_BLUE);
|
||||
backButton.SetText(GetRenderer(), font, "Back", COLOR_WHITE);
|
||||
|
||||
//set the button positions
|
||||
backButton.SetX(50);
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -40,7 +40,7 @@ LobbyMenu::LobbyMenu(int* const argClientIndex, int* const argAccountIndex):
|
||||
accountIndex = -1;
|
||||
|
||||
//setup the utility objects
|
||||
buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_red.png");
|
||||
buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_blue.png");
|
||||
font = TTF_OpenFont(config["client.font"].c_str(), 12);
|
||||
|
||||
//check that the font loaded
|
||||
@@ -52,11 +52,11 @@ LobbyMenu::LobbyMenu(int* const argClientIndex, int* const argAccountIndex):
|
||||
|
||||
//setup the buttons
|
||||
searchButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||
searchButton.SetText(GetRenderer(), font, "Search", COLOR_BLUE);
|
||||
searchButton.SetText(GetRenderer(), font, "Search", COLOR_WHITE);
|
||||
joinButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||
joinButton.SetText(GetRenderer(), font, "Join", COLOR_BLUE);
|
||||
joinButton.SetText(GetRenderer(), font, "Join", COLOR_WHITE);
|
||||
backButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||
backButton.SetText(GetRenderer(), font, "Back", COLOR_BLUE);
|
||||
backButton.SetText(GetRenderer(), font, "Back", COLOR_WHITE);
|
||||
|
||||
//set the button positions (assumed)
|
||||
searchButton.SetX(50);
|
||||
@@ -122,7 +122,7 @@ void LobbyMenu::RenderFrame(SDL_Renderer* renderer) {
|
||||
|
||||
//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);
|
||||
serverVector[i].playerCountImage.DrawTo(renderer, boundingBox.x+276, boundingBox.y + boundingBox.h * i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -34,7 +34,7 @@ MainMenu::MainMenu() {
|
||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||
|
||||
//setup the utility objects
|
||||
buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_red.png");
|
||||
buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_blue.png");
|
||||
font = TTF_OpenFont(config["client.font"].c_str(), 12);
|
||||
|
||||
//check that the font loaded
|
||||
@@ -46,11 +46,11 @@ MainMenu::MainMenu() {
|
||||
|
||||
//setup the buttons
|
||||
startButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||
startButton.SetText(GetRenderer(), font, "Start", COLOR_BLUE);
|
||||
startButton.SetText(GetRenderer(), font, "Start", COLOR_WHITE);
|
||||
optionsButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||
optionsButton.SetText(GetRenderer(), font, "Options", COLOR_BLUE);
|
||||
optionsButton.SetText(GetRenderer(), font, "Options", COLOR_WHITE);
|
||||
quitButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||
quitButton.SetText(GetRenderer(), font, "Quit", COLOR_BLUE);
|
||||
quitButton.SetText(GetRenderer(), font, "Quit", COLOR_WHITE);
|
||||
|
||||
//set the button positions
|
||||
startButton.SetX(50);
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -34,7 +34,7 @@ OptionsMenu::OptionsMenu() {
|
||||
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||
|
||||
//setup the utility objects
|
||||
buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_red.png");
|
||||
buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_blue.png");
|
||||
font = TTF_OpenFont(config["client.font"].c_str(), 12);
|
||||
|
||||
//check that the font loaded
|
||||
@@ -46,7 +46,7 @@ OptionsMenu::OptionsMenu() {
|
||||
|
||||
//setup the button
|
||||
backButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture());
|
||||
backButton.SetText(GetRenderer(), font, "Back", COLOR_BLUE);
|
||||
backButton.SetText(GetRenderer(), font, "Back", COLOR_WHITE);
|
||||
|
||||
//set the button positions
|
||||
backButton.SetX(50);
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -35,15 +35,11 @@ SplashScreen::SplashScreen(SDL_Window* w) {
|
||||
|
||||
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);
|
||||
//
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
@@ -58,6 +54,7 @@ void SplashScreen::FrameStart() {
|
||||
}
|
||||
|
||||
void SplashScreen::RenderFrame(SDL_Renderer* renderer) {
|
||||
//TODO: version information
|
||||
int w = 0, h = 0;
|
||||
SDL_RenderGetLogicalSize(renderer, &w, &h);
|
||||
logo.DrawTo(renderer, (w - logo.GetClipW()) / 2, (h - logo.GetClipH()) / 2);
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -39,8 +39,10 @@
|
||||
#include "frame_rate.hpp"
|
||||
|
||||
//client
|
||||
#include "barrier_manager.hpp"
|
||||
#include "base_scene.hpp"
|
||||
#include "base_monster.hpp"
|
||||
#include "base_barrier.hpp"
|
||||
#include "base_creature.hpp"
|
||||
#include "local_character.hpp"
|
||||
|
||||
#include "SDL2/SDL.h"
|
||||
@@ -102,25 +104,25 @@ private:
|
||||
//character management
|
||||
void hCharacterUpdate(CharacterPacket* const);
|
||||
void hCharacterCreate(CharacterPacket* const);
|
||||
void hCharacterDelete(CharacterPacket* const);
|
||||
void hCharacterUnload(CharacterPacket* const);
|
||||
void hQueryCharacterExists(CharacterPacket* const);
|
||||
void hQueryCharacterStats(CharacterPacket* const);
|
||||
void hQueryCharacterLocation(CharacterPacket* const);
|
||||
void hCharacterMovement(CharacterPacket* const);
|
||||
void hCharacterAttack(CharacterPacket* const);
|
||||
void hCharacterDamage(CharacterPacket* const);
|
||||
|
||||
//monster management
|
||||
void hMonsterCreate(MonsterPacket* const);
|
||||
void hMonsterDelete(MonsterPacket* const);
|
||||
void hQueryMonsterExists(MonsterPacket* const);
|
||||
void hQueryMonsterStats(MonsterPacket* const);
|
||||
void hQueryMonsterLocation(MonsterPacket* const);
|
||||
void hMonsterMovement(MonsterPacket* const);
|
||||
void hMonsterAttack(MonsterPacket* const);
|
||||
void hMonsterDamage(MonsterPacket* const);
|
||||
//creature management
|
||||
void hCreatureUpdate(CreaturePacket* const);
|
||||
void hCreatureCreate(CreaturePacket* const);
|
||||
void hCreatureUnload(CreaturePacket* const);
|
||||
void hQueryCreatureExists(CreaturePacket* const);
|
||||
void hCreatureMovement(CreaturePacket* const);
|
||||
|
||||
//barrier management
|
||||
void hBarrierUpdate(BarrierPacket* const);
|
||||
void hBarrierCreate(BarrierPacket* const);
|
||||
void hBarrierUnload(BarrierPacket* const);
|
||||
void hQueryBarrierExists(BarrierPacket* const);
|
||||
|
||||
//chat
|
||||
//TODO: ui chat engine
|
||||
void hTextBroadcast(TextPacket* const);
|
||||
void hTextSpeech(TextPacket* const);
|
||||
void hTextWhisper(TextPacket* const);
|
||||
@@ -157,8 +159,9 @@ private:
|
||||
} camera;
|
||||
|
||||
//entities
|
||||
BarrierManager barrierMgr;
|
||||
std::map<int, BaseCharacter> characterMap;
|
||||
std::map<int, BaseMonster> monsterMap;
|
||||
std::map<int, BaseCreature> creatureMap;
|
||||
LocalCharacter* localCharacter = nullptr;
|
||||
|
||||
//heartbeat
|
||||
-1
Submodule common deleted from e7d3205a96
@@ -10,10 +10,6 @@ CXXSRC=$(wildcard *.cpp)
|
||||
OBJDIR=obj
|
||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||
|
||||
#output
|
||||
OUTDIR=..
|
||||
OUT=$(addprefix $(OUTDIR)/,client.a)
|
||||
|
||||
#targets
|
||||
all: $(OBJ) $(OUT)
|
||||
ar -crs $(OUT) $(OBJ)
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -19,21 +19,27 @@
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "world.hpp"
|
||||
#include "timer.hpp"
|
||||
|
||||
//-------------------------
|
||||
//chat
|
||||
//-------------------------
|
||||
|
||||
void World::hTextBroadcast(TextPacket* const argPacket) {
|
||||
//TODO: (9) World::hTextBroadcast()
|
||||
Timer::Timer(): start(Timer::Clock::now()) {
|
||||
//
|
||||
}
|
||||
|
||||
void World::hTextSpeech(TextPacket* const argPacket) {
|
||||
//TODO: (9) World::hTextSpeech()
|
||||
Timer::Timer(std::string s): name(s), start(Timer::Clock::now()) {
|
||||
//
|
||||
}
|
||||
|
||||
void World::hTextWhisper(TextPacket* const argPacket) {
|
||||
//TODO: (9) World::hTextWhisper()
|
||||
void Timer::Start() {
|
||||
start = Clock::now();
|
||||
}
|
||||
|
||||
void Timer::Stop() {
|
||||
timeSpan = Clock::now() - start;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, Timer& t) {
|
||||
os << t.GetName() << ": ";
|
||||
os << std::chrono::duration_cast<std::chrono::microseconds>(t.GetTime()).count();
|
||||
os << "us";
|
||||
return os;
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <chrono>
|
||||
#include <string>
|
||||
#include <ostream>
|
||||
|
||||
class Timer {
|
||||
public:
|
||||
typedef std::chrono::high_resolution_clock Clock;
|
||||
|
||||
Timer();
|
||||
Timer(std::string s);
|
||||
~Timer() = default;
|
||||
|
||||
void Start();
|
||||
void Stop();
|
||||
|
||||
//accessors and mutators
|
||||
Clock::duration GetTime() { return timeSpan; }
|
||||
|
||||
std::string SetName(std::string s) { return name = s; }
|
||||
std::string GetName() { return name; }
|
||||
|
||||
private:
|
||||
std::string name;
|
||||
Clock::time_point start;
|
||||
Clock::duration timeSpan;
|
||||
};
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, Timer& t);
|
||||
@@ -1,5 +1,5 @@
|
||||
#config
|
||||
INCLUDES+=. .. ../client_utilities ../../common/graphics ../../common/map ../../common/network ../../common/network/packet_types ../../common/ui ../../common/utilities
|
||||
INCLUDES+=. packet_types ../gameplay ../map ../utilities
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
@@ -10,13 +10,10 @@ CXXSRC=$(wildcard *.cpp)
|
||||
OBJDIR=obj
|
||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||
|
||||
#output
|
||||
OUTDIR=..
|
||||
OUT=$(addprefix $(OUTDIR)/,client.a)
|
||||
|
||||
#targets
|
||||
all: $(OBJ) $(OUT)
|
||||
ar -crs $(OUT) $(OBJ)
|
||||
$(MAKE) -C packet_types
|
||||
|
||||
$(OBJ): | $(OBJDIR)
|
||||
|
||||
@@ -0,0 +1,188 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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 "application.hpp"
|
||||
|
||||
#include <chrono>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
void Application::Init(int argc, char* argv[]) {
|
||||
//create and check the window
|
||||
window = SDL_CreateWindow(
|
||||
"Example Caption",
|
||||
SDL_WINDOWPOS_UNDEFINED,
|
||||
SDL_WINDOWPOS_UNDEFINED,
|
||||
screenWidth,
|
||||
screenHeight,
|
||||
SDL_WINDOW_RESIZABLE);
|
||||
|
||||
if (!window) {
|
||||
std::ostringstream msg;
|
||||
msg << "Failed to create the window: " << SDL_GetError();
|
||||
throw(std::runtime_error(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, screenWidth, screenHeight);
|
||||
|
||||
//set the hook for the renderer
|
||||
BaseScene::SetRenderer(renderer);
|
||||
}
|
||||
|
||||
void Application::Proc() {
|
||||
//load the first scene
|
||||
ProcessSceneSignal(SceneSignal::FIRST);
|
||||
|
||||
//fixed frame rate
|
||||
typedef std::chrono::steady_clock Clock;
|
||||
|
||||
Clock::time_point simTime = Clock::now();
|
||||
Clock::time_point realTime;
|
||||
constexpr std::chrono::duration<int, std::milli> frameDelay(16); //~60FPS
|
||||
|
||||
//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 the game or give the machine a break
|
||||
if (simTime < realTime) {
|
||||
while(simTime < realTime) {
|
||||
//call the user defined functions
|
||||
activeScene->FrameStart();
|
||||
ProcessEvents();
|
||||
activeScene->Update();
|
||||
activeScene->FrameEnd();
|
||||
|
||||
//step to the next frame
|
||||
simTime += frameDelay;
|
||||
}
|
||||
}
|
||||
else {
|
||||
SDL_Delay(1);
|
||||
}
|
||||
|
||||
SDL_RenderClear(renderer);
|
||||
activeScene->RenderFrame(renderer);
|
||||
SDL_RenderPresent(renderer);
|
||||
}
|
||||
|
||||
//cleanup
|
||||
ClearScene();
|
||||
}
|
||||
|
||||
void Application::Quit() {
|
||||
//clean up after the program
|
||||
BaseScene::SetRenderer(nullptr);
|
||||
SDL_DestroyRenderer(renderer);
|
||||
SDL_DestroyWindow(window);
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//Scene management
|
||||
//-------------------------
|
||||
|
||||
void Application::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: 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Add the custom scene headers here
|
||||
#include "example_scene.hpp"
|
||||
|
||||
void Application::ProcessSceneSignal(SceneSignal signal) {
|
||||
ClearScene();
|
||||
|
||||
switch(signal) {
|
||||
case SceneSignal::FIRST:
|
||||
case SceneSignal::EXAMPLE_SCENE:
|
||||
activeScene = new ExampleScene();
|
||||
break;
|
||||
default: {
|
||||
std::ostringstream msg;
|
||||
msg << "Failed to recognize the scene signal: " << signal;
|
||||
throw(std::logic_error(msg.str()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Application::ClearScene() {
|
||||
delete activeScene;
|
||||
activeScene = nullptr;
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "base_scene.hpp"
|
||||
#include "scene_signal.hpp"
|
||||
|
||||
#include "SDL2/SDL.h"
|
||||
|
||||
//TODO: do something with these
|
||||
constexpr int screenWidth = 800;
|
||||
constexpr int screenHeight = 600;
|
||||
|
||||
//DOCS: The Application class handles scene switching, utilizing only one window
|
||||
class Application {
|
||||
public:
|
||||
Application() = default;
|
||||
~Application() = default;
|
||||
|
||||
void Init(int argc, char* argv[]);
|
||||
void Proc();
|
||||
void Quit();
|
||||
|
||||
private:
|
||||
//scene management
|
||||
void ProcessEvents();
|
||||
void ProcessSceneSignal(SceneSignal);
|
||||
void ClearScene();
|
||||
|
||||
BaseScene* activeScene = nullptr;
|
||||
|
||||
//TODO: build a "window" class?
|
||||
SDL_Window* window = nullptr;
|
||||
SDL_Renderer* renderer = nullptr;
|
||||
};
|
||||
@@ -0,0 +1,105 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "base_scene.hpp"
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//frame phases
|
||||
//-------------------------
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
void BaseScene::KeyUp(SDL_KeyboardEvent const& event) {
|
||||
//EMPTY
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "scene_signal.hpp"
|
||||
|
||||
#include "SDL2/SDL.h"
|
||||
|
||||
class BaseScene {
|
||||
public:
|
||||
BaseScene();
|
||||
virtual ~BaseScene();
|
||||
|
||||
virtual void RenderFrame(SDL_Renderer*);
|
||||
static void SetRenderer(SDL_Renderer*);
|
||||
SceneSignal GetSceneSignal();
|
||||
|
||||
//frame phases
|
||||
virtual void FrameStart();
|
||||
virtual void Update();
|
||||
virtual void FrameEnd();
|
||||
|
||||
//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: joystick and controller events
|
||||
|
||||
protected:
|
||||
//control
|
||||
static SDL_Renderer* GetRenderer();
|
||||
void SetSceneSignal(SceneSignal);
|
||||
|
||||
private:
|
||||
static SDL_Renderer* rendererHandle;
|
||||
SceneSignal sceneSignal = SceneSignal::CONTINUE;
|
||||
};
|
||||
@@ -0,0 +1,83 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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 "example_scene.hpp"
|
||||
|
||||
ExampleScene::ExampleScene() {
|
||||
//
|
||||
}
|
||||
|
||||
ExampleScene::~ExampleScene() {
|
||||
//
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//frame phases
|
||||
//-------------------------
|
||||
|
||||
void ExampleScene::FrameStart() {
|
||||
//
|
||||
}
|
||||
|
||||
void ExampleScene::Update() {
|
||||
//
|
||||
}
|
||||
|
||||
void ExampleScene::FrameEnd() {
|
||||
//
|
||||
}
|
||||
|
||||
void ExampleScene::RenderFrame(SDL_Renderer* renderer) {
|
||||
//
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//input events
|
||||
//-------------------------
|
||||
|
||||
void ExampleScene::MouseMotion(SDL_MouseMotionEvent const& event) {
|
||||
//
|
||||
}
|
||||
|
||||
void ExampleScene::MouseButtonDown(SDL_MouseButtonEvent const& event) {
|
||||
//
|
||||
}
|
||||
|
||||
void ExampleScene::MouseButtonUp(SDL_MouseButtonEvent const& event) {
|
||||
//
|
||||
}
|
||||
|
||||
void ExampleScene::MouseWheel(SDL_MouseWheelEvent const& event) {
|
||||
//
|
||||
}
|
||||
|
||||
void ExampleScene::KeyDown(SDL_KeyboardEvent const& event) {
|
||||
//preference as a default
|
||||
switch(event.keysym.sym) {
|
||||
case SDLK_ESCAPE:
|
||||
QuitEvent();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ExampleScene::KeyUp(SDL_KeyboardEvent const& event) {
|
||||
//
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "base_scene.hpp"
|
||||
|
||||
class ExampleScene : public BaseScene {
|
||||
public:
|
||||
ExampleScene();
|
||||
~ExampleScene();
|
||||
|
||||
void RenderFrame(SDL_Renderer* renderer) override;
|
||||
|
||||
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;
|
||||
};
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -19,16 +19,25 @@
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "server_application.hpp"
|
||||
#include "application.hpp"
|
||||
|
||||
void ServerApplication::hTextBroadcast(TextPacket* const argPacket) {
|
||||
//TODO: (9) ServerApplication::hTextBroadcast()
|
||||
}
|
||||
#include "SDL2/SDL.h"
|
||||
|
||||
void ServerApplication::hTextSpeech(TextPacket* const argPacket) {
|
||||
//TODO: (9) ServerApplication::hTextSpeech()
|
||||
}
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
|
||||
void ServerApplication::hTextWhisper(TextPacket* const argPacket) {
|
||||
//TODO: (9) ServerApplication::hTextWhisper()
|
||||
}
|
||||
int main(int argc, char** argv) {
|
||||
std::cout << "Beginning " << argv[0] << std::endl;
|
||||
try {
|
||||
Application app;
|
||||
app.Init(argc, argv);
|
||||
app.Proc();
|
||||
app.Quit();
|
||||
}
|
||||
catch(std::exception& e) {
|
||||
std::cerr << "Fatal Error: " << e.what() << std::endl;
|
||||
return 1;
|
||||
}
|
||||
std::cout << "Clean exit from " << argv[0] << std::endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
#include directories
|
||||
INCLUDES+=.
|
||||
|
||||
#libraries
|
||||
#the order of the $(LIBS) is important, at least for MinGW
|
||||
LIBS+=
|
||||
ifeq ($(OS),Windows_NT)
|
||||
LIBS+=-lmingw32
|
||||
endif
|
||||
LIBS+=-lSDL2main -lSDL2
|
||||
|
||||
#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)
|
||||
|
||||
#objects
|
||||
OBJDIR=obj
|
||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||
|
||||
#output
|
||||
OUTDIR=out
|
||||
OUT=$(addprefix $(OUTDIR)/,scenes)
|
||||
|
||||
#targets
|
||||
all: $(OBJ) $(OUT)
|
||||
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)
|
||||
|
||||
$(OBJ): | $(OBJDIR)
|
||||
|
||||
$(OUT): | $(OUTDIR)
|
||||
|
||||
$(OBJDIR):
|
||||
mkdir $(OBJDIR)
|
||||
|
||||
$(OUTDIR):
|
||||
mkdir $(OUTDIR)
|
||||
|
||||
$(OBJDIR)/%.o: %.cpp
|
||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||
|
||||
clean:
|
||||
ifeq ($(OS),Windows_NT)
|
||||
$(RM) *.o *.a *.exe
|
||||
else ifeq ($(shell uname), Linux)
|
||||
find . -type f -name '*.o' -exec rm -f -r -v {} \;
|
||||
find . -type f -name '*.a' -exec rm -f -r -v {} \;
|
||||
rm -f -v $(OUT)
|
||||
endif
|
||||
|
||||
rebuild: clean all
|
||||
@@ -0,0 +1,32 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
enum SceneSignal {
|
||||
//reserved members for internal use
|
||||
QUIT = -1,
|
||||
CONTINUE = 0,
|
||||
FIRST = 1,
|
||||
|
||||
//custom scenes
|
||||
EXAMPLE_SCENE
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
//the bounds for the objects, mapped to the default sprites
|
||||
constexpr int BARRIER_BOUNDS_X = 0;
|
||||
constexpr int BARRIER_BOUNDS_Y = 0;
|
||||
constexpr int BARRIER_BOUNDS_WIDTH = 96;
|
||||
constexpr int BARRIER_BOUNDS_HEIGHT = 96;
|
||||
@@ -0,0 +1,39 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <cmath>
|
||||
|
||||
//the speeds that the characters move
|
||||
constexpr double CHARACTER_WALKING_SPEED = 2.24;
|
||||
constexpr double CHARACTER_WALKING_MOD = 1.0/sqrt(2.0);
|
||||
constexpr double CHARACTER_WALKING_NEGATIVE_MOD = 1.0 - CHARACTER_WALKING_MOD;
|
||||
|
||||
//the bounds for the character objects, mapped to the default sprites
|
||||
constexpr int CHARACTER_BOUNDS_X = 0;
|
||||
constexpr int CHARACTER_BOUNDS_Y = 16;
|
||||
constexpr int CHARACTER_BOUNDS_WIDTH = 32;
|
||||
constexpr int CHARACTER_BOUNDS_HEIGHT = 32;
|
||||
|
||||
//the character's sprite format
|
||||
constexpr int CHARACTER_CELLS_X = 4;
|
||||
constexpr int CHARACTER_CELLS_Y = 4;
|
||||
@@ -0,0 +1,39 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <cmath>
|
||||
|
||||
//the speeds that the characters move
|
||||
constexpr double CREATURE_WALKING_SPEED = 1.0;
|
||||
constexpr double CREATURE_WALKING_MOD = 1.0/sqrt(2.0);
|
||||
constexpr double CREATURE_WALKING_NEGATIVE_MOD = 1.0 - CREATURE_WALKING_MOD;
|
||||
|
||||
//the bounds for the character objects, mapped to the default sprites
|
||||
constexpr int CREATURE_BOUNDS_X = 0;
|
||||
constexpr int CREATURE_BOUNDS_Y = 0;
|
||||
constexpr int CREATURE_BOUNDS_WIDTH = 32;
|
||||
constexpr int CREATURE_BOUNDS_HEIGHT = 32;
|
||||
|
||||
//the character's sprite format
|
||||
constexpr int CREATURE_CELLS_X = 4;
|
||||
constexpr int CREATURE_CELLS_Y = 4;
|
||||
@@ -0,0 +1,24 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
constexpr int INFLUENCE_RADIUS = 1000;
|
||||
@@ -0,0 +1,28 @@
|
||||
#config
|
||||
INCLUDES+=.
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
#source
|
||||
CXXSRC=$(wildcard *.cpp)
|
||||
|
||||
#objects
|
||||
OBJDIR=obj
|
||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||
|
||||
#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 $@ $<
|
||||
@@ -0,0 +1,167 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "button.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
void Button::DrawTo(SDL_Renderer* renderer) {
|
||||
image.SetClipY(image.GetClipH() * state);
|
||||
image.DrawTo(renderer, posX, posY);
|
||||
}
|
||||
|
||||
void Button::SetBackgroundTexture(SDL_Renderer* renderer, SDL_Texture* texture) {
|
||||
//copy the given texture
|
||||
image.Free();
|
||||
|
||||
//a null texture can simply free the image
|
||||
if (!texture) {
|
||||
return;
|
||||
}
|
||||
|
||||
//get the w & h, & create
|
||||
int w = 0, h = 0;
|
||||
SDL_QueryTexture(texture, nullptr, nullptr, &w, &h);
|
||||
image.Create(renderer, w, h);
|
||||
|
||||
//copy
|
||||
SDL_SetRenderTarget(renderer, image.GetTexture());
|
||||
SDL_RenderCopy(renderer, texture, nullptr, nullptr);
|
||||
SDL_SetRenderTarget(renderer, nullptr);
|
||||
|
||||
//prune
|
||||
image.SetClipH(image.GetClipH() / 3);
|
||||
}
|
||||
|
||||
void Button::SetText(SDL_Renderer* renderer, TTF_Font* font, std::string s, SDL_Color color) {
|
||||
//make the surface (from SDL_ttf)
|
||||
SDL_Surface* surf = TTF_RenderText_Solid(font, s.c_str(), color);
|
||||
if (!surf) {
|
||||
throw(std::runtime_error("Failed to create a TTF surface"));
|
||||
}
|
||||
|
||||
//convert to texture
|
||||
SDL_Texture* text = SDL_CreateTextureFromSurface(renderer, surf);
|
||||
SDL_FreeSurface(surf);
|
||||
if (!text) {
|
||||
throw(std::runtime_error("Failed to create a TTF texture"));
|
||||
}
|
||||
|
||||
//get the dimensions & rects
|
||||
int x, y, w, h;
|
||||
SDL_QueryTexture(text, nullptr, nullptr, &w, &h);
|
||||
x = (image.GetClipW() - w) / 2;
|
||||
y = (image.GetClipH() - h) / 2;
|
||||
SDL_Rect src = {0, 0, w, h};
|
||||
SDL_Rect dst;
|
||||
|
||||
//draw the text to the background
|
||||
SDL_SetRenderTarget(renderer, image.GetTexture());
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
dst = {x, y + image.GetClipH() * i, w, h};
|
||||
SDL_RenderCopy(renderer, text, &src, &dst);
|
||||
}
|
||||
|
||||
SDL_SetRenderTarget(renderer, nullptr);
|
||||
|
||||
//free the texture
|
||||
SDL_DestroyTexture(text);
|
||||
}
|
||||
|
||||
void Button::SetX(int x) {
|
||||
posX = x;
|
||||
}
|
||||
|
||||
void Button::SetY(int y) {
|
||||
posY = y;
|
||||
}
|
||||
|
||||
Button::State Button::MouseMotion(SDL_MouseMotionEvent const& event) {
|
||||
//if out of bounds, exit
|
||||
if (!CheckBounds(event.x, event.y)) {
|
||||
return state = State::IDLE;
|
||||
}
|
||||
|
||||
//if in bounds, check button
|
||||
if (event.state & SDL_BUTTON_LMASK && state == State::PRESSED) {
|
||||
//stay pressed
|
||||
// state = State::PRESSED;
|
||||
}
|
||||
else {
|
||||
state = State::HOVER;
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
Button::State Button::MouseButtonDown(SDL_MouseButtonEvent const& event) {
|
||||
//if out of bounds, exit
|
||||
if (!CheckBounds(event.x, event.y)) {
|
||||
return state = State::IDLE;
|
||||
}
|
||||
|
||||
//if in bounds, check button
|
||||
if (event.button == SDL_BUTTON_LEFT) {
|
||||
return state = State::PRESSED;
|
||||
}
|
||||
|
||||
//NOTE: if not left button down, ignore
|
||||
return State::HOVER;
|
||||
}
|
||||
|
||||
Button::State Button::MouseButtonUp(SDL_MouseButtonEvent const& event) {
|
||||
//if out of bounds, exit
|
||||
if (!CheckBounds(event.x, event.y)) {
|
||||
return state = State::IDLE;
|
||||
}
|
||||
|
||||
//if not left button up, ignore
|
||||
if (event.button != SDL_BUTTON_LEFT) {
|
||||
return state;
|
||||
}
|
||||
|
||||
//if in bounds and left button up, send release signal
|
||||
if (state == State::PRESSED) {
|
||||
state = State::HOVER;
|
||||
return State::RELEASED;
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
void Button::SetState(State s) {
|
||||
state = s;
|
||||
}
|
||||
|
||||
Button::State Button::GetState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
bool Button::CheckBounds(int x, int y) {
|
||||
//return if true (x, y) is within bounds, otherwise return false
|
||||
return !(
|
||||
x < posX ||
|
||||
y < posY ||
|
||||
x > posX + image.GetClipW() ||
|
||||
y > posY + image.GetClipH()
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "image.hpp"
|
||||
|
||||
#include "SDL2/SDL_ttf.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
constexpr SDL_Color COLOR_WHITE = {255, 255, 255, 255};
|
||||
constexpr SDL_Color COLOR_RED = {255, 0, 0, 255};
|
||||
constexpr SDL_Color COLOR_ORANGE = {255, 127, 0, 255};
|
||||
constexpr SDL_Color COLOR_BLUE = {0, 0, 255, 255};
|
||||
|
||||
class Button {
|
||||
public:
|
||||
enum State {
|
||||
IDLE = 0, HOVER = 1, PRESSED = 2, RELEASED = 3
|
||||
};
|
||||
|
||||
//methods
|
||||
Button() = default;
|
||||
~Button() = default;
|
||||
|
||||
void DrawTo(SDL_Renderer*);
|
||||
|
||||
//setup
|
||||
void SetBackgroundTexture(SDL_Renderer*, SDL_Texture*);
|
||||
void SetText(SDL_Renderer*, TTF_Font*, std::string, SDL_Color);
|
||||
void SetX(int x);
|
||||
void SetY(int y);
|
||||
|
||||
//capture input
|
||||
State MouseMotion(SDL_MouseMotionEvent const&);
|
||||
State MouseButtonDown(SDL_MouseButtonEvent const&);
|
||||
State MouseButtonUp(SDL_MouseButtonEvent const&);
|
||||
|
||||
//states
|
||||
void SetState(State); //TODO: idle, busy or disabled
|
||||
State GetState();
|
||||
|
||||
protected:
|
||||
bool CheckBounds(int x, int y);
|
||||
|
||||
Image image;
|
||||
int posX = 0, posY = 0;
|
||||
State state = State::IDLE;
|
||||
};
|
||||
@@ -0,0 +1,211 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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 "SDL2/SDL_image.h"
|
||||
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
Image& Image::operator=(Image const& rhs) {
|
||||
//don't screw yourself
|
||||
if (this == &rhs) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
Free();
|
||||
|
||||
//Copy the other Image's stuff
|
||||
texture = rhs.texture;
|
||||
clip = rhs.clip;
|
||||
local = false;
|
||||
}
|
||||
|
||||
Image& Image::operator=(Image&& rhs) {
|
||||
//don't screw yourself
|
||||
if (this == &rhs) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
Free();
|
||||
|
||||
//Steal the other Image's stuff
|
||||
texture = rhs.texture;
|
||||
clip = rhs.clip;
|
||||
local = rhs.local;
|
||||
|
||||
rhs.texture = nullptr;
|
||||
rhs.clip = {0, 0, 0, 0};
|
||||
rhs.local = false;
|
||||
}
|
||||
|
||||
SDL_Texture* Image::Load(SDL_Renderer* renderer, std::string fname) {
|
||||
Free();
|
||||
|
||||
//load the file into a surface
|
||||
SDL_Surface* surface = IMG_Load(fname.c_str());
|
||||
if (!surface) {
|
||||
std::ostringstream msg;
|
||||
msg << "Failed to load an image file: " << fname;
|
||||
msg << "; " << IMG_GetError();
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
|
||||
//create a texture from this surface
|
||||
texture = SDL_CreateTextureFromSurface(renderer, surface);
|
||||
if (!texture) {
|
||||
std::ostringstream msg;
|
||||
msg << "Failed to convert a newly loaded image file: " << fname;
|
||||
msg << "; " << SDL_GetError();
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
|
||||
//set the metadata
|
||||
clip.x = 0;
|
||||
clip.y = 0;
|
||||
if (SDL_QueryTexture(texture, nullptr, nullptr, &clip.w, &clip.h)) {
|
||||
std::ostringstream msg;
|
||||
msg << "Failed to record metadata for a newly loaded image file: " << fname;
|
||||
msg << "; " << SDL_GetError();
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
local = true;
|
||||
|
||||
//free the surface & return
|
||||
SDL_FreeSurface(surface);
|
||||
return texture;
|
||||
}
|
||||
|
||||
SDL_Texture* Image::Create(SDL_Renderer* renderer, Uint16 w, Uint16 h, SDL_Color blank) {
|
||||
Free();
|
||||
|
||||
//make the texture
|
||||
texture = SDL_CreateTexture(renderer,
|
||||
SDL_PIXELFORMAT_RGBA8888,
|
||||
SDL_TEXTUREACCESS_TARGET,
|
||||
w, h);
|
||||
|
||||
//check
|
||||
if (!texture) {
|
||||
std::ostringstream msg;
|
||||
msg << "Failed to create a texture; " << SDL_GetError();
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
|
||||
//set the metadata
|
||||
clip.x = 0;
|
||||
clip.y = 0;
|
||||
if (SDL_QueryTexture(texture, nullptr, nullptr, &clip.w, &clip.h)) {
|
||||
std::ostringstream msg;
|
||||
msg << "Failed to record metadata for a newly created image";
|
||||
msg << "; " << SDL_GetError();
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
local = true;
|
||||
|
||||
//blank (black) texture
|
||||
SDL_SetRenderTarget(renderer, texture);
|
||||
SDL_SetRenderDrawColor(renderer, blank.r, blank.g, blank.b, blank.a);
|
||||
SDL_RenderFillRect(renderer, nullptr);
|
||||
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
|
||||
SDL_SetRenderTarget(renderer, nullptr);
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
SDL_Texture* Image::CopyTexture(SDL_Renderer* renderer, SDL_Texture* ptr) {
|
||||
Free();
|
||||
int w = 0, h = 0;
|
||||
|
||||
//get the info
|
||||
SDL_QueryTexture(ptr, nullptr, nullptr, &w, &h);
|
||||
|
||||
//create a texture of (w, h) size (also sets the metadata)
|
||||
Create(renderer, w, h);
|
||||
|
||||
//copy the argument texture to the local texture
|
||||
SDL_SetRenderTarget(renderer, texture);
|
||||
SDL_RenderCopy(renderer, ptr, nullptr, nullptr);
|
||||
SDL_SetRenderTarget(renderer, nullptr);
|
||||
|
||||
//return the local texture
|
||||
return texture;
|
||||
}
|
||||
|
||||
SDL_Texture* Image::SetTexture(SDL_Texture* ptr) {
|
||||
Free();
|
||||
|
||||
texture = ptr;
|
||||
|
||||
//set the metadata
|
||||
clip.x = 0;
|
||||
clip.y = 0;
|
||||
if (SDL_QueryTexture(texture, nullptr, nullptr, &clip.w, &clip.h)) {
|
||||
std::ostringstream msg;
|
||||
msg << "Failed to record metadata for a newly set image";
|
||||
msg << "; " << SDL_GetError();
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
local = false;
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
SDL_Texture* Image::GetTexture() const {
|
||||
return texture;
|
||||
}
|
||||
|
||||
void Image::Free() {
|
||||
if (local) {
|
||||
SDL_DestroyTexture(texture);
|
||||
local = false;
|
||||
}
|
||||
texture = nullptr;
|
||||
clip = {0, 0, 0, 0};
|
||||
}
|
||||
|
||||
void Image::DrawTo(SDL_Renderer* const renderer, Sint16 x, Sint16 y, double scaleX, double scaleY) {
|
||||
if (!texture) {
|
||||
throw(std::logic_error("No image texture to draw"));
|
||||
}
|
||||
SDL_Rect sclip = clip;
|
||||
SDL_Rect dclip = {x, y, Uint16(clip.w * scaleX), Uint16(clip.h * scaleY)};
|
||||
SDL_RenderCopy(renderer, texture, &sclip, &dclip);
|
||||
}
|
||||
|
||||
void Image::SetAlpha(Uint8 a) {
|
||||
if (SDL_SetTextureAlphaMod(texture, a)) {
|
||||
std::ostringstream msg;
|
||||
msg << "Failed to set alpha; " << SDL_GetError();
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
}
|
||||
|
||||
Uint8 Image::GetAlpha() {
|
||||
Uint8 ret = 0;
|
||||
if (SDL_GetTextureAlphaMod(texture, &ret)) {
|
||||
std::ostringstream msg;
|
||||
msg << "Failed to get alpha; " << SDL_GetError();
|
||||
throw(std::runtime_error(msg.str()));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "SDL2/SDL.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
class Image {
|
||||
public:
|
||||
Image() = default;
|
||||
Image(Image const& rhs) { *this = rhs; }
|
||||
Image(Image&& rhs) { *this = std::move(rhs); }
|
||||
Image(SDL_Renderer* r, std::string fname) { Load(r, fname); }
|
||||
Image(SDL_Renderer* r, Uint16 w, Uint16 h) { Create(r, w, h); }
|
||||
Image(SDL_Texture* p) { SetTexture(p); }
|
||||
virtual ~Image() { Free(); }
|
||||
|
||||
Image& operator=(Image const&);
|
||||
Image& operator=(Image&&);
|
||||
|
||||
SDL_Texture* Load(SDL_Renderer* renderer, std::string fname);
|
||||
SDL_Texture* Create(SDL_Renderer* renderer, Uint16 w, Uint16 h, SDL_Color blank = {0, 0, 0, 255});
|
||||
SDL_Texture* CopyTexture(SDL_Renderer* renderer, SDL_Texture* ptr);
|
||||
SDL_Texture* SetTexture(SDL_Texture*);
|
||||
SDL_Texture* GetTexture() const;
|
||||
virtual void Free();
|
||||
|
||||
void DrawTo(SDL_Renderer* const, Sint16 x, Sint16 y, double scaleX = 1.0, double scaleY = 1.0);
|
||||
|
||||
void SetAlpha(Uint8 a);
|
||||
Uint8 GetAlpha();
|
||||
|
||||
//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; }
|
||||
|
||||
protected:
|
||||
SDL_Texture* texture = nullptr;
|
||||
SDL_Rect clip = {0, 0, 0, 0};
|
||||
bool local = false;
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
#config
|
||||
INCLUDES+=.
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
#source
|
||||
CXXSRC=$(wildcard *.cpp)
|
||||
|
||||
#objects
|
||||
OBJDIR=obj
|
||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||
|
||||
#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 $@ $<
|
||||
@@ -0,0 +1,186 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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 <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
SpriteSheet& SpriteSheet::operator=(SpriteSheet const& rhs) {
|
||||
//don't screw yourself
|
||||
if (this == &rhs) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
Free();
|
||||
|
||||
//Copy the other SpriteSheet's stuff
|
||||
texture = rhs.texture;
|
||||
clip = rhs.clip;
|
||||
local = false;
|
||||
countX = rhs.countX;
|
||||
countY = rhs.countY;
|
||||
indexX = rhs.indexX;
|
||||
indexY = rhs.indexY;
|
||||
delay = rhs.delay;
|
||||
tick = rhs.tick;
|
||||
}
|
||||
|
||||
SpriteSheet& SpriteSheet::operator=(SpriteSheet&& rhs) {
|
||||
//don't screw yourself
|
||||
if (this == &rhs) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
Free();
|
||||
|
||||
//Steal the other SpriteSheet's stuff
|
||||
texture = rhs.texture;
|
||||
clip = rhs.clip;
|
||||
local = rhs.local;
|
||||
countX = rhs.countX;
|
||||
countY = rhs.countY;
|
||||
indexX = rhs.indexX;
|
||||
indexY = rhs.indexY;
|
||||
delay = rhs.delay;
|
||||
tick = rhs.tick;
|
||||
|
||||
rhs.texture = nullptr;
|
||||
rhs.clip = {0, 0, 0, 0};
|
||||
rhs.local = false;
|
||||
rhs.countX = 0;
|
||||
rhs.countY = 0;
|
||||
rhs.indexX = 0;
|
||||
rhs.indexY = 0;
|
||||
rhs.delay = 0.0;
|
||||
rhs.tick = 0.0;
|
||||
}
|
||||
|
||||
void SpriteSheet::Update(double delta) {
|
||||
//if the delay has passed
|
||||
if (delay && (tick += delta) >= delay) {
|
||||
//if the index is out of bounds
|
||||
if (++indexX >= countX) {
|
||||
indexX = 0;
|
||||
}
|
||||
tick = 0;
|
||||
}
|
||||
//modify area drawn
|
||||
clip.x = indexX * clip.w;
|
||||
clip.y = indexY * clip.h;
|
||||
}
|
||||
|
||||
SDL_Texture* SpriteSheet::Load(SDL_Renderer* r, std::string fname, Uint16 cx, Uint16 cy) {
|
||||
//call the base function
|
||||
Image::Load(r, fname);
|
||||
|
||||
//set the metadata
|
||||
countX = cx;
|
||||
countY = cy;
|
||||
|
||||
//assume clip.x and clip.y were set to the size of the texture
|
||||
//reduce the w & h to the size of one cell
|
||||
clip.w = clip.w / countX;
|
||||
clip.h = clip.h / countY;
|
||||
|
||||
indexX = indexY = 0;
|
||||
delay = tick = 0.0;
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
SDL_Texture* SpriteSheet::Create(SDL_Renderer* r, Uint16 w, Uint16 h, Uint16 cx, Uint16 cy) {
|
||||
//call the base function
|
||||
Image::Create(r, w, h);
|
||||
|
||||
//set the metadata
|
||||
countX = cx;
|
||||
countY = cy;
|
||||
|
||||
//assume clip.x and clip.y were set to the size of the texture
|
||||
//reduce the w & h to the size of one cell
|
||||
clip.w = clip.w / countX;
|
||||
clip.h = clip.h / countY;
|
||||
|
||||
indexX = indexY = 0;
|
||||
delay = tick = 0.0;
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
SDL_Texture* SpriteSheet::SetTexture(SDL_Texture* ptr, Uint16 cx, Uint16 cy) {
|
||||
//call the base function
|
||||
Image::SetTexture(ptr);
|
||||
|
||||
//set the metadata
|
||||
countX = cx;
|
||||
countY = cy;
|
||||
|
||||
//assume clip.x and clip.y were set to the size of the texture
|
||||
//reduce the w & h to the size of one cell
|
||||
clip.w = clip.w / countX;
|
||||
clip.h = clip.h / countY;
|
||||
|
||||
indexX = indexY = 0;
|
||||
delay = tick = 0.0;
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
void SpriteSheet::Free() {
|
||||
Image::Free();
|
||||
countX = countY = 0;
|
||||
indexX = indexY = 0;
|
||||
delay = tick = 0.0;
|
||||
}
|
||||
|
||||
Uint16 SpriteSheet::SetCountX(Uint16 i) {
|
||||
indexX = 0;
|
||||
return countX = i;
|
||||
}
|
||||
|
||||
Uint16 SpriteSheet::SetCountY(Uint16 i) {
|
||||
indexY = 0;
|
||||
return countY = i;
|
||||
}
|
||||
|
||||
Uint16 SpriteSheet::SetIndexX(Uint16 i) {
|
||||
if (i > countX) {
|
||||
std::ostringstream msg;
|
||||
msg << "Cannot set index 'x' to " << i;
|
||||
throw(std::out_of_range(msg.str()));
|
||||
}
|
||||
return indexX = i;
|
||||
}
|
||||
|
||||
Uint16 SpriteSheet::SetIndexY(Uint16 i) {
|
||||
if (i > countY) {
|
||||
std::ostringstream msg;
|
||||
msg << "Cannot set index 'y' to " << i;
|
||||
throw(std::invalid_argument(msg.str()));
|
||||
}
|
||||
return indexY = i;
|
||||
}
|
||||
|
||||
double SpriteSheet::SetDelay(double d) {
|
||||
tick = 0;
|
||||
return delay = d;
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "image.hpp"
|
||||
|
||||
class SpriteSheet : public Image {
|
||||
public:
|
||||
SpriteSheet() = default;
|
||||
SpriteSheet(SpriteSheet const& rhs) { *this = rhs; }
|
||||
SpriteSheet(SpriteSheet&& rhs) { *this = std::move(rhs); }
|
||||
SpriteSheet(SDL_Renderer* r, std::string fname, Uint16 cx, Uint16 cy)
|
||||
{ Load(r, fname, cx, cy); }
|
||||
SpriteSheet(SDL_Renderer* r, Uint16 w, Uint16 h, Uint16 cx, Uint16 cy)
|
||||
{ Create(r, w, h, cx, cy); }
|
||||
SpriteSheet(SDL_Texture* p, Uint16 cx, Uint16 cy)
|
||||
{ SetTexture(p, cx, cy); }
|
||||
~SpriteSheet() = default;
|
||||
|
||||
SpriteSheet& operator=(SpriteSheet const&);
|
||||
SpriteSheet& operator=(SpriteSheet&&);
|
||||
|
||||
void Update(double delta);
|
||||
|
||||
SDL_Texture* Load(SDL_Renderer*, std::string fname, Uint16 cx, Uint16 cy);
|
||||
SDL_Texture* Create(SDL_Renderer*, Uint16 w, Uint16 h, Uint16 cx, Uint16 cy);
|
||||
SDL_Texture* SetTexture(SDL_Texture*, Uint16 cx, Uint16 cy);
|
||||
void Free() override;
|
||||
|
||||
Uint16 SetCountX(Uint16);
|
||||
Uint16 SetCountY(Uint16);
|
||||
Uint16 SetIndexX(Uint16);
|
||||
Uint16 SetIndexY(Uint16);
|
||||
|
||||
Uint16 GetCountX() const { return countX; }
|
||||
Uint16 GetCountY() const { return countY; }
|
||||
Uint16 GetIndexX() const { return indexX; }
|
||||
Uint16 GetIndexY() const { return indexY; }
|
||||
|
||||
double SetDelay(double d);
|
||||
double GetDelay() const { return delay; }
|
||||
|
||||
private:
|
||||
Uint16 countX = 0, countY = 0, indexX = 0, indexY = 0;
|
||||
double delay = 0.0, tick = 0.0;
|
||||
|
||||
//disable access
|
||||
using Image::Load;
|
||||
using Image::Create;
|
||||
using Image::SetTexture;
|
||||
};
|
||||
@@ -0,0 +1,56 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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_box.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
TextBox::TextBox() {
|
||||
//
|
||||
}
|
||||
|
||||
TextBox::~TextBox() {
|
||||
//
|
||||
}
|
||||
|
||||
void TextBox::DrawTo(SDL_Renderer* renderer, int posX, int posY, int pointSize) {
|
||||
for (std::list<TextLine>::iterator it = lineList.begin(); it != lineList.end(); it++) {
|
||||
it->DrawTo(renderer, posX, posY);
|
||||
posY += pointSize;
|
||||
}
|
||||
}
|
||||
|
||||
void TextBox::PushLine(SDL_Renderer* renderer, TTF_Font* font, std::string str, SDL_Color color) {
|
||||
lineList.emplace_front(renderer, font, str, color);
|
||||
}
|
||||
|
||||
void TextBox::PopLine(int num) {
|
||||
//prevent underflow
|
||||
num < lineList.size() ? num : lineList.size();
|
||||
|
||||
for (int i = 0; i < num; ++i) {
|
||||
lineList.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
void TextBox::ClearLines() {
|
||||
lineList.clear();
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "text_line.hpp"
|
||||
|
||||
#include "SDL2/SDL.h"
|
||||
#include "SDL2/SDL_ttf.h"
|
||||
|
||||
#include <string>
|
||||
#include <list>
|
||||
|
||||
class TextBox {
|
||||
public:
|
||||
TextBox();
|
||||
~TextBox();
|
||||
|
||||
void DrawTo(SDL_Renderer*, int posX, int posY, int pointSize);
|
||||
|
||||
void PushLine(SDL_Renderer*, TTF_Font*, std::string, SDL_Color color);
|
||||
void PopLine(int num = 1);
|
||||
void ClearLines();
|
||||
|
||||
private:
|
||||
std::list<TextLine> lineList;
|
||||
};
|
||||
@@ -0,0 +1,70 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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_line.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
SDL_Texture* renderTextTexture(SDL_Renderer* renderer, TTF_Font* font, std::string str, SDL_Color color) {
|
||||
//make the surface (from SDL_ttf)
|
||||
SDL_Surface* surface = TTF_RenderText_Solid(font, str.c_str(), color);
|
||||
if (!surface) {
|
||||
throw(std::runtime_error("Failed to create a TTF surface"));
|
||||
}
|
||||
|
||||
//convert to texture
|
||||
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
|
||||
|
||||
//cleanup
|
||||
SDL_FreeSurface(surface);
|
||||
|
||||
//check
|
||||
if (!texture) {
|
||||
throw(std::runtime_error("Failed to create a TTF texture"));
|
||||
}
|
||||
|
||||
//NOTE: free the texture yourself
|
||||
return texture;
|
||||
}
|
||||
|
||||
TextLine::TextLine() {
|
||||
//
|
||||
}
|
||||
|
||||
TextLine::~TextLine() {
|
||||
ClearText();
|
||||
}
|
||||
|
||||
void TextLine::DrawTo(SDL_Renderer* renderer, int posX, int posY) {
|
||||
SDL_Rect dclip = {posX, posY, 0, 0};
|
||||
SDL_QueryTexture(texture, nullptr, nullptr, &dclip.w, &dclip.h);
|
||||
SDL_RenderCopy(renderer, texture, nullptr, &dclip);
|
||||
}
|
||||
|
||||
void TextLine::SetText(SDL_Renderer* renderer, TTF_Font* font, std::string str, SDL_Color color) {
|
||||
//just use the above global function
|
||||
SDL_DestroyTexture(texture);
|
||||
texture = renderTextTexture(renderer, font, str, color);
|
||||
}
|
||||
|
||||
void TextLine::ClearText() {
|
||||
SDL_DestroyTexture(texture);
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "SDL2/SDL.h"
|
||||
#include "SDL2/SDL_ttf.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
SDL_Texture* renderTextTexture(SDL_Renderer*, TTF_Font*, std::string, SDL_Color color);
|
||||
|
||||
class TextLine {
|
||||
public:
|
||||
TextLine();
|
||||
TextLine(SDL_Renderer* r, TTF_Font* f, std::string s, SDL_Color c)
|
||||
{ SetText(r, f, s, c); }
|
||||
virtual ~TextLine();
|
||||
|
||||
void DrawTo(SDL_Renderer*, int posX, int posY);
|
||||
|
||||
void SetText(SDL_Renderer*, TTF_Font*, std::string, SDL_Color color);
|
||||
void ClearText();
|
||||
|
||||
protected:
|
||||
SDL_Texture* texture = nullptr;
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
#output
|
||||
export OUTDIR=..
|
||||
export OUT=$(addprefix $(OUTDIR)/,libcommon.a)
|
||||
|
||||
all: $(OUTDIR)
|
||||
$(MAKE) -C debugging
|
||||
$(MAKE) -C gameplay
|
||||
$(MAKE) -C graphics
|
||||
$(MAKE) -C map
|
||||
$(MAKE) -C network
|
||||
$(MAKE) -C utilities
|
||||
|
||||
debug: export CXXFLAGS+=-g
|
||||
debug: clean all
|
||||
|
||||
$(OUTDIR):
|
||||
mkdir $(OUTDIR)
|
||||
|
||||
clean:
|
||||
ifeq ($(OS),Windows_NT)
|
||||
$(RM) *.o *.a *.exe
|
||||
else ifeq ($(shell uname), Linux)
|
||||
find . -type f -name *.o -exec rm -f -r -v {} \;
|
||||
find . -type f -name *.a -exec rm -f -r -v {} \;
|
||||
rm -f -v out/client out/server
|
||||
endif
|
||||
|
||||
rebuild: clean all
|
||||
@@ -0,0 +1,28 @@
|
||||
#config
|
||||
INCLUDES+=. ../graphics
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
#source
|
||||
CXXSRC=$(wildcard *.cpp)
|
||||
|
||||
#objects
|
||||
OBJDIR=obj
|
||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||
|
||||
#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 $@ $<
|
||||
@@ -0,0 +1,82 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "region.hpp"
|
||||
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <stdexcept>
|
||||
|
||||
int snapToBase(int base, int x) {
|
||||
return floor((double)x / base) * base;
|
||||
}
|
||||
|
||||
Region::Region(int argX, int argY): x(argX), y(argY) {
|
||||
if (x != snapToBase(REGION_WIDTH, x) || y != snapToBase(REGION_HEIGHT, y)) {
|
||||
throw(std::invalid_argument("Region location is off grid"));
|
||||
}
|
||||
memset(tiles, 0, REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH*sizeof(type_t));
|
||||
}
|
||||
|
||||
Region::Region(Region const& rhs): x(rhs.x), y(rhs.y) {
|
||||
memcpy(tiles, rhs.tiles, REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH*sizeof(type_t));
|
||||
solid = rhs.solid;
|
||||
}
|
||||
|
||||
Region::type_t Region::SetTile(int x, int y, int z, type_t v) {
|
||||
if (x < 0 || y < 0 || z < 0 || x >= REGION_WIDTH || y >= REGION_HEIGHT || z >= REGION_DEPTH) {
|
||||
throw(std::out_of_range("Region::SetTile() argument out of range"));
|
||||
}
|
||||
return tiles[x][y][z] = v;
|
||||
}
|
||||
|
||||
Region::type_t Region::GetTile(int x, int y, int z) const {
|
||||
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) const {
|
||||
if (x < 0 || y < 0 || x >= REGION_WIDTH || y >= REGION_HEIGHT) {
|
||||
throw(std::out_of_range("Region::GetSolid() argument out of range"));
|
||||
}
|
||||
return solid[x * REGION_WIDTH + y];
|
||||
}
|
||||
|
||||
int Region::GetX() const {
|
||||
return x;
|
||||
}
|
||||
|
||||
int Region::GetY() const {
|
||||
return y;
|
||||
}
|
||||
|
||||
std::bitset<REGION_WIDTH*REGION_HEIGHT>* Region::GetSolidBitset() {
|
||||
return &solid;
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <bitset>
|
||||
|
||||
//the region's storage format
|
||||
constexpr int REGION_WIDTH = 20;
|
||||
constexpr int REGION_HEIGHT = 20;
|
||||
constexpr int REGION_DEPTH = 3;
|
||||
|
||||
//utility function
|
||||
int snapToBase(int base, int x);
|
||||
|
||||
class Region {
|
||||
public:
|
||||
typedef unsigned char type_t;
|
||||
|
||||
Region() = delete;
|
||||
Region(int x, int y);
|
||||
Region(Region const&);
|
||||
~Region() = default;
|
||||
|
||||
type_t SetTile(int x, int y, int z, type_t v);
|
||||
type_t GetTile(int x, int y, int z) const;
|
||||
|
||||
bool SetSolid(int x, int y, bool b);
|
||||
bool GetSolid(int x, int y) const;
|
||||
|
||||
//accessors
|
||||
int GetX() const;
|
||||
int GetY() const;
|
||||
|
||||
std::bitset<REGION_WIDTH*REGION_HEIGHT>* GetSolidBitset();
|
||||
private:
|
||||
friend class TileSheet;
|
||||
|
||||
const int x;
|
||||
const int y;
|
||||
|
||||
type_t tiles[REGION_WIDTH][REGION_HEIGHT][REGION_DEPTH];
|
||||
std::bitset<REGION_WIDTH*REGION_HEIGHT> solid;
|
||||
};
|
||||
@@ -0,0 +1,99 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "region_api.hpp"
|
||||
|
||||
#include "region.hpp"
|
||||
|
||||
static int setTile(lua_State* L) {
|
||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||
int ret = region->SetTile(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_tointeger(L, 4)-1, lua_tointeger(L, 5));
|
||||
lua_pushinteger(L, ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getTile(lua_State* L) {
|
||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||
int ret = region->GetTile(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_tointeger(L, 4)-1);
|
||||
lua_pushinteger(L, ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int setSolid(lua_State* L) {
|
||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||
bool ret = region->SetSolid(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_toboolean(L, 4));
|
||||
lua_pushboolean(L, ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getSolid(lua_State* L) {
|
||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||
bool ret = region->GetSolid(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1);
|
||||
lua_pushboolean(L, ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getX(lua_State* L) {
|
||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||
lua_pushinteger(L, region->GetX());
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getY(lua_State* L) {
|
||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||
lua_pushinteger(L, region->GetY());
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getWidth(lua_State* L) {
|
||||
lua_pushinteger(L, REGION_WIDTH);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getHeight(lua_State* L) {
|
||||
lua_pushinteger(L, REGION_HEIGHT);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getDepth(lua_State* L) {
|
||||
lua_pushinteger(L, REGION_DEPTH);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const luaL_Reg regionLib[] = {
|
||||
{"SetTile",setTile},
|
||||
{"GetTile",getTile},
|
||||
{"SetSolid",setSolid},
|
||||
{"GetSolid",getSolid},
|
||||
{"GetX",getX},
|
||||
{"GetY",getY},
|
||||
|
||||
//the global macros
|
||||
{"GetWidth",getWidth},
|
||||
{"GetHeight",getHeight},
|
||||
{"GetDepth",getDepth},
|
||||
{nullptr, nullptr}
|
||||
};
|
||||
|
||||
LUAMOD_API int openRegionAPI(lua_State* L) {
|
||||
luaL_newlib(L, regionLib);
|
||||
return 1;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -23,5 +23,5 @@
|
||||
|
||||
#include "lua.hpp"
|
||||
|
||||
#define TORTUGA_MONSTER_API "monster"
|
||||
LUAMOD_API int openMonsterAPI(lua_State* L);
|
||||
#define TORTUGA_REGION_API "region"
|
||||
LUAMOD_API int openRegionAPI(lua_State* L);
|
||||
@@ -0,0 +1,172 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "region_pager_api.hpp"
|
||||
|
||||
#include "region_pager_lua.hpp"
|
||||
#include "region.hpp"
|
||||
|
||||
//DOCS: These glue functions simply wrap RegionPagerLua's methods
|
||||
//NOTE: zero indexing is used here, but not in the region API
|
||||
|
||||
static int setTile(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
int ret = pager->SetTile(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5));
|
||||
lua_pushinteger(L, ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getTile(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
int ret = pager->GetTile(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4));
|
||||
lua_pushinteger(L, ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int setSolid(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
bool ret = pager->SetSolid(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_toboolean(L, 4));
|
||||
lua_pushboolean(L, ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getSolid(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
bool ret = pager->GetSolid(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||
lua_pushboolean(L, ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getRegion(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||
lua_pushlightuserdata(L, region);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int loadRegion(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
Region* region = pager->LoadRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||
lua_pushlightuserdata(L, region);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int saveRegion(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
Region* region = pager->SaveRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||
lua_pushlightuserdata(L, region);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int createRegion(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
Region* region = pager->CreateRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||
lua_pushlightuserdata(L, region);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int unloadRegion(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
|
||||
//two argument types: coords & the region itself
|
||||
switch(lua_type(L, 2)) {
|
||||
case LUA_TNUMBER:
|
||||
pager->UnloadIf([&](Region const& region) -> bool {
|
||||
int x = lua_tointeger(L, 2);
|
||||
int y = lua_tointeger(L, 3);
|
||||
return region.GetX() == x && region.GetY() == y;
|
||||
});
|
||||
break;
|
||||
case LUA_TLIGHTUSERDATA:
|
||||
pager->UnloadIf([&](Region const& region) -> bool {
|
||||
return (®ion) == lua_touserdata(L, 2);
|
||||
});
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setOnLoad(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetLoadReference());
|
||||
pager->SetLoadReference(luaL_ref(L, LUA_REGISTRYINDEX));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setOnSave(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetSaveReference());
|
||||
pager->SetSaveReference(luaL_ref(L, LUA_REGISTRYINDEX));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setOnCreate(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetCreateReference());
|
||||
pager->SetCreateReference(luaL_ref(L, LUA_REGISTRYINDEX));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setOnUnload(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetUnloadReference());
|
||||
pager->SetUnloadReference(luaL_ref(L, LUA_REGISTRYINDEX));
|
||||
return 0;
|
||||
}
|
||||
|
||||
//debugging
|
||||
static int containerSize(lua_State* L) {
|
||||
RegionPagerLua* pager = static_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
lua_pushinteger(L, pager->GetContainer()->size());
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const luaL_Reg regionPagerLib[] = {
|
||||
//curry
|
||||
{"SetTile", setTile},
|
||||
{"GetTile", getTile},
|
||||
{"SetSolid", setSolid},
|
||||
{"GetSolid", getSolid},
|
||||
|
||||
//access and control
|
||||
{"GetRegion", getRegion},
|
||||
{"LoadRegion", loadRegion},
|
||||
{"SaveRegion", saveRegion},
|
||||
{"CreateRegion", createRegion},
|
||||
{"UnloadRegion", unloadRegion},
|
||||
|
||||
//triggers
|
||||
{"SetOnLoad",setOnLoad},
|
||||
{"SetOnSave",setOnSave},
|
||||
{"SetOnCreate",setOnCreate},
|
||||
{"SetOnUnload",setOnUnload},
|
||||
|
||||
//debugging
|
||||
{"ContainerSize", containerSize},
|
||||
|
||||
//sentinel
|
||||
{nullptr, nullptr}
|
||||
};
|
||||
|
||||
LUAMOD_API int openRegionPagerAPI(lua_State* L) {
|
||||
luaL_newlib(L, regionPagerLib);
|
||||
return 1;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -23,5 +23,5 @@
|
||||
|
||||
#include "lua.hpp"
|
||||
|
||||
#define TORTUGA_MONSTER_MANAGER_API "monster_manager"
|
||||
LUAMOD_API int openMonsterManagerAPI(lua_State* L);
|
||||
#define TORTUGA_REGION_PAGER_API "region_pager"
|
||||
LUAMOD_API int openRegionPagerAPI(lua_State* L);
|
||||
@@ -0,0 +1,106 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "region_pager_base.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
#include <algorithm>
|
||||
|
||||
RegionPagerBase::~RegionPagerBase() {
|
||||
UnloadAll();
|
||||
};
|
||||
|
||||
Region::type_t RegionPagerBase::SetTile(int x, int y, int z, Region::type_t v) {
|
||||
Region* ptr = GetRegion(x, y);
|
||||
return ptr->SetTile(x - ptr->GetX(), y - ptr->GetY(), z, v);
|
||||
}
|
||||
|
||||
//Bug Origin?
|
||||
Region::type_t RegionPagerBase::GetTile(int x, int y, int z) {
|
||||
Region* ptr = GetRegion(x, y);
|
||||
return ptr->GetTile(x - ptr->GetX(), y - ptr->GetY(), z);
|
||||
}
|
||||
|
||||
bool RegionPagerBase::SetSolid(int x, int y, int b) {
|
||||
Region* ptr = GetRegion(x, y);
|
||||
return ptr->SetSolid(x - ptr->GetX(), y - ptr->GetY(), b);
|
||||
}
|
||||
|
||||
bool RegionPagerBase::GetSolid(int x, int y) {
|
||||
Region* ptr = GetRegion(x, y);
|
||||
return ptr->GetSolid(x - ptr->GetX(), y - ptr->GetY());
|
||||
}
|
||||
|
||||
Region* RegionPagerBase::GetRegion(int x, int y) {
|
||||
x = snapToBase(REGION_WIDTH, x);
|
||||
y = snapToBase(REGION_HEIGHT, y);
|
||||
|
||||
//get the region by various means
|
||||
Region* ptr = nullptr;
|
||||
ptr = FindRegion(x, y);
|
||||
if (ptr) return ptr;
|
||||
ptr = LoadRegion(x, y);
|
||||
if (ptr) return ptr;
|
||||
return CreateRegion(x, y);
|
||||
}
|
||||
|
||||
Region* RegionPagerBase::FindRegion(int x, int y) {
|
||||
//find the region
|
||||
std::list<Region>::iterator it = find_if(regionList.begin(), regionList.end(), [x, y](Region& region) -> bool {
|
||||
return region.GetX() == x && region.GetY() == y;
|
||||
});
|
||||
return it != regionList.end() ? &(*it) : nullptr;
|
||||
}
|
||||
|
||||
Region* RegionPagerBase::PushRegion(Region* const ptr) {
|
||||
regionList.push_front(*ptr);
|
||||
return ®ionList.front();
|
||||
}
|
||||
|
||||
Region* RegionPagerBase::LoadRegion(int x, int y) {
|
||||
//EMPTY, intended for override
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Region* RegionPagerBase::SaveRegion(int x, int y) {
|
||||
//EMPTY, intended for override
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Region* RegionPagerBase::CreateRegion(int x, int y) {
|
||||
if (FindRegion(x, y)) {
|
||||
throw(std::logic_error("Cannot overwrite an existing region"));
|
||||
}
|
||||
regionList.emplace_front(x, y);
|
||||
return ®ionList.front();
|
||||
}
|
||||
|
||||
void RegionPagerBase::UnloadIf(std::function<bool(Region const&)> fn) {
|
||||
regionList.remove_if(fn);
|
||||
}
|
||||
|
||||
void RegionPagerBase::UnloadAll() {
|
||||
regionList.clear();
|
||||
}
|
||||
|
||||
std::list<Region>* RegionPagerBase::GetContainer() {
|
||||
return ®ionList;
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "region.hpp"
|
||||
|
||||
#include <functional>
|
||||
#include <list>
|
||||
|
||||
class RegionPagerBase {
|
||||
public:
|
||||
RegionPagerBase() = default;
|
||||
virtual ~RegionPagerBase();
|
||||
|
||||
//tile manipulation
|
||||
virtual Region::type_t SetTile(int x, int y, int z, Region::type_t v);
|
||||
virtual Region::type_t GetTile(int x, int y, int z);
|
||||
|
||||
//solid manipulation
|
||||
virtual bool SetSolid(int x, int y, int b);
|
||||
virtual bool GetSolid(int x, int y);
|
||||
|
||||
//region manipulation
|
||||
virtual Region* GetRegion(int x, int y);
|
||||
virtual Region* FindRegion(int x, int y);
|
||||
virtual Region* PushRegion(Region* const);
|
||||
|
||||
virtual Region* LoadRegion(int x, int y);
|
||||
virtual Region* SaveRegion(int x, int y);
|
||||
virtual Region* CreateRegion(int x, int y);
|
||||
|
||||
virtual void UnloadIf(std::function<bool(Region const&)> fn);
|
||||
virtual void UnloadAll();
|
||||
|
||||
//accessors & mutators
|
||||
std::list<Region>* GetContainer();
|
||||
protected:
|
||||
std::list<Region> regionList;
|
||||
};
|
||||
@@ -0,0 +1,208 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "region_pager_lua.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
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);
|
||||
//signal that there is no load function
|
||||
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_isboolean(lua, -1) && lua_toboolean(lua, -1)) {
|
||||
lua_pop(lua, 1);
|
||||
//push and return the loaded region
|
||||
regionList.push_front(tmpRegion);
|
||||
return ®ionList.front();
|
||||
}
|
||||
else {
|
||||
lua_pop(lua, 1);
|
||||
//signal a failure
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
//NOTE: this return value seems strange; could replace it with a boolean
|
||||
//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);
|
||||
//signal that the region wasn't saved
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//find the specified region
|
||||
Region* ptr = FindRegion(x, y);
|
||||
if (!ptr) {
|
||||
lua_pop(lua, 1);
|
||||
//signal that there is no save function
|
||||
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_isboolean(lua, -1) && lua_toboolean(lua, -1)) {
|
||||
lua_pop(lua, 1);
|
||||
//return the specified region that was saved
|
||||
return ptr;
|
||||
}
|
||||
else {
|
||||
lua_pop(lua, 1);
|
||||
//signal a failure
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
//DOCS: since this method is the last ditch call from GetRegion, it must return a valid region object, even if the create function hasn't been set.
|
||||
//return a new region, throwing an error 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 an empty region object
|
||||
regionList.emplace_front(x, y);
|
||||
return ®ionList.front();
|
||||
}
|
||||
|
||||
//something to work on
|
||||
Region tmpRegion(x, y);
|
||||
lua_pushlightuserdata(lua, &tmpRegion);
|
||||
|
||||
//call the function, 1 arg, 0 return
|
||||
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
|
||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
|
||||
}
|
||||
|
||||
//return the new region
|
||||
regionList.push_front(tmpRegion);
|
||||
return ®ionList.front();
|
||||
}
|
||||
|
||||
//no return
|
||||
void RegionPagerLua::UnloadIf(std::function<bool(Region const&)> fn) {
|
||||
//get the pager's function from the registry
|
||||
lua_rawgeti(lua, LUA_REGISTRYINDEX, unloadRef);
|
||||
|
||||
//check if this function is available
|
||||
if (lua_isnil(lua, -1)) {
|
||||
lua_pop(lua, 1);
|
||||
//remove the regions anyway
|
||||
regionList.remove_if(fn);
|
||||
return;
|
||||
}
|
||||
|
||||
//run each region through this lambda
|
||||
regionList.remove_if([&](Region& region) -> bool {
|
||||
if (fn(region)) {
|
||||
|
||||
//push a copy of the function onto the stack with the region
|
||||
lua_pushvalue(lua, -1);
|
||||
lua_pushlightuserdata(lua, static_cast<void*>(®ion));
|
||||
|
||||
//call the function, 1 arg, 0 return
|
||||
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
|
||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
|
||||
}
|
||||
|
||||
//signal to the container
|
||||
return true;
|
||||
}
|
||||
//signal to the container
|
||||
return false;
|
||||
});
|
||||
|
||||
//pop the base copy of the function
|
||||
lua_pop(lua, 1);
|
||||
}
|
||||
|
||||
void RegionPagerLua::UnloadAll() {
|
||||
//get the pager's function from the registry
|
||||
lua_rawgeti(lua, LUA_REGISTRYINDEX, unloadRef);
|
||||
|
||||
//check if this function is available
|
||||
if (lua_isnil(lua, -1)) {
|
||||
lua_pop(lua, 1);
|
||||
//remove the regions anyway
|
||||
regionList.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto& it : regionList) {
|
||||
//push a copy of the function onto the stack with the region
|
||||
lua_pushvalue(lua, -1);
|
||||
lua_pushlightuserdata(lua, &it);
|
||||
|
||||
//call the function, 1 arg, 0 return
|
||||
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
|
||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
|
||||
}
|
||||
}
|
||||
|
||||
//pop the base copy of the function
|
||||
lua_pop(lua, 1);
|
||||
|
||||
//remove from memory
|
||||
regionList.clear();
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "region_pager_base.hpp"
|
||||
|
||||
#include "lua.hpp"
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
|
||||
//DOCS: set the lua hook before use
|
||||
|
||||
class RegionPagerLua : public RegionPagerBase {
|
||||
public:
|
||||
RegionPagerLua() = default;
|
||||
~RegionPagerLua();
|
||||
|
||||
//region manipulation
|
||||
Region* LoadRegion(int x, int y) override;
|
||||
Region* SaveRegion(int x, int y) override;
|
||||
Region* CreateRegion(int x, int y) override;
|
||||
|
||||
void UnloadIf(std::function<bool(Region const&)> fn) override;
|
||||
void UnloadAll() override;
|
||||
|
||||
//accessors & mutators
|
||||
lua_State* SetLuaState(lua_State* L) { return lua = L; }
|
||||
lua_State* GetLuaState() { return lua; }
|
||||
|
||||
//utilities for the API
|
||||
int SetLoadReference(int i) { return loadRef = i; }
|
||||
int SetSaveReference(int i) { return saveRef = i; }
|
||||
int SetCreateReference(int i) { return createRef = i; }
|
||||
int SetUnloadReference(int i) { return unloadRef = i; }
|
||||
|
||||
int GetLoadReference() { return loadRef; }
|
||||
int GetSaveReference() { return saveRef; }
|
||||
int GetCreateReference() { return createRef; }
|
||||
int GetUnloadReference() { return unloadRef; }
|
||||
|
||||
protected:
|
||||
lua_State* lua = nullptr;
|
||||
|
||||
int loadRef = LUA_NOREF;
|
||||
int saveRef = LUA_NOREF;
|
||||
int createRef = LUA_NOREF;
|
||||
int unloadRef = LUA_NOREF;
|
||||
};
|
||||
@@ -0,0 +1,124 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
TileSheet& TileSheet::operator=(TileSheet const& rhs) {
|
||||
//don't screw yourself
|
||||
if (this == &rhs) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
Free();
|
||||
|
||||
//Copy the other TileSheet's stuff
|
||||
texture = rhs.texture;
|
||||
clip = rhs.clip;
|
||||
local = false;
|
||||
countX = rhs.countX;
|
||||
countY = rhs.countY;
|
||||
}
|
||||
|
||||
TileSheet& TileSheet::operator=(TileSheet&& rhs) {
|
||||
//don't screw yourself
|
||||
if (this == &rhs) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
Free();
|
||||
|
||||
//Copy the other TileSheet's stuff
|
||||
texture = rhs.texture;
|
||||
clip = rhs.clip;
|
||||
local = false;
|
||||
countX = rhs.countX;
|
||||
countY = rhs.countY;
|
||||
|
||||
rhs.texture = nullptr;
|
||||
rhs.clip = {0, 0, 0, 0};
|
||||
rhs.local = false;
|
||||
rhs.countX = 0;
|
||||
rhs.countY = 0;
|
||||
}
|
||||
|
||||
void TileSheet::Load(SDL_Renderer* renderer, std::string fname, int tileWidth, int tileHeight) {
|
||||
Image::Load(renderer, fname);
|
||||
countX = clip.w / tileWidth;
|
||||
countY = clip.h / tileHeight;
|
||||
clip.w = tileWidth;
|
||||
clip.h = tileHeight;
|
||||
}
|
||||
|
||||
SDL_Texture* TileSheet::SetTexture(SDL_Texture* ptr, int tileWidth, int tileHeight) {
|
||||
Image::SetTexture(ptr);
|
||||
countX = clip.w / tileWidth;
|
||||
countY = clip.h / tileHeight;
|
||||
clip.w = tileWidth;
|
||||
clip.h = tileHeight;
|
||||
}
|
||||
|
||||
void TileSheet::Free() {
|
||||
Image::Free();
|
||||
countX = countY = 0;
|
||||
}
|
||||
|
||||
void TileSheet::DrawLayerTo(SDL_Renderer* const renderer, Region* const region, int layer, int camX, int camY, double scaleX, double scaleY) {
|
||||
//TODO: (2) empty
|
||||
}
|
||||
|
||||
void TileSheet::DrawRegionTo(SDL_Renderer* const renderer, Region* const region, int camX, int camY, double scaleX, double scaleY) {
|
||||
//NOTE: TileSheet is a friend class of Region
|
||||
//reimplementing DrawTo() to improve performance (less indirection)
|
||||
if (!texture) {
|
||||
throw(std::logic_error("No image texture to draw"));
|
||||
}
|
||||
|
||||
//the local variables
|
||||
SDL_Rect sclip = {0, 0, clip.w, clip.h};
|
||||
SDL_Rect dclip = {0, 0, Uint16(clip.w * scaleX), Uint16(clip.h * scaleY)};
|
||||
Region::type_t tile = 0;
|
||||
|
||||
//for each tile
|
||||
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) {
|
||||
//get the value to skip expensive lookups
|
||||
tile = region->tiles[i][j][k];
|
||||
|
||||
//0 is invisible
|
||||
if (tile == 0) continue;
|
||||
|
||||
//set the sclip
|
||||
sclip.x = (tile-1) % countX * clip.h;
|
||||
sclip.y = (tile-1) / countX * clip.w;
|
||||
|
||||
//set the dclip
|
||||
dclip.x = ((region->x + i) * clip.w - camX) * scaleX;
|
||||
dclip.y = ((region->y + j) * clip.h - camY) * scaleY;
|
||||
|
||||
//draw
|
||||
SDL_RenderCopy(renderer, texture, &sclip, &dclip);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "region.hpp"
|
||||
|
||||
#include "image.hpp"
|
||||
|
||||
#include <string>
|
||||
|
||||
class TileSheet : public Image {
|
||||
public:
|
||||
TileSheet() = default;
|
||||
TileSheet(TileSheet const& rhs) { *this = rhs; }
|
||||
TileSheet(TileSheet&& rhs) { *this = std::move(rhs); }
|
||||
TileSheet(SDL_Renderer* r, std::string fn, int tw, int th) { Load(r, fn, tw, th); }
|
||||
TileSheet(SDL_Texture* p, int tw, int th) { SetTexture(p, tw, th); }
|
||||
~TileSheet() = default;
|
||||
|
||||
TileSheet& operator=(TileSheet const&);
|
||||
TileSheet& operator=(TileSheet&&);
|
||||
|
||||
void Load(SDL_Renderer*, std::string fname, int tileWidth, int tileHeight);
|
||||
SDL_Texture* SetTexture(SDL_Texture*, int tileWidth, int tileHeight);
|
||||
void Free() override;
|
||||
|
||||
void DrawLayerTo(SDL_Renderer* const renderer, Region* const region, int layer, int camX, int camY, double scaleX = 1.0, double scaleY = 1.0);
|
||||
void DrawRegionTo(SDL_Renderer* const renderer, Region* const region, int camX, int camY, double scaleX = 1.0, double scaleY = 1.0);
|
||||
|
||||
//accessors
|
||||
//DOCS: Reuse Image::clip for tile sizes
|
||||
int GetCountX() { return countX; }
|
||||
int GetCountY() { return countY; }
|
||||
int GetTileW() { return clip.w; }
|
||||
int GetTileH() { return clip.h; }
|
||||
|
||||
protected:
|
||||
int countX = 0, countY = 0;
|
||||
|
||||
using Image::Load;
|
||||
using Image::Create;
|
||||
using Image::SetTexture;
|
||||
using Image::SetClip;
|
||||
using Image::SetClipX;
|
||||
using Image::SetClipY;
|
||||
using Image::SetClipW;
|
||||
using Image::SetClipH;
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
#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))
|
||||
|
||||
#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 $@ $<
|
||||
@@ -0,0 +1,72 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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 "barrier_packet.hpp"
|
||||
|
||||
#include "serial_utility.hpp"
|
||||
|
||||
void serializeBarrier(void* buffer, BarrierPacket* packet) {
|
||||
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
||||
|
||||
//identify the barrier
|
||||
serialCopy(&buffer, &packet->barrierIndex, sizeof(int));
|
||||
|
||||
//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));
|
||||
|
||||
//graphical data
|
||||
serialCopy(&buffer, packet->status, sizeof(int) * 8);
|
||||
}
|
||||
|
||||
void deserializeBarrier(void* buffer, BarrierPacket* packet) {
|
||||
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
||||
|
||||
//identify the barrier
|
||||
deserialCopy(&buffer, &packet->barrierIndex, sizeof(int));
|
||||
|
||||
//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));
|
||||
|
||||
//graphical data
|
||||
deserialCopy(&buffer, packet->status, sizeof(int) * 8);
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "serial_packet_base.hpp"
|
||||
|
||||
#include "bounding_box.hpp"
|
||||
#include "vector2.hpp"
|
||||
|
||||
struct BarrierPacket : SerialPacketBase {
|
||||
//identify the barrier
|
||||
int barrierIndex;
|
||||
BoundingBox bounds;
|
||||
|
||||
//location
|
||||
int roomIndex;
|
||||
Vector2 origin;
|
||||
Vector2 motion;
|
||||
|
||||
//graphical data: 0 blank, 1 green, 2 red
|
||||
int status[8];
|
||||
};
|
||||
|
||||
void serializeBarrier(void* buffer, BarrierPacket* packet);
|
||||
void deserializeBarrier(void* buffer, BarrierPacket* packet);
|
||||
@@ -0,0 +1,80 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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...
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#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);
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2015
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
@@ -19,37 +19,22 @@
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "monster_data.hpp"
|
||||
#include "client_packet.hpp"
|
||||
|
||||
MonsterData::MonsterData(std::string _avatar, int _scriptRef):
|
||||
Entity("monster"),
|
||||
avatar(_avatar),
|
||||
scriptRef(_scriptRef)
|
||||
{
|
||||
//EMPTY
|
||||
#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 MonsterData::Update() {
|
||||
Entity::Update();
|
||||
//TODO: (0) call the script reference
|
||||
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);
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//accessors & mutators
|
||||
//-------------------------
|
||||
|
||||
std::string MonsterData::SetAvatar(std::string s) {
|
||||
return avatar = s;
|
||||
}
|
||||
|
||||
std::string MonsterData::GetAvatar() {
|
||||
return avatar;
|
||||
}
|
||||
|
||||
int MonsterData::SetScriptReference(int i) {
|
||||
return scriptRef = i;
|
||||
}
|
||||
|
||||
int MonsterData::GetScriptReference() {
|
||||
return scriptRef;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#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);
|
||||
@@ -0,0 +1,70 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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 "creature_packet.hpp"
|
||||
|
||||
#include "serial_utility.hpp"
|
||||
|
||||
void serializeCreature(void* buffer, CreaturePacket* packet) {
|
||||
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
||||
|
||||
//identify the creature
|
||||
serialCopy(&buffer, &packet->creatureIndex, 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 deserializeCreature(void* buffer, CreaturePacket* packet) {
|
||||
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
||||
|
||||
//identify the creature
|
||||
deserialCopy(&buffer, &packet->creatureIndex, 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));
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "serial_packet_base.hpp"
|
||||
|
||||
#include "bounding_box.hpp"
|
||||
#include "vector2.hpp"
|
||||
|
||||
struct CreaturePacket : SerialPacketBase {
|
||||
//identify the creature
|
||||
int creatureIndex;
|
||||
char handle[PACKET_STRING_SIZE];
|
||||
char avatar[PACKET_STRING_SIZE];
|
||||
BoundingBox bounds;
|
||||
|
||||
//location
|
||||
int roomIndex;
|
||||
Vector2 origin;
|
||||
Vector2 motion;
|
||||
};
|
||||
|
||||
void serializeCreature(void* buffer, CreaturePacket* packet);
|
||||
void deserializeCreature(void* buffer, CreaturePacket* packet);
|
||||
@@ -0,0 +1,28 @@
|
||||
#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))
|
||||
|
||||
#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 $@ $<
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user