Compare commits
159 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fdaae0e8f2 | |||
| bd3838a04e | |||
| 5eeda8235d | |||
| 20d40d5b81 | |||
| 5e11077c7a | |||
| ba81bcba69 | |||
| 9329274866 | |||
| ace87b438b | |||
| 1f3c1f32f4 | |||
| cacd3dcd6d | |||
| 97b7945191 | |||
| a01d75549f | |||
| ecd0b43abe | |||
| d35ab24e15 | |||
| 100c4f6522 | |||
| a1c20959fe | |||
| 3b9df46510 | |||
| f7ba34dcec | |||
| 74234684af | |||
| 06e027710f | |||
| 73d9095604 | |||
| f2d79225a3 | |||
| daa38413f3 | |||
| a4ed23f6c7 | |||
| cfdc61c357 | |||
| 77b47b4634 | |||
| 0f139562c3 | |||
| fc2bc06992 | |||
| 8eefdd71b5 | |||
| 966443be3d | |||
| 5327d91917 | |||
| 6399efc227 | |||
| 7da5de619b | |||
| 0735037f10 | |||
| 8c78a5d26c | |||
| f584dd140b | |||
| 4434900afc | |||
| e488b15acc | |||
| 387e86de63 | |||
| 0e3a042fbb | |||
| de7167e830 | |||
| 40c76b4285 | |||
| 12cc970bf1 | |||
| bd2fd4ee97 | |||
| c3041d2a74 | |||
| 974effd95e | |||
| f3073efa39 | |||
| 1761134839 | |||
| 7c4762852b | |||
| 8dcd02aba3 | |||
| 4d6186021f | |||
| b7847d6260 | |||
| 869780589f | |||
| 254b97aa80 | |||
| 5a42a7e36c | |||
| 76206a1146 | |||
| 1f099a07dc | |||
| 356d83caf6 | |||
| be9ce33637 | |||
| 9b43b4641f | |||
| 6589a1a06d | |||
| db40f198be | |||
| 87ef03d512 | |||
| 8e97de6979 | |||
| d4740df996 | |||
| 926871d5fe | |||
| c010c0da0a | |||
| 8dc41886ef | |||
| e452f2ecfc | |||
| bfcf9a1d37 | |||
| 59e3518dd8 | |||
| 58bb70d1c5 | |||
| 9367bd802f | |||
| 411687b41c | |||
| ad2c65dc67 | |||
| 712d94d3b2 | |||
| 17b9eb7ad4 | |||
| 2c06232264 | |||
| 4c882682ed | |||
| f581c3238f | |||
| ceb6fe73f5 | |||
| 246a5ee541 | |||
| 79c7e48139 | |||
| 06922dc820 | |||
| 5577387d61 | |||
| d50cf5b91e | |||
| 6ca62db16d | |||
| 5536bf366d | |||
| 094efad728 | |||
| f77aec6dd7 | |||
| 6f4334f84d | |||
| 4ed512e0e2 | |||
| d0cc5521da | |||
| af8e7b70a0 | |||
| 8bc1326fef | |||
| dfe8c108de | |||
| 61337e29f6 | |||
| 5dea53ad50 | |||
| f52a022e64 | |||
| 0fdaa90a83 | |||
| e7ba097e6a | |||
| 3b409a8608 | |||
| ce97245131 | |||
| 59c9ba698f | |||
| 52ab9f0087 | |||
| 4ea1f8b016 | |||
| f1080151e3 | |||
| 5af0a7999c | |||
| 1e9ac9815b | |||
| 98ffcb8cd3 | |||
| 1b041d7771 | |||
| 6d98bab000 | |||
| b6c70cbc0d | |||
| e56a3d121c | |||
| 1776583e01 | |||
| 74f809a801 | |||
| 182101b592 | |||
| 07885cca1b | |||
| 956e920b7a | |||
| 908f91d674 | |||
| fd320767c5 | |||
| c830fa0537 | |||
| 10c89970cc | |||
| 0b512305a9 | |||
| 555abf9c95 | |||
| 2b3ea5eb80 | |||
| 66815016ba | |||
| 46f02dcfdd | |||
| 414a0896c9 | |||
| 0077d501ac | |||
| e946a0741d | |||
| 839c2af940 | |||
| f70241cc57 | |||
| 36d30ce39b | |||
| 28d083cba4 | |||
| 4dd4b37fc0 | |||
| 82b1b589dc | |||
| bac493c96b | |||
| d5520e83c6 | |||
| 93480be685 | |||
| 8ed308e89a | |||
| 8df1ecd804 | |||
| 8c9d071c7a | |||
| ac1098fa86 | |||
| deba324449 | |||
| 95362286f8 | |||
| f5c58bf5ad | |||
| 316db43b0a | |||
| 46ed196bf4 | |||
| 64baa63d12 | |||
| e19b6fbc23 | |||
| a64411a567 | |||
| 3662a97475 | |||
| 97aaacbc23 | |||
| 8afd0e7c8a | |||
| 82c776df83 | |||
| 924ebc2ee9 | |||
| d3bf099a98 | |||
| a6de5f9e69 |
@@ -1,14 +1,17 @@
|
|||||||
|
## Outline
|
||||||
|
|
||||||
|
Tortuga is a 2D multiplayer JRPG featuring permadeath, with an emphasis on multiplayer cooperation, exploration and customization. The game runs on customizable public and private servers.
|
||||||
|
|
||||||
|
This game is inspired by classic 2D RPGs (Final Fantasy, The Legend of Zelda), as well as more modern sandboxes amd MMOs (Minecraft, EVE Online). This project is currently independently created and funded, with the goal of creating a game that will engage the players and inspire a large community.
|
||||||
|
|
||||||
|
## Releases
|
||||||
|
|
||||||
The most recent stable build for Windows can be found [here](https://dl.dropboxusercontent.com/u/46669050/Tortuga.rar).
|
The most recent stable build for Windows can be found [here](https://dl.dropboxusercontent.com/u/46669050/Tortuga.rar).
|
||||||
|
|
||||||
Tortuga is a 2D multiplayer JRPG featuring permadeath (deletion of a character upon death). The emphasis of this game is on multiplayer cooperation, exploration and customization. The game runs on customizable server software that can support up to 150 simultaneous players or more.
|
|
||||||
|
|
||||||
This game is inspired by classic 2D RPGs, as well as more modern sandbox MMOs. This project is currently independently created and funded, with the goal of creating a game that will engage user's imagination and inspire a large modding community.
|
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
Tortuga's full documentation can be found in a separate branch, see [Tortuga/docs](https://github.com/Ratstail91/Tortuga/tree/docs).
|
* [Tortuga Wiki](https://github.com/Ratstail91/Tortuga/wiki) - Full documentation
|
||||||
For Tortuga's primary documentation, please read the [Tortuga Game Design Document](https://github.com/Ratstail91/Tortuga/blob/docs/Tortuga%20Game%20Design%20Document.docx?raw=true).
|
* [Tortuga Bug Tracker](https://github.com/Ratstail91/Tortuga/issues) - A list of all known bugs and issues
|
||||||
For a list of known bugs, see the [GitHub bug tracker](https://github.com/Ratstail91/Tortuga/issues).
|
|
||||||
|
|
||||||
## External Dependencies
|
## External Dependencies
|
||||||
|
|
||||||
|
|||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
This is the README for Tortuga's demo build. The source code is available at:
|
||||||
|
|
||||||
|
https://github.com/Ratstail91/Tortuga
|
||||||
|
|
||||||
|
The current build may have bugs, missing features, bugs masquerading as
|
||||||
|
features, etc. You can report a bug/feature here:
|
||||||
|
|
||||||
|
https://github.com/Ratstail91/Tortuga/issues
|
||||||
|
|
||||||
|
Please note that this game requires a functioning server to operate correctly.
|
||||||
|
Both a game server and game client are included in this package.
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
Instructions For Setup
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
1. To create a server, simply run server.exe.
|
||||||
|
2. To join that server, run client.exe with config settings not already in use.
|
||||||
|
(Note: This process will be streamlined later).
|
||||||
|
3. To change the config settings, open rsc/config.cfg
|
||||||
|
4. These settings must be unique for each player:
|
||||||
|
|
||||||
|
* client.username
|
||||||
|
* client.handle
|
||||||
|
|
||||||
|
5. There are currently two options for 'client.avatar':
|
||||||
|
|
||||||
|
* client.avatar = elliot2.bmp #male
|
||||||
|
* client.avatar = coa2.bmp #female
|
||||||
|
|
||||||
|
6. When you've correctly set these values (good luck), select 'Start' from the
|
||||||
|
main menu; this displays the list of available servers.
|
||||||
|
7. Select the name of your server (default is 'local') and select 'Join'.
|
||||||
|
8. Welcome to Tortuga, enjoy your stay.
|
||||||
@@ -21,10 +21,12 @@
|
|||||||
*/
|
*/
|
||||||
#include "client_application.hpp"
|
#include "client_application.hpp"
|
||||||
|
|
||||||
#include "serial.hpp"
|
#include "serial_packet.hpp"
|
||||||
|
#include "config_utility.hpp"
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Scene headers
|
//Scene headers
|
||||||
@@ -36,32 +38,82 @@
|
|||||||
#include "options_menu.hpp"
|
#include "options_menu.hpp"
|
||||||
#include "lobby_menu.hpp"
|
#include "lobby_menu.hpp"
|
||||||
#include "in_world.hpp"
|
#include "in_world.hpp"
|
||||||
#include "in_combat.hpp"
|
#include "disconnected_screen.hpp"
|
||||||
#include "clean_up.hpp"
|
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Public access members
|
//Public access members
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void ClientApplication::Init(int argc, char** argv) {
|
void ClientApplication::Init(int argc, char* argv[]) {
|
||||||
|
std::cout << "Beginning " << argv[0] << std::endl;
|
||||||
|
|
||||||
//load the prerequisites
|
//load the prerequisites
|
||||||
config.Load("rsc\\config.cfg");
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
|
config.Load("rsc/config.cfg", argc, argv);
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//Initialize the APIs
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
//initialize SDL
|
//initialize SDL
|
||||||
if (SDL_Init(SDL_INIT_VIDEO)) {
|
if (SDL_Init(SDL_INIT_VIDEO)) {
|
||||||
throw(std::runtime_error("Failed to initialize SDL"));
|
throw(std::runtime_error("Failed to initialize SDL"));
|
||||||
}
|
}
|
||||||
int w = config.Int("client.screen.w");
|
std::cout << "Initialized SDL" << std::endl;
|
||||||
int h = config.Int("client.screen.h");
|
|
||||||
int f = config.Bool("client.screen.f") ? SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN : SDL_HWSURFACE|SDL_DOUBLEBUF;
|
|
||||||
|
|
||||||
BaseScene::SetScreen(w ? w : 800, h ? h : 600, 0, f);
|
|
||||||
|
|
||||||
//initialize SDL_net
|
//initialize SDL_net
|
||||||
if (SDLNet_Init()) {
|
if (SDLNet_Init()) {
|
||||||
throw(std::runtime_error("Failed to initialize SDL_net"));
|
throw(std::runtime_error("Failed to initialize SDL_net"));
|
||||||
}
|
}
|
||||||
network.Open(0);
|
UDPNetworkUtility::GetSingleton().Open(0);
|
||||||
|
std::cout << "Initialized SDL_net" << std::endl;
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//Setup the screen
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
int w = config.Int("client.screen.w");
|
||||||
|
int h = config.Int("client.screen.h");
|
||||||
|
int f = config.Bool("client.screen.f") ? SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN : SDL_HWSURFACE|SDL_DOUBLEBUF;
|
||||||
|
|
||||||
|
BaseScene::SetScreen(w ? w : 800, h ? h : 600, 0, f);
|
||||||
|
std::cout << "Initialized the screen" << std::endl;
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//debug output
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
//TODO: enable/disable these with a switch
|
||||||
|
#define DEBUG_OUTPUT_VAR(x) std::cout << "\t" << #x << ": " << x << std::endl;
|
||||||
|
|
||||||
|
std::cout << "Internal sizes:" << std::endl;
|
||||||
|
|
||||||
|
DEBUG_OUTPUT_VAR(NETWORK_VERSION);
|
||||||
|
DEBUG_OUTPUT_VAR(sizeof(Region::type_t));
|
||||||
|
DEBUG_OUTPUT_VAR(sizeof(Region));
|
||||||
|
DEBUG_OUTPUT_VAR(REGION_WIDTH);
|
||||||
|
DEBUG_OUTPUT_VAR(REGION_HEIGHT);
|
||||||
|
DEBUG_OUTPUT_VAR(REGION_DEPTH);
|
||||||
|
DEBUG_OUTPUT_VAR(REGION_TILE_FOOTPRINT);
|
||||||
|
DEBUG_OUTPUT_VAR(REGION_SOLID_FOOTPRINT);
|
||||||
|
DEBUG_OUTPUT_VAR(PACKET_STRING_SIZE);
|
||||||
|
DEBUG_OUTPUT_VAR(PACKET_BUFFER_SIZE);
|
||||||
|
DEBUG_OUTPUT_VAR(MAX_PACKET_SIZE);
|
||||||
|
DEBUG_OUTPUT_VAR(static_cast<int>(SerialPacketType::LAST));
|
||||||
|
|
||||||
|
#undef DEBUG_OUTPUT_VAR
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//finalize the startup
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
std::cout << "Startup completed successfully" << std::endl;
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//debugging
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
//...
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientApplication::Proc() {
|
void ClientApplication::Proc() {
|
||||||
@@ -70,7 +122,6 @@ void ClientApplication::Proc() {
|
|||||||
//prepare the time system
|
//prepare the time system
|
||||||
typedef std::chrono::steady_clock Clock;
|
typedef std::chrono::steady_clock Clock;
|
||||||
|
|
||||||
std::chrono::duration<int, std::milli> delta(16);
|
|
||||||
Clock::time_point simTime = Clock::now();
|
Clock::time_point simTime = Clock::now();
|
||||||
Clock::time_point realTime;
|
Clock::time_point realTime;
|
||||||
|
|
||||||
@@ -88,8 +139,9 @@ void ClientApplication::Proc() {
|
|||||||
//simulate game time
|
//simulate game time
|
||||||
while (simTime < realTime) {
|
while (simTime < realTime) {
|
||||||
//call each user defined function
|
//call each user defined function
|
||||||
activeScene->RunFrame(double(delta.count()) / std::chrono::duration<int, std::milli>::period::den);
|
activeScene->RunFrame();
|
||||||
simTime += delta;
|
//~60 FPS
|
||||||
|
simTime += std::chrono::duration<int, std::milli>(16);
|
||||||
}
|
}
|
||||||
|
|
||||||
//draw the game to the screen
|
//draw the game to the screen
|
||||||
@@ -100,9 +152,11 @@ void ClientApplication::Proc() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ClientApplication::Quit() {
|
void ClientApplication::Quit() {
|
||||||
network.Close();
|
std::cout << "Shutting down" << std::endl;
|
||||||
|
UDPNetworkUtility::GetSingleton().Close();
|
||||||
SDLNet_Quit();
|
SDLNet_Quit();
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
|
std::cout << "Clean exit" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
@@ -115,25 +169,22 @@ void ClientApplication::LoadScene(SceneList sceneIndex) {
|
|||||||
//add scene creation calls here
|
//add scene creation calls here
|
||||||
case SceneList::FIRST:
|
case SceneList::FIRST:
|
||||||
case SceneList::SPLASHSCREEN:
|
case SceneList::SPLASHSCREEN:
|
||||||
activeScene = new SplashScreen(&config);
|
activeScene = new SplashScreen();
|
||||||
break;
|
break;
|
||||||
case SceneList::MAINMENU:
|
case SceneList::MAINMENU:
|
||||||
activeScene = new MainMenu(&config);
|
activeScene = new MainMenu();
|
||||||
break;
|
break;
|
||||||
case SceneList::OPTIONSMENU:
|
case SceneList::OPTIONSMENU:
|
||||||
activeScene = new OptionsMenu(&config);
|
activeScene = new OptionsMenu();
|
||||||
break;
|
break;
|
||||||
case SceneList::LOBBYMENU:
|
case SceneList::LOBBYMENU:
|
||||||
activeScene = new LobbyMenu(&config, &network, &clientIndex, &accountIndex);
|
activeScene = new LobbyMenu(&clientIndex, &accountIndex); //TODO: can I use the ConfigUtility for these parameters?
|
||||||
break;
|
break;
|
||||||
case SceneList::INWORLD:
|
case SceneList::INWORLD:
|
||||||
activeScene = new InWorld(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap);
|
activeScene = new InWorld(&clientIndex, &accountIndex);
|
||||||
break;
|
break;
|
||||||
case SceneList::INCOMBAT:
|
case SceneList::DISCONNECTEDSCREEN:
|
||||||
activeScene = new InCombat(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap, &enemyMap);
|
activeScene = new DisconnectedScreen();
|
||||||
break;
|
|
||||||
case SceneList::CLEANUP:
|
|
||||||
activeScene = new CleanUp(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap, &enemyMap);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw(std::logic_error("Failed to recognize the scene index"));
|
throw(std::logic_error("Failed to recognize the scene index"));
|
||||||
|
|||||||
@@ -25,24 +25,25 @@
|
|||||||
#include "scene_list.hpp"
|
#include "scene_list.hpp"
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
|
|
||||||
#include "config_utility.hpp"
|
|
||||||
#include "udp_network_utility.hpp"
|
#include "udp_network_utility.hpp"
|
||||||
#include "character_data.hpp"
|
|
||||||
#include "combat_data.hpp"
|
#include "singleton.hpp"
|
||||||
#include "enemy_data.hpp"
|
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
class ClientApplication {
|
class ClientApplication: public Singleton<ClientApplication> {
|
||||||
public:
|
public:
|
||||||
ClientApplication() = default;
|
//public methods
|
||||||
~ClientApplication() = default;
|
void Init(int argc, char* argv[]);
|
||||||
|
|
||||||
void Init(int argc, char** argv);
|
|
||||||
void Proc();
|
void Proc();
|
||||||
void Quit();
|
void Quit();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
friend Singleton<ClientApplication>;
|
||||||
|
|
||||||
|
ClientApplication() = default;
|
||||||
|
~ClientApplication() = default;
|
||||||
|
|
||||||
//Private access members
|
//Private access members
|
||||||
void LoadScene(SceneList sceneIndex);
|
void LoadScene(SceneList sceneIndex);
|
||||||
void UnloadScene();
|
void UnloadScene();
|
||||||
@@ -50,15 +51,8 @@ private:
|
|||||||
BaseScene* activeScene = nullptr;
|
BaseScene* activeScene = nullptr;
|
||||||
|
|
||||||
//shared parameters
|
//shared parameters
|
||||||
ConfigUtility config;
|
|
||||||
UDPNetworkUtility network;
|
|
||||||
int clientIndex = -1;
|
int clientIndex = -1;
|
||||||
int accountIndex = -1;
|
int accountIndex = -1;
|
||||||
int characterIndex = -1;
|
|
||||||
|
|
||||||
std::map<int, CombatData> combatMap;
|
|
||||||
std::map<int, CharacterData> characterMap;
|
|
||||||
std::map<int, EnemyData> enemyMap;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -19,27 +19,9 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#include "character_data.hpp"
|
#include "base_character.hpp"
|
||||||
|
|
||||||
void CharacterData::Update(double delta) {
|
void BaseCharacter::CorrectSprite() {
|
||||||
if (motion.x && motion.y) {
|
|
||||||
origin += motion * delta * CHARACTER_WALKING_MOD;
|
|
||||||
}
|
|
||||||
else if (motion != 0) {
|
|
||||||
origin += motion * delta;
|
|
||||||
}
|
|
||||||
#ifdef GRAPHICS
|
|
||||||
sprite.Update(delta);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef GRAPHICS
|
|
||||||
|
|
||||||
void CharacterData::DrawTo(SDL_Surface* const dest, int camX, int camY) {
|
|
||||||
sprite.DrawTo(dest, origin.x - camX, origin.y - camY);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CharacterData::CorrectSprite() {
|
|
||||||
//NOTE: These must correspond to the sprite sheet in use
|
//NOTE: These must correspond to the sprite sheet in use
|
||||||
if (motion.y > 0) {
|
if (motion.y > 0) {
|
||||||
sprite.SetYIndex(0);
|
sprite.SetYIndex(0);
|
||||||
@@ -63,5 +45,3 @@ void CharacterData::CorrectSprite() {
|
|||||||
sprite.SetXIndex(0);
|
sprite.SetXIndex(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#ifndef BASECHARACTER_HPP_
|
||||||
|
#define BASECHARACTER_HPP_
|
||||||
|
|
||||||
|
//components
|
||||||
|
#include "character_defines.hpp"
|
||||||
|
#include "entity.hpp"
|
||||||
|
|
||||||
|
//std namespace
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class BaseCharacter : public Entity {
|
||||||
|
public:
|
||||||
|
BaseCharacter() = default;
|
||||||
|
virtual ~BaseCharacter() = default;
|
||||||
|
|
||||||
|
//graphics
|
||||||
|
void CorrectSprite();
|
||||||
|
|
||||||
|
//metadata
|
||||||
|
int SetOwner(int i) { return owner = i; }
|
||||||
|
int GetOwner() { return owner; }
|
||||||
|
std::string SetHandle(std::string s) { return handle = s; }
|
||||||
|
std::string GetHandle() const { return handle; }
|
||||||
|
std::string SetAvatar(std::string s) { return avatar = s; }
|
||||||
|
std::string GetAvatar() const { return avatar; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
//metadata
|
||||||
|
int owner;
|
||||||
|
std::string handle;
|
||||||
|
std::string avatar;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -19,13 +19,5 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#ifndef CLIENTDATA_HPP_
|
#include "base_monster.hpp"
|
||||||
#define CLIENTDATA_HPP_
|
|
||||||
|
|
||||||
#include "SDL/SDL_net.h"
|
|
||||||
|
|
||||||
struct ClientData {
|
|
||||||
IPaddress address = {0,0};
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#ifndef BASEMONSTER_HPP_
|
||||||
|
#define BASEMONSTER_HPP_
|
||||||
|
|
||||||
|
#include "entity.hpp"
|
||||||
|
|
||||||
|
class BaseMonster : public Entity {
|
||||||
|
public:
|
||||||
|
BaseMonster() = default;
|
||||||
|
virtual ~BaseMonster() = default;
|
||||||
|
|
||||||
|
private:
|
||||||
|
//
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -19,36 +19,44 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#include "enemy_manager.hpp"
|
#include "entity.hpp"
|
||||||
|
|
||||||
//-------------------------
|
void Entity::Update() {
|
||||||
//public access methods
|
origin += motion;
|
||||||
//-------------------------
|
sprite.Update(0.016);
|
||||||
|
|
||||||
//TODO
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//accessors and mutators
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
EnemyData* EnemyManager::GetEnemy(int uid) {
|
|
||||||
std::map<int, EnemyData>::iterator it = enemyMap.find(uid);
|
|
||||||
|
|
||||||
if (it == enemyMap.end()) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return &it->second;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<int, EnemyData>* EnemyManager::GetContainer() {
|
void Entity::DrawTo(SDL_Surface* const dest, int camX, int camY) {
|
||||||
return &enemyMap;
|
sprite.DrawTo(dest, origin.x - camX, origin.y - camY);
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_State* EnemyManager::SetLuaState(lua_State* L) {
|
int Entity::SetEntityIndex(int i) {
|
||||||
return luaState = L;
|
return entityIndex = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_State* EnemyManager::GetLuaState() {
|
int Entity::SetRoomIndex(int i) {
|
||||||
return luaState;
|
return roomIndex = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector2 Entity::SetOrigin(Vector2 v) {
|
||||||
|
return origin = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 Entity::SetMotion(Vector2 v) {
|
||||||
|
return motion = v;
|
||||||
|
}
|
||||||
|
int Entity::GetEntityIndex() {
|
||||||
|
return entityIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Entity::GetRoomIndex() {
|
||||||
|
return roomIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 Entity::GetOrigin() {
|
||||||
|
return origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 Entity::GetMotion() {
|
||||||
|
return motion;
|
||||||
|
}
|
||||||
@@ -19,52 +19,44 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#ifndef COMBATDATA_HPP_
|
#ifndef ENTITY_HPP_
|
||||||
#define COMBATDATA_HPP_
|
#define ENTITY_HPP_
|
||||||
|
|
||||||
|
#include "bounding_box.hpp"
|
||||||
|
#include "sprite_sheet.hpp"
|
||||||
#include "vector2.hpp"
|
#include "vector2.hpp"
|
||||||
|
|
||||||
//gameplay members
|
//The base class for all objects in the world
|
||||||
#include "character_data.hpp"
|
class Entity {
|
||||||
#include "enemy_data.hpp"
|
public:
|
||||||
|
virtual void Update();
|
||||||
|
virtual void DrawTo(SDL_Surface* const, int camX, int camY);
|
||||||
|
|
||||||
//graphics
|
SpriteSheet* GetSprite() { return &sprite; }
|
||||||
#ifdef GRAPHICS
|
|
||||||
#include "sprite_sheet.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//std namespace
|
//accessors & mutators
|
||||||
#include <chrono>
|
int SetEntityIndex(int i);
|
||||||
#include <array>
|
int SetRoomIndex(int i);
|
||||||
#include <utility>
|
Vector2 SetOrigin(Vector2 v);
|
||||||
|
Vector2 SetMotion(Vector2 v);
|
||||||
|
BoundingBox SetBounds(BoundingBox b) { return bounds = b; }
|
||||||
|
|
||||||
#define COMBAT_MAX_CHARACTERS 12
|
int GetEntityIndex();
|
||||||
#define COMBAT_MAX_ENEMIES 12
|
int GetRoomIndex();
|
||||||
|
Vector2 GetOrigin();
|
||||||
|
Vector2 GetMotion();
|
||||||
|
BoundingBox GetBounds() { return bounds; }
|
||||||
|
|
||||||
struct CombatData {
|
protected:
|
||||||
enum class Terrain {
|
Entity() = default;
|
||||||
//TODO: types of combat terrains
|
~Entity() = default;
|
||||||
NONE = 0,
|
|
||||||
GRASSLANDS,
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef std::chrono::steady_clock Clock;
|
|
||||||
|
|
||||||
std::array<CharacterData, COMBAT_MAX_CHARACTERS> characterArray;
|
|
||||||
std::array<EnemyData, COMBAT_MAX_ENEMIES> enemyArray;
|
|
||||||
|
|
||||||
//world interaction
|
|
||||||
int mapIndex = 0;
|
|
||||||
Vector2 origin = {0.0,0.0};
|
|
||||||
Vector2 bounds = {0.0,0.0};
|
|
||||||
|
|
||||||
//time interval
|
|
||||||
Clock::time_point lastTick = Clock::now();
|
|
||||||
|
|
||||||
//graphics
|
|
||||||
#ifdef GRAPHICS
|
|
||||||
SpriteSheet sprite;
|
SpriteSheet sprite;
|
||||||
#endif
|
int entityIndex = -1;
|
||||||
|
int roomIndex = -1;
|
||||||
|
Vector2 origin;
|
||||||
|
Vector2 motion;
|
||||||
|
BoundingBox bounds;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#config
|
||||||
|
INCLUDES+=. .. ../../common/gameplay ../../common/graphics ../../common/utilities
|
||||||
|
LIBS+=
|
||||||
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
|
#source
|
||||||
|
CXXSRC=$(wildcard *.cpp)
|
||||||
|
|
||||||
|
#objects
|
||||||
|
OBJDIR=obj
|
||||||
|
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||||
|
|
||||||
|
#output
|
||||||
|
OUTDIR=..
|
||||||
|
OUT=$(addprefix $(OUTDIR)/,client.a)
|
||||||
|
|
||||||
|
#targets
|
||||||
|
all: $(OBJ) $(OUT)
|
||||||
|
ar -crs $(OUT) $(OBJ)
|
||||||
|
|
||||||
|
$(OBJ): | $(OBJDIR)
|
||||||
|
|
||||||
|
$(OUT): | $(OUTDIR)
|
||||||
|
|
||||||
|
$(OBJDIR):
|
||||||
|
mkdir $(OBJDIR)
|
||||||
|
|
||||||
|
$(OUTDIR):
|
||||||
|
mkdir $(OUTDIR)
|
||||||
|
|
||||||
|
$(OBJDIR)/%.o: %.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) *.o *.a *.exe
|
||||||
|
|
||||||
|
rebuild: clean all
|
||||||
@@ -1,225 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013, 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "in_combat.hpp"
|
|
||||||
|
|
||||||
#include "channels.hpp"
|
|
||||||
#include "utility.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Public access members
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
InCombat::InCombat(
|
|
||||||
ConfigUtility* const argConfig,
|
|
||||||
UDPNetworkUtility* const argNetwork,
|
|
||||||
int* const argClientIndex,
|
|
||||||
int* const argAccountIndex,
|
|
||||||
int* const argCharacterIndex,
|
|
||||||
std::map<int, CombatData>* argCombatMap,
|
|
||||||
std::map<int, CharacterData>* argCharacterMap,
|
|
||||||
std::map<int, EnemyData>* argEnemyMap
|
|
||||||
):
|
|
||||||
config(*argConfig),
|
|
||||||
network(*argNetwork),
|
|
||||||
clientIndex(*argClientIndex),
|
|
||||||
accountIndex(*argAccountIndex),
|
|
||||||
characterIndex(*argCharacterIndex),
|
|
||||||
combatMap(*argCombatMap),
|
|
||||||
characterMap(*argCharacterMap),
|
|
||||||
enemyMap(*argEnemyMap)
|
|
||||||
{
|
|
||||||
/* //setup the utility objects
|
|
||||||
buttonImage.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
|
||||||
buttonImage.SetClipH(buttonImage.GetClipH()/3);
|
|
||||||
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp");
|
|
||||||
|
|
||||||
//pass the utility objects
|
|
||||||
backButton.SetImage(&buttonImage);
|
|
||||||
backButton.SetFont(&font);
|
|
||||||
|
|
||||||
//set the button positions
|
|
||||||
backButton.SetX(50);
|
|
||||||
backButton.SetY(50 + buttonImage.GetClipH() * 0);
|
|
||||||
|
|
||||||
//set the button texts
|
|
||||||
backButton.SetText("Back");
|
|
||||||
|
|
||||||
//request a sync
|
|
||||||
RequestSynchronize();
|
|
||||||
*/
|
|
||||||
//debug
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
InCombat::~InCombat() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Frame loop
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void InCombat::FrameStart() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::Update(double delta) {
|
|
||||||
//suck in and process all waiting packets
|
|
||||||
SerialPacket* packetBuffer = static_cast<SerialPacket*>(malloc(MAX_PACKET_SIZE));
|
|
||||||
while(network.Receive(packetBuffer)) {
|
|
||||||
HandlePacket(packetBuffer);
|
|
||||||
}
|
|
||||||
free(static_cast<void*>(packetBuffer));
|
|
||||||
|
|
||||||
//TODO: more
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::FrameEnd() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::RenderFrame() {
|
|
||||||
SDL_FillRect(GetScreen(), 0, 0);
|
|
||||||
Render(GetScreen());
|
|
||||||
SDL_Flip(GetScreen());
|
|
||||||
fps.Calculate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::Render(SDL_Surface* const screen) {
|
|
||||||
//TODO: draw the background
|
|
||||||
|
|
||||||
//TODO: draw the characters
|
|
||||||
|
|
||||||
//TODO: draw the enemies
|
|
||||||
|
|
||||||
//TODO: draw the UI
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Event handlers
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void InCombat::QuitEvent() {
|
|
||||||
//exit the game AND the server
|
|
||||||
RequestDisconnect();
|
|
||||||
SetNextScene(SceneList::QUIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::KeyDown(SDL_KeyboardEvent const& key) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::KeyUp(SDL_KeyboardEvent const& key) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Network handlers
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void InCombat::HandlePacket(SerialPacket* const argPacket) {
|
|
||||||
switch(argPacket->type) {
|
|
||||||
case SerialPacketType::DISCONNECT:
|
|
||||||
HandleDisconnect(argPacket);
|
|
||||||
break;
|
|
||||||
//handle errors
|
|
||||||
default:
|
|
||||||
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in InCombat: " + to_string_custom(static_cast<int>(argPacket->type)) ));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::HandleDisconnect(SerialPacket* const) {
|
|
||||||
SetNextScene(SceneList::CLEANUP);
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: more network handlers
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Server control
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void InCombat::RequestSynchronize() {
|
|
||||||
ClientPacket newPacket;
|
|
||||||
|
|
||||||
//request a sync
|
|
||||||
newPacket.type = SerialPacketType::SYNCHRONIZE;
|
|
||||||
newPacket.clientIndex = clientIndex;
|
|
||||||
newPacket.accountIndex = accountIndex;
|
|
||||||
|
|
||||||
network.SendTo(Channels::SERVER, &newPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::SendPlayerUpdate() {
|
|
||||||
CharacterPacket newPacket;
|
|
||||||
|
|
||||||
//pack the packet
|
|
||||||
newPacket.type = SerialPacketType::CHARACTER_UPDATE;
|
|
||||||
|
|
||||||
newPacket.characterIndex = characterIndex;
|
|
||||||
//handle, avatar
|
|
||||||
newPacket.accountIndex = accountIndex;
|
|
||||||
// newPacket.roomIndex = localCharacter->roomIndex;
|
|
||||||
// newPacket.origin = localCharacter->origin;
|
|
||||||
// newPacket.motion = localCharacter->motion;
|
|
||||||
// newPacket.stats = localCharacter->stats;
|
|
||||||
|
|
||||||
//TODO: gameplay components: equipment, items, buffs, debuffs
|
|
||||||
|
|
||||||
network.SendTo(Channels::SERVER, &newPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::RequestDisconnect() {
|
|
||||||
ClientPacket newPacket;
|
|
||||||
|
|
||||||
//send a disconnect request
|
|
||||||
newPacket.type = SerialPacketType::DISCONNECT;
|
|
||||||
newPacket.clientIndex = clientIndex;
|
|
||||||
newPacket.accountIndex = accountIndex;
|
|
||||||
|
|
||||||
network.SendTo(Channels::SERVER, &newPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::RequestShutdown() {
|
|
||||||
ClientPacket newPacket;
|
|
||||||
|
|
||||||
//send a shutdown request
|
|
||||||
newPacket.type = SerialPacketType::SHUTDOWN;
|
|
||||||
newPacket.clientIndex = clientIndex;
|
|
||||||
newPacket.accountIndex = accountIndex;
|
|
||||||
|
|
||||||
network.SendTo(Channels::SERVER, &newPacket);
|
|
||||||
}
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013, 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef INCOMBAT_HPP_
|
|
||||||
#define INCOMBAT_HPP_
|
|
||||||
|
|
||||||
//network
|
|
||||||
#include "udp_network_utility.hpp"
|
|
||||||
|
|
||||||
//graphics
|
|
||||||
#include "image.hpp"
|
|
||||||
#include "raster_font.hpp"
|
|
||||||
#include "button.hpp"
|
|
||||||
|
|
||||||
//common
|
|
||||||
#include "config_utility.hpp"
|
|
||||||
#include "frame_rate.hpp"
|
|
||||||
|
|
||||||
#include "combat_data.hpp"
|
|
||||||
#include "character_data.hpp"
|
|
||||||
#include "enemy_data.hpp"
|
|
||||||
|
|
||||||
//client
|
|
||||||
#include "base_scene.hpp"
|
|
||||||
|
|
||||||
class InCombat : public BaseScene {
|
|
||||||
public:
|
|
||||||
//Public access members
|
|
||||||
InCombat(
|
|
||||||
ConfigUtility* const argConfig,
|
|
||||||
UDPNetworkUtility* const argNetwork,
|
|
||||||
int* const argClientIndex,
|
|
||||||
int* const argAccountIndex,
|
|
||||||
int* const argCharacterIndex,
|
|
||||||
std::map<int, CombatData>* argCombatMap,
|
|
||||||
std::map<int, CharacterData>* argCharacterMap,
|
|
||||||
std::map<int, EnemyData>* argEnemyMap
|
|
||||||
);
|
|
||||||
~InCombat();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
//Frame loop
|
|
||||||
void FrameStart();
|
|
||||||
void Update(double delta);
|
|
||||||
void FrameEnd();
|
|
||||||
void RenderFrame();
|
|
||||||
void Render(SDL_Surface* const);
|
|
||||||
|
|
||||||
//Event handlers
|
|
||||||
void QuitEvent();
|
|
||||||
void MouseMotion(SDL_MouseMotionEvent const&);
|
|
||||||
void MouseButtonDown(SDL_MouseButtonEvent const&);
|
|
||||||
void MouseButtonUp(SDL_MouseButtonEvent const&);
|
|
||||||
void KeyDown(SDL_KeyboardEvent const&);
|
|
||||||
void KeyUp(SDL_KeyboardEvent const&);
|
|
||||||
|
|
||||||
//Network handlers
|
|
||||||
void HandlePacket(SerialPacket* const);
|
|
||||||
void HandleDisconnect(SerialPacket* const);
|
|
||||||
//TODO: more network handlers
|
|
||||||
|
|
||||||
//Server control
|
|
||||||
void RequestSynchronize();
|
|
||||||
void SendPlayerUpdate();
|
|
||||||
void RequestDisconnect();
|
|
||||||
void RequestShutdown();
|
|
||||||
//TODO: more
|
|
||||||
|
|
||||||
//shared parameters
|
|
||||||
ConfigUtility& config;
|
|
||||||
UDPNetworkUtility& network;
|
|
||||||
int& clientIndex;
|
|
||||||
int& accountIndex;
|
|
||||||
int& characterIndex;
|
|
||||||
std::map<int, CombatData>& combatMap;
|
|
||||||
std::map<int, CharacterData>& characterMap;
|
|
||||||
std::map<int, EnemyData>& enemyMap;
|
|
||||||
|
|
||||||
//graphics
|
|
||||||
//TODO: graphics
|
|
||||||
|
|
||||||
//UI
|
|
||||||
//TODO: UI
|
|
||||||
FrameRate fps;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
+20
-5
@@ -21,23 +21,38 @@
|
|||||||
*/
|
*/
|
||||||
#include "client_application.hpp"
|
#include "client_application.hpp"
|
||||||
|
|
||||||
|
//singletons
|
||||||
|
#include "config_utility.hpp"
|
||||||
|
#include "udp_network_utility.hpp"
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char* argv[]) {
|
||||||
cout << "Beginning client" << endl;
|
|
||||||
try {
|
try {
|
||||||
ClientApplication app;
|
//create the singletons
|
||||||
|
ConfigUtility::CreateSingleton();
|
||||||
|
UDPNetworkUtility::CreateSingleton();
|
||||||
|
|
||||||
|
//call the server's routines
|
||||||
|
ClientApplication::CreateSingleton();
|
||||||
|
ClientApplication& app = ClientApplication::GetSingleton();
|
||||||
|
|
||||||
app.Init(argc, argv);
|
app.Init(argc, argv);
|
||||||
app.Proc();
|
app.Proc();
|
||||||
app.Quit();
|
app.Quit();
|
||||||
|
|
||||||
|
ClientApplication::DeleteSingleton();
|
||||||
|
|
||||||
|
//delete the singletons
|
||||||
|
ConfigUtility::DeleteSingleton();
|
||||||
|
UDPNetworkUtility::DeleteSingleton();
|
||||||
}
|
}
|
||||||
catch(exception& e) {
|
catch(exception& e) {
|
||||||
cerr << "Fatal exception thrown: " << e.what() << endl;
|
cerr << "Fatal exception thrown: " << e.what() << endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
cout << "Clean exit" << endl;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
+15
-4
@@ -1,7 +1,16 @@
|
|||||||
#config
|
#include directories
|
||||||
INCLUDES+=. ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet ../common/network/serial ../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
|
||||||
LIBS+=../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua
|
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) -DGRAPHICS
|
#libraries
|
||||||
|
#the order of the $(LIBS) is important, at least for MinGW
|
||||||
|
LIBS+=client.a ../libcommon.a -lSDL_net
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
LIBS+=-lwsock32 -liphlpapi -lmingw32
|
||||||
|
endif
|
||||||
|
LIBS+=-lSDLmain -lSDL
|
||||||
|
|
||||||
|
#flags
|
||||||
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
#source
|
#source
|
||||||
CXXSRC=$(wildcard *.cpp)
|
CXXSRC=$(wildcard *.cpp)
|
||||||
@@ -16,6 +25,8 @@ OUT=$(addprefix $(OUTDIR)/,client)
|
|||||||
|
|
||||||
#targets
|
#targets
|
||||||
all: $(OBJ) $(OUT)
|
all: $(OBJ) $(OUT)
|
||||||
|
$(MAKE) -C entities
|
||||||
|
$(MAKE) -C scenes
|
||||||
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)
|
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)
|
||||||
|
|
||||||
$(OBJ): | $(OBJDIR)
|
$(OBJ): | $(OBJDIR)
|
||||||
|
|||||||
@@ -34,8 +34,7 @@ enum class SceneList {
|
|||||||
OPTIONSMENU,
|
OPTIONSMENU,
|
||||||
LOBBYMENU,
|
LOBBYMENU,
|
||||||
INWORLD,
|
INWORLD,
|
||||||
INCOMBAT,
|
DISCONNECTEDSCREEN,
|
||||||
CLEANUP,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -75,10 +75,10 @@ SceneList BaseScene::GetNextScene() const {
|
|||||||
//Frame loop
|
//Frame loop
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void BaseScene::RunFrame(double delta) {
|
void BaseScene::RunFrame() {
|
||||||
FrameStart();
|
FrameStart();
|
||||||
HandleEvents();
|
HandleEvents();
|
||||||
Update(delta);
|
Update();
|
||||||
FrameEnd();
|
FrameEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,6 +86,7 @@ void BaseScene::RenderFrame() {
|
|||||||
SDL_FillRect(screen, 0, 0);
|
SDL_FillRect(screen, 0, 0);
|
||||||
Render(screen);
|
Render(screen);
|
||||||
SDL_Flip(screen);
|
SDL_Flip(screen);
|
||||||
|
SDL_Delay(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
@@ -40,13 +40,13 @@ public:
|
|||||||
SceneList GetNextScene() const;
|
SceneList GetNextScene() const;
|
||||||
|
|
||||||
//Frame loop
|
//Frame loop
|
||||||
virtual void RunFrame(double delta);
|
virtual void RunFrame();
|
||||||
virtual void RenderFrame();
|
virtual void RenderFrame();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void FrameStart() {}
|
virtual void FrameStart() {}
|
||||||
virtual void HandleEvents();
|
virtual void HandleEvents();
|
||||||
virtual void Update(double delta) {}
|
virtual void Update() {}
|
||||||
virtual void FrameEnd() {}
|
virtual void FrameEnd() {}
|
||||||
virtual void Render(SDL_Surface* const screen) {}
|
virtual void Render(SDL_Surface* const screen) {}
|
||||||
|
|
||||||
@@ -19,9 +19,11 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#include "clean_up.hpp"
|
#include "disconnected_screen.hpp"
|
||||||
|
|
||||||
#include "channels.hpp"
|
#include "channels.hpp"
|
||||||
|
#include "config_utility.hpp"
|
||||||
|
#include "udp_network_utility.hpp"
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
@@ -29,25 +31,9 @@
|
|||||||
//Public access members
|
//Public access members
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
CleanUp::CleanUp(
|
DisconnectedScreen::DisconnectedScreen() {
|
||||||
ConfigUtility* const argConfig,
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
UDPNetworkUtility* const argNetwork,
|
|
||||||
int* const argClientIndex,
|
|
||||||
int* const argAccountIndex,
|
|
||||||
int* const argCharacterIndex,
|
|
||||||
std::map<int, CombatData>* argCombatMap,
|
|
||||||
std::map<int, CharacterData>* argCharacterMap,
|
|
||||||
std::map<int, EnemyData>* argEnemyMap
|
|
||||||
):
|
|
||||||
config(*argConfig),
|
|
||||||
network(*argNetwork),
|
|
||||||
clientIndex(*argClientIndex),
|
|
||||||
accountIndex(*argAccountIndex),
|
|
||||||
characterIndex(*argCharacterIndex),
|
|
||||||
combatMap(*argCombatMap),
|
|
||||||
characterMap(*argCharacterMap),
|
|
||||||
enemyMap(*argEnemyMap)
|
|
||||||
{
|
|
||||||
//setup the utility objects
|
//setup the utility objects
|
||||||
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
||||||
image.SetClipH(image.GetClipH()/3);
|
image.SetClipH(image.GetClipH()/3);
|
||||||
@@ -65,19 +51,13 @@ CleanUp::CleanUp(
|
|||||||
backButton.SetText("Back");
|
backButton.SetText("Back");
|
||||||
|
|
||||||
//full reset
|
//full reset
|
||||||
network.Unbind(Channels::SERVER);
|
UDPNetworkUtility::GetSingleton().Unbind(Channels::SERVER);
|
||||||
clientIndex = -1;
|
|
||||||
accountIndex = -1;
|
|
||||||
characterIndex = -1;
|
|
||||||
combatMap.clear();
|
|
||||||
characterMap.clear();
|
|
||||||
enemyMap.clear();
|
|
||||||
|
|
||||||
//auto return
|
//auto return
|
||||||
startTick = std::chrono::steady_clock::now();
|
startTick = std::chrono::steady_clock::now();
|
||||||
}
|
}
|
||||||
|
|
||||||
CleanUp::~CleanUp() {
|
DisconnectedScreen::~DisconnectedScreen() {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,53 +65,52 @@ CleanUp::~CleanUp() {
|
|||||||
//Frame loop
|
//Frame loop
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void CleanUp::Update(double delta) {
|
void DisconnectedScreen::Update() {
|
||||||
if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(10)) {
|
if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(10)) {
|
||||||
QuitEvent();
|
SetNextScene(SceneList::MAINMENU);
|
||||||
}
|
}
|
||||||
|
|
||||||
//BUGFIX: Eat incoming packets
|
//Eat incoming packets
|
||||||
while(network.Receive());
|
while(UDPNetworkUtility::GetSingleton().Receive());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CleanUp::RenderFrame() {
|
void DisconnectedScreen::Render(SDL_Surface* const screen) {
|
||||||
SDL_FillRect(GetScreen(), 0, 0);
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
Render(GetScreen());
|
|
||||||
SDL_Flip(GetScreen());
|
|
||||||
fps.Calculate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CleanUp::Render(SDL_Surface* const screen) {
|
|
||||||
backButton.DrawTo(screen);
|
backButton.DrawTo(screen);
|
||||||
font.DrawStringTo("You have been disconnected.", screen, 50, 30);
|
font.DrawStringTo(config["client.disconnectMessage"], screen, 50, 30);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Event handlers
|
//Event handlers
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void CleanUp::QuitEvent() {
|
void DisconnectedScreen::QuitEvent() {
|
||||||
SetNextScene(SceneList::QUIT);
|
SetNextScene(SceneList::QUIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CleanUp::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
void DisconnectedScreen::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
||||||
backButton.MouseMotion(motion);
|
backButton.MouseMotion(motion);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CleanUp::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
void DisconnectedScreen::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
||||||
backButton.MouseButtonDown(button);
|
backButton.MouseButtonDown(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CleanUp::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
void DisconnectedScreen::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
||||||
if (backButton.MouseButtonUp(button) == Button::State::HOVER) {
|
if (backButton.MouseButtonUp(button) == Button::State::HOVER) {
|
||||||
SetNextScene(SceneList::MAINMENU);
|
SetNextScene(SceneList::MAINMENU);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CleanUp::KeyDown(SDL_KeyboardEvent const& key) {
|
void DisconnectedScreen::KeyDown(SDL_KeyboardEvent const& key) {
|
||||||
//
|
switch(key.keysym.sym) {
|
||||||
|
case SDLK_ESCAPE:
|
||||||
|
SetNextScene(SceneList::MAINMENU);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CleanUp::KeyUp(SDL_KeyboardEvent const& key) {
|
void DisconnectedScreen::KeyUp(SDL_KeyboardEvent const& key) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
@@ -19,50 +19,29 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#ifndef CLEANUP_HPP_
|
#ifndef DISCONNECTEDSCREEN_HPP_
|
||||||
#define CLEANUP_HPP_
|
#define DISCONNECTEDSCREEN_HPP_
|
||||||
|
|
||||||
//network
|
|
||||||
#include "udp_network_utility.hpp"
|
|
||||||
|
|
||||||
//graphics
|
//graphics
|
||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
#include "raster_font.hpp"
|
#include "raster_font.hpp"
|
||||||
#include "button.hpp"
|
#include "button.hpp"
|
||||||
|
|
||||||
//common
|
|
||||||
#include "config_utility.hpp"
|
|
||||||
#include "frame_rate.hpp"
|
|
||||||
|
|
||||||
#include "combat_data.hpp"
|
|
||||||
#include "character_data.hpp"
|
|
||||||
#include "enemy_data.hpp"
|
|
||||||
|
|
||||||
//client
|
//client
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
|
|
||||||
//std namespace
|
//std namespace
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
class CleanUp : public BaseScene {
|
class DisconnectedScreen : public BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
//Public access members
|
||||||
CleanUp(
|
DisconnectedScreen();
|
||||||
ConfigUtility* const argConfig,
|
~DisconnectedScreen();
|
||||||
UDPNetworkUtility* const argNetwork,
|
|
||||||
int* const argClientIndex,
|
|
||||||
int* const argAccountIndex,
|
|
||||||
int* const argCharacterIndex,
|
|
||||||
std::map<int, CombatData>* argCombatMap,
|
|
||||||
std::map<int, CharacterData>* argCharacterMap,
|
|
||||||
std::map<int, EnemyData>* argEnemyMap
|
|
||||||
);
|
|
||||||
~CleanUp();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//Frame loop
|
//Frame loop
|
||||||
void Update(double delta);
|
void Update();
|
||||||
void RenderFrame();
|
|
||||||
void Render(SDL_Surface* const);
|
void Render(SDL_Surface* const);
|
||||||
|
|
||||||
//Event handlers
|
//Event handlers
|
||||||
@@ -73,23 +52,12 @@ protected:
|
|||||||
void KeyDown(SDL_KeyboardEvent const&);
|
void KeyDown(SDL_KeyboardEvent const&);
|
||||||
void KeyUp(SDL_KeyboardEvent const&);
|
void KeyUp(SDL_KeyboardEvent const&);
|
||||||
|
|
||||||
//shared parameters
|
|
||||||
ConfigUtility& config;
|
|
||||||
UDPNetworkUtility& network;
|
|
||||||
int& clientIndex;
|
|
||||||
int& accountIndex;
|
|
||||||
int& characterIndex;
|
|
||||||
std::map<int, CombatData>& combatMap;
|
|
||||||
std::map<int, CharacterData>& characterMap;
|
|
||||||
std::map<int, EnemyData>& enemyMap;
|
|
||||||
|
|
||||||
//graphics
|
//graphics
|
||||||
Image image;
|
Image image;
|
||||||
RasterFont font;
|
RasterFont font;
|
||||||
|
|
||||||
//UI
|
//UI
|
||||||
Button backButton;
|
Button backButton;
|
||||||
FrameRate fps;
|
|
||||||
|
|
||||||
//auto return
|
//auto return
|
||||||
std::chrono::steady_clock::time_point startTick;
|
std::chrono::steady_clock::time_point startTick;
|
||||||
@@ -23,32 +23,23 @@
|
|||||||
|
|
||||||
#include "channels.hpp"
|
#include "channels.hpp"
|
||||||
#include "utility.hpp"
|
#include "utility.hpp"
|
||||||
|
#include "config_utility.hpp"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <stdexcept>
|
#include <iostream>
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Public access members
|
//Public access members
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
InWorld::InWorld(
|
InWorld::InWorld(int* const argClientIndex, int* const argAccountIndex):
|
||||||
ConfigUtility* const argConfig,
|
|
||||||
UDPNetworkUtility* const argNetwork,
|
|
||||||
int* const argClientIndex,
|
|
||||||
int* const argAccountIndex,
|
|
||||||
int* const argCharacterIndex,
|
|
||||||
std::map<int, CombatData>* argCombatMap,
|
|
||||||
std::map<int, CharacterData>* argCharacterMap
|
|
||||||
):
|
|
||||||
config(*argConfig),
|
|
||||||
network(*argNetwork),
|
|
||||||
clientIndex(*argClientIndex),
|
clientIndex(*argClientIndex),
|
||||||
accountIndex(*argAccountIndex),
|
accountIndex(*argAccountIndex)
|
||||||
characterIndex(*argCharacterIndex),
|
|
||||||
combatMap(*argCombatMap),
|
|
||||||
characterMap(*argCharacterMap)
|
|
||||||
{
|
{
|
||||||
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
|
|
||||||
//setup the utility objects
|
//setup the utility objects
|
||||||
buttonImage.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
buttonImage.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
||||||
buttonImage.SetClipH(buttonImage.GetClipH()/3);
|
buttonImage.SetClipH(buttonImage.GetClipH()/3);
|
||||||
@@ -72,10 +63,19 @@ InWorld::InWorld(
|
|||||||
|
|
||||||
//load the tilesheet
|
//load the tilesheet
|
||||||
//TODO: add the tilesheet to the map system?
|
//TODO: add the tilesheet to the map system?
|
||||||
tileSheet.Load(config["dir.tilesets"] + "terrain.bmp", 12, 15);
|
//TODO: Tile size and tile sheet should be loaded elsewhere
|
||||||
|
tileSheet.Load(config["dir.tilesets"] + "overworld.bmp", 32, 32);
|
||||||
|
|
||||||
|
//send this player's character info
|
||||||
|
// CharacterPacket newPacket;
|
||||||
|
// newPacket.type = SerialPacketType::CHARACTER_NEW;
|
||||||
|
// 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);
|
||||||
|
|
||||||
//request a sync
|
//request a sync
|
||||||
RequestSynchronize();
|
// RequestSynchronize();
|
||||||
|
|
||||||
//debug
|
//debug
|
||||||
//
|
//
|
||||||
@@ -93,27 +93,70 @@ void InWorld::FrameStart() {
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
void InWorld::Update(double delta) {
|
void InWorld::Update() {
|
||||||
//suck in and process all waiting packets
|
//suck in and process all waiting packets
|
||||||
SerialPacket* packetBuffer = static_cast<SerialPacket*>(malloc(MAX_PACKET_SIZE));
|
SerialPacket* packetBuffer = reinterpret_cast<SerialPacket*>(new char[MAX_PACKET_SIZE]);
|
||||||
while(network.Receive(packetBuffer)) {
|
while(network.Receive(packetBuffer)) {
|
||||||
HandlePacket(packetBuffer);
|
HandlePacket(packetBuffer);
|
||||||
}
|
}
|
||||||
free(static_cast<void*>(packetBuffer));
|
delete reinterpret_cast<char*>(packetBuffer);
|
||||||
|
|
||||||
//update the characters
|
//update the characters
|
||||||
for (auto& it : characterMap) {
|
for (auto& it : characterMap) {
|
||||||
it.second.Update(delta);
|
it.second.Update();
|
||||||
}
|
|
||||||
|
|
||||||
//update the camera
|
|
||||||
if(localCharacter) {
|
|
||||||
camera.x = localCharacter->origin.x - camera.marginX;
|
|
||||||
camera.y = localCharacter->origin.y - camera.marginY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//check the map
|
//check the map
|
||||||
UpdateMap();
|
UpdateMap();
|
||||||
|
|
||||||
|
//skip the rest
|
||||||
|
if (!localCharacter) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//check for collisions with the map
|
||||||
|
BoundingBox wallBounds = {0, 0, tileSheet.GetTileW(), tileSheet.GetTileH()};
|
||||||
|
const int xCount = localCharacter->GetBounds().w / wallBounds.w + 1;
|
||||||
|
const int yCount = localCharacter->GetBounds().h / wallBounds.h + 1;
|
||||||
|
|
||||||
|
for (int i = -1; i <= xCount; ++i) {
|
||||||
|
for (int j = -1; j <= yCount; ++j) {
|
||||||
|
//set the wall's position
|
||||||
|
wallBounds.x = wallBounds.w * i + snapToBase((double)wallBounds.w, localCharacter->GetOrigin().x);
|
||||||
|
wallBounds.y = wallBounds.h * j + snapToBase((double)wallBounds.h, localCharacter->GetOrigin().y);
|
||||||
|
|
||||||
|
if (!regionPager.GetSolid(wallBounds.x / wallBounds.w, wallBounds.y / wallBounds.h)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((localCharacter->GetOrigin() + localCharacter->GetBounds()).CheckOverlap(wallBounds)) {
|
||||||
|
localCharacter->SetOrigin(localCharacter->GetOrigin() - (localCharacter->GetMotion()));
|
||||||
|
localCharacter->SetMotion({0,0});
|
||||||
|
localCharacter->CorrectSprite();
|
||||||
|
SendPlayerUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//update the camera (following the player)
|
||||||
|
camera.x = localCharacter->GetOrigin().x - camera.marginX;
|
||||||
|
camera.y = localCharacter->GetOrigin().y - camera.marginY;
|
||||||
|
|
||||||
|
//check the connection
|
||||||
|
if (Clock::now() - lastBeat > std::chrono::seconds(3)) {
|
||||||
|
if (attemptedBeats > 2) {
|
||||||
|
RequestDisconnect();
|
||||||
|
SetNextScene(SceneList::DISCONNECTEDSCREEN);
|
||||||
|
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "Error: Lost connection to the server";
|
||||||
|
}
|
||||||
|
|
||||||
|
ServerPacket newPacket;
|
||||||
|
newPacket.type = SerialPacketType::PING;
|
||||||
|
network.SendTo(Channels::SERVER, &newPacket);
|
||||||
|
|
||||||
|
attemptedBeats++;
|
||||||
|
lastBeat = Clock::now();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InWorld::FrameEnd() {
|
void InWorld::FrameEnd() {
|
||||||
@@ -136,6 +179,7 @@ void InWorld::Render(SDL_Surface* const screen) {
|
|||||||
//draw characters
|
//draw characters
|
||||||
for (auto& it : characterMap) {
|
for (auto& it : characterMap) {
|
||||||
//BUG: #29 drawing order according to Y origin
|
//BUG: #29 drawing order according to Y origin
|
||||||
|
//TODO: use a list of renderable objects
|
||||||
it.second.DrawTo(screen, camera.x, camera.y);
|
it.second.DrawTo(screen, camera.x, camera.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,86 +210,76 @@ void InWorld::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void InWorld::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
void InWorld::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
||||||
if (disconnectButton.MouseButtonUp(button) == Button::State::HOVER) {
|
if (disconnectButton.MouseButtonUp(button) == Button::State::HOVER && button.button == SDL_BUTTON_LEFT) {
|
||||||
RequestDisconnect();
|
RequestDisconnect();
|
||||||
}
|
}
|
||||||
if (shutDownButton.MouseButtonUp(button) == Button::State::HOVER) {
|
if (shutDownButton.MouseButtonUp(button) == Button::State::HOVER && button.button == SDL_BUTTON_LEFT) {
|
||||||
RequestShutDown();
|
RequestShutDown();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InWorld::KeyDown(SDL_KeyboardEvent const& key) {
|
void InWorld::KeyDown(SDL_KeyboardEvent const& key) {
|
||||||
|
if (!localCharacter) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//hotkeys
|
||||||
switch(key.keysym.sym) {
|
switch(key.keysym.sym) {
|
||||||
//player movement
|
case SDLK_ESCAPE:
|
||||||
case SDLK_LEFT:
|
RequestDisconnect();
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->motion.x -= CHARACTER_WALKING_SPEED;
|
|
||||||
localCharacter->CorrectSprite();
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDLK_RIGHT:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->motion.x += CHARACTER_WALKING_SPEED;
|
|
||||||
localCharacter->CorrectSprite();
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDLK_UP:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->motion.y -= CHARACTER_WALKING_SPEED;
|
|
||||||
localCharacter->CorrectSprite();
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDLK_DOWN:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->motion.y += CHARACTER_WALKING_SPEED;
|
|
||||||
localCharacter->CorrectSprite();
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//player movement
|
||||||
|
Vector2 motion = localCharacter->GetMotion();
|
||||||
|
switch(key.keysym.sym) {
|
||||||
|
case SDLK_LEFT:
|
||||||
|
motion.x -= CHARACTER_WALKING_SPEED;
|
||||||
|
break;
|
||||||
|
case SDLK_RIGHT:
|
||||||
|
motion.x += CHARACTER_WALKING_SPEED;
|
||||||
|
break;
|
||||||
|
case SDLK_UP:
|
||||||
|
motion.y -= CHARACTER_WALKING_SPEED;
|
||||||
|
break;
|
||||||
|
case SDLK_DOWN:
|
||||||
|
motion.y += CHARACTER_WALKING_SPEED;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
localCharacter->SetMotion(motion);
|
||||||
|
localCharacter->CorrectSprite();
|
||||||
|
SendPlayerUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void InWorld::KeyUp(SDL_KeyboardEvent const& key) {
|
void InWorld::KeyUp(SDL_KeyboardEvent const& key) {
|
||||||
switch(key.keysym.sym) {
|
if (!localCharacter) {
|
||||||
//player movement
|
return;
|
||||||
case SDLK_LEFT:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->motion.x += CHARACTER_WALKING_SPEED;
|
|
||||||
localCharacter->CorrectSprite();
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDLK_RIGHT:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->motion.x -= CHARACTER_WALKING_SPEED;
|
|
||||||
localCharacter->CorrectSprite();
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDLK_UP:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->motion.y += CHARACTER_WALKING_SPEED;
|
|
||||||
localCharacter->CorrectSprite();
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDLK_DOWN:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->motion.y -= CHARACTER_WALKING_SPEED;
|
|
||||||
localCharacter->CorrectSprite();
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//player movement
|
||||||
|
Vector2 motion = localCharacter->GetMotion();
|
||||||
|
switch(key.keysym.sym) {
|
||||||
|
//NOTE: The use of min/max here are to prevent awkward movements
|
||||||
|
case SDLK_LEFT:
|
||||||
|
motion.x = std::min(motion.x + CHARACTER_WALKING_SPEED, 0.0);
|
||||||
|
break;
|
||||||
|
case SDLK_RIGHT:
|
||||||
|
motion.x = std::max(motion.x - CHARACTER_WALKING_SPEED, 0.0);
|
||||||
|
break;
|
||||||
|
case SDLK_UP:
|
||||||
|
motion.y = std::min(motion.y + CHARACTER_WALKING_SPEED, 0.0);
|
||||||
|
break;
|
||||||
|
case SDLK_DOWN:
|
||||||
|
motion.y = std::max(motion.y - CHARACTER_WALKING_SPEED, 0.0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
localCharacter->SetMotion(motion);
|
||||||
|
localCharacter->CorrectSprite();
|
||||||
|
SendPlayerUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
@@ -254,21 +288,55 @@ void InWorld::KeyUp(SDL_KeyboardEvent const& key) {
|
|||||||
|
|
||||||
void InWorld::HandlePacket(SerialPacket* const argPacket) {
|
void InWorld::HandlePacket(SerialPacket* const argPacket) {
|
||||||
switch(argPacket->type) {
|
switch(argPacket->type) {
|
||||||
case SerialPacketType::DISCONNECT:
|
//heartbeat system
|
||||||
HandleDisconnect(argPacket);
|
case SerialPacketType::PING: {
|
||||||
|
ServerPacket newPacket;
|
||||||
|
newPacket.type = SerialPacketType::PONG;
|
||||||
|
network.SendTo(argPacket->srcAddress, &newPacket);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SerialPacketType::CHARACTER_NEW:
|
case SerialPacketType::PONG:
|
||||||
HandleCharacterNew(static_cast<CharacterPacket*>(argPacket));
|
// HandlePong(static_cast<ServerPacket*>(argPacket));
|
||||||
break;
|
break;
|
||||||
case SerialPacketType::CHARACTER_DELETE:
|
|
||||||
HandleCharacterDelete(static_cast<CharacterPacket*>(argPacket));
|
//game server connections
|
||||||
|
case SerialPacketType::LOGOUT_RESPONSE:
|
||||||
|
// HandleLogoutResponse(static_cast<ClientPacket*>(argPacket));
|
||||||
break;
|
break;
|
||||||
case SerialPacketType::CHARACTER_UPDATE:
|
case SerialPacketType::DISCONNECT_REQUEST:
|
||||||
HandleCharacterUpdate(static_cast<CharacterPacket*>(argPacket));
|
// HandleDisconnectRequest(static_cast<ClientPacket*>(argPacket));
|
||||||
break;
|
break;
|
||||||
|
case SerialPacketType::DISCONNECT_FORCED:
|
||||||
|
// HandleDisconnectForced(static_cast<ClientPacket*>(argPacket));
|
||||||
|
break;
|
||||||
|
|
||||||
|
//data management
|
||||||
case SerialPacketType::REGION_CONTENT:
|
case SerialPacketType::REGION_CONTENT:
|
||||||
HandleRegionContent(static_cast<RegionPacket*>(argPacket));
|
// HandleRegionContent(static_cast<RegionPacket*>(argPacket));
|
||||||
break;
|
break;
|
||||||
|
// case SerialPacketType::QUERY_CHARACTER_EXISTS:
|
||||||
|
// case SerialPacketType::QUERY_CHARACTER_STATS:
|
||||||
|
// case SerialPacketType::QUERY_CHARACTER_LOCATION:
|
||||||
|
|
||||||
|
//character management
|
||||||
|
// case SerialPacketType::CHARACTER_NEW:
|
||||||
|
// HandleCharacterNew(static_cast<CharacterPacket*>(argPacket));
|
||||||
|
// break;
|
||||||
|
// case SerialPacketType::CHARACTER_DELETE:
|
||||||
|
// HandleCharacterDelete(static_cast<CharacterPacket*>(argPacket));
|
||||||
|
// break;
|
||||||
|
// case SerialPacketType::CHARACTER_UPDATE:
|
||||||
|
// HandleCharacterUpdate(static_cast<CharacterPacket*>(argPacket));
|
||||||
|
// break;
|
||||||
|
// case SerialPacketType::CHARACTER_REJECTION:
|
||||||
|
// HandleCharacterRejection(static_cast<TextPacket*>(argPacket));
|
||||||
|
// break;
|
||||||
|
|
||||||
|
//enemy management
|
||||||
|
//TODO: enemy management
|
||||||
|
|
||||||
|
//TODO: text
|
||||||
|
|
||||||
//handle errors
|
//handle errors
|
||||||
default:
|
default:
|
||||||
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in InWorld: " + to_string_custom(static_cast<int>(argPacket->type)) ));
|
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in InWorld: " + to_string_custom(static_cast<int>(argPacket->type)) ));
|
||||||
@@ -276,8 +344,19 @@ void InWorld::HandlePacket(SerialPacket* const argPacket) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InWorld::HandleDisconnect(SerialPacket* const argPacket) {
|
void InWorld::HandlePong(ServerPacket* const argPacket) {
|
||||||
SetNextScene(SceneList::CLEANUP);
|
if (network.GetIPAddress(Channels::SERVER)->host != argPacket->srcAddress.host) {
|
||||||
|
throw(std::runtime_error("Heartbeat message received from an unknown source"));
|
||||||
|
}
|
||||||
|
|
||||||
|
attemptedBeats = 0;
|
||||||
|
lastBeat = Clock::now();
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::HandleDisconnect(ClientPacket* const argPacket) {
|
||||||
|
//TODO: More needed in the disconnection
|
||||||
|
SetNextScene(SceneList::DISCONNECTEDSCREEN);
|
||||||
|
ConfigUtility::GetSingleton()["client.disconnectMessage"] = "You have been disconnected";
|
||||||
}
|
}
|
||||||
|
|
||||||
void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) {
|
void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) {
|
||||||
@@ -286,36 +365,46 @@ void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//create the character object
|
//create the character object
|
||||||
CharacterData& character = characterMap[argPacket->characterIndex];
|
BaseCharacter& newCharacter = characterMap[argPacket->characterIndex];
|
||||||
|
|
||||||
//set the members
|
//fill out the character's members
|
||||||
character.handle = argPacket->handle;
|
newCharacter.SetHandle(argPacket->handle);
|
||||||
character.avatar = argPacket->avatar;
|
newCharacter.SetAvatar(argPacket->avatar);
|
||||||
character.sprite.LoadSurface(config["dir.sprites"] + character.avatar, 4, 4);
|
|
||||||
character.roomIndex = argPacket->roomIndex;
|
|
||||||
character.origin = argPacket->origin;
|
|
||||||
character.motion = argPacket->motion;
|
|
||||||
character.stats = argPacket->stats;
|
|
||||||
|
|
||||||
character.CorrectSprite();
|
newCharacter.GetSprite()->LoadSurface(ConfigUtility::GetSingleton()["dir.sprites"] + newCharacter.GetAvatar(), 4, 4);
|
||||||
|
|
||||||
|
newCharacter.SetOrigin(argPacket->origin);
|
||||||
|
newCharacter.SetMotion(argPacket->motion);
|
||||||
|
newCharacter.SetBounds({
|
||||||
|
CHARACTER_BOUNDS_X,
|
||||||
|
CHARACTER_BOUNDS_Y,
|
||||||
|
CHARACTER_BOUNDS_WIDTH,
|
||||||
|
CHARACTER_BOUNDS_HEIGHT
|
||||||
|
});
|
||||||
|
|
||||||
|
// (*newCharacter.GetBaseStats()) = argPacket->stats;
|
||||||
|
|
||||||
|
//bookkeeping code
|
||||||
|
newCharacter.CorrectSprite();
|
||||||
|
|
||||||
//catch this client's player object
|
//catch this client's player object
|
||||||
if (argPacket->accountIndex == accountIndex && !localCharacter) {
|
if (argPacket->accountIndex == accountIndex && !localCharacter) {
|
||||||
characterIndex = argPacket->characterIndex;
|
characterIndex = argPacket->characterIndex;
|
||||||
localCharacter = &character;
|
localCharacter = &newCharacter;
|
||||||
|
|
||||||
//setup the camera
|
//setup the camera
|
||||||
camera.width = GetScreen()->w;
|
camera.width = GetScreen()->w;
|
||||||
camera.height = GetScreen()->h;
|
camera.height = GetScreen()->h;
|
||||||
|
|
||||||
//center on the player's character
|
//center on the player's character
|
||||||
camera.marginX = (GetScreen()->w / 2 - localCharacter->sprite.GetImage()->GetClipW() / 2);
|
camera.marginX = (GetScreen()->w / 2 - localCharacter->GetSprite()->GetImage()->GetClipW() / 2);
|
||||||
camera.marginY = (GetScreen()->h / 2 - localCharacter->sprite.GetImage()->GetClipH() / 2);
|
camera.marginY = (GetScreen()->h / 2 - localCharacter->GetSprite()->GetImage()->GetClipH() / 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) {
|
void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) {
|
||||||
//TODO: authenticate when own character is being deleted (linked to a TODO in the server)
|
//TODO: authenticate when own character is being deleted (linked to a TODO in the server)
|
||||||
|
|
||||||
//catch this client's player object
|
//catch this client's player object
|
||||||
if (argPacket->characterIndex == characterIndex) {
|
if (argPacket->characterIndex == characterIndex) {
|
||||||
characterIndex = -1;
|
characterIndex = -1;
|
||||||
@@ -331,17 +420,24 @@ void InWorld::HandleCharacterUpdate(CharacterPacket* const argPacket) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CharacterData& character = characterMap[argPacket->characterIndex];
|
BaseCharacter& character = characterMap[argPacket->characterIndex];
|
||||||
|
|
||||||
//other characters moving
|
//other characters moving
|
||||||
if (argPacket->characterIndex != characterIndex) {
|
if (argPacket->characterIndex != characterIndex) {
|
||||||
character.roomIndex = argPacket->roomIndex;
|
character.SetOrigin(argPacket->origin);
|
||||||
character.origin = argPacket->origin;
|
character.SetMotion(argPacket->motion);
|
||||||
character.motion = argPacket->motion;
|
|
||||||
character.CorrectSprite();
|
character.CorrectSprite();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InWorld::HandleCharacterRejection(TextPacket* const argPacket) {
|
||||||
|
RequestDisconnect();
|
||||||
|
SetNextScene(SceneList::DISCONNECTEDSCREEN);
|
||||||
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
|
config["client.disconnectMessage"] = "Error: ";
|
||||||
|
config["client.disconnectMessage"] += argPacket->text;
|
||||||
|
}
|
||||||
|
|
||||||
void InWorld::HandleRegionContent(RegionPacket* const argPacket) {
|
void InWorld::HandleRegionContent(RegionPacket* const argPacket) {
|
||||||
//replace existing regions
|
//replace existing regions
|
||||||
regionPager.UnloadRegion(argPacket->x, argPacket->y);
|
regionPager.UnloadRegion(argPacket->x, argPacket->y);
|
||||||
@@ -357,29 +453,31 @@ void InWorld::HandleRegionContent(RegionPacket* const argPacket) {
|
|||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void InWorld::RequestSynchronize() {
|
void InWorld::RequestSynchronize() {
|
||||||
ClientPacket newPacket;
|
// ClientPacket newPacket;
|
||||||
|
|
||||||
//request a sync
|
//request a sync
|
||||||
newPacket.type = SerialPacketType::SYNCHRONIZE;
|
// newPacket.type = SerialPacketType::SYNCHRONIZE;
|
||||||
newPacket.clientIndex = clientIndex;
|
// newPacket.clientIndex = clientIndex;
|
||||||
newPacket.accountIndex = accountIndex;
|
// newPacket.accountIndex = accountIndex;
|
||||||
|
|
||||||
network.SendTo(Channels::SERVER, &newPacket);
|
//TODO: location, range for sync request
|
||||||
|
|
||||||
|
// network.SendTo(Channels::SERVER, &newPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InWorld::SendPlayerUpdate() {
|
void InWorld::SendPlayerUpdate() {
|
||||||
CharacterPacket newPacket;
|
CharacterPacket newPacket;
|
||||||
|
|
||||||
//pack the packet
|
//pack the packet
|
||||||
newPacket.type = SerialPacketType::CHARACTER_UPDATE;
|
// newPacket.type = SerialPacketType::CHARACTER_UPDATE;
|
||||||
|
|
||||||
newPacket.characterIndex = characterIndex;
|
newPacket.characterIndex = characterIndex;
|
||||||
//handle, avatar
|
//NOTE: omitting the handle and avatar here
|
||||||
newPacket.accountIndex = accountIndex;
|
newPacket.accountIndex = accountIndex;
|
||||||
newPacket.roomIndex = localCharacter->roomIndex;
|
newPacket.roomIndex = 0; //TODO: room index
|
||||||
newPacket.origin = localCharacter->origin;
|
newPacket.origin = localCharacter->GetOrigin();
|
||||||
newPacket.motion = localCharacter->motion;
|
newPacket.motion = localCharacter->GetMotion();
|
||||||
newPacket.stats = localCharacter->stats;
|
// newPacket.stats = *localCharacter->GetBaseStats();
|
||||||
|
|
||||||
//TODO: gameplay components: equipment, items, buffs, debuffs
|
//TODO: gameplay components: equipment, items, buffs, debuffs
|
||||||
|
|
||||||
@@ -390,7 +488,7 @@ void InWorld::RequestDisconnect() {
|
|||||||
ClientPacket newPacket;
|
ClientPacket newPacket;
|
||||||
|
|
||||||
//send a disconnect request
|
//send a disconnect request
|
||||||
newPacket.type = SerialPacketType::DISCONNECT;
|
newPacket.type = SerialPacketType::DISCONNECT_REQUEST;
|
||||||
newPacket.clientIndex = clientIndex;
|
newPacket.clientIndex = clientIndex;
|
||||||
newPacket.accountIndex = accountIndex;
|
newPacket.accountIndex = accountIndex;
|
||||||
|
|
||||||
@@ -401,7 +499,7 @@ void InWorld::RequestShutDown() {
|
|||||||
ClientPacket newPacket;
|
ClientPacket newPacket;
|
||||||
|
|
||||||
//send a shutdown request
|
//send a shutdown request
|
||||||
newPacket.type = SerialPacketType::SHUTDOWN;
|
newPacket.type = SerialPacketType::SHUTDOWN_REQUEST;
|
||||||
newPacket.clientIndex = clientIndex;
|
newPacket.clientIndex = clientIndex;
|
||||||
newPacket.accountIndex = accountIndex;
|
newPacket.accountIndex = accountIndex;
|
||||||
|
|
||||||
@@ -435,7 +533,7 @@ void InWorld::UpdateMap() {
|
|||||||
|
|
||||||
//prune distant regions
|
//prune distant regions
|
||||||
for (std::list<Region>::iterator it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); /* EMPTY */) {
|
for (std::list<Region>::iterator it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); /* EMPTY */) {
|
||||||
//check if the region is outside off this area
|
//check if the region is outside of this area
|
||||||
if (it->GetX() < xStart || it->GetX() > xEnd || it->GetY() < yStart || it->GetY() > yEnd) {
|
if (it->GetX() < xStart || it->GetX() > xEnd || it->GetY() < yStart || it->GetY() > yEnd) {
|
||||||
|
|
||||||
//clunky, but the alternative was time consuming
|
//clunky, but the alternative was time consuming
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
//networking
|
//networking
|
||||||
#include "udp_network_utility.hpp"
|
#include "udp_network_utility.hpp"
|
||||||
|
#include "serial_packet.hpp"
|
||||||
|
|
||||||
//graphics
|
//graphics
|
||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
@@ -35,11 +36,10 @@
|
|||||||
#include "tile_sheet.hpp"
|
#include "tile_sheet.hpp"
|
||||||
|
|
||||||
//common
|
//common
|
||||||
#include "config_utility.hpp"
|
|
||||||
#include "frame_rate.hpp"
|
#include "frame_rate.hpp"
|
||||||
|
|
||||||
#include "combat_data.hpp"
|
#include "base_character.hpp"
|
||||||
#include "character_data.hpp"
|
#include "base_monster.hpp"
|
||||||
|
|
||||||
//client
|
//client
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
@@ -47,24 +47,18 @@
|
|||||||
//STL
|
//STL
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
class InWorld : public BaseScene {
|
class InWorld : public BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
//Public access members
|
||||||
InWorld(
|
InWorld(int* const argClientIndex, int* const argAccountIndex);
|
||||||
ConfigUtility* const argConfig,
|
|
||||||
UDPNetworkUtility* const argNetwork,
|
|
||||||
int* const argClientIndex,
|
|
||||||
int* const argAccountIndex,
|
|
||||||
int* const argCharacterIndex,
|
|
||||||
std::map<int, CombatData>* argCombatMap,
|
|
||||||
std::map<int, CharacterData>* argCharacterMap
|
|
||||||
);
|
|
||||||
~InWorld();
|
~InWorld();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//Frame loop
|
//Frame loop
|
||||||
void FrameStart();
|
void FrameStart();
|
||||||
void Update(double delta);
|
void Update();
|
||||||
void FrameEnd();
|
void FrameEnd();
|
||||||
void RenderFrame();
|
void RenderFrame();
|
||||||
void Render(SDL_Surface* const);
|
void Render(SDL_Surface* const);
|
||||||
@@ -79,10 +73,12 @@ protected:
|
|||||||
|
|
||||||
//Network handlers
|
//Network handlers
|
||||||
void HandlePacket(SerialPacket* const);
|
void HandlePacket(SerialPacket* const);
|
||||||
void HandleDisconnect(SerialPacket* const);
|
void HandlePong(ServerPacket* const);
|
||||||
|
void HandleDisconnect(ClientPacket* const);
|
||||||
void HandleCharacterNew(CharacterPacket* const);
|
void HandleCharacterNew(CharacterPacket* const);
|
||||||
void HandleCharacterDelete(CharacterPacket* const);
|
void HandleCharacterDelete(CharacterPacket* const);
|
||||||
void HandleCharacterUpdate(CharacterPacket* const);
|
void HandleCharacterUpdate(CharacterPacket* const);
|
||||||
|
void HandleCharacterRejection(TextPacket* const);
|
||||||
void HandleRegionContent(RegionPacket* const);
|
void HandleRegionContent(RegionPacket* const);
|
||||||
|
|
||||||
//Server control
|
//Server control
|
||||||
@@ -95,14 +91,13 @@ protected:
|
|||||||
//utilities
|
//utilities
|
||||||
void UpdateMap();
|
void UpdateMap();
|
||||||
|
|
||||||
//shared parameters
|
//singleton shortcut
|
||||||
ConfigUtility& config;
|
UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton();
|
||||||
UDPNetworkUtility& network;
|
|
||||||
|
//indexes
|
||||||
int& clientIndex;
|
int& clientIndex;
|
||||||
int& accountIndex;
|
int& accountIndex;
|
||||||
int& characterIndex;
|
int characterIndex = -1;
|
||||||
std::map<int, CombatData>& combatMap;
|
|
||||||
std::map<int, CharacterData>& characterMap;
|
|
||||||
|
|
||||||
//graphics
|
//graphics
|
||||||
Image buttonImage;
|
Image buttonImage;
|
||||||
@@ -115,16 +110,25 @@ protected:
|
|||||||
//UI
|
//UI
|
||||||
Button disconnectButton;
|
Button disconnectButton;
|
||||||
Button shutDownButton;
|
Button shutDownButton;
|
||||||
//TODO: Review the camera
|
FrameRate fps;
|
||||||
|
|
||||||
|
//the camera structure
|
||||||
struct {
|
struct {
|
||||||
int x = 0, y = 0;
|
int x = 0, y = 0;
|
||||||
int width = 0, height = 0;
|
int width = 0, height = 0;
|
||||||
int marginX = 0, marginY = 0;
|
int marginX = 0, marginY = 0;
|
||||||
} camera;
|
} camera;
|
||||||
FrameRate fps;
|
|
||||||
|
|
||||||
//game
|
//game components
|
||||||
CharacterData* localCharacter = nullptr;
|
BaseCharacter* localCharacter = nullptr;
|
||||||
|
std::map<int, BaseCharacter> characterMap;
|
||||||
|
std::map<int, BaseMonster> monsterMap;
|
||||||
|
|
||||||
|
//heartbeat
|
||||||
|
//TODO: This needs it's own utility, for both InWorld and InCombat
|
||||||
|
typedef std::chrono::steady_clock Clock;
|
||||||
|
Clock::time_point lastBeat = Clock::now();
|
||||||
|
int attemptedBeats = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -30,17 +30,14 @@
|
|||||||
//Public access members
|
//Public access members
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
LobbyMenu::LobbyMenu(
|
LobbyMenu::LobbyMenu(int* const argClientIndex, int* const argAccountIndex):
|
||||||
ConfigUtility* const argConfig,
|
|
||||||
UDPNetworkUtility* const argNetwork,
|
|
||||||
int* const argClientIndex,
|
|
||||||
int* const argAccountIndex
|
|
||||||
):
|
|
||||||
config(*argConfig),
|
|
||||||
network(*argNetwork),
|
|
||||||
clientIndex(*argClientIndex),
|
clientIndex(*argClientIndex),
|
||||||
accountIndex(*argAccountIndex)
|
accountIndex(*argAccountIndex)
|
||||||
{
|
{
|
||||||
|
//preemptive reset
|
||||||
|
clientIndex = -1;
|
||||||
|
accountIndex = -1;
|
||||||
|
|
||||||
//setup the utility objects
|
//setup the utility objects
|
||||||
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
||||||
image.SetClipH(image.GetClipH()/3);
|
image.SetClipH(image.GetClipH()/3);
|
||||||
@@ -70,8 +67,11 @@ LobbyMenu::LobbyMenu(
|
|||||||
//set the server list's position
|
//set the server list's position
|
||||||
listBox = {300, 50, 200, font.GetCharH()};
|
listBox = {300, 50, 200, font.GetCharH()};
|
||||||
|
|
||||||
//BUGFIX: Eat incoming packets
|
//Eat incoming packets
|
||||||
while(network.Receive());
|
while(network.Receive());
|
||||||
|
|
||||||
|
//Initial broadcast
|
||||||
|
SendBroadcastRequest();
|
||||||
}
|
}
|
||||||
|
|
||||||
LobbyMenu::~LobbyMenu() {
|
LobbyMenu::~LobbyMenu() {
|
||||||
@@ -86,13 +86,13 @@ void LobbyMenu::FrameStart() {
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::Update(double delta) {
|
void LobbyMenu::Update() {
|
||||||
//suck in and process all waiting packets
|
//suck in and process all waiting packets
|
||||||
SerialPacket* packetBuffer = static_cast<SerialPacket*>(malloc(MAX_PACKET_SIZE));
|
SerialPacket* packetBuffer = reinterpret_cast<SerialPacket*>(new char[MAX_PACKET_SIZE]);
|
||||||
while(network.Receive(packetBuffer)) {
|
while(network.Receive(packetBuffer)) {
|
||||||
HandlePacket(packetBuffer);
|
HandlePacket(packetBuffer);
|
||||||
}
|
}
|
||||||
free(static_cast<void*>(packetBuffer));
|
delete reinterpret_cast<char*>(packetBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::FrameEnd() {
|
void LobbyMenu::FrameEnd() {
|
||||||
@@ -111,9 +111,12 @@ void LobbyMenu::Render(SDL_Surface* const screen) {
|
|||||||
for (int i = 0; i < serverInfo.size(); i++) {
|
for (int i = 0; i < serverInfo.size(); i++) {
|
||||||
//draw the selected server's highlight
|
//draw the selected server's highlight
|
||||||
if (selection == &serverInfo[i]) {
|
if (selection == &serverInfo[i]) {
|
||||||
SDL_Rect r = listBox;
|
SDL_Rect r = {
|
||||||
|
(Sint16)listBox.x, (Sint16)listBox.y,
|
||||||
|
(Uint16)listBox.w, (Uint16)listBox.h
|
||||||
|
};
|
||||||
r.y += i * listBox.h;
|
r.y += i * listBox.h;
|
||||||
SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 255, 127, 39));
|
SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 49, 150, 5));
|
||||||
}
|
}
|
||||||
|
|
||||||
//draw the server name
|
//draw the server name
|
||||||
@@ -149,39 +152,19 @@ void LobbyMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
|||||||
|
|
||||||
void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
||||||
if (search.MouseButtonUp(button) == Button::State::HOVER) {
|
if (search.MouseButtonUp(button) == Button::State::HOVER) {
|
||||||
//broadcast to the network, or a specific server
|
SendBroadcastRequest();
|
||||||
SerialPacket packet;
|
|
||||||
packet.type = SerialPacketType::BROADCAST_REQUEST;
|
|
||||||
network.SendTo(config["server.host"].c_str(), config.Int("server.port"), &packet);
|
|
||||||
|
|
||||||
//reset the server list
|
|
||||||
serverInfo.clear();
|
|
||||||
selection = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) {
|
else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) {
|
||||||
//pack the packet
|
SendJoinRequest();
|
||||||
ClientPacket packet;
|
|
||||||
packet.type = SerialPacketType::JOIN_REQUEST;
|
|
||||||
strncpy(packet.username, config["client.username"].c_str(), PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//join the selected server
|
|
||||||
network.SendTo(&selection->address, &packet);
|
|
||||||
selection = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (back.MouseButtonUp(button) == Button::State::HOVER) {
|
else if (back.MouseButtonUp(button) == Button::State::HOVER) {
|
||||||
SetNextScene(SceneList::MAINMENU);
|
SetNextScene(SceneList::MAINMENU);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (
|
//has the user selected a server on the list?
|
||||||
//has the user selected a server on the list?
|
BoundingBox tmpBox = listBox;
|
||||||
//TODO: replace with regular collision checker
|
tmpBox.h *= serverInfo.size();
|
||||||
button.x > listBox.x &&
|
if (tmpBox.CheckOverlap({button.x, button.y})) {
|
||||||
button.x < listBox.x + listBox.w &&
|
|
||||||
button.y > listBox.y &&
|
|
||||||
button.y < listBox.y + listBox.h * serverInfo.size()
|
|
||||||
) {
|
|
||||||
selection = &serverInfo[(button.y - listBox.y)/listBox.h];
|
selection = &serverInfo[(button.y - listBox.y)/listBox.h];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -190,7 +173,11 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::KeyDown(SDL_KeyboardEvent const& key) {
|
void LobbyMenu::KeyDown(SDL_KeyboardEvent const& key) {
|
||||||
//
|
switch(key.keysym.sym) {
|
||||||
|
case SDLK_ESCAPE:
|
||||||
|
SetNextScene(SceneList::MAINMENU);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) {
|
void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) {
|
||||||
@@ -203,12 +190,25 @@ void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) {
|
|||||||
|
|
||||||
void LobbyMenu::HandlePacket(SerialPacket* const argPacket) {
|
void LobbyMenu::HandlePacket(SerialPacket* const argPacket) {
|
||||||
switch(argPacket->type) {
|
switch(argPacket->type) {
|
||||||
|
//responses
|
||||||
case SerialPacketType::BROADCAST_RESPONSE:
|
case SerialPacketType::BROADCAST_RESPONSE:
|
||||||
HandleBroadcastResponse(static_cast<ServerPacket*>(argPacket));
|
HandleBroadcastResponse(static_cast<ServerPacket*>(argPacket));
|
||||||
break;
|
break;
|
||||||
case SerialPacketType::JOIN_RESPONSE:
|
case SerialPacketType::JOIN_RESPONSE:
|
||||||
HandleJoinResponse(static_cast<ClientPacket*>(argPacket));
|
HandleJoinResponse(static_cast<ClientPacket*>(argPacket));
|
||||||
break;
|
break;
|
||||||
|
case SerialPacketType::LOGIN_RESPONSE:
|
||||||
|
HandleLoginResponse(static_cast<ClientPacket*>(argPacket));
|
||||||
|
break;
|
||||||
|
|
||||||
|
//rejections
|
||||||
|
case SerialPacketType::JOIN_REJECTION:
|
||||||
|
HandleJoinRejection(static_cast<TextPacket*>(argPacket));
|
||||||
|
break;
|
||||||
|
case SerialPacketType::LOGIN_REJECTION:
|
||||||
|
HandleLoginRejection(static_cast<TextPacket*>(argPacket));
|
||||||
|
break;
|
||||||
|
|
||||||
//handle errors
|
//handle errors
|
||||||
default:
|
default:
|
||||||
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in LobbyMenu: " + to_string_custom(static_cast<int>(argPacket->type)) ));
|
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in LobbyMenu: " + to_string_custom(static_cast<int>(argPacket->type)) ));
|
||||||
@@ -232,16 +232,61 @@ void LobbyMenu::HandleBroadcastResponse(ServerPacket* const argPacket) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::HandleJoinResponse(ClientPacket* const argPacket) {
|
void LobbyMenu::HandleJoinResponse(ClientPacket* const argPacket) {
|
||||||
|
//save the server's data
|
||||||
clientIndex = argPacket->clientIndex;
|
clientIndex = argPacket->clientIndex;
|
||||||
accountIndex = argPacket->accountIndex;
|
network.Bind(argPacket->srcAddress, Channels::SERVER);
|
||||||
network.Bind(&argPacket->srcAddress, Channels::SERVER);
|
|
||||||
SetNextScene(SceneList::INWORLD);
|
|
||||||
|
|
||||||
//send this player's character info
|
//request login data
|
||||||
CharacterPacket newPacket;
|
SendLoginRequest();
|
||||||
newPacket.type = SerialPacketType::CHARACTER_NEW;
|
}
|
||||||
strncpy(newPacket.handle, config["client.handle"].c_str(), PACKET_STRING_SIZE);
|
|
||||||
strncpy(newPacket.avatar, config["client.avatar"].c_str(), PACKET_STRING_SIZE);
|
void LobbyMenu::HandleLoginResponse(ClientPacket* const argPacket) {
|
||||||
newPacket.accountIndex = accountIndex;
|
if (argPacket->clientIndex != clientIndex) {
|
||||||
network.SendTo(Channels::SERVER, &newPacket);
|
throw(std::runtime_error("Client index invalid during login"));
|
||||||
}
|
}
|
||||||
|
accountIndex = argPacket->accountIndex;
|
||||||
|
SetNextScene(SceneList::INWORLD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LobbyMenu::HandleJoinRejection(TextPacket* const argPacket) {
|
||||||
|
//TODO: Better output for join rejection
|
||||||
|
}
|
||||||
|
|
||||||
|
void LobbyMenu::HandleLoginRejection(TextPacket* const argPacket) {
|
||||||
|
//TODO: Better output for login rejection
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//server control
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
void LobbyMenu::SendBroadcastRequest() {
|
||||||
|
//broadcast to the network, or a specific server
|
||||||
|
ClientPacket packet;
|
||||||
|
packet.type = SerialPacketType::BROADCAST_REQUEST;
|
||||||
|
network.SendTo(config["server.host"].c_str(), config.Int("server.port"), &packet);
|
||||||
|
|
||||||
|
//reset the server list
|
||||||
|
serverInfo.clear();
|
||||||
|
selection = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LobbyMenu::SendJoinRequest() {
|
||||||
|
//pack the packet
|
||||||
|
ClientPacket packet;
|
||||||
|
packet.type = SerialPacketType::JOIN_REQUEST;
|
||||||
|
|
||||||
|
//join the selected server
|
||||||
|
network.SendTo(selection->address, &packet);
|
||||||
|
selection = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LobbyMenu::SendLoginRequest() {
|
||||||
|
//NOTE: high cohesion
|
||||||
|
ClientPacket packet;
|
||||||
|
packet.type = SerialPacketType::LOGIN_REQUEST;
|
||||||
|
packet.clientIndex = clientIndex;
|
||||||
|
strncpy(packet.username, config["client.username"].c_str(), PACKET_STRING_SIZE);
|
||||||
|
|
||||||
|
network.SendTo(Channels::SERVER, &packet);
|
||||||
|
}
|
||||||
@@ -26,10 +26,12 @@
|
|||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
#include "raster_font.hpp"
|
#include "raster_font.hpp"
|
||||||
#include "button.hpp"
|
#include "button.hpp"
|
||||||
|
#include "bounding_box.hpp"
|
||||||
|
|
||||||
//utilities
|
//utilities
|
||||||
#include "config_utility.hpp"
|
#include "config_utility.hpp"
|
||||||
#include "udp_network_utility.hpp"
|
#include "udp_network_utility.hpp"
|
||||||
|
#include "serial_packet.hpp"
|
||||||
|
|
||||||
//client
|
//client
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
@@ -40,18 +42,13 @@
|
|||||||
class LobbyMenu : public BaseScene {
|
class LobbyMenu : public BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
//Public access members
|
||||||
LobbyMenu(
|
LobbyMenu(int* const argClientIndex, int* const argAccountIndex);
|
||||||
ConfigUtility* const argConfig,
|
|
||||||
UDPNetworkUtility* const argNetwork,
|
|
||||||
int* const argClientIndex,
|
|
||||||
int* const argAccountIndex
|
|
||||||
);
|
|
||||||
~LobbyMenu();
|
~LobbyMenu();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//Frame loop
|
//Frame loop
|
||||||
void FrameStart();
|
void FrameStart();
|
||||||
void Update(double delta);
|
void Update();
|
||||||
void FrameEnd();
|
void FrameEnd();
|
||||||
void Render(SDL_Surface* const);
|
void Render(SDL_Surface* const);
|
||||||
|
|
||||||
@@ -66,10 +63,18 @@ protected:
|
|||||||
void HandlePacket(SerialPacket* const);
|
void HandlePacket(SerialPacket* const);
|
||||||
void HandleBroadcastResponse(ServerPacket* const);
|
void HandleBroadcastResponse(ServerPacket* const);
|
||||||
void HandleJoinResponse(ClientPacket* const);
|
void HandleJoinResponse(ClientPacket* const);
|
||||||
|
void HandleLoginResponse(ClientPacket* const);
|
||||||
|
void HandleJoinRejection(TextPacket* const);
|
||||||
|
void HandleLoginRejection(TextPacket* const);
|
||||||
|
|
||||||
|
//server control
|
||||||
|
void SendBroadcastRequest();
|
||||||
|
void SendJoinRequest();
|
||||||
|
void SendLoginRequest();
|
||||||
|
|
||||||
//shared parameters
|
//shared parameters
|
||||||
ConfigUtility& config;
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
UDPNetworkUtility& network;
|
UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton();
|
||||||
int& clientIndex;
|
int& clientIndex;
|
||||||
int& accountIndex;
|
int& accountIndex;
|
||||||
|
|
||||||
@@ -91,9 +96,9 @@ protected:
|
|||||||
|
|
||||||
std::vector<ServerInformation> serverInfo;
|
std::vector<ServerInformation> serverInfo;
|
||||||
|
|
||||||
//a terrible hack, forgive me
|
//NOTE: a terrible hack
|
||||||
//I'd love a proper gui system for this
|
//I'd love a proper gui system for this
|
||||||
SDL_Rect listBox;
|
BoundingBox listBox;
|
||||||
ServerInformation* selection = nullptr;
|
ServerInformation* selection = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -21,13 +21,15 @@
|
|||||||
*/
|
*/
|
||||||
#include "main_menu.hpp"
|
#include "main_menu.hpp"
|
||||||
|
|
||||||
|
#include "config_utility.hpp"
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Public access members
|
//Public access members
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
MainMenu::MainMenu(ConfigUtility* const argConfig):
|
MainMenu::MainMenu() {
|
||||||
config(*argConfig)
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
{
|
|
||||||
//setup the utility objects
|
//setup the utility objects
|
||||||
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
||||||
image.SetClipH(image.GetClipH()/3);
|
image.SetClipH(image.GetClipH()/3);
|
||||||
@@ -70,7 +72,7 @@ void MainMenu::FrameStart() {
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenu::Update(double delta) {
|
void MainMenu::Update() {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,6 +103,7 @@ void MainMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MainMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
void MainMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
||||||
|
//TODO: Buttons should only register as "selected" when the left button is used
|
||||||
if (startButton.MouseButtonUp(button) == Button::State::HOVER) {
|
if (startButton.MouseButtonUp(button) == Button::State::HOVER) {
|
||||||
SetNextScene(SceneList::LOBBYMENU);
|
SetNextScene(SceneList::LOBBYMENU);
|
||||||
}
|
}
|
||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
|
|
||||||
#include "config_utility.hpp"
|
|
||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
#include "raster_font.hpp"
|
#include "raster_font.hpp"
|
||||||
#include "button.hpp"
|
#include "button.hpp"
|
||||||
@@ -32,13 +31,13 @@
|
|||||||
class MainMenu : public BaseScene {
|
class MainMenu : public BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
//Public access members
|
||||||
MainMenu(ConfigUtility* const);
|
MainMenu();
|
||||||
~MainMenu();
|
~MainMenu();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//Frame loop
|
//Frame loop
|
||||||
void FrameStart();
|
void FrameStart();
|
||||||
void Update(double delta);
|
void Update();
|
||||||
void FrameEnd();
|
void FrameEnd();
|
||||||
void Render(SDL_Surface* const);
|
void Render(SDL_Surface* const);
|
||||||
|
|
||||||
@@ -49,9 +48,6 @@ protected:
|
|||||||
void KeyDown(SDL_KeyboardEvent const&);
|
void KeyDown(SDL_KeyboardEvent const&);
|
||||||
void KeyUp(SDL_KeyboardEvent const&);
|
void KeyUp(SDL_KeyboardEvent const&);
|
||||||
|
|
||||||
//shared parameters
|
|
||||||
ConfigUtility& config;
|
|
||||||
|
|
||||||
//members
|
//members
|
||||||
Image image;
|
Image image;
|
||||||
RasterFont font;
|
RasterFont font;
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#config
|
||||||
|
INCLUDES+=. .. ../entities ../../common/gameplay ../../common/graphics ../../common/map ../../common/network ../../common/network/packet_types ../../common/ui ../../common/utilities
|
||||||
|
LIBS+=
|
||||||
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
|
#source
|
||||||
|
CXXSRC=$(wildcard *.cpp)
|
||||||
|
|
||||||
|
#objects
|
||||||
|
OBJDIR=obj
|
||||||
|
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||||
|
|
||||||
|
#output
|
||||||
|
OUTDIR=..
|
||||||
|
OUT=$(addprefix $(OUTDIR)/,client.a)
|
||||||
|
|
||||||
|
#targets
|
||||||
|
all: $(OBJ) $(OUT)
|
||||||
|
ar -crs $(OUT) $(OBJ)
|
||||||
|
|
||||||
|
$(OBJ): | $(OBJDIR)
|
||||||
|
|
||||||
|
$(OUT): | $(OUTDIR)
|
||||||
|
|
||||||
|
$(OBJDIR):
|
||||||
|
mkdir $(OBJDIR)
|
||||||
|
|
||||||
|
$(OUTDIR):
|
||||||
|
mkdir $(OUTDIR)
|
||||||
|
|
||||||
|
$(OBJDIR)/%.o: %.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) *.o *.a *.exe
|
||||||
|
|
||||||
|
rebuild: clean all
|
||||||
@@ -21,13 +21,15 @@
|
|||||||
*/
|
*/
|
||||||
#include "options_menu.hpp"
|
#include "options_menu.hpp"
|
||||||
|
|
||||||
|
#include "config_utility.hpp"
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Public access members
|
//Public access members
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
OptionsMenu::OptionsMenu(ConfigUtility* const argConfig):
|
OptionsMenu::OptionsMenu() {
|
||||||
config(*argConfig)
|
ConfigUtility& config = ConfigUtility::GetSingleton();
|
||||||
{
|
|
||||||
//setup the utility objects
|
//setup the utility objects
|
||||||
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
||||||
image.SetClipH(image.GetClipH()/3);
|
image.SetClipH(image.GetClipH()/3);
|
||||||
@@ -57,7 +59,7 @@ void OptionsMenu::FrameStart() {
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsMenu::Update(double delta) {
|
void OptionsMenu::Update() {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +92,11 @@ void OptionsMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OptionsMenu::KeyDown(SDL_KeyboardEvent const& key) {
|
void OptionsMenu::KeyDown(SDL_KeyboardEvent const& key) {
|
||||||
//
|
switch(key.keysym.sym) {
|
||||||
|
case SDLK_ESCAPE:
|
||||||
|
SetNextScene(SceneList::MAINMENU);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsMenu::KeyUp(SDL_KeyboardEvent const& key) {
|
void OptionsMenu::KeyUp(SDL_KeyboardEvent const& key) {
|
||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
|
|
||||||
#include "config_utility.hpp"
|
|
||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
#include "raster_font.hpp"
|
#include "raster_font.hpp"
|
||||||
#include "button.hpp"
|
#include "button.hpp"
|
||||||
@@ -33,13 +32,13 @@
|
|||||||
class OptionsMenu : public BaseScene {
|
class OptionsMenu : public BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
//Public access members
|
||||||
OptionsMenu(ConfigUtility* const);
|
OptionsMenu();
|
||||||
~OptionsMenu();
|
~OptionsMenu();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//Frame loop
|
//Frame loop
|
||||||
void FrameStart();
|
void FrameStart();
|
||||||
void Update(double delta);
|
void Update();
|
||||||
void FrameEnd();
|
void FrameEnd();
|
||||||
void Render(SDL_Surface* const);
|
void Render(SDL_Surface* const);
|
||||||
|
|
||||||
@@ -50,9 +49,6 @@ protected:
|
|||||||
void KeyDown(SDL_KeyboardEvent const&);
|
void KeyDown(SDL_KeyboardEvent const&);
|
||||||
void KeyUp(SDL_KeyboardEvent const&);
|
void KeyUp(SDL_KeyboardEvent const&);
|
||||||
|
|
||||||
//shared parameters
|
|
||||||
ConfigUtility& config;
|
|
||||||
|
|
||||||
//members
|
//members
|
||||||
Image image;
|
Image image;
|
||||||
RasterFont font;
|
RasterFont font;
|
||||||
@@ -21,14 +21,14 @@
|
|||||||
*/
|
*/
|
||||||
#include "splash_screen.hpp"
|
#include "splash_screen.hpp"
|
||||||
|
|
||||||
|
#include "config_utility.hpp"
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Public access members
|
//Public access members
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
SplashScreen::SplashScreen(ConfigUtility* const argConfig):
|
SplashScreen::SplashScreen() {
|
||||||
config(*argConfig)
|
logo.LoadSurface(ConfigUtility::GetSingleton()["dir.logos"] + "krstudios.bmp");
|
||||||
{
|
|
||||||
logo.LoadSurface(config["dir.logos"] + "krstudios.bmp");
|
|
||||||
startTick = std::chrono::steady_clock::now();
|
startTick = std::chrono::steady_clock::now();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ SplashScreen::~SplashScreen() {
|
|||||||
//Frame loop
|
//Frame loop
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
void SplashScreen::Update(double delta) {
|
void SplashScreen::Update() {
|
||||||
if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(1)) {
|
if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(1)) {
|
||||||
SetNextScene(SceneList::MAINMENU);
|
SetNextScene(SceneList::MAINMENU);
|
||||||
}
|
}
|
||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
|
|
||||||
#include "config_utility.hpp"
|
|
||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@@ -32,17 +31,14 @@
|
|||||||
class SplashScreen : public BaseScene {
|
class SplashScreen : public BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
//Public access members
|
||||||
SplashScreen(ConfigUtility* const);
|
SplashScreen();
|
||||||
~SplashScreen();
|
~SplashScreen();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//Frame loop
|
//Frame loop
|
||||||
void Update(double delta);
|
void Update();
|
||||||
void Render(SDL_Surface* const);
|
void Render(SDL_Surface* const);
|
||||||
|
|
||||||
//shared parameters
|
|
||||||
ConfigUtility& config;
|
|
||||||
|
|
||||||
//members
|
//members
|
||||||
std::chrono::steady_clock::time_point startTick;
|
std::chrono::steady_clock::time_point startTick;
|
||||||
Image logo;
|
Image logo;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. ../packet ../../gameplay ../../map ../../utilities
|
INCLUDES+=.
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@ OBJDIR=obj
|
|||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||||
|
|
||||||
#output
|
#output
|
||||||
OUTDIR=../../..
|
OUTDIR=../..
|
||||||
OUT=$(addprefix $(OUTDIR)/,libcommon.a)
|
OUT=$(addprefix $(OUTDIR)/,libcommon.a)
|
||||||
|
|
||||||
#targets
|
#targets
|
||||||
@@ -19,27 +19,27 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#ifndef ROOMDATA_HPP_
|
#include "timer.hpp"
|
||||||
#define ROOMDATA_HPP_
|
|
||||||
|
|
||||||
//map system
|
Timer::Timer(): start(Timer::Clock::now()) {
|
||||||
#include "region_pager_lua.hpp"
|
//
|
||||||
|
}
|
||||||
|
|
||||||
struct RoomData {
|
Timer::Timer(std::string s): name(s), start(Timer::Clock::now()) {
|
||||||
enum class RoomType {
|
//
|
||||||
OVERWORLD = 0,
|
}
|
||||||
RUINS = 1,
|
|
||||||
TOWERS = 2,
|
|
||||||
FORESTS = 3,
|
|
||||||
CAVE = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
//members
|
void Timer::Start() {
|
||||||
RegionPagerLua pager;
|
start = Clock::now();
|
||||||
RoomType type;
|
}
|
||||||
|
|
||||||
//TODO: collision map
|
void Timer::Stop() {
|
||||||
//TODO: NPCs?
|
timeSpan = Clock::now() - start;
|
||||||
};
|
}
|
||||||
|
|
||||||
#endif
|
std::ostream& operator<<(std::ostream& os, Timer& t) {
|
||||||
|
os << t.GetName() << ": ";
|
||||||
|
os << std::chrono::duration_cast<std::chrono::milliseconds>(t.GetTime()).count();
|
||||||
|
os << "ms";
|
||||||
|
return os;
|
||||||
|
}
|
||||||
@@ -19,39 +19,36 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#ifndef ENEMYDATA_HPP_
|
#ifndef TIMER_HPP_
|
||||||
#define ENEMYDATA_HPP_
|
#define TIMER_HPP_
|
||||||
|
|
||||||
#include "vector2.hpp"
|
#include <chrono>
|
||||||
#include "statistics.hpp"
|
|
||||||
|
|
||||||
//graphics
|
|
||||||
#ifdef GRAPHICS
|
|
||||||
#include "sprite_sheet.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//std namespace
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <ostream>
|
||||||
|
|
||||||
struct EnemyData {
|
class Timer {
|
||||||
//metadata
|
public:
|
||||||
std::string handle;
|
typedef std::chrono::high_resolution_clock Clock;
|
||||||
std::string avatar;
|
|
||||||
|
|
||||||
//gameplay
|
Timer();
|
||||||
Statistics stats;
|
Timer(std::string s);
|
||||||
|
~Timer() = default;
|
||||||
|
|
||||||
//TODO: gameplay components: equipment, items, buffs, debuffs, rewards
|
inline void Start();
|
||||||
|
inline void Stop();
|
||||||
|
|
||||||
//active gameplay members
|
//accessors and mutators
|
||||||
//NOTE: these are lost when unloaded
|
Clock::duration GetTime() { return timeSpan; }
|
||||||
#ifdef GRAPHICS
|
|
||||||
SpriteSheet sprite;
|
std::string SetName(std::string s) { return name = s; }
|
||||||
Vector2 origin = {0.0,0.0};
|
std::string GetName() { return name; }
|
||||||
Vector2 bounds = {0.0,0.0};
|
|
||||||
#endif
|
private:
|
||||||
int tableIndex;
|
std::string name;
|
||||||
int atbGauge = 0;
|
Clock::time_point start;
|
||||||
|
Clock::duration timeSpan;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& os, Timer& t);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef CHARACTERDATA_HPP_
|
|
||||||
#define CHARACTERDATA_HPP_
|
|
||||||
|
|
||||||
#include "vector2.hpp"
|
|
||||||
#include "statistics.hpp"
|
|
||||||
|
|
||||||
//graphics
|
|
||||||
#ifdef GRAPHICS
|
|
||||||
#include "sprite_sheet.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//std namespace
|
|
||||||
#include <string>
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
//the speeds that the characters move
|
|
||||||
constexpr double CHARACTER_WALKING_SPEED = 140.0;
|
|
||||||
constexpr double CHARACTER_WALKING_MOD = 1.0/sqrt(2.0);
|
|
||||||
|
|
||||||
struct CharacterData {
|
|
||||||
//metadata
|
|
||||||
int owner;
|
|
||||||
std::string handle;
|
|
||||||
std::string avatar;
|
|
||||||
|
|
||||||
//world position
|
|
||||||
int roomIndex = 0;
|
|
||||||
Vector2 origin = {0.0,0.0};
|
|
||||||
Vector2 motion = {0.0,0.0};
|
|
||||||
Vector2 bounds = {0.0,0.0};
|
|
||||||
|
|
||||||
//base statistics
|
|
||||||
Statistics stats;
|
|
||||||
|
|
||||||
//TODO: gameplay components: equipment, items, buffs, debuffs
|
|
||||||
|
|
||||||
//methods
|
|
||||||
void Update(double delta);
|
|
||||||
#ifdef GRAPHICS
|
|
||||||
void DrawTo(SDL_Surface* const, int camX, int camY);
|
|
||||||
void CorrectSprite();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//active gameplay members
|
|
||||||
//NOTE: these are lost when unloaded
|
|
||||||
#ifdef GRAPHICS
|
|
||||||
SpriteSheet sprite;
|
|
||||||
#endif
|
|
||||||
bool inCombat = false;
|
|
||||||
int atbGauge = 0;
|
|
||||||
//TODO: stored command
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#ifndef CHARACTERDEFINES_HPP_
|
||||||
|
#define CHARACTERDEFINES_HPP_
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
//the speeds that the characters move
|
||||||
|
constexpr double CHARACTER_WALKING_SPEED = 2.24;
|
||||||
|
constexpr double CHARACTER_WALKING_MOD = 1.0/sqrt(2.0);
|
||||||
|
constexpr double CHARACTER_WALKING_NEGATIVE_MOD = 1.0 - CHARACTER_WALKING_MOD;
|
||||||
|
|
||||||
|
//the bounds for the character objects, mapped to the default sprites
|
||||||
|
constexpr int CHARACTER_BOUNDS_X = 0;
|
||||||
|
constexpr int CHARACTER_BOUNDS_Y = 16;
|
||||||
|
constexpr int CHARACTER_BOUNDS_WIDTH = 32;
|
||||||
|
constexpr int CHARACTER_BOUNDS_HEIGHT = 32;
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. ../utilities ../graphics
|
INCLUDES+=.
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) -DGRAPHICS
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
#source
|
#source
|
||||||
CXXSRC=$(wildcard *.cpp)
|
CXXSRC=$(wildcard *.cpp)
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "character_data.hpp"
|
|
||||||
#include "combat_data.hpp"
|
|
||||||
#include "enemy_data.hpp"
|
|
||||||
#include "statistics.hpp"
|
|
||||||
|
|
||||||
/* DOCS: Sanity check, read more
|
|
||||||
* Since most/all of the files in this directory are header files, I've created
|
|
||||||
* this source file as a "sanity check", to ensure that the above header files
|
|
||||||
* are written correctly via make.
|
|
||||||
*/
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. ../map
|
INCLUDES+=.
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
all:
|
all:
|
||||||
|
$(MAKE) -C debugging
|
||||||
$(MAKE) -C gameplay
|
$(MAKE) -C gameplay
|
||||||
$(MAKE) -C graphics
|
$(MAKE) -C graphics
|
||||||
$(MAKE) -C map
|
$(MAKE) -C map
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. ../utilities
|
INCLUDES+=. ../graphics ../utilities
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,77 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#include "map_system_api.hpp"
|
||||||
|
|
||||||
|
//all map API headers
|
||||||
|
#include "region_api.hpp"
|
||||||
|
#include "region_pager_api.hpp"
|
||||||
|
#include "tile_sheet_api.hpp"
|
||||||
|
|
||||||
|
//macros
|
||||||
|
#include "region.hpp"
|
||||||
|
|
||||||
|
//useful "globals"
|
||||||
|
static int getRegionWidth(lua_State* L) {
|
||||||
|
lua_pushinteger(L, REGION_WIDTH);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getRegionHeight(lua_State* L) {
|
||||||
|
lua_pushinteger(L, REGION_HEIGHT);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getRegionDepth(lua_State* L) {
|
||||||
|
lua_pushinteger(L, REGION_DEPTH);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//This mimics linit.c to create a nested collection of all map modules.
|
||||||
|
static const luaL_Reg funcs[] = {
|
||||||
|
//synonyms
|
||||||
|
{"GetRegionWidth", getRegionWidth},
|
||||||
|
{"GetRegionHeight", getRegionHeight},
|
||||||
|
{"GetRegionDepth", getRegionDepth},
|
||||||
|
{nullptr, nullptr}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const luaL_Reg libs[] = {
|
||||||
|
{"Region", openRegionAPI},
|
||||||
|
{"RegionPager", openRegionPagerAPI},
|
||||||
|
// {"TileSheet", openTileSheetAPI},
|
||||||
|
{nullptr, nullptr}
|
||||||
|
};
|
||||||
|
|
||||||
|
int openMapSystemAPI(lua_State* L) {
|
||||||
|
//create the table
|
||||||
|
luaL_newlibtable(L, libs);
|
||||||
|
|
||||||
|
//push the "global" functions
|
||||||
|
luaL_setfuncs(L, funcs, 0);
|
||||||
|
|
||||||
|
//push the substable
|
||||||
|
for (const luaL_Reg* lib = libs; lib->func; lib++) {
|
||||||
|
lua_pushcfunction(L, lib->func);
|
||||||
|
lua_setfield(L, -2, lib->name);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
@@ -19,20 +19,16 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#ifndef ACCOUNTDATA_HPP_
|
#ifndef MAPSYSTEMAPI_HPP_
|
||||||
#define ACCOUNTDATA_HPP_
|
#define MAPSYSTEMAPI_APP_
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
struct AccountData {
|
|
||||||
std::string username;
|
|
||||||
//TODO: password
|
|
||||||
bool blackListed = false;
|
|
||||||
bool whiteListed = true;
|
|
||||||
bool mod = false;
|
|
||||||
bool admin = false;
|
|
||||||
|
|
||||||
int clientIndex;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
#if defined(__MINGW32__)
|
||||||
|
#include "lua/lua.hpp"
|
||||||
|
#else
|
||||||
|
#include "lua.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define TORTUGA_MAP_SYSTEM_API "map_system"
|
||||||
|
LUAMOD_API int openMapSystemAPI(lua_State* L);
|
||||||
|
|
||||||
|
#endif
|
||||||
+14
-2
@@ -21,11 +21,14 @@
|
|||||||
*/
|
*/
|
||||||
#include "region.hpp"
|
#include "region.hpp"
|
||||||
|
|
||||||
#include "utility.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
#include <cmath>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
int snapToBase(int base, int x) {
|
||||||
|
return floor((double)x / base) * base;
|
||||||
|
}
|
||||||
|
|
||||||
Region::Region(int argX, int argY): x(argX), y(argY) {
|
Region::Region(int argX, int argY): x(argX), y(argY) {
|
||||||
if (x != snapToBase(REGION_WIDTH, x) || y != snapToBase(REGION_HEIGHT, y)) {
|
if (x != snapToBase(REGION_WIDTH, x) || y != snapToBase(REGION_HEIGHT, y)) {
|
||||||
throw(std::invalid_argument("Region location is off grid"));
|
throw(std::invalid_argument("Region location is off grid"));
|
||||||
@@ -35,6 +38,7 @@ Region::Region(int argX, int argY): x(argX), y(argY) {
|
|||||||
|
|
||||||
Region::Region(Region const& rhs): x(rhs.x), y(rhs.y) {
|
Region::Region(Region const& rhs): x(rhs.x), y(rhs.y) {
|
||||||
memcpy(tiles, rhs.tiles, REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH*sizeof(type_t));
|
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) {
|
Region::type_t Region::SetTile(int x, int y, int z, type_t v) {
|
||||||
@@ -44,3 +48,11 @@ Region::type_t Region::SetTile(int x, int y, int z, type_t v) {
|
|||||||
Region::type_t Region::GetTile(int x, int y, int z) {
|
Region::type_t Region::GetTile(int x, int y, int z) {
|
||||||
return tiles[x][y][z];
|
return tiles[x][y][z];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Region::SetSolid(int x, int y, bool b) {
|
||||||
|
return solid[x * REGION_WIDTH + y] = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Region::GetSolid(int x, int y) {
|
||||||
|
return solid[x * REGION_WIDTH + y];
|
||||||
|
}
|
||||||
@@ -22,10 +22,16 @@
|
|||||||
#ifndef REGION_HPP_
|
#ifndef REGION_HPP_
|
||||||
#define REGION_HPP_
|
#define REGION_HPP_
|
||||||
|
|
||||||
|
#include <bitset>
|
||||||
|
|
||||||
|
//the region's storage format
|
||||||
constexpr int REGION_WIDTH = 20;
|
constexpr int REGION_WIDTH = 20;
|
||||||
constexpr int REGION_HEIGHT = 20;
|
constexpr int REGION_HEIGHT = 20;
|
||||||
constexpr int REGION_DEPTH = 3;
|
constexpr int REGION_DEPTH = 3;
|
||||||
|
|
||||||
|
//utility function
|
||||||
|
int snapToBase(int base, int x);
|
||||||
|
|
||||||
class Region {
|
class Region {
|
||||||
public:
|
public:
|
||||||
typedef unsigned char type_t;
|
typedef unsigned char type_t;
|
||||||
@@ -38,14 +44,20 @@ public:
|
|||||||
type_t SetTile(int x, int y, int z, type_t v);
|
type_t SetTile(int x, int y, int z, type_t v);
|
||||||
type_t GetTile(int x, int y, int z);
|
type_t GetTile(int x, int y, int z);
|
||||||
|
|
||||||
|
bool SetSolid(int x, int y, bool b);
|
||||||
|
bool GetSolid(int x, int y);
|
||||||
|
|
||||||
//accessors
|
//accessors
|
||||||
int GetX() const { return x; }
|
int GetX() const { return x; }
|
||||||
int GetY() const { return y; }
|
int GetY() const { return y; }
|
||||||
|
|
||||||
|
std::bitset<REGION_WIDTH*REGION_HEIGHT>* GetSolidBitset() { return &solid; }
|
||||||
private:
|
private:
|
||||||
const int x;
|
const int x;
|
||||||
const int y;
|
const int y;
|
||||||
|
|
||||||
type_t tiles[REGION_WIDTH][REGION_HEIGHT][REGION_DEPTH];
|
type_t tiles[REGION_WIDTH][REGION_HEIGHT][REGION_DEPTH];
|
||||||
|
std::bitset<REGION_WIDTH*REGION_HEIGHT> solid;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+26
-35
@@ -37,6 +37,20 @@ static int getTile(lua_State* L) {
|
|||||||
return 1;
|
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) {
|
static int getX(lua_State* L) {
|
||||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||||
lua_pushinteger(L, region->GetX());
|
lua_pushinteger(L, region->GetX());
|
||||||
@@ -64,43 +78,20 @@ static int getDepth(lua_State* L) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int load(lua_State* L) {
|
static const luaL_Reg regionLib[] = {
|
||||||
//TODO: fill this
|
{"SetTile",setTile},
|
||||||
lua_pushboolean(L, false);
|
{"GetTile",getTile},
|
||||||
return 1;
|
{"SetSolid",setSolid},
|
||||||
}
|
{"GetSolid",getSolid},
|
||||||
|
{"GetX",getX},
|
||||||
static int save(lua_State* L) {
|
{"GetY",getY},
|
||||||
//TODO: fill this
|
{"GetWidth",getWidth},
|
||||||
return 0;
|
{"GetHeight",getHeight},
|
||||||
}
|
{"GetDepth",getDepth},
|
||||||
|
|
||||||
static int create(lua_State* L) {
|
|
||||||
//TODO: fill this
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int unload(lua_State* L) {
|
|
||||||
//TODO: fill this
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const luaL_Reg regionlib[] = {
|
|
||||||
{"settile",setTile},
|
|
||||||
{"gettile",getTile},
|
|
||||||
{"getx",getX},
|
|
||||||
{"gety",getY},
|
|
||||||
{"getwidth",getWidth},
|
|
||||||
{"getheight",getHeight},
|
|
||||||
{"getdepth",getDepth},
|
|
||||||
{"load",load},
|
|
||||||
{"save",save},
|
|
||||||
{"create",create},
|
|
||||||
{"unload",unload},
|
|
||||||
{nullptr, nullptr}
|
{nullptr, nullptr}
|
||||||
};
|
};
|
||||||
|
|
||||||
LUAMOD_API int luaopen_regionapi(lua_State* L) {
|
LUAMOD_API int openRegionAPI(lua_State* L) {
|
||||||
luaL_newlib(L, regionlib);
|
luaL_newlib(L, regionLib);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -22,9 +22,13 @@
|
|||||||
#ifndef REGIONAPI_HPP_
|
#ifndef REGIONAPI_HPP_
|
||||||
#define REGIONAPI_HPP_
|
#define REGIONAPI_HPP_
|
||||||
|
|
||||||
#include "lua/lua.hpp"
|
#if defined(__MINGW32__)
|
||||||
|
#include "lua/lua.hpp"
|
||||||
|
#else
|
||||||
|
#include "lua.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define LUA_REGIONLIBNAME "region"
|
#define TORTUGA_REGION_NAME "region"
|
||||||
LUAMOD_API int luaopen_regionapi(lua_State* L);
|
LUAMOD_API int openRegionAPI(lua_State* L);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -19,13 +19,12 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#include "pager_api.hpp"
|
#include "region_pager_api.hpp"
|
||||||
|
|
||||||
#include "region_pager_lua.hpp"
|
#include "region_pager_lua.hpp"
|
||||||
#include "region.hpp"
|
#include "region.hpp"
|
||||||
|
|
||||||
#include <stdexcept>
|
//DOCS: These glue functions simply wrap RegionPagerLua's methods
|
||||||
#include <string>
|
|
||||||
|
|
||||||
static int setTile(lua_State* L) {
|
static int setTile(lua_State* L) {
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
@@ -41,6 +40,20 @@ static int getTile(lua_State* L) {
|
|||||||
return 1;
|
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) {
|
static int getRegion(lua_State* L) {
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||||
@@ -48,109 +61,86 @@ static int getRegion(lua_State* L) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int setDirectory(lua_State* L) {
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
|
||||||
std::string s = pager->SetDirectory(lua_tostring(L, 2));
|
|
||||||
lua_pushstring(L, s.c_str());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getDirectory(lua_State* L) {
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
|
||||||
std::string s = pager->GetDirectory();
|
|
||||||
lua_pushstring(L, s.c_str());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int loadRegion(lua_State* L) {
|
static int loadRegion(lua_State* L) {
|
||||||
//get the parameters
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
Region* region = pager->LoadRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||||
std::string s = pager->GetDirectory();
|
|
||||||
|
|
||||||
//push the parameters
|
|
||||||
lua_getglobal(L, "region");
|
|
||||||
lua_getfield(L, -1, "load");
|
|
||||||
lua_pushlightuserdata(L, region);
|
lua_pushlightuserdata(L, region);
|
||||||
lua_pushstring(L, s.c_str());
|
|
||||||
|
|
||||||
//call the method
|
|
||||||
if (lua_pcall(L, 2, 1, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(L, -1) ));
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int saveRegion(lua_State* L) {
|
static int saveRegion(lua_State* L) {
|
||||||
//get the parameters
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
Region* region = pager->SaveRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||||
std::string s = pager->GetDirectory();
|
|
||||||
|
|
||||||
//push the parameters
|
|
||||||
lua_getglobal(L, "region");
|
|
||||||
lua_getfield(L, -1, "save");
|
|
||||||
lua_pushlightuserdata(L, region);
|
lua_pushlightuserdata(L, region);
|
||||||
lua_pushstring(L, s.c_str());
|
return 1;
|
||||||
|
|
||||||
//call the method
|
|
||||||
if (lua_pcall(L, 2, 0, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(L, -1) ));
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int createRegion(lua_State* L) {
|
static int createRegion(lua_State* L) {
|
||||||
//get the parameters
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
Region* region = pager->CreateRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||||
|
|
||||||
//push the parameters
|
|
||||||
lua_getglobal(L, "region");
|
|
||||||
lua_getfield(L, -1, "create");
|
|
||||||
lua_pushlightuserdata(L, region);
|
lua_pushlightuserdata(L, region);
|
||||||
//TODO: parameters
|
return 1;
|
||||||
|
|
||||||
//call the method
|
|
||||||
if (lua_pcall(L, 1, 0, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(L, -1) ));
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int unloadRegion(lua_State* L) {
|
static int unloadRegion(lua_State* L) {
|
||||||
//get the parameters
|
|
||||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
pager->UnloadRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||||
std::string s = pager->GetDirectory();
|
|
||||||
|
|
||||||
//push the parameters
|
|
||||||
lua_getglobal(L, "region");
|
|
||||||
lua_getfield(L, -1, "unload");
|
|
||||||
lua_pushlightuserdata(L, region);
|
|
||||||
lua_pushstring(L, s.c_str());
|
|
||||||
|
|
||||||
//call the method
|
|
||||||
if (lua_pcall(L, 2, 0, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(L, -1) ));
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const luaL_Reg pagerlib[] = {
|
static int setOnLoad(lua_State* L) {
|
||||||
{"settile", setTile},
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
{"gettile", getTile},
|
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetLoadReference());
|
||||||
{"getregion", getRegion},
|
pager->SetLoadReference(luaL_ref(L, LUA_REGISTRYINDEX));
|
||||||
{"setdirectory", setDirectory},
|
return 0;
|
||||||
{"getdirectory", getDirectory},
|
}
|
||||||
{"loadregion", loadRegion},
|
|
||||||
{"saveregion", saveRegion},
|
static int setOnSave(lua_State* L) {
|
||||||
{"createregion", createRegion},
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
{"unloadregion", unloadRegion},
|
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetSaveReference());
|
||||||
|
pager->SetSaveReference(luaL_ref(L, LUA_REGISTRYINDEX));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int setOnCreate(lua_State* L) {
|
||||||
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
|
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetCreateReference());
|
||||||
|
pager->SetCreateReference(luaL_ref(L, LUA_REGISTRYINDEX));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int setOnUnload(lua_State* L) {
|
||||||
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
|
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetUnloadReference());
|
||||||
|
pager->SetUnloadReference(luaL_ref(L, LUA_REGISTRYINDEX));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const luaL_Reg regionPagerLib[] = {
|
||||||
|
//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},
|
||||||
|
|
||||||
|
//sentinel
|
||||||
{nullptr, nullptr}
|
{nullptr, nullptr}
|
||||||
};
|
};
|
||||||
|
|
||||||
LUAMOD_API int luaopen_pagerapi(lua_State* L) {
|
LUAMOD_API int openRegionPagerAPI(lua_State* L) {
|
||||||
luaL_newlib(L, pagerlib);
|
luaL_newlib(L, regionPagerLib);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#ifndef REGIONPAGERAPI_HPP_
|
||||||
|
#define REGIONPAGERAPI_HPP_
|
||||||
|
|
||||||
|
#if defined(__MINGW32__)
|
||||||
|
#include "lua/lua.hpp"
|
||||||
|
#else
|
||||||
|
#include "lua.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TORTUGA_REGION_PAGER_NAME "region_pager"
|
||||||
|
LUAMOD_API int openRegionPagerAPI(lua_State* L);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -21,11 +21,21 @@
|
|||||||
*/
|
*/
|
||||||
#include "region_pager_base.hpp"
|
#include "region_pager_base.hpp"
|
||||||
|
|
||||||
#include "utility.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
RegionPagerBase::RegionPagerBase() {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
RegionPagerBase::RegionPagerBase(RegionPagerBase&& rhs) {
|
||||||
|
regionList = std::move(rhs.regionList);
|
||||||
|
}
|
||||||
|
|
||||||
|
RegionPagerBase::~RegionPagerBase() {
|
||||||
|
UnloadAll();
|
||||||
|
}
|
||||||
|
|
||||||
Region::type_t RegionPagerBase::SetTile(int x, int y, int z, Region::type_t v) {
|
Region::type_t RegionPagerBase::SetTile(int x, int y, int z, Region::type_t v) {
|
||||||
Region* ptr = GetRegion(x, y);
|
Region* ptr = GetRegion(x, y);
|
||||||
return ptr->SetTile(x - ptr->GetX(), y - ptr->GetY(), z, v);
|
return ptr->SetTile(x - ptr->GetX(), y - ptr->GetY(), z, v);
|
||||||
@@ -36,7 +46,20 @@ Region::type_t RegionPagerBase::GetTile(int x, int y, int z) {
|
|||||||
return ptr->GetTile(x - ptr->GetX(), y - ptr->GetY(), z);
|
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) {
|
Region* RegionPagerBase::GetRegion(int x, int y) {
|
||||||
|
x = snapToBase(REGION_WIDTH, x);
|
||||||
|
y = snapToBase(REGION_HEIGHT, y);
|
||||||
|
|
||||||
//get the region by various means
|
//get the region by various means
|
||||||
Region* ptr = nullptr;
|
Region* ptr = nullptr;
|
||||||
ptr = FindRegion(x, y);
|
ptr = FindRegion(x, y);
|
||||||
@@ -60,12 +83,12 @@ Region* RegionPagerBase::PushRegion(Region* const ptr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Region* RegionPagerBase::LoadRegion(int x, int y) {
|
Region* RegionPagerBase::LoadRegion(int x, int y) {
|
||||||
//TODO: load the region if possible
|
//EMPTY, intended for override
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Region* RegionPagerBase::SaveRegion(int x, int y) {
|
Region* RegionPagerBase::SaveRegion(int x, int y) {
|
||||||
//TODO: find & save the region
|
//EMPTY, intended for override
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,8 +101,9 @@ Region* RegionPagerBase::CreateRegion(int x, int y) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RegionPagerBase::UnloadRegion(int x, int y) {
|
void RegionPagerBase::UnloadRegion(int x, int y) {
|
||||||
//custom loop, not FindRegion()
|
regionList.remove_if([x, y](Region& region) -> bool {
|
||||||
regionList.remove_if([x, y](Region& region) -> bool { return region.GetX() == x && region.GetY() == y; });
|
return region.GetX() == x && region.GetY() == y;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegionPagerBase::UnloadAll() {
|
void RegionPagerBase::UnloadAll() {
|
||||||
|
|||||||
@@ -28,13 +28,18 @@
|
|||||||
|
|
||||||
class RegionPagerBase {
|
class RegionPagerBase {
|
||||||
public:
|
public:
|
||||||
RegionPagerBase() = default;
|
RegionPagerBase();
|
||||||
virtual ~RegionPagerBase() { UnloadAll(); };
|
RegionPagerBase(RegionPagerBase&&);
|
||||||
|
virtual ~RegionPagerBase();
|
||||||
|
|
||||||
//tile manipulation
|
//tile manipulation
|
||||||
virtual Region::type_t SetTile(int x, int y, int z, Region::type_t v);
|
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);
|
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
|
//region manipulation
|
||||||
virtual Region* GetRegion(int x, int y);
|
virtual Region* GetRegion(int x, int y);
|
||||||
virtual Region* FindRegion(int x, int y);
|
virtual Region* FindRegion(int x, int y);
|
||||||
|
|||||||
+142
-62
@@ -21,106 +21,186 @@
|
|||||||
*/
|
*/
|
||||||
#include "region_pager_lua.hpp"
|
#include "region_pager_lua.hpp"
|
||||||
|
|
||||||
#include "utility.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
|
RegionPagerLua::RegionPagerLua() {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
RegionPagerLua::RegionPagerLua(RegionPagerLua&& rhs) {
|
||||||
|
lua = rhs.lua;
|
||||||
|
loadRef = rhs.loadRef;
|
||||||
|
saveRef = rhs.saveRef;
|
||||||
|
createRef = rhs.createRef;
|
||||||
|
unloadRef = rhs.unloadRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
Region* RegionPagerLua::LoadRegion(int x, int y) {
|
||||||
//load the region if possible
|
//get the pager's function from the registry
|
||||||
|
lua_rawgeti(lua, LUA_REGISTRYINDEX, loadRef);
|
||||||
|
|
||||||
//something to work on
|
//check if this function is available
|
||||||
regionList.emplace_front(x, y);
|
if (lua_isnil(lua, -1)) {
|
||||||
|
lua_pop(lua, 1);
|
||||||
//API hook
|
|
||||||
lua_getglobal(luaState, "region");
|
|
||||||
lua_getfield(luaState, -1, "load");
|
|
||||||
lua_pushlightuserdata(luaState, ®ionList.front());
|
|
||||||
lua_pushstring(luaState, directory.c_str());
|
|
||||||
if (lua_pcall(luaState, 2, 1, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
|
|
||||||
}
|
|
||||||
//success or failure
|
|
||||||
if (!lua_toboolean(luaState, -1)) {
|
|
||||||
lua_pop(luaState, 2);
|
|
||||||
regionList.pop_front();
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
lua_pop(luaState, 2);
|
|
||||||
return ®ionList.front();
|
|
||||||
}
|
|
||||||
|
|
||||||
Region* RegionPagerLua::SaveRegion(int x, int y) {
|
//something to work on
|
||||||
//find & save the region
|
Region tmpRegion(x, y);
|
||||||
Region* ptr = FindRegion(x, y);
|
lua_pushlightuserdata(lua, &tmpRegion);
|
||||||
if (ptr) {
|
|
||||||
//API hook
|
//call the funtion, 1 arg, 1 return
|
||||||
lua_getglobal(luaState, "region");
|
if (lua_pcall(lua, 1, 1, 0) != LUA_OK) {
|
||||||
lua_getfield(luaState, -1, "save");
|
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
|
||||||
lua_pushlightuserdata(luaState, ptr);
|
}
|
||||||
lua_pushstring(luaState, directory.c_str());
|
|
||||||
if (lua_pcall(luaState, 2, 0, 0) != LUA_OK) {
|
//check the return value, success or failure
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
|
if (lua_toboolean(lua, -1)) {
|
||||||
}
|
lua_pop(lua, 1);
|
||||||
lua_pop(luaState, 1);
|
regionList.push_front(tmpRegion);
|
||||||
|
return ®ionList.front();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lua_pop(lua, 1);
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
return ptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//return the saved region, or nullptr on failure
|
||||||
|
Region* RegionPagerLua::SaveRegion(int x, int y) {
|
||||||
|
//get the pager's function from the registry
|
||||||
|
lua_rawgeti(lua, LUA_REGISTRYINDEX, saveRef);
|
||||||
|
|
||||||
|
//check if this function is available
|
||||||
|
if (lua_isnil(lua, -1)) {
|
||||||
|
lua_pop(lua, 1);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
//find the specified region
|
||||||
|
Region* ptr = FindRegion(x, y);
|
||||||
|
if (!ptr) {
|
||||||
|
lua_pop(lua, 1);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
lua_pushlightuserdata(lua, ptr);
|
||||||
|
|
||||||
|
//call the function, 1 arg, 1 return
|
||||||
|
if (lua_pcall(lua, 1, 1, 0) != LUA_OK) {
|
||||||
|
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
//check the return value, success or failure
|
||||||
|
if (lua_toboolean(lua, -1)) {
|
||||||
|
lua_pop(lua, 1);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lua_pop(lua, 1);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//return the created region, or nullptr on failure
|
||||||
Region* RegionPagerLua::CreateRegion(int x, int y) {
|
Region* RegionPagerLua::CreateRegion(int x, int y) {
|
||||||
if (FindRegion(x, y)) {
|
if (FindRegion(x, y)) {
|
||||||
throw(std::logic_error("Cannot overwrite an existing region"));
|
throw(std::logic_error("Cannot overwrite an existing region"));
|
||||||
}
|
}
|
||||||
|
|
||||||
//something to work on
|
//get the pager's function from the registry
|
||||||
regionList.emplace_front(x, y);
|
lua_rawgeti(lua, LUA_REGISTRYINDEX, createRef);
|
||||||
|
|
||||||
//API hook
|
//check if this function is available
|
||||||
lua_getglobal(luaState, "region");
|
if (lua_isnil(lua, -1)) {
|
||||||
lua_getfield(luaState, -1, "create");
|
lua_pop(lua, 1);
|
||||||
lua_pushlightuserdata(luaState, ®ionList.front());
|
return nullptr;
|
||||||
//TODO: parameters
|
|
||||||
if (lua_pcall(luaState, 1, 0, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
|
|
||||||
}
|
}
|
||||||
lua_pop(luaState, 1);
|
|
||||||
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::UnloadRegion(int x, int y) {
|
void RegionPagerLua::UnloadRegion(int x, int y) {
|
||||||
lua_getglobal(luaState, "region");
|
//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);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//run each region through this lambda
|
||||||
regionList.remove_if([&](Region& region) -> bool {
|
regionList.remove_if([&](Region& region) -> bool {
|
||||||
if (region.GetX() == x && region.GetY() == y) {
|
if (region.GetX() == x && region.GetY() == y) {
|
||||||
|
|
||||||
//API hook
|
//push a copy of the function onto the stack with the region
|
||||||
lua_getfield(luaState, -1, "unload");
|
lua_pushvalue(lua, -1);
|
||||||
lua_pushlightuserdata(luaState, ®ion);
|
lua_pushlightuserdata(lua, ®ion);
|
||||||
lua_pushstring(luaState, directory.c_str());
|
|
||||||
if (lua_pcall(luaState, 2, 0, 0) != LUA_OK) {
|
//call the function, 1 arg, 0 return
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
//signal to the container
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
lua_pop(luaState, 1);
|
//pop the base copy of the function
|
||||||
|
lua_pop(lua, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//no return
|
||||||
void RegionPagerLua::UnloadAll() {
|
void RegionPagerLua::UnloadAll() {
|
||||||
lua_getglobal(luaState, "region");
|
//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);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (auto& it : regionList) {
|
for (auto& it : regionList) {
|
||||||
//API hook
|
//push a copy of the function onto the stack with the region
|
||||||
lua_getfield(luaState, -1, "unload");
|
lua_pushvalue(lua, -1);
|
||||||
lua_pushlightuserdata(luaState, &it);
|
lua_pushlightuserdata(lua, &it);
|
||||||
lua_pushstring(luaState, directory.c_str());
|
|
||||||
if (lua_pcall(luaState, 2, 0, 0) != LUA_OK) {
|
//call the function, 1 arg, 0 return
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
|
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
|
||||||
|
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_pop(luaState, 1);
|
//pop the base copy of the function
|
||||||
|
lua_pop(lua, 1);
|
||||||
|
|
||||||
|
//remove from memory
|
||||||
regionList.clear();
|
regionList.clear();
|
||||||
}
|
}
|
||||||
@@ -24,14 +24,19 @@
|
|||||||
|
|
||||||
#include "region_pager_base.hpp"
|
#include "region_pager_base.hpp"
|
||||||
|
|
||||||
#include "lua/lua.hpp"
|
#if defined(__MINGW32__)
|
||||||
|
#include "lua/lua.hpp"
|
||||||
|
#else
|
||||||
|
#include "lua.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class RegionPagerLua : public RegionPagerBase {
|
class RegionPagerLua : public RegionPagerBase {
|
||||||
public:
|
public:
|
||||||
RegionPagerLua() = default;
|
RegionPagerLua();
|
||||||
~RegionPagerLua() = default;
|
RegionPagerLua(RegionPagerLua&&);
|
||||||
|
~RegionPagerLua();
|
||||||
|
|
||||||
//region manipulation
|
//region manipulation
|
||||||
Region* LoadRegion(int x, int y) override;
|
Region* LoadRegion(int x, int y) override;
|
||||||
@@ -41,14 +46,28 @@ public:
|
|||||||
|
|
||||||
void UnloadAll() override;
|
void UnloadAll() override;
|
||||||
|
|
||||||
std::string SetDirectory(std::string s) { return directory = s; }
|
//accessors & mutators
|
||||||
std::string GetDirectory() { return directory; }
|
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; }
|
||||||
|
|
||||||
lua_State* SetLuaState(lua_State* L) { return luaState = L; }
|
|
||||||
lua_State* GetLuaState() { return luaState; }
|
|
||||||
protected:
|
protected:
|
||||||
std::string directory;
|
lua_State* lua = nullptr;
|
||||||
lua_State* luaState = nullptr;
|
|
||||||
|
int loadRef = LUA_NOREF;
|
||||||
|
int saveRef = LUA_NOREF;
|
||||||
|
int createRef = LUA_NOREF;
|
||||||
|
int unloadRef = LUA_NOREF;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -21,24 +21,24 @@
|
|||||||
*/
|
*/
|
||||||
#include "tile_sheet.hpp"
|
#include "tile_sheet.hpp"
|
||||||
|
|
||||||
void TileSheet::Load(std::string fname, int xc, int yc) {
|
void TileSheet::Load(std::string fname, int tileWidth, int tileHeight) {
|
||||||
XCount = xc;
|
|
||||||
YCount = yc;
|
|
||||||
image.LoadSurface(fname);
|
image.LoadSurface(fname);
|
||||||
image.SetClipW(image.GetClipW()/XCount);
|
image.SetClipW(tileWidth);
|
||||||
image.SetClipH(image.GetClipH()/YCount);
|
image.SetClipH(tileHeight);
|
||||||
|
xCount = image.GetSurface()->w / image.GetClipW();
|
||||||
|
yCount = image.GetSurface()->h / image.GetClipH();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileSheet::Unload() {
|
void TileSheet::Unload() {
|
||||||
image.FreeSurface();
|
image.FreeSurface();
|
||||||
XCount = YCount = 0;
|
xCount = yCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileSheet::DrawTo(SDL_Surface* const dest, int x, int y, Region::type_t tile) {
|
void TileSheet::DrawTileTo(SDL_Surface* const dest, int x, int y, Region::type_t tile) {
|
||||||
//0 is invisible
|
//0 is invisible
|
||||||
if (tile == 0) return;
|
if (tile == 0) return;
|
||||||
image.SetClipX((tile-1) % XCount * image.GetClipW());
|
image.SetClipX((tile-1) % xCount * image.GetClipW());
|
||||||
image.SetClipY((tile-1) / XCount * image.GetClipH());
|
image.SetClipY((tile-1) / xCount * image.GetClipH());
|
||||||
image.DrawTo(dest, x, y);
|
image.DrawTo(dest, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,8 +50,8 @@ void TileSheet::DrawRegionTo(SDL_Surface* const dest, Region* const region, int
|
|||||||
tile = region->GetTile(i, j, k);
|
tile = region->GetTile(i, j, k);
|
||||||
//0 is invisible
|
//0 is invisible
|
||||||
if (tile == 0) continue;
|
if (tile == 0) continue;
|
||||||
image.SetClipX((tile-1) % XCount * image.GetClipW());
|
image.SetClipX((tile-1) % xCount * image.GetClipW());
|
||||||
image.SetClipY((tile-1) / XCount * image.GetClipH());
|
image.SetClipY((tile-1) / xCount * image.GetClipH());
|
||||||
image.DrawTo(dest,
|
image.DrawTo(dest,
|
||||||
(region->GetX() + i) * image.GetClipW() - camX,
|
(region->GetX() + i) * image.GetClipW() - camX,
|
||||||
(region->GetY() + j) * image.GetClipH() - camY);
|
(region->GetY() + j) * image.GetClipH() - camY);
|
||||||
@@ -31,24 +31,24 @@
|
|||||||
class TileSheet {
|
class TileSheet {
|
||||||
public:
|
public:
|
||||||
TileSheet() = default;
|
TileSheet() = default;
|
||||||
TileSheet(std::string f, int x, int y) { Load(f, x, y); }
|
TileSheet(std::string f, int w, int h) { Load(f, w, h); }
|
||||||
~TileSheet() = default;
|
~TileSheet() = default;
|
||||||
|
|
||||||
void Load(std::string fname, int XCount, int YCount);
|
void Load(std::string fname, int tileWidth, int tileHeight);
|
||||||
void Unload();
|
void Unload();
|
||||||
|
|
||||||
void DrawTo(SDL_Surface* const dest, int x, int y, Region::type_t tile);
|
void DrawTileTo(SDL_Surface* const dest, int x, int y, Region::type_t tile);
|
||||||
void DrawRegionTo(SDL_Surface* const dest, Region* const region, int camX, int camY);
|
void DrawRegionTo(SDL_Surface* const dest, Region* const region, int camX, int camY);
|
||||||
|
|
||||||
//accessors
|
//accessors
|
||||||
Image* GetImage() { return ℑ }
|
Image* GetImage() { return ℑ }
|
||||||
int GetXCount() { return XCount; }
|
int GetXCount() { return xCount; }
|
||||||
int GetYCount() { return YCount; }
|
int GetYCount() { return yCount; }
|
||||||
int GetTileW() { return image.GetClipW(); }
|
int GetTileW() { return image.GetClipW(); }
|
||||||
int GetTileH() { return image.GetClipH(); }
|
int GetTileH() { return image.GetClipH(); }
|
||||||
private:
|
private:
|
||||||
Image image;
|
Image image;
|
||||||
int XCount = 0, YCount = 0;
|
int xCount = 0, yCount = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#include "tile_sheet_api.hpp"
|
||||||
|
|
||||||
|
#include "tile_sheet.hpp"
|
||||||
|
|
||||||
|
static int load(lua_State* L) {
|
||||||
|
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
|
||||||
|
sheet->Load(lua_tostring(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int unload(lua_State* L) {
|
||||||
|
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
|
||||||
|
sheet->Unload();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getXCount(lua_State* L) {
|
||||||
|
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
|
||||||
|
lua_pushinteger(L, sheet->GetXCount());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getYCount(lua_State* L) {
|
||||||
|
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
|
||||||
|
lua_pushinteger(L, sheet->GetYCount());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getTileW(lua_State* L) {
|
||||||
|
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
|
||||||
|
lua_pushinteger(L, sheet->GetTileW());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getTileH(lua_State* L) {
|
||||||
|
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
|
||||||
|
lua_pushinteger(L, sheet->GetTileH());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const luaL_Reg tileSheetLib[] = {
|
||||||
|
{"Load",load},
|
||||||
|
{"Unload",unload},
|
||||||
|
{"GetXCount",getXCount},
|
||||||
|
{"GetYCount",getYCount},
|
||||||
|
{"GetTileW",getTileW},
|
||||||
|
{"GetTileH",getTileH},
|
||||||
|
{nullptr, nullptr}
|
||||||
|
};
|
||||||
|
|
||||||
|
LUAMOD_API int openTileSheetAPI(lua_State* L) {
|
||||||
|
luaL_newlib(L, tileSheetLib);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#ifndef TILESHEETAPI_HPP_
|
||||||
|
#define TILESHEETAPI_HPP_
|
||||||
|
|
||||||
|
#if defined(__MINGW32__)
|
||||||
|
#include "lua/lua.hpp"
|
||||||
|
#else
|
||||||
|
#include "lua.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TORTUGA_TILE_SHEET_NAME "tile_sheet"
|
||||||
|
LUAMOD_API int openTileSheetAPI(lua_State* L);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. packet serial ../gameplay ../map ../utilities
|
INCLUDES+=. packet_types ../gameplay ../map ../utilities
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
@@ -17,8 +17,7 @@ OUT=$(addprefix $(OUTDIR)/,libcommon.a)
|
|||||||
#targets
|
#targets
|
||||||
all: $(OBJ) $(OUT)
|
all: $(OBJ) $(OUT)
|
||||||
ar -crs $(OUT) $(OBJ)
|
ar -crs $(OUT) $(OBJ)
|
||||||
$(MAKE) -C packet
|
$(MAKE) -C packet_types
|
||||||
$(MAKE) -C serial
|
|
||||||
|
|
||||||
$(OBJ): | $(OBJDIR)
|
$(OBJ): | $(OBJDIR)
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013, 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "serial_packet.hpp"
|
|
||||||
|
|
||||||
/* DOCS: Sanity check, read more
|
|
||||||
* Since most/all of the files in this directory are header files, I've created
|
|
||||||
* this source file as a "sanity check", to ensure that the above header files
|
|
||||||
* are written correctly via make.
|
|
||||||
*/
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013, 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef SERIALPACKETTYPE_HPP_
|
|
||||||
#define SERIALPACKETTYPE_HPP_
|
|
||||||
|
|
||||||
/* Key for the comments:
|
|
||||||
* request => response
|
|
||||||
*/
|
|
||||||
|
|
||||||
enum class SerialPacketType {
|
|
||||||
//default: there is something wrong
|
|
||||||
NONE = 0,
|
|
||||||
|
|
||||||
//keep alive
|
|
||||||
//ping => pong
|
|
||||||
PING = 1,
|
|
||||||
PONG = 2,
|
|
||||||
|
|
||||||
//search for the server list
|
|
||||||
//none => server name, player count, version info (and source address)
|
|
||||||
BROADCAST_REQUEST = 3,
|
|
||||||
BROADCAST_RESPONSE = 4,
|
|
||||||
|
|
||||||
//try to join the server
|
|
||||||
//username, and password => client index, account index
|
|
||||||
JOIN_REQUEST = 5,
|
|
||||||
JOIN_RESPONSE = 6,
|
|
||||||
JOIN_REJECTION = 7,
|
|
||||||
|
|
||||||
//mass update of all surrounding content
|
|
||||||
//character.x, character.y => packet barrage
|
|
||||||
SYNCHRONIZE = 8,
|
|
||||||
|
|
||||||
//disconnect from the server
|
|
||||||
//autentication, account index => disconnect that account
|
|
||||||
DISCONNECT = 9,
|
|
||||||
|
|
||||||
//shut down the server
|
|
||||||
//autentication => disconnect, shutdown
|
|
||||||
SHUTDOWN = 10,
|
|
||||||
|
|
||||||
//map data
|
|
||||||
//room index, region.x, region.y => room index, region.x, region.y, region content
|
|
||||||
REGION_REQUEST = 11,
|
|
||||||
REGION_CONTENT = 12,
|
|
||||||
|
|
||||||
//combat data
|
|
||||||
//TODO: system incomplete
|
|
||||||
COMBAT_NEW = 13,
|
|
||||||
COMBAT_DELETE = 14,
|
|
||||||
COMBAT_UPDATE = 15,
|
|
||||||
|
|
||||||
COMBAT_ENTER_REQUEST = 16,
|
|
||||||
COMBAT_ENTER_RESPONSE = 17,
|
|
||||||
|
|
||||||
COMBAT_EXIT_REQUEST = 18,
|
|
||||||
COMBAT_EXIT_RESPONSE = 19,
|
|
||||||
|
|
||||||
//TODO: COMBAT info
|
|
||||||
|
|
||||||
COMBAT_REJECTION = 20,
|
|
||||||
|
|
||||||
//character data
|
|
||||||
//character data => etc.
|
|
||||||
CHARACTER_NEW = 21,
|
|
||||||
CHARACTER_DELETE = 22,
|
|
||||||
CHARACTER_UPDATE = 23,
|
|
||||||
|
|
||||||
//authentication, character index => character stats
|
|
||||||
CHARACTER_STATS_REQUEST= 24,
|
|
||||||
CHARACTER_STATS_RESPONSE = 25,
|
|
||||||
|
|
||||||
//character new => character rejection, disconnect?
|
|
||||||
CHARACTER_REJECTION = 26,
|
|
||||||
|
|
||||||
//enemy data
|
|
||||||
//enemy data => etc.
|
|
||||||
ENEMY_NEW = 27,
|
|
||||||
ENEMY_DELETE = 28,
|
|
||||||
ENEMY_UPDATE = 29,
|
|
||||||
|
|
||||||
ENEMY_STATS_REQUEST = 30,
|
|
||||||
ENEMY_STATS_RESPONSE = 31,
|
|
||||||
|
|
||||||
//enemy index => enemy doens't exist
|
|
||||||
ENEMY_REJECTION= 32,
|
|
||||||
|
|
||||||
//NOTE: more packet types go here
|
|
||||||
|
|
||||||
//not used
|
|
||||||
LAST
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#include "character_packet.hpp"
|
||||||
|
|
||||||
|
#include "serial_utility.hpp"
|
||||||
|
|
||||||
|
void 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));
|
||||||
|
|
||||||
|
//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));
|
||||||
|
|
||||||
|
//gameplay components: equipment, items, buffs, debuffs...
|
||||||
|
}
|
||||||
+5
-5
@@ -25,7 +25,6 @@
|
|||||||
#include "serial_packet_base.hpp"
|
#include "serial_packet_base.hpp"
|
||||||
|
|
||||||
#include "vector2.hpp"
|
#include "vector2.hpp"
|
||||||
#include "statistics.hpp"
|
|
||||||
|
|
||||||
struct CharacterPacket : SerialPacketBase {
|
struct CharacterPacket : SerialPacketBase {
|
||||||
//identify the character
|
//identify the character
|
||||||
@@ -35,16 +34,17 @@ struct CharacterPacket : SerialPacketBase {
|
|||||||
|
|
||||||
//the owner
|
//the owner
|
||||||
int accountIndex;
|
int accountIndex;
|
||||||
|
//TODO: Authentication token?
|
||||||
|
|
||||||
//location
|
//location
|
||||||
int roomIndex;
|
int roomIndex;
|
||||||
Vector2 origin;
|
Vector2 origin;
|
||||||
Vector2 motion;
|
Vector2 motion;
|
||||||
|
|
||||||
//gameplay
|
//gameplay components: equipment, items, buffs, debuffs...
|
||||||
Statistics stats;
|
|
||||||
|
|
||||||
//TODO: gameplay components: equipment, items, buffs, debuffs
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void serializeCharacter(void* buffer, CharacterPacket* packet);
|
||||||
|
void deserializeCharacter(void* buffer, CharacterPacket* packet);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#include "client_packet.hpp"
|
||||||
|
|
||||||
|
#include "serial_utility.hpp"
|
||||||
|
|
||||||
|
void serializeClient(void* buffer, ClientPacket* packet) {
|
||||||
|
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
||||||
|
|
||||||
|
serialCopy(&buffer, &packet->clientIndex, sizeof(int));
|
||||||
|
serialCopy(&buffer, &packet->accountIndex, sizeof(int));
|
||||||
|
serialCopy(&buffer, packet->username, PACKET_STRING_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deserializeClient(void* buffer, ClientPacket* packet) {
|
||||||
|
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
||||||
|
|
||||||
|
deserialCopy(&buffer, &packet->clientIndex, sizeof(int));
|
||||||
|
deserialCopy(&buffer, &packet->accountIndex, sizeof(int));
|
||||||
|
deserialCopy(&buffer, packet->username, PACKET_STRING_SIZE);
|
||||||
|
}
|
||||||
+3
-1
@@ -28,7 +28,9 @@ struct ClientPacket : SerialPacketBase {
|
|||||||
int clientIndex;
|
int clientIndex;
|
||||||
int accountIndex;
|
int accountIndex;
|
||||||
char username[PACKET_STRING_SIZE];
|
char username[PACKET_STRING_SIZE];
|
||||||
// char password[PACKET_STRING_SIZE]; //hashed, not currently used
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void serializeClient(void* buffer, ClientPacket* packet);
|
||||||
|
void deserializeClient(void* buffer, ClientPacket* packet);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. ../../gameplay ../../map ../../utilities
|
INCLUDES+=. .. ../../gameplay ../../map ../../utilities
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#include "region_packet.hpp"
|
||||||
|
|
||||||
|
#include "serial_utility.hpp"
|
||||||
|
|
||||||
|
void serializeRegion(void* buffer, RegionPacket* packet) {
|
||||||
|
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
||||||
|
|
||||||
|
//format
|
||||||
|
serialCopy(&buffer, &packet->roomIndex, sizeof(int));
|
||||||
|
serialCopy(&buffer, &packet->x, sizeof(int));
|
||||||
|
serialCopy(&buffer, &packet->y, sizeof(int));
|
||||||
|
|
||||||
|
if (packet->type != SerialPacketType::REGION_CONTENT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//tiles
|
||||||
|
for (int i = 0; i < REGION_WIDTH; i++) {
|
||||||
|
for (int j = 0; j < REGION_HEIGHT; j++) {
|
||||||
|
for (int k = 0; k < REGION_DEPTH; k++) {
|
||||||
|
*reinterpret_cast<Region::type_t*>(buffer) = packet->region->GetTile(i, j, k);
|
||||||
|
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//solids
|
||||||
|
serialCopy(&buffer, packet->region->GetSolidBitset(), REGION_SOLID_FOOTPRINT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deserializeRegion(void* buffer, RegionPacket* packet) {
|
||||||
|
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
||||||
|
|
||||||
|
//format
|
||||||
|
deserialCopy(&buffer, &packet->roomIndex, sizeof(int));
|
||||||
|
deserialCopy(&buffer, &packet->x, sizeof(int));
|
||||||
|
deserialCopy(&buffer, &packet->y, sizeof(int));
|
||||||
|
|
||||||
|
if (packet->type != SerialPacketType::REGION_CONTENT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//an object to work on
|
||||||
|
packet->region = new Region(packet->x, packet->y);
|
||||||
|
|
||||||
|
//tiles
|
||||||
|
for (int i = 0; i < REGION_WIDTH; i++) {
|
||||||
|
for (int j = 0; j < REGION_HEIGHT; j++) {
|
||||||
|
for (int k = 0; k < REGION_DEPTH; k++) {
|
||||||
|
packet->region->SetTile(i, j, k, *reinterpret_cast<Region::type_t*>(buffer));
|
||||||
|
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//solids
|
||||||
|
deserialCopy(&buffer, packet->region->GetSolidBitset(), REGION_SOLID_FOOTPRINT);
|
||||||
|
}
|
||||||
+19
-10
@@ -19,21 +19,30 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#ifndef ENEMYPACKET_HPP_
|
#ifndef REGIONPACKET_HPP_
|
||||||
#define ENEMYPACKET_HPP_
|
#define REGIONPACKET_HPP_
|
||||||
|
|
||||||
#include "serial_packet_base.hpp"
|
#include "serial_packet_base.hpp"
|
||||||
|
|
||||||
struct EnemyPacket : SerialPacketBase {
|
#include "region.hpp"
|
||||||
//identify the enemy
|
|
||||||
int enemyIndex;
|
|
||||||
char handle[PACKET_STRING_SIZE];
|
|
||||||
char avatar[PACKET_STRING_SIZE];
|
|
||||||
|
|
||||||
//gameplay
|
#include <cmath>
|
||||||
Statistics stats;
|
|
||||||
|
|
||||||
//TODO: gameplay components: equipment, items, buffs, debuffs, rewards
|
//define the memory footprint for the region's members
|
||||||
|
constexpr int REGION_TILE_FOOTPRINT = sizeof(Region::type_t) * REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH;
|
||||||
|
constexpr int REGION_SOLID_FOOTPRINT = ceil(REGION_WIDTH * REGION_HEIGHT / 8.0);
|
||||||
|
constexpr int REGION_METADATA_FOOTPRINT = sizeof(int) * 3;
|
||||||
|
|
||||||
|
struct RegionPacket : SerialPacketBase {
|
||||||
|
//location/identify the region
|
||||||
|
int roomIndex;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
//the data
|
||||||
|
Region* region;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void serializeRegion(void* buffer, RegionPacket* packet);
|
||||||
|
void deserializeRegion(void* buffer, RegionPacket* packet);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -19,12 +19,6 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#ifndef PAGERAPI_HPP_
|
#include "serial_packet_base.hpp"
|
||||||
#define PAGERAPI_HPP_
|
|
||||||
|
|
||||||
#include "lua/lua.hpp"
|
//sanity check
|
||||||
|
|
||||||
#define LUA_PAGERLIBNAME "pager"
|
|
||||||
LUAMOD_API int luaopen_pagerapi(lua_State* L);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
-7
@@ -22,15 +22,10 @@
|
|||||||
#ifndef SERIALPACKETBASE_HPP_
|
#ifndef SERIALPACKETBASE_HPP_
|
||||||
#define SERIALPACKETBASE_HPP_
|
#define SERIALPACKETBASE_HPP_
|
||||||
|
|
||||||
#ifndef SERIALPACKET_HPP_
|
|
||||||
#error Cannot include this file without 'serial_packet.hpp'
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "serial_packet_type.hpp"
|
#include "serial_packet_type.hpp"
|
||||||
|
|
||||||
#include "SDL/SDL_net.h"
|
#include "SDL/SDL_net.h"
|
||||||
|
|
||||||
constexpr int NETWORK_VERSION = 20140607;
|
|
||||||
constexpr int PACKET_STRING_SIZE = 100;
|
constexpr int PACKET_STRING_SIZE = 100;
|
||||||
|
|
||||||
struct SerialPacketBase {
|
struct SerialPacketBase {
|
||||||
@@ -41,6 +36,4 @@ struct SerialPacketBase {
|
|||||||
virtual ~SerialPacketBase() {};
|
virtual ~SerialPacketBase() {};
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef SerialPacketBase SerialPacket;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
+12
-12
@@ -19,24 +19,24 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#include "serial.hpp"
|
#include "server_packet.hpp"
|
||||||
|
|
||||||
#include "serial_util.hpp"
|
#include "serial_utility.hpp"
|
||||||
|
|
||||||
void serializeServer(ServerPacket* packet, void* buffer) {
|
void serializeServer(void* buffer, ServerPacket* packet) {
|
||||||
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
||||||
|
|
||||||
//identify the server
|
//identify the server
|
||||||
SERIALIZE(buffer, &packet->name, PACKET_STRING_SIZE);
|
serialCopy(&buffer, packet->name, PACKET_STRING_SIZE);
|
||||||
SERIALIZE(buffer, &packet->playerCount, sizeof(int));
|
serialCopy(&buffer, &packet->playerCount, sizeof(int));
|
||||||
SERIALIZE(buffer, &packet->version, sizeof(int));
|
serialCopy(&buffer, &packet->version, sizeof(int));
|
||||||
}
|
}
|
||||||
|
|
||||||
void deserializeServer(ServerPacket* packet, void* buffer) {
|
void deserializeServer(void* buffer, ServerPacket* packet) {
|
||||||
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
||||||
|
|
||||||
//identify the server
|
//identify the server
|
||||||
DESERIALIZE(buffer, &packet->name, PACKET_STRING_SIZE);
|
deserialCopy(&buffer, packet->name, PACKET_STRING_SIZE);
|
||||||
DESERIALIZE(buffer, &packet->playerCount, sizeof(int));
|
deserialCopy(&buffer, &packet->playerCount, sizeof(int));
|
||||||
DESERIALIZE(buffer, &packet->version, sizeof(int));
|
deserialCopy(&buffer, &packet->version, sizeof(int));
|
||||||
}
|
}
|
||||||
+3
@@ -31,4 +31,7 @@ struct ServerPacket : SerialPacketBase {
|
|||||||
int version;
|
int version;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void serializeServer(void* buffer, ServerPacket* packet);
|
||||||
|
void deserializeServer(void* buffer, ServerPacket* packet);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
+14
-20
@@ -19,28 +19,22 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#ifndef COMBATPACKET_HPP_
|
#include "text_packet.hpp"
|
||||||
#define COMBATPACKET_HPP_
|
|
||||||
|
|
||||||
#include "serial_packet_base.hpp"
|
#include "serial_utility.hpp"
|
||||||
|
|
||||||
#include "combat_data.hpp"
|
void serializeText(void* buffer, TextPacket* packet) {
|
||||||
|
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
||||||
|
|
||||||
struct CombatPacket : SerialPacketBase {
|
//content
|
||||||
//identify the combat instance
|
serialCopy(&buffer, packet->name, PACKET_STRING_SIZE);
|
||||||
int combatIndex;
|
serialCopy(&buffer, packet->text, PACKET_STRING_SIZE);
|
||||||
int difficulty;
|
}
|
||||||
CombatData::Terrain terrainType;
|
|
||||||
|
|
||||||
//combatants
|
void deserializeText(void* buffer, TextPacket* packet) {
|
||||||
int characterArray[COMBAT_MAX_CHARACTERS];
|
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
|
||||||
int enemyArray[COMBAT_MAX_ENEMIES];
|
|
||||||
|
|
||||||
//location
|
//content
|
||||||
int mapIndex;
|
deserialCopy(&buffer, packet->name, PACKET_STRING_SIZE);
|
||||||
Vector2 origin;
|
deserialCopy(&buffer, packet->text, PACKET_STRING_SIZE);
|
||||||
|
}
|
||||||
//TODO: gameplay components: rewards
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
+9
-12
@@ -19,20 +19,17 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#ifndef REGIONPACKET_HPP_
|
#ifndef TEXTPACKET_HPP_
|
||||||
#define REGIONPACKET_HPP_
|
#define TEXTPACKET_HPP_
|
||||||
|
|
||||||
#include "serial_packet_base.hpp"
|
#include "serial_packet_base.hpp"
|
||||||
|
|
||||||
#include "region.hpp"
|
struct TextPacket : SerialPacketBase {
|
||||||
|
char name[PACKET_STRING_SIZE];
|
||||||
struct RegionPacket : SerialPacketBase {
|
char text[PACKET_STRING_SIZE];
|
||||||
//location/identify the region
|
|
||||||
int roomIndex;
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
//the data
|
|
||||||
Region* region;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
void serializeText(void* buffer, TextPacket* packet);
|
||||||
|
void deserializeText(void* buffer, TextPacket* packet);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,182 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "serial.hpp"
|
|
||||||
|
|
||||||
#include "serial_util.hpp"
|
|
||||||
|
|
||||||
//simple type functions
|
|
||||||
void serializeType(SerialPacketBase* packet, void* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeType(SerialPacketBase* packet, void* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
}
|
|
||||||
|
|
||||||
//main switch functions
|
|
||||||
void serializePacket(SerialPacketBase* packet, void* buffer) {
|
|
||||||
switch(packet->type) {
|
|
||||||
//no extra data
|
|
||||||
case SerialPacketType::NONE:
|
|
||||||
case SerialPacketType::PING:
|
|
||||||
case SerialPacketType::PONG:
|
|
||||||
case SerialPacketType::BROADCAST_REQUEST:
|
|
||||||
|
|
||||||
//all rejections
|
|
||||||
case SerialPacketType::JOIN_REJECTION:
|
|
||||||
case SerialPacketType::CHARACTER_REJECTION:
|
|
||||||
case SerialPacketType::ENEMY_REJECTION:
|
|
||||||
case SerialPacketType::COMBAT_REJECTION:
|
|
||||||
|
|
||||||
serializeType(packet, buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
//character info
|
|
||||||
case SerialPacketType::CHARACTER_NEW:
|
|
||||||
case SerialPacketType::CHARACTER_DELETE:
|
|
||||||
case SerialPacketType::CHARACTER_UPDATE:
|
|
||||||
case SerialPacketType::CHARACTER_STATS_REQUEST:
|
|
||||||
case SerialPacketType::CHARACTER_STATS_RESPONSE:
|
|
||||||
serializeCharacter(static_cast<CharacterPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
//client info
|
|
||||||
case SerialPacketType::JOIN_REQUEST:
|
|
||||||
case SerialPacketType::JOIN_RESPONSE:
|
|
||||||
case SerialPacketType::SYNCHRONIZE:
|
|
||||||
case SerialPacketType::DISCONNECT:
|
|
||||||
case SerialPacketType::SHUTDOWN:
|
|
||||||
serializeClient(static_cast<ClientPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
//combat info
|
|
||||||
case SerialPacketType::COMBAT_NEW:
|
|
||||||
case SerialPacketType::COMBAT_DELETE:
|
|
||||||
case SerialPacketType::COMBAT_UPDATE:
|
|
||||||
|
|
||||||
case SerialPacketType::COMBAT_ENTER_REQUEST:
|
|
||||||
case SerialPacketType::COMBAT_ENTER_RESPONSE:
|
|
||||||
case SerialPacketType::COMBAT_EXIT_REQUEST:
|
|
||||||
case SerialPacketType::COMBAT_EXIT_RESPONSE:
|
|
||||||
|
|
||||||
serializeCombat(static_cast<CombatPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
//enemy info
|
|
||||||
case SerialPacketType::ENEMY_NEW:
|
|
||||||
case SerialPacketType::ENEMY_DELETE:
|
|
||||||
case SerialPacketType::ENEMY_UPDATE:
|
|
||||||
case SerialPacketType::ENEMY_STATS_REQUEST:
|
|
||||||
case SerialPacketType::ENEMY_STATS_RESPONSE:
|
|
||||||
serializeEnemy(static_cast<EnemyPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
//region info
|
|
||||||
case SerialPacketType::REGION_REQUEST:
|
|
||||||
serializeRegionFormat(static_cast<RegionPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SerialPacketType::REGION_CONTENT:
|
|
||||||
serializeRegionContent(static_cast<RegionPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
//server info
|
|
||||||
case SerialPacketType::BROADCAST_RESPONSE:
|
|
||||||
serializeServer(static_cast<ServerPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializePacket(SerialPacketBase* packet, void* buffer) {
|
|
||||||
//find the type, so that you can actually deserialize the packet!
|
|
||||||
deserializeType(packet, buffer);
|
|
||||||
switch(packet->type) {
|
|
||||||
//no extra data
|
|
||||||
case SerialPacketType::NONE:
|
|
||||||
case SerialPacketType::PING:
|
|
||||||
case SerialPacketType::PONG:
|
|
||||||
case SerialPacketType::BROADCAST_REQUEST:
|
|
||||||
|
|
||||||
//all rejections
|
|
||||||
case SerialPacketType::JOIN_REJECTION:
|
|
||||||
case SerialPacketType::CHARACTER_REJECTION:
|
|
||||||
case SerialPacketType::ENEMY_REJECTION:
|
|
||||||
case SerialPacketType::COMBAT_REJECTION:
|
|
||||||
|
|
||||||
//NOTHING
|
|
||||||
break;
|
|
||||||
|
|
||||||
//character info
|
|
||||||
case SerialPacketType::CHARACTER_NEW:
|
|
||||||
case SerialPacketType::CHARACTER_DELETE:
|
|
||||||
case SerialPacketType::CHARACTER_UPDATE:
|
|
||||||
case SerialPacketType::CHARACTER_STATS_REQUEST:
|
|
||||||
case SerialPacketType::CHARACTER_STATS_RESPONSE:
|
|
||||||
deserializeCharacter(static_cast<CharacterPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
//client info
|
|
||||||
case SerialPacketType::JOIN_REQUEST:
|
|
||||||
case SerialPacketType::JOIN_RESPONSE:
|
|
||||||
case SerialPacketType::SYNCHRONIZE:
|
|
||||||
case SerialPacketType::DISCONNECT:
|
|
||||||
case SerialPacketType::SHUTDOWN:
|
|
||||||
deserializeClient(static_cast<ClientPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
//combat info
|
|
||||||
case SerialPacketType::COMBAT_NEW:
|
|
||||||
case SerialPacketType::COMBAT_DELETE:
|
|
||||||
case SerialPacketType::COMBAT_UPDATE:
|
|
||||||
|
|
||||||
case SerialPacketType::COMBAT_ENTER_REQUEST:
|
|
||||||
case SerialPacketType::COMBAT_ENTER_RESPONSE:
|
|
||||||
case SerialPacketType::COMBAT_EXIT_REQUEST:
|
|
||||||
case SerialPacketType::COMBAT_EXIT_RESPONSE:
|
|
||||||
|
|
||||||
serializeCombat(static_cast<CombatPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
//enemy info
|
|
||||||
case SerialPacketType::ENEMY_NEW:
|
|
||||||
case SerialPacketType::ENEMY_DELETE:
|
|
||||||
case SerialPacketType::ENEMY_UPDATE:
|
|
||||||
case SerialPacketType::ENEMY_STATS_REQUEST:
|
|
||||||
case SerialPacketType::ENEMY_STATS_RESPONSE:
|
|
||||||
serializeEnemy(static_cast<EnemyPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
//region info
|
|
||||||
case SerialPacketType::REGION_REQUEST:
|
|
||||||
deserializeRegionFormat(static_cast<RegionPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SerialPacketType::REGION_CONTENT:
|
|
||||||
deserializeRegionContent(static_cast<RegionPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
//server info
|
|
||||||
case SerialPacketType::BROADCAST_RESPONSE:
|
|
||||||
deserializeServer(static_cast<ServerPacket*>(packet), buffer);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef SERIALIZE_HPP_
|
|
||||||
#define SERIALIZE_HPP_
|
|
||||||
|
|
||||||
#include "serial_packet.hpp"
|
|
||||||
|
|
||||||
#include "region.hpp"
|
|
||||||
#include "statistics.hpp"
|
|
||||||
|
|
||||||
//Primary interface functions
|
|
||||||
void serializePacket(SerialPacketBase*, void* dest);
|
|
||||||
void deserializePacket(SerialPacketBase*, void* src);
|
|
||||||
|
|
||||||
void serializeType(SerialPacketBase*, void*);
|
|
||||||
void deserializeType(SerialPacketBase*, void*);
|
|
||||||
|
|
||||||
//utility functions, exposed
|
|
||||||
void serializeCharacter(CharacterPacket*, void*);
|
|
||||||
void serializeClient(ClientPacket*, void*);
|
|
||||||
void serializeCombat(CombatPacket*, void*);
|
|
||||||
void serializeEnemy(EnemyPacket*, void*);
|
|
||||||
void serializeRegionFormat(RegionPacket*, void*);
|
|
||||||
void serializeRegionContent(RegionPacket*, void*);
|
|
||||||
void serializeServer(ServerPacket*, void*);
|
|
||||||
void serializeStatistics(Statistics*, void*);
|
|
||||||
|
|
||||||
void deserializeCharacter(CharacterPacket*, void*);
|
|
||||||
void deserializeClient(ClientPacket*, void*);
|
|
||||||
void deserializeCombat(CombatPacket*, void*);
|
|
||||||
void deserializeEnemy(EnemyPacket*, void*);
|
|
||||||
void deserializeRegionFormat(RegionPacket*, void*);
|
|
||||||
void deserializeRegionContent(RegionPacket*, void*);
|
|
||||||
void deserializeServer(ServerPacket*, void*);
|
|
||||||
void deserializeStatistics(Statistics*, void*);
|
|
||||||
|
|
||||||
/* DOCS: Keep the PACKET_BUFFER_SIZE up to date
|
|
||||||
* DOCS: REGION_CONTENT is currently the largest type of packet, read more
|
|
||||||
* map content: REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizoeof(region::type_t)
|
|
||||||
* map format: sizeof(int) * 3
|
|
||||||
* metadata: sizeof(SerialPacket::Type)
|
|
||||||
*/
|
|
||||||
|
|
||||||
constexpr int PACKET_BUFFER_SIZE = REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) + sizeof(int) * 3 + sizeof(SerialPacketType);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "serial.hpp"
|
|
||||||
|
|
||||||
#include "serial_util.hpp"
|
|
||||||
|
|
||||||
void serializeCharacter(CharacterPacket* packet, void* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//identify the character
|
|
||||||
SERIALIZE(buffer, &packet->characterIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->handle, PACKET_STRING_SIZE);
|
|
||||||
SERIALIZE(buffer, &packet->avatar, PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//the owner
|
|
||||||
SERIALIZE(buffer, &packet->accountIndex, sizeof(int));
|
|
||||||
|
|
||||||
//location
|
|
||||||
SERIALIZE(buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->origin.x, sizeof(double));
|
|
||||||
SERIALIZE(buffer, &packet->origin.y, sizeof(double));
|
|
||||||
SERIALIZE(buffer, &packet->motion.x, sizeof(double));
|
|
||||||
SERIALIZE(buffer, &packet->motion.y, sizeof(double));
|
|
||||||
|
|
||||||
//stats structure
|
|
||||||
serializeStatistics(&packet->stats, buffer);
|
|
||||||
buffer = reinterpret_cast<char*>(buffer) + sizeof(Statistics);
|
|
||||||
|
|
||||||
//TODO: gameplay components: equipment, items, buffs, debuffs
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeCharacter(CharacterPacket* packet, void* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//identify the character
|
|
||||||
DESERIALIZE(buffer, &packet->characterIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->handle, PACKET_STRING_SIZE);
|
|
||||||
DESERIALIZE(buffer, &packet->avatar, PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//the owner
|
|
||||||
DESERIALIZE(buffer, &packet->accountIndex, sizeof(int));
|
|
||||||
|
|
||||||
//location
|
|
||||||
DESERIALIZE(buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->origin.x, sizeof(double));
|
|
||||||
DESERIALIZE(buffer, &packet->origin.y, sizeof(double));
|
|
||||||
DESERIALIZE(buffer, &packet->motion.x, sizeof(double));
|
|
||||||
DESERIALIZE(buffer, &packet->motion.y, sizeof(double));
|
|
||||||
|
|
||||||
//stats structure
|
|
||||||
deserializeStatistics(&packet->stats, buffer);
|
|
||||||
buffer = reinterpret_cast<char*>(buffer) + sizeof(Statistics);
|
|
||||||
|
|
||||||
//TODO: gameplay components: equipment, items, buffs, debuffs
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "serial.hpp"
|
|
||||||
|
|
||||||
#include "serial_util.hpp"
|
|
||||||
|
|
||||||
void serializeClient(ClientPacket* packet, void* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
SERIALIZE(buffer, &packet->clientIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->accountIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->username, PACKET_STRING_SIZE);
|
|
||||||
// SERIALIZE(buffer, &packet->password, PACKET_STRING_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeClient(ClientPacket* packet, void* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
DESERIALIZE(buffer, &packet->clientIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->accountIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->username, PACKET_STRING_SIZE);
|
|
||||||
// DESERIALIZE(buffer, &packet->password, PACKET_STRING_SIZE);
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "serial.hpp"
|
|
||||||
|
|
||||||
#include "serial_util.hpp"
|
|
||||||
|
|
||||||
void serializeCombat(CombatPacket* packet, void* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//identify the combat instance
|
|
||||||
SERIALIZE(buffer, &packet->combatIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->difficulty, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->terrainType, sizeof(CombatData::Terrain));
|
|
||||||
|
|
||||||
//combatants
|
|
||||||
SERIALIZE(buffer, &packet->characterArray, sizeof(int) * COMBAT_MAX_CHARACTERS);
|
|
||||||
SERIALIZE(buffer, &packet->enemyArray, sizeof(int) * COMBAT_MAX_ENEMIES);
|
|
||||||
|
|
||||||
//location
|
|
||||||
SERIALIZE(buffer, &packet->mapIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->origin.x, sizeof(double));
|
|
||||||
SERIALIZE(buffer, &packet->origin.y, sizeof(double));
|
|
||||||
|
|
||||||
//TODO: gameplay components: rewards
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeCombat(CombatPacket* packet, void* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//identify the combat instance
|
|
||||||
DESERIALIZE(buffer, &packet->combatIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->difficulty, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->terrainType, sizeof(CombatData::Terrain));
|
|
||||||
|
|
||||||
//combatants
|
|
||||||
DESERIALIZE(buffer, &packet->characterArray, sizeof(int) * COMBAT_MAX_CHARACTERS);
|
|
||||||
DESERIALIZE(buffer, &packet->enemyArray, sizeof(int) * COMBAT_MAX_ENEMIES);
|
|
||||||
|
|
||||||
//location
|
|
||||||
DESERIALIZE(buffer, &packet->mapIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->origin.x, sizeof(double));
|
|
||||||
DESERIALIZE(buffer, &packet->origin.y, sizeof(double));
|
|
||||||
|
|
||||||
//TODO: gameplay components: rewards
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "serial.hpp"
|
|
||||||
|
|
||||||
#include "serial_util.hpp"
|
|
||||||
|
|
||||||
void serializeEnemy(EnemyPacket* packet, void* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//identify the enemy
|
|
||||||
SERIALIZE(buffer, &packet->enemyIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->handle, PACKET_STRING_SIZE);
|
|
||||||
SERIALIZE(buffer, &packet->avatar, PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//gameplay
|
|
||||||
|
|
||||||
//stats structure
|
|
||||||
serializeStatistics(&packet->stats, buffer);
|
|
||||||
buffer = reinterpret_cast<char*>(buffer) + sizeof(Statistics);
|
|
||||||
|
|
||||||
//TODO: gameplay components: equipment, items, buffs, debuffs, rewards
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeEnemy(EnemyPacket* packet, void* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//identify the enemy
|
|
||||||
DESERIALIZE(buffer, &packet->enemyIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->handle, PACKET_STRING_SIZE);
|
|
||||||
DESERIALIZE(buffer, &packet->avatar, PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//stats structure
|
|
||||||
deserializeStatistics(&packet->stats, buffer);
|
|
||||||
buffer = reinterpret_cast<char*>(buffer) + sizeof(Statistics);
|
|
||||||
|
|
||||||
//TODO: gameplay components: equipment, items, buffs, debuffs, rewards
|
|
||||||
}
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "serial.hpp"
|
|
||||||
|
|
||||||
#include "serial_util.hpp"
|
|
||||||
|
|
||||||
void serializeRegionFormat(RegionPacket* packet, void* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//format
|
|
||||||
SERIALIZE(buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->x, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->y, sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
void serializeRegionContent(RegionPacket* packet, void* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//format
|
|
||||||
SERIALIZE(buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->x, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->y, sizeof(int));
|
|
||||||
|
|
||||||
//content
|
|
||||||
for (register int i = 0; i < REGION_WIDTH; i++) {
|
|
||||||
for (register int j = 0; j < REGION_HEIGHT; j++) {
|
|
||||||
for (register int k = 0; k < REGION_DEPTH; k++) {
|
|
||||||
*reinterpret_cast<Region::type_t*>(buffer) = packet->region->GetTile(i, j, k);
|
|
||||||
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeRegionFormat(RegionPacket* packet, void* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//format
|
|
||||||
DESERIALIZE(buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->x, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->y, sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeRegionContent(RegionPacket* packet, void* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
|
||||||
|
|
||||||
//format
|
|
||||||
DESERIALIZE(buffer, &packet->roomIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->x, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->y, sizeof(int));
|
|
||||||
|
|
||||||
//an object to work on
|
|
||||||
packet->region = new Region(packet->x, packet->y);
|
|
||||||
|
|
||||||
//content
|
|
||||||
for (register int i = 0; i < REGION_WIDTH; i++) {
|
|
||||||
for (register int j = 0; j < REGION_HEIGHT; j++) {
|
|
||||||
for (register int k = 0; k < REGION_DEPTH; k++) {
|
|
||||||
packet->region->SetTile(i, j, k, *reinterpret_cast<Region::type_t*>(buffer));
|
|
||||||
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "serial.hpp"
|
|
||||||
|
|
||||||
#include "serial_util.hpp"
|
|
||||||
|
|
||||||
void serializeStatistics(Statistics* stats, void* buffer) {
|
|
||||||
//integers
|
|
||||||
SERIALIZE(buffer, &stats->level, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &stats->exp, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &stats->maxHP, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &stats->health, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &stats->maxMP, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &stats->mana, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &stats->attack, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &stats->defence, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &stats->intelligence, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &stats->resistance, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &stats->speed, sizeof(int));
|
|
||||||
|
|
||||||
//floats
|
|
||||||
SERIALIZE(buffer, &stats->accuracy, sizeof(float));
|
|
||||||
SERIALIZE(buffer, &stats->evasion, sizeof(float));
|
|
||||||
SERIALIZE(buffer, &stats->luck, sizeof(float));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void deserializeStatistics(Statistics* stats, void* buffer) {
|
|
||||||
//integers
|
|
||||||
DESERIALIZE(buffer, &stats->level, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &stats->exp, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &stats->maxHP, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &stats->health, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &stats->maxMP, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &stats->mana, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &stats->attack, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &stats->defence, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &stats->intelligence, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &stats->resistance, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &stats->speed, sizeof(int));
|
|
||||||
|
|
||||||
//floats
|
|
||||||
DESERIALIZE(buffer, &stats->accuracy, sizeof(float));
|
|
||||||
DESERIALIZE(buffer, &stats->evasion, sizeof(float));
|
|
||||||
DESERIALIZE(buffer, &stats->luck, sizeof(float));
|
|
||||||
}
|
|
||||||
@@ -22,23 +22,43 @@
|
|||||||
#ifndef SERIALPACKET_HPP_
|
#ifndef SERIALPACKET_HPP_
|
||||||
#define SERIALPACKET_HPP_
|
#define SERIALPACKET_HPP_
|
||||||
|
|
||||||
|
#include "serial_packet_base.hpp"
|
||||||
#include "character_packet.hpp"
|
#include "character_packet.hpp"
|
||||||
#include "client_packet.hpp"
|
#include "client_packet.hpp"
|
||||||
#include "combat_packet.hpp"
|
|
||||||
#include "enemy_packet.hpp"
|
|
||||||
#include "region_packet.hpp"
|
#include "region_packet.hpp"
|
||||||
#include "server_packet.hpp"
|
#include "server_packet.hpp"
|
||||||
|
#include "text_packet.hpp"
|
||||||
|
|
||||||
//NOTE: SerialPacket is defined in serial_packet_base.hpp
|
//SerialPacketBase is defined in serial_packet_base.hpp
|
||||||
|
typedef SerialPacketBase SerialPacket;
|
||||||
|
|
||||||
|
//DOCS: NETWORK_VERSION is used to discern compatible servers and clients
|
||||||
|
constexpr int NETWORK_VERSION = -1;
|
||||||
|
|
||||||
union MaxPacket {
|
union MaxPacket {
|
||||||
CharacterPacket a;
|
CharacterPacket a;
|
||||||
ClientPacket b;
|
ClientPacket b;
|
||||||
CombatPacket c;
|
RegionPacket c;
|
||||||
EnemyPacket d;
|
ServerPacket d;
|
||||||
RegionPacket e;
|
TextPacket e;
|
||||||
ServerPacket f;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr int MAX_PACKET_SIZE = sizeof(MaxPacket);
|
constexpr int MAX_PACKET_SIZE = sizeof(MaxPacket);
|
||||||
|
|
||||||
|
/* DOCS: PACKET_BUFFER_SIZE is the memory required to store serialized data
|
||||||
|
* DOCS: SerialPacketType::REGION_CONTENT is currently the largest packet type
|
||||||
|
* Serialized RegionPacket structure:
|
||||||
|
* SerialPacketType
|
||||||
|
* room index (int)
|
||||||
|
* X & Y position (int)
|
||||||
|
* tile data (3 layers)
|
||||||
|
* solid data (bitset)
|
||||||
|
*/
|
||||||
|
|
||||||
|
constexpr int PACKET_BUFFER_SIZE =
|
||||||
|
sizeof(SerialPacketType) +
|
||||||
|
REGION_METADATA_FOOTPRINT +
|
||||||
|
REGION_TILE_FOOTPRINT +
|
||||||
|
REGION_SOLID_FOOTPRINT;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#ifndef SERIALPACKETTYPE_HPP_
|
||||||
|
#define SERIALPACKETTYPE_HPP_
|
||||||
|
|
||||||
|
/* DOCS: The headers indicate what packet type is used for each message
|
||||||
|
* different messages under the same header will carry different amounts of
|
||||||
|
* valid data, but it will still be carried in that packet's format.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//TODO: This needs to be smoothed out
|
||||||
|
enum class SerialPacketType {
|
||||||
|
//default: there is something wrong
|
||||||
|
NONE = 0,
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//ServerPacket
|
||||||
|
// name, player count, version
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
//heartbeat
|
||||||
|
PING,
|
||||||
|
PONG,
|
||||||
|
|
||||||
|
//Used for finding available servers
|
||||||
|
BROADCAST_REQUEST,
|
||||||
|
BROADCAST_RESPONSE,
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//ClientPacket
|
||||||
|
// client index, account index, username
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
//Connecting to a server as a client
|
||||||
|
JOIN_REQUEST,
|
||||||
|
JOIN_RESPONSE,
|
||||||
|
|
||||||
|
//disconnect from the server
|
||||||
|
DISCONNECT_REQUEST,
|
||||||
|
DISCONNECT_RESPONSE,
|
||||||
|
DISCONNECT_FORCED,
|
||||||
|
|
||||||
|
//load the account
|
||||||
|
LOGIN_REQUEST,
|
||||||
|
LOGIN_RESPONSE,
|
||||||
|
|
||||||
|
//unload the account
|
||||||
|
LOGOUT_REQUEST,
|
||||||
|
LOGOUT_RESPONSE,
|
||||||
|
|
||||||
|
//shut down the server
|
||||||
|
SHUTDOWN_REQUEST,
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//RegionPacket
|
||||||
|
// room index, x, y, raw data
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
//map data
|
||||||
|
REGION_REQUEST, //NOTE: technically a query
|
||||||
|
REGION_CONTENT,
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//CharacterPacket
|
||||||
|
// character index,
|
||||||
|
// handle, avatar,
|
||||||
|
// account index (owner),
|
||||||
|
// room index, origin, motion,
|
||||||
|
// statistics
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
//character management
|
||||||
|
CHARACTER_CREATE,
|
||||||
|
CHARACTER_DELETE,
|
||||||
|
CHARACTER_LOAD,
|
||||||
|
CHARACTER_UNLOAD,
|
||||||
|
|
||||||
|
//find out info from the server
|
||||||
|
QUERY_CHARACTER_EXISTS,
|
||||||
|
QUERY_CHARACTER_STATS,
|
||||||
|
QUERY_CHARACTER_LOCATION,
|
||||||
|
|
||||||
|
//set the info in the server
|
||||||
|
CHARACTER_SET_ROOM,
|
||||||
|
CHARACTER_SET_ORIGIN,
|
||||||
|
CHARACTER_SET_MOTION,
|
||||||
|
|
||||||
|
//TODO: enemy management
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//TextPacket
|
||||||
|
// name, text
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
//general speech
|
||||||
|
TEXT_BROADCAST,
|
||||||
|
|
||||||
|
//rejection/error messages
|
||||||
|
JOIN_REJECTION,
|
||||||
|
LOGIN_REJECTION,
|
||||||
|
CHARACTER_REJECTION,
|
||||||
|
SHUTDOWN_REJECTION,
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//not used
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
LAST
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#include "serial_utility.hpp"
|
||||||
|
|
||||||
|
//packet types
|
||||||
|
#include "character_packet.hpp"
|
||||||
|
#include "client_packet.hpp"
|
||||||
|
#include "region_packet.hpp"
|
||||||
|
#include "server_packet.hpp"
|
||||||
|
#include "text_packet.hpp"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
//raw memory copy
|
||||||
|
void serialCopy(void** buffer, void* data, int size) {
|
||||||
|
memcpy(*buffer, data, size);
|
||||||
|
*buffer = reinterpret_cast<char*>(*buffer) + size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void deserialCopy(void** buffer, void* data, int size) {
|
||||||
|
memcpy(data, *buffer, size);
|
||||||
|
*buffer = reinterpret_cast<char*>(*buffer) + size;
|
||||||
|
}
|
||||||
|
|
||||||
|
//DOCS: The server and client MUST use the correct packet types
|
||||||
|
|
||||||
|
//main switch functions
|
||||||
|
void serializePacket(void* buffer, SerialPacketBase* packet) {
|
||||||
|
switch(packet->type) {
|
||||||
|
case SerialPacketType::PING:
|
||||||
|
case SerialPacketType::PONG:
|
||||||
|
case SerialPacketType::BROADCAST_REQUEST:
|
||||||
|
case SerialPacketType::BROADCAST_RESPONSE:
|
||||||
|
serializeServer(buffer, static_cast<ServerPacket*>(packet));
|
||||||
|
break;
|
||||||
|
case SerialPacketType::JOIN_REQUEST:
|
||||||
|
case SerialPacketType::JOIN_RESPONSE:
|
||||||
|
case SerialPacketType::DISCONNECT_REQUEST:
|
||||||
|
case SerialPacketType::DISCONNECT_RESPONSE:
|
||||||
|
case SerialPacketType::DISCONNECT_FORCED:
|
||||||
|
case SerialPacketType::LOGIN_REQUEST:
|
||||||
|
case SerialPacketType::LOGIN_RESPONSE:
|
||||||
|
case SerialPacketType::LOGOUT_REQUEST:
|
||||||
|
case SerialPacketType::LOGOUT_RESPONSE:
|
||||||
|
case SerialPacketType::SHUTDOWN_REQUEST:
|
||||||
|
serializeClient(buffer, static_cast<ClientPacket*>(packet));
|
||||||
|
break;
|
||||||
|
case SerialPacketType::REGION_REQUEST:
|
||||||
|
case SerialPacketType::REGION_CONTENT:
|
||||||
|
serializeRegion(buffer, static_cast<RegionPacket*>(packet));
|
||||||
|
break;
|
||||||
|
case SerialPacketType::CHARACTER_CREATE:
|
||||||
|
case SerialPacketType::CHARACTER_DELETE:
|
||||||
|
case SerialPacketType::CHARACTER_LOAD:
|
||||||
|
case SerialPacketType::CHARACTER_UNLOAD:
|
||||||
|
case SerialPacketType::QUERY_CHARACTER_EXISTS:
|
||||||
|
case SerialPacketType::QUERY_CHARACTER_STATS:
|
||||||
|
case SerialPacketType::QUERY_CHARACTER_LOCATION:
|
||||||
|
case SerialPacketType::CHARACTER_SET_ROOM:
|
||||||
|
case SerialPacketType::CHARACTER_SET_ORIGIN:
|
||||||
|
case SerialPacketType::CHARACTER_SET_MOTION:
|
||||||
|
serializeCharacter(buffer, static_cast<CharacterPacket*>(packet));
|
||||||
|
break;
|
||||||
|
case SerialPacketType::TEXT_BROADCAST:
|
||||||
|
case SerialPacketType::JOIN_REJECTION:
|
||||||
|
case SerialPacketType::LOGIN_REJECTION:
|
||||||
|
case SerialPacketType::CHARACTER_REJECTION:
|
||||||
|
case SerialPacketType::SHUTDOWN_REJECTION:
|
||||||
|
serializeText(buffer, static_cast<TextPacket*>(packet));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void deserializePacket(void* buffer, SerialPacketBase* packet) {
|
||||||
|
//find the type, so that you can actually deserialize the packet!
|
||||||
|
SerialPacketType type;
|
||||||
|
memcpy(&type, buffer, sizeof(SerialPacketType));
|
||||||
|
|
||||||
|
switch(packet->type) {
|
||||||
|
case SerialPacketType::PING:
|
||||||
|
case SerialPacketType::PONG:
|
||||||
|
case SerialPacketType::BROADCAST_REQUEST:
|
||||||
|
case SerialPacketType::BROADCAST_RESPONSE:
|
||||||
|
deserializeServer(buffer, static_cast<ServerPacket*>(packet));
|
||||||
|
break;
|
||||||
|
case SerialPacketType::JOIN_REQUEST:
|
||||||
|
case SerialPacketType::JOIN_RESPONSE:
|
||||||
|
case SerialPacketType::DISCONNECT_REQUEST:
|
||||||
|
case SerialPacketType::DISCONNECT_RESPONSE:
|
||||||
|
case SerialPacketType::DISCONNECT_FORCED:
|
||||||
|
case SerialPacketType::LOGIN_REQUEST:
|
||||||
|
case SerialPacketType::LOGIN_RESPONSE:
|
||||||
|
case SerialPacketType::LOGOUT_REQUEST:
|
||||||
|
case SerialPacketType::LOGOUT_RESPONSE:
|
||||||
|
case SerialPacketType::SHUTDOWN_REQUEST:
|
||||||
|
deserializeClient(buffer, static_cast<ClientPacket*>(packet));
|
||||||
|
break;
|
||||||
|
case SerialPacketType::REGION_REQUEST:
|
||||||
|
case SerialPacketType::REGION_CONTENT:
|
||||||
|
deserializeRegion(buffer, static_cast<RegionPacket*>(packet));
|
||||||
|
break;
|
||||||
|
case SerialPacketType::CHARACTER_CREATE:
|
||||||
|
case SerialPacketType::CHARACTER_DELETE:
|
||||||
|
case SerialPacketType::CHARACTER_LOAD:
|
||||||
|
case SerialPacketType::CHARACTER_UNLOAD:
|
||||||
|
case SerialPacketType::QUERY_CHARACTER_EXISTS:
|
||||||
|
case SerialPacketType::QUERY_CHARACTER_STATS:
|
||||||
|
case SerialPacketType::QUERY_CHARACTER_LOCATION:
|
||||||
|
case SerialPacketType::CHARACTER_SET_ROOM:
|
||||||
|
case SerialPacketType::CHARACTER_SET_ORIGIN:
|
||||||
|
case SerialPacketType::CHARACTER_SET_MOTION:
|
||||||
|
deserializeCharacter(buffer, static_cast<CharacterPacket*>(packet));
|
||||||
|
break;
|
||||||
|
case SerialPacketType::TEXT_BROADCAST:
|
||||||
|
case SerialPacketType::JOIN_REJECTION:
|
||||||
|
case SerialPacketType::LOGIN_REJECTION:
|
||||||
|
case SerialPacketType::CHARACTER_REJECTION:
|
||||||
|
case SerialPacketType::SHUTDOWN_REJECTION:
|
||||||
|
deserializeText(buffer, static_cast<TextPacket*>(packet));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,13 +19,19 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#ifndef SERIALIZEUTIL_HPP_
|
#ifndef SERIALIZEUTILITY_HPP_
|
||||||
#define SERIALIZEUTIL_HPP_
|
#define SERIALIZEUTILITY_HPP_
|
||||||
|
|
||||||
|
#include "serial_packet_base.hpp"
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
//NOTE: The strange assignments here used in order to move the void* parameter
|
//raw memory copy
|
||||||
#define SERIALIZE(buffer, data, size) memcpy(buffer, data, size); buffer = reinterpret_cast<char*>(buffer) + size;
|
void serialCopy(void** buffer, void* data, int size);
|
||||||
#define DESERIALIZE(buffer, data, size) memcpy(data, buffer, size); buffer = reinterpret_cast<char*>(buffer) + size;
|
void deserialCopy(void** buffer, void* data, int size);
|
||||||
|
|
||||||
|
//primary functions
|
||||||
|
void serializePacket(void* buffer, SerialPacketBase* packet);
|
||||||
|
void deserializePacket(void* buffer, SerialPacketBase* packet);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -21,12 +21,13 @@
|
|||||||
*/
|
*/
|
||||||
#include "udp_network_utility.hpp"
|
#include "udp_network_utility.hpp"
|
||||||
|
|
||||||
#include "serial.hpp"
|
#include "serial_packet.hpp"
|
||||||
|
#include "serial_utility.hpp"
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
//BUGFIX: memset() is used before sending a packet to remove old data; you don't want to send sensitive data over the network
|
//NOTE: memset() is used before sending a packet to remove old data; you don't want to send sensitive data over the network
|
||||||
//NOTE: don't confuse SerialPacket with UDPpacket
|
//NOTE: don't confuse SerialPacketBase with UDPpacket
|
||||||
|
|
||||||
void UDPNetworkUtility::Open(int port) {
|
void UDPNetworkUtility::Open(int port) {
|
||||||
socket = SDLNet_UDP_Open(port);
|
socket = SDLNet_UDP_Open(port);
|
||||||
@@ -54,11 +55,11 @@ int UDPNetworkUtility::Bind(const char* ip, int port, int channel) {
|
|||||||
throw(std::runtime_error("Failed to resolve a host"));
|
throw(std::runtime_error("Failed to resolve a host"));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Bind(&add, channel);
|
return Bind(add, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
int UDPNetworkUtility::Bind(IPaddress* add, int channel) {
|
int UDPNetworkUtility::Bind(IPaddress add, int channel) {
|
||||||
int ret = SDLNet_UDP_Bind(socket, channel, add);
|
int ret = SDLNet_UDP_Bind(socket, channel, &add);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
throw(std::runtime_error("Failed to bind to a channel"));
|
throw(std::runtime_error("Failed to bind to a channel"));
|
||||||
@@ -81,17 +82,17 @@ int UDPNetworkUtility::SendTo(const char* ip, int port, void* data, int len) {
|
|||||||
throw(std::runtime_error("Failed to resolve a host"));
|
throw(std::runtime_error("Failed to resolve a host"));
|
||||||
}
|
}
|
||||||
|
|
||||||
SendTo(&add, data, len);
|
SendTo(add, data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
int UDPNetworkUtility::SendTo(IPaddress* add, void* data, int len) {
|
int UDPNetworkUtility::SendTo(IPaddress add, void* data, int len) {
|
||||||
if (len > packet->maxlen) {
|
if (len > packet->maxlen) {
|
||||||
throw(std::runtime_error("The buffer is to large for the UDPpacket"));
|
throw(std::runtime_error("The buffer is to large for the UDPpacket"));
|
||||||
}
|
}
|
||||||
memset(packet->data, 0, packet->maxlen);
|
memset(packet->data, 0, packet->maxlen);
|
||||||
memcpy(packet->data, data, len);
|
memcpy(packet->data, data, len);
|
||||||
packet->len = len;
|
packet->len = len;
|
||||||
packet->address = *add;
|
packet->address = add;
|
||||||
|
|
||||||
int ret = SDLNet_UDP_Send(socket, -1, packet);
|
int ret = SDLNet_UDP_Send(socket, -1, packet);
|
||||||
|
|
||||||
@@ -152,23 +153,23 @@ int UDPNetworkUtility::Receive() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//send a SerialPacket
|
//send a SerialPacketBase
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
int UDPNetworkUtility::SendTo(const char* ip, int port, SerialPacket* serialPacket) {
|
int UDPNetworkUtility::SendTo(const char* ip, int port, SerialPacketBase* serialPacket) {
|
||||||
IPaddress add;
|
IPaddress add;
|
||||||
if (SDLNet_ResolveHost(&add, ip, port) == -1) {
|
if (SDLNet_ResolveHost(&add, ip, port) == -1) {
|
||||||
throw(std::runtime_error("Failed to resolve a host"));
|
throw(std::runtime_error("Failed to resolve a host"));
|
||||||
}
|
}
|
||||||
|
|
||||||
SendTo(&add, serialPacket);
|
SendTo(add, serialPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
int UDPNetworkUtility::SendTo(IPaddress* add, SerialPacket* serialPacket) {
|
int UDPNetworkUtility::SendTo(IPaddress add, SerialPacketBase* serialPacket) {
|
||||||
memset(packet->data, 0, packet->maxlen);
|
memset(packet->data, 0, packet->maxlen);
|
||||||
serializePacket(serialPacket, packet->data);
|
serializePacket(packet->data, serialPacket);
|
||||||
packet->len = PACKET_BUFFER_SIZE;
|
packet->len = PACKET_BUFFER_SIZE;
|
||||||
packet->address = *add;
|
packet->address = add;
|
||||||
|
|
||||||
int ret = SDLNet_UDP_Send(socket, -1, packet);
|
int ret = SDLNet_UDP_Send(socket, -1, packet);
|
||||||
|
|
||||||
@@ -179,9 +180,9 @@ int UDPNetworkUtility::SendTo(IPaddress* add, SerialPacket* serialPacket) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int UDPNetworkUtility::SendTo(int channel, SerialPacket* serialPacket) {
|
int UDPNetworkUtility::SendTo(int channel, SerialPacketBase* serialPacket) {
|
||||||
memset(packet->data, 0, packet->maxlen);
|
memset(packet->data, 0, packet->maxlen);
|
||||||
serializePacket(serialPacket, packet->data);
|
serializePacket(packet->data, serialPacket);
|
||||||
packet->len = PACKET_BUFFER_SIZE;
|
packet->len = PACKET_BUFFER_SIZE;
|
||||||
|
|
||||||
int ret = SDLNet_UDP_Send(socket, channel, packet);
|
int ret = SDLNet_UDP_Send(socket, channel, packet);
|
||||||
@@ -193,9 +194,9 @@ int UDPNetworkUtility::SendTo(int channel, SerialPacket* serialPacket) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int UDPNetworkUtility::SendToAllChannels(SerialPacket* serialPacket) {
|
int UDPNetworkUtility::SendToAllChannels(SerialPacketBase* serialPacket) {
|
||||||
memset(packet->data, 0, packet->maxlen);
|
memset(packet->data, 0, packet->maxlen);
|
||||||
serializePacket(serialPacket, packet->data);
|
serializePacket(packet->data, serialPacket);
|
||||||
packet->len = PACKET_BUFFER_SIZE;
|
packet->len = PACKET_BUFFER_SIZE;
|
||||||
|
|
||||||
int sent = 0;
|
int sent = 0;
|
||||||
@@ -210,10 +211,10 @@ int UDPNetworkUtility::SendToAllChannels(SerialPacket* serialPacket) {
|
|||||||
return sent;
|
return sent;
|
||||||
}
|
}
|
||||||
|
|
||||||
int UDPNetworkUtility::Receive(SerialPacket* serialPacket) {
|
int UDPNetworkUtility::Receive(SerialPacketBase* serialPacket) {
|
||||||
memset(packet->data, 0, packet->maxlen);
|
memset(packet->data, 0, packet->maxlen);
|
||||||
int ret = SDLNet_UDP_Recv(socket, packet);
|
int ret = SDLNet_UDP_Recv(socket, packet);
|
||||||
deserializePacket(serialPacket, packet->data);
|
deserializePacket(packet->data, serialPacket);
|
||||||
serialPacket->srcAddress = packet->address;
|
serialPacket->srcAddress = packet->address;
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|||||||
@@ -22,21 +22,21 @@
|
|||||||
#ifndef UDPNETWORKUTILITY_HPP_
|
#ifndef UDPNETWORKUTILITY_HPP_
|
||||||
#define UDPNETWORKUTILITY_HPP_
|
#define UDPNETWORKUTILITY_HPP_
|
||||||
|
|
||||||
|
//common
|
||||||
|
#include "serial_packet_base.hpp"
|
||||||
|
#include "singleton.hpp"
|
||||||
|
|
||||||
|
//APIs
|
||||||
#include "SDL/SDL_net.h"
|
#include "SDL/SDL_net.h"
|
||||||
|
|
||||||
#include "serial_packet.hpp"
|
class UDPNetworkUtility : public Singleton<UDPNetworkUtility> {
|
||||||
|
|
||||||
class UDPNetworkUtility {
|
|
||||||
public:
|
public:
|
||||||
UDPNetworkUtility() = default;
|
|
||||||
~UDPNetworkUtility() = default;
|
|
||||||
|
|
||||||
void Open(int port);
|
void Open(int port);
|
||||||
void Close();
|
void Close();
|
||||||
|
|
||||||
//bind to a channel
|
//bind to a channel
|
||||||
int Bind(const char* ip, int port, int channel = -1);
|
int Bind(const char* ip, int port, int channel = -1);
|
||||||
int Bind(IPaddress* add, int channel = -1);
|
int Bind(IPaddress add, int channel = -1);
|
||||||
void Unbind(int channel);
|
void Unbind(int channel);
|
||||||
|
|
||||||
IPaddress* GetIPAddress(int channel) {
|
IPaddress* GetIPAddress(int channel) {
|
||||||
@@ -45,17 +45,17 @@ public:
|
|||||||
|
|
||||||
//send a buffer
|
//send a buffer
|
||||||
int SendTo(const char* ip, int port, void* data, int len);
|
int SendTo(const char* ip, int port, void* data, int len);
|
||||||
int SendTo(IPaddress* add, void* data, int len);
|
int SendTo(IPaddress add, void* data, int len);
|
||||||
int SendTo(int channel, void* data, int len);
|
int SendTo(int channel, void* data, int len);
|
||||||
int SendToAllChannels(void* data, int len);
|
int SendToAllChannels(void* data, int len);
|
||||||
int Receive();
|
int Receive();
|
||||||
|
|
||||||
//send a SerialPacket
|
//send a SerialPacketBase
|
||||||
int SendTo(const char* ip, int port, SerialPacket* serialPacket);
|
int SendTo(const char* ip, int port, SerialPacketBase* serialPacket);
|
||||||
int SendTo(IPaddress* add, SerialPacket* serialPacket);
|
int SendTo(IPaddress add, SerialPacketBase* serialPacket);
|
||||||
int SendTo(int channel, SerialPacket* serialPacket);
|
int SendTo(int channel, SerialPacketBase* serialPacket);
|
||||||
int SendToAllChannels(SerialPacket* serialPacket);
|
int SendToAllChannels(SerialPacketBase* serialPacket);
|
||||||
int Receive(SerialPacket* serialPacket);
|
int Receive(SerialPacketBase* serialPacket);
|
||||||
|
|
||||||
//accessors
|
//accessors
|
||||||
UDPpacket* GetPacket() const {
|
UDPpacket* GetPacket() const {
|
||||||
@@ -65,6 +65,11 @@ public:
|
|||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
|
friend Singleton<UDPNetworkUtility>;
|
||||||
|
|
||||||
|
UDPNetworkUtility() = default;
|
||||||
|
~UDPNetworkUtility() = default;
|
||||||
|
|
||||||
UDPsocket socket = nullptr;
|
UDPsocket socket = nullptr;
|
||||||
UDPpacket* packet = nullptr;
|
UDPpacket* packet = nullptr;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
* This class needs a rewrite.
|
* This class needs a rewrite.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//TODO: This thing is fucking terrible, fix it and the button class
|
||||||
class MenuBar {
|
class MenuBar {
|
||||||
public:
|
public:
|
||||||
MenuBar() = default;
|
MenuBar() = default;
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
#ifndef BOUNDINGBOX_HPP_
|
||||||
|
#define BOUNDINGBOX_HPP_
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
class BoundingBox {
|
||||||
|
public:
|
||||||
|
//This is explicitly a POD
|
||||||
|
int x, y;
|
||||||
|
int w, h;
|
||||||
|
|
||||||
|
BoundingBox() = default;
|
||||||
|
BoundingBox(int i, int j): x(i), y(j), w(0), h(0) {};
|
||||||
|
BoundingBox(int i, int j, int k, int l): x(i), y(j), w(k), h(l) {};
|
||||||
|
~BoundingBox() = default;
|
||||||
|
BoundingBox& operator=(BoundingBox const&) = default;
|
||||||
|
|
||||||
|
int Size() {
|
||||||
|
return std::max(w*h,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CheckOverlap(BoundingBox rhs) {
|
||||||
|
return !(
|
||||||
|
x >= rhs.x + rhs.w ||
|
||||||
|
y >= rhs.y + rhs.h ||
|
||||||
|
rhs.x >= x + w ||
|
||||||
|
rhs.y >= y + h);
|
||||||
|
}
|
||||||
|
|
||||||
|
BoundingBox CalcOverlap(BoundingBox rhs) {
|
||||||
|
if (!CheckOverlap(rhs)) {
|
||||||
|
return {0, 0, 0, 0};
|
||||||
|
}
|
||||||
|
BoundingBox ret;
|
||||||
|
ret.x = std::max(x, rhs.x);
|
||||||
|
ret.y = std::max(y, rhs.y);
|
||||||
|
ret.w = std::min(x+w, rhs.x+rhs.w) - ret.x;
|
||||||
|
ret.h = std::min(y+h, rhs.y+rhs.h) - ret.y;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//This is explicitly a POD
|
||||||
|
static_assert(std::is_pod<BoundingBox>::value, "BoundingBox is not a POD");
|
||||||
|
|
||||||
|
#include "vector2.hpp"
|
||||||
|
|
||||||
|
//operators
|
||||||
|
inline BoundingBox operator+(BoundingBox b, Vector2 v) {
|
||||||
|
return {b.x + (int)v.x, b.y + (int)v.y, b.w, b.h};
|
||||||
|
}
|
||||||
|
inline BoundingBox operator+(Vector2 v, BoundingBox b) {
|
||||||
|
return b + v;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2014
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "check_bounds.hpp"
|
|
||||||
|
|
||||||
bool checkPoint(Vector2 const& origin, Vector2 const& bound, Vector2 const& point) {
|
|
||||||
return !(
|
|
||||||
point.x < origin.x ||
|
|
||||||
point.y < origin.y ||
|
|
||||||
point.x >= origin.x + bound.x ||
|
|
||||||
point.y >= origin.y + bound.y
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool checkOverlap(Vector2 const& originOne, Vector2 const& boundOne, Vector2 const& originTwo, Vector2 const& boundTwo) {
|
|
||||||
return !(
|
|
||||||
originOne.x >= originTwo.x + boundTwo.x ||
|
|
||||||
originOne.x + boundOne.x >= originTwo.x ||
|
|
||||||
originOne.y >= originTwo.y + boundTwo.y ||
|
|
||||||
originOne.y + boundOne.y >= originTwo.y
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -22,28 +22,86 @@
|
|||||||
#include "config_utility.hpp"
|
#include "config_utility.hpp"
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
using namespace std;
|
void ConfigUtility::Load(std::string fname, int argc, char* argv[]) {
|
||||||
|
//clear the stored configuration
|
||||||
|
configMap.clear();
|
||||||
|
|
||||||
void ConfigUtility::Load(string fname) {
|
//use the default file
|
||||||
ifstream is(fname);
|
if (argc < 2) {
|
||||||
|
configMap = Read(fname);
|
||||||
if (!is.is_open()) {
|
return;
|
||||||
throw(runtime_error("Failed to open config file"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string key, val;
|
//some variables to use
|
||||||
|
table_t redirectedFile;
|
||||||
|
table_t cmdLineParams;
|
||||||
|
char key[256], val[256];
|
||||||
|
bool redirectUsed = false;
|
||||||
|
|
||||||
for (;;) { //forever
|
//reading from the command line
|
||||||
|
for (int i = 1; i < argc; ++i) {
|
||||||
|
//read from a specified config file
|
||||||
|
if (!strncmp(argv[i], "-config=", 8)) {
|
||||||
|
redirectedFile = Read(argv[i] + 8);
|
||||||
|
redirectUsed = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//set some specific values
|
||||||
|
if (!strncmp(argv[i], "-", 1)) {
|
||||||
|
//wipe the variables
|
||||||
|
memset(key, 0, 256);
|
||||||
|
memset(key, 0, 256);
|
||||||
|
|
||||||
|
//read the key-value pair
|
||||||
|
if (sscanf(argv[i], "-%[^=]=%[^\0]", key, val) != 2) {
|
||||||
|
std::ostringstream os;
|
||||||
|
os << "Failed to read a command line config argument (expected -%s=%s):" << std::endl;
|
||||||
|
os << "\targv[" << i << "]: " << argv[i] << std::endl;
|
||||||
|
os << "\tkey: " << key << std::endl;
|
||||||
|
os << "\tval: " << val << std::endl;
|
||||||
|
throw(std::runtime_error( os.str() ));
|
||||||
|
}
|
||||||
|
cmdLineParams[key] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//finally, construct the final config table
|
||||||
|
if (!redirectUsed) {
|
||||||
|
redirectedFile = Read(fname);
|
||||||
|
}
|
||||||
|
configMap.insert(cmdLineParams.begin(), cmdLineParams.end());
|
||||||
|
configMap.insert(redirectedFile.begin(), redirectedFile.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigUtility::table_t ConfigUtility::Read(std::string fname) {
|
||||||
|
//read in and return this file's data
|
||||||
|
table_t retTable;
|
||||||
|
std::ifstream is(fname);
|
||||||
|
|
||||||
|
if (!is.is_open()) {
|
||||||
|
std::ostringstream os;
|
||||||
|
os << "Failed to open a config file: " << fname;
|
||||||
|
throw(std::runtime_error( os.str() ));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string key, val;
|
||||||
|
|
||||||
|
while(true) { //forever
|
||||||
//eat whitespace
|
//eat whitespace
|
||||||
while(isspace(is.peek()))
|
while(isspace(is.peek())) {
|
||||||
is.ignore();
|
is.ignore();
|
||||||
|
}
|
||||||
|
|
||||||
//end of file
|
//end of file
|
||||||
if (is.eof())
|
if (is.eof()) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
//skip comment lines
|
//skip comment lines
|
||||||
if (is.peek() == '#') {
|
if (is.peek() == '#') {
|
||||||
@@ -57,48 +115,68 @@ void ConfigUtility::Load(string fname) {
|
|||||||
getline(is, key,'=');
|
getline(is, key,'=');
|
||||||
getline(is, val);
|
getline(is, val);
|
||||||
|
|
||||||
//trim the strings at the start & end
|
//eat the whitespace at the start & end
|
||||||
while(key.size() && isspace(*key.begin())) key.erase(0, 1);
|
while(key.size() && isspace( *key.begin() )) {
|
||||||
while(val.size() && isspace(*val.begin())) val.erase(0, 1);
|
key.erase(0, 1);
|
||||||
|
}
|
||||||
|
while(val.size() && isspace( *val.begin() )) {
|
||||||
|
val.erase(0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
while(key.size() && isspace(*(key.end()-1))) key.erase(key.end() - 1);
|
while(key.size() && isspace( *(key.end()-1) )) {
|
||||||
while(val.size() && isspace(*(val.end()-1))) val.erase(val.end() - 1);
|
key.erase(key.end() - 1);
|
||||||
|
}
|
||||||
|
while(val.size() && isspace( *(val.end()-1) )) {
|
||||||
|
val.erase(val.end() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
//allow empty/wiped values
|
//disallow empty/wiped pairs
|
||||||
if (key.size() == 0) {
|
if (key.size() == 0 || val.size() == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//save the pair
|
//save the pair
|
||||||
table[key] = val;
|
retTable[key] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
is.close();
|
is.close();
|
||||||
|
|
||||||
|
//load in any subordinate config files
|
||||||
|
if (retTable.find("config.next") != retTable.end()) {
|
||||||
|
table_t subTable = Read(retTable["config.next"]);
|
||||||
|
retTable.insert(subTable.begin(), subTable.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
return retTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//Convert to a type
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
std::string& ConfigUtility::String(std::string s) {
|
std::string& ConfigUtility::String(std::string s) {
|
||||||
return table[s];
|
return configMap[s];
|
||||||
}
|
}
|
||||||
|
|
||||||
int ConfigUtility::Integer(std::string s) {
|
int ConfigUtility::Integer(std::string s) {
|
||||||
std::map<std::string, std::string>::iterator it = table.find(s);
|
table_t::iterator it = configMap.find(s);
|
||||||
if (it == table.end()) {
|
if (it == configMap.end()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return atoi(it->second.c_str());
|
return atoi(it->second.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
double ConfigUtility::Double(std::string s) {
|
double ConfigUtility::Double(std::string s) {
|
||||||
std::map<std::string, std::string>::iterator it = table.find(s);
|
table_t::iterator it = configMap.find(s);
|
||||||
if (it == table.end()) {
|
if (it == configMap.end()) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
return atof(it->second.c_str());
|
return atof(it->second.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ConfigUtility::Boolean(std::string s) {
|
bool ConfigUtility::Boolean(std::string s) {
|
||||||
std::map<std::string, std::string>::iterator it = table.find(s);
|
table_t::iterator it = configMap.find(s);
|
||||||
if (it == table.end()) {
|
if (it == configMap.end()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return it->second == "true";
|
return it->second == "true";
|
||||||
|
|||||||
@@ -22,15 +22,14 @@
|
|||||||
#ifndef CONFIGUTILITY_HPP_
|
#ifndef CONFIGUTILITY_HPP_
|
||||||
#define CONFIGUTILITY_HPP_
|
#define CONFIGUTILITY_HPP_
|
||||||
|
|
||||||
|
#include "singleton.hpp"
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class ConfigUtility {
|
class ConfigUtility : public Singleton<ConfigUtility> {
|
||||||
public:
|
public:
|
||||||
ConfigUtility() = default;
|
void Load(std::string fname, int argc = 0, char* argv[] = nullptr);
|
||||||
ConfigUtility(std::string s) { Load(s); }
|
|
||||||
|
|
||||||
void Load(std::string fname);
|
|
||||||
|
|
||||||
//convert to a type
|
//convert to a type
|
||||||
std::string& String(std::string);
|
std::string& String(std::string);
|
||||||
@@ -39,22 +38,21 @@ public:
|
|||||||
bool Boolean(std::string);
|
bool Boolean(std::string);
|
||||||
|
|
||||||
//shorthand
|
//shorthand
|
||||||
std::string& operator[](std::string s) {
|
inline std::string& operator[](std::string s) { return configMap[s]; }
|
||||||
return String(s);
|
inline int Int(std::string s) { return Integer(s); }
|
||||||
}
|
inline bool Bool(std::string s) { return Boolean(s); }
|
||||||
int Int(std::string s) {
|
|
||||||
return Integer(s);
|
|
||||||
}
|
|
||||||
bool Bool(std::string s) {
|
|
||||||
return Boolean(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
//OO breaker
|
|
||||||
std::map<std::string, std::string>* GetMap() {
|
|
||||||
return &table;
|
|
||||||
}
|
|
||||||
private:
|
private:
|
||||||
std::map<std::string, std::string> table;
|
typedef std::map<std::string, std::string> table_t;
|
||||||
|
|
||||||
|
friend Singleton<ConfigUtility>;
|
||||||
|
|
||||||
|
ConfigUtility() = default;
|
||||||
|
~ConfigUtility() = default;
|
||||||
|
|
||||||
|
table_t Read(std::string fname);
|
||||||
|
|
||||||
|
table_t configMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -19,39 +19,45 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#ifndef ROOMMANAGER_HPP_
|
#ifndef SINGLETON_HPP_
|
||||||
#define ROOMMANAGER_HPP_
|
#define SINGLETON_HPP_
|
||||||
|
|
||||||
#include "room_data.hpp"
|
#include <stdexcept>
|
||||||
|
|
||||||
#include "lua/lua.hpp"
|
template<typename T>
|
||||||
|
class Singleton {
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#define ROOM_MANAGER_PSEUDOINDEX "RoomManager"
|
|
||||||
|
|
||||||
class RoomManager {
|
|
||||||
public:
|
public:
|
||||||
RoomManager() = default;
|
static T& GetSingleton() {
|
||||||
~RoomManager() = default;
|
if (!ptr) {
|
||||||
|
throw(std::logic_error("This singleton has not been created"));
|
||||||
|
}
|
||||||
|
return *ptr;
|
||||||
|
}
|
||||||
|
static void CreateSingleton() {
|
||||||
|
if (ptr) {
|
||||||
|
throw(std::logic_error("This singleton has already been created"));
|
||||||
|
}
|
||||||
|
ptr = new T();
|
||||||
|
}
|
||||||
|
static void DeleteSingleton() {
|
||||||
|
if (!ptr) {
|
||||||
|
throw(std::logic_error("A non-existant singleton cannot be deleted"));
|
||||||
|
}
|
||||||
|
delete ptr;
|
||||||
|
ptr = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
//public access methods
|
protected:
|
||||||
RoomData* CreateRoom(int uid);
|
Singleton() = default;
|
||||||
RoomData* UnloadRoom(int uid);
|
Singleton(Singleton const&) = default;
|
||||||
|
Singleton(Singleton&&) = default;
|
||||||
RoomData* GetRoom(int uid);
|
~Singleton() = default;
|
||||||
RoomData* FindRoom(int uid);
|
|
||||||
RoomData* PushRoom(int uid, RoomData*);
|
|
||||||
|
|
||||||
//accessors and mutators
|
|
||||||
std::map<int, RoomData*>* GetContainer() { return &roomMap; }
|
|
||||||
|
|
||||||
lua_State* SetLuaState(lua_State* L) { return luaState = L; }
|
|
||||||
lua_State* GetLuaState() { return luaState; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::map<int, RoomData*> roomMap;
|
static T* ptr;
|
||||||
lua_State* luaState = nullptr;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T* Singleton<T>::ptr = nullptr;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -23,25 +23,14 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
int snapToBase(int base, int x) {
|
|
||||||
//snap to a grid
|
|
||||||
if (x < 0) {
|
|
||||||
++x;
|
|
||||||
return x / base * base - base;
|
|
||||||
}
|
|
||||||
return x / base * base;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string truncatePath(std::string pathname) {
|
std::string truncatePath(std::string pathname) {
|
||||||
return std::string(
|
return std::string(
|
||||||
std::find_if(
|
std::find_if(
|
||||||
pathname.rbegin(),
|
pathname.rbegin(),
|
||||||
pathname.rend(),
|
pathname.rend(),
|
||||||
[](char ch) -> bool {
|
[](char ch) -> bool {
|
||||||
//windows only
|
//windows & unix tested
|
||||||
return ch == '/' || ch == '\\';
|
return ch == '/' || ch == '\\';
|
||||||
// //unix only
|
|
||||||
// return ch == '/';
|
|
||||||
}).base(),
|
}).base(),
|
||||||
pathname.end());
|
pathname.end());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
int snapToBase(int base, int x);
|
|
||||||
std::string truncatePath(std::string pathname);
|
std::string truncatePath(std::string pathname);
|
||||||
|
|
||||||
//fixing known bugs in g++
|
//fixing known bugs in g++
|
||||||
|
|||||||
@@ -41,6 +41,13 @@ public:
|
|||||||
double SquaredLength() const {
|
double SquaredLength() const {
|
||||||
return x*x+y*y;
|
return x*x+y*y;
|
||||||
}
|
}
|
||||||
|
void Normalize() {
|
||||||
|
double l = Length();
|
||||||
|
if (l == 0)
|
||||||
|
throw(std::domain_error("Divide by zero"));
|
||||||
|
x /= l;
|
||||||
|
y /= l;
|
||||||
|
}
|
||||||
|
|
||||||
//Arithmetic operators
|
//Arithmetic operators
|
||||||
Vector2 operator+(Vector2 v) const {
|
Vector2 operator+(Vector2 v) const {
|
||||||
@@ -97,15 +104,6 @@ public:
|
|||||||
template<typename T> bool operator!=(T t) { return (x != t || y != t); }
|
template<typename T> bool operator!=(T t) { return (x != t || y != t); }
|
||||||
};
|
};
|
||||||
|
|
||||||
//non-member templates (flip the order)
|
|
||||||
template<typename T> Vector2 operator+(T t, Vector2 v) { return v + t; }
|
|
||||||
template<typename T> Vector2 operator-(T t, Vector2 v) { return v - t; }
|
|
||||||
template<typename T> Vector2 operator*(T t, Vector2 v) { return v * t; }
|
|
||||||
template<typename T> Vector2 operator/(T t, Vector2 v) { return v / t; }
|
|
||||||
|
|
||||||
template<typename T> bool operator==(T t, Vector2 v) { return v == t; }
|
|
||||||
template<typename T> bool operator!=(T t, Vector2 v) { return v != t; }
|
|
||||||
|
|
||||||
//This is explicitly a POD
|
//This is explicitly a POD
|
||||||
static_assert(std::is_pod<Vector2>::value, "Vector2 is not a POD");
|
static_assert(std::is_pod<Vector2>::value, "Vector2 is not a POD");
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
Future versions (to be determined) may be released under a modified version of the Uplink Developer's License.
|
||||||
|
|
||||||
|
The current version of Tortuga is released under the zlib license.
|
||||||
|
|
||||||
|
Copyright (c) 2013, 2014 Kayne Ruse
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
|
||||||
|
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
|
||||||
|
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
@@ -3,10 +3,6 @@
|
|||||||
#MKDIR=mkdir
|
#MKDIR=mkdir
|
||||||
#RM=del /y
|
#RM=del /y
|
||||||
|
|
||||||
CXXFLAGS+=-static-libgcc -static-libstdc++
|
|
||||||
|
|
||||||
export
|
|
||||||
|
|
||||||
OUTDIR=out
|
OUTDIR=out
|
||||||
|
|
||||||
all: $(OUTDIR)
|
all: $(OUTDIR)
|
||||||
@@ -14,6 +10,17 @@ all: $(OUTDIR)
|
|||||||
$(MAKE) -C server
|
$(MAKE) -C server
|
||||||
$(MAKE) -C client
|
$(MAKE) -C client
|
||||||
|
|
||||||
|
debug: export CXXFLAGS+=-g
|
||||||
|
debug: clean all
|
||||||
|
|
||||||
|
release: export CXXFLAGS+=-static-libgcc -static-libstdc++
|
||||||
|
release: clean all package
|
||||||
|
|
||||||
|
#For use on my machine ONLY
|
||||||
|
package:
|
||||||
|
rar a -r -ep Tortuga.rar $(OUTDIR)/*.exe $(OUTDIR)/*.dll
|
||||||
|
rar a -r Tortuga.rar rsc/* copyright.txt README.txt
|
||||||
|
|
||||||
$(OUTDIR):
|
$(OUTDIR):
|
||||||
mkdir $(OUTDIR)
|
mkdir $(OUTDIR)
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ server.name = local
|
|||||||
server.dbname = database.db
|
server.dbname = database.db
|
||||||
|
|
||||||
#client specific settings
|
#client specific settings
|
||||||
|
#client.screen.w = 800
|
||||||
|
#client.screen.h = 600
|
||||||
client.screen.f = false
|
client.screen.f = false
|
||||||
|
|
||||||
client.username = Kayne Ruse
|
client.username = Kayne Ruse
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.0 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user