Compare commits
111 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 618666de43 | |||
| 5c74ecdd72 | |||
| 61848db65b | |||
| dfc464ddd6 | |||
| bd5e57401e | |||
| a23fbbfb38 | |||
| c021032512 | |||
| d4be22a6eb | |||
| c210b99a5f | |||
| 01eb934fad | |||
| 52e6b144c1 | |||
| b418ad713d | |||
| 1bc51fe035 | |||
| 793737e1ed | |||
| e57b047343 | |||
| a11867126c | |||
| bf4a7561ed | |||
| 13332bf3fc | |||
| 955aed2224 | |||
| ee79231de0 | |||
| 5128d17759 | |||
| a07e7418a6 | |||
| 1ef5eb7a0f | |||
| 135e650ec8 | |||
| b7c12ba106 | |||
| 2d27399fd1 | |||
| ba83fac29f | |||
| 3bd4f1bb1d | |||
| b269ce5fb9 | |||
| f034c32c38 | |||
| 5175a4e40d | |||
| ee2ac0b7a9 | |||
| 63be0ee70d | |||
| cac273da5e | |||
| 170096b5db | |||
| 10e857ecd1 | |||
| 5c8572d811 | |||
| 973a2be16b | |||
| 9b9f6700af | |||
| 7fb458ddc1 | |||
| 310f701b0d | |||
| 6664f8a8bc | |||
| 2c9b0fc3e7 | |||
| 5966d7b51a | |||
| 46dff9b97b | |||
| 23364b2810 | |||
| da60fa8f94 | |||
| fbac14e188 | |||
| 0a03535ecb | |||
| 2bebfdfb97 | |||
| fb6fba9564 | |||
| d2f03b98dc | |||
| 4acd350219 | |||
| 9d83abbd38 | |||
| 1cfb814ee4 | |||
| 2e8a474792 | |||
| 93c41bb19c | |||
| bf922ec598 | |||
| de902d2d3d | |||
| 7b3bf24e5d | |||
| de7da81102 | |||
| 6428b02d85 | |||
| 519b8a1e36 | |||
| 967f0653a1 | |||
| b86d393571 | |||
| 6b38501c27 | |||
| 5893342ad8 | |||
| ac4a264f12 | |||
| 43895a462a | |||
| 1bde0ed3f7 | |||
| d903c0df30 | |||
| 9620826d65 | |||
| 0a71f43ef3 | |||
| a47e76845f | |||
| c2eb08bd5e | |||
| 7b76e07231 | |||
| 1dd8042d3d | |||
| c575ee9ce1 | |||
| 1befc76b70 | |||
| 6a6e7f7125 | |||
| bb6e248583 | |||
| f7df4fba6c | |||
| e7403be508 | |||
| 873715b28c | |||
| b1d6e5a314 | |||
| f0453375c4 | |||
| e5a98efd7d | |||
| 14b330009b | |||
| 288b62d3f8 | |||
| c5e8f1b3af | |||
| 980717f9fd | |||
| 68475eee0f | |||
| eeb2400e79 | |||
| 01244005e9 | |||
| c5005b9b07 | |||
| 80a26341b1 | |||
| b7877962f1 | |||
| 688d064085 | |||
| 1c4d53e3ef | |||
| a53a134163 | |||
| 4d12788c53 | |||
| 1beb7cbd5d | |||
| 8358d72a98 | |||
| 4ebff4a25a | |||
| 0ff787abda | |||
| 9b5b48a8ab | |||
| 5dd0fb9e23 | |||
| 7c210e04a5 | |||
| 9236e02101 | |||
| 8f4ebf20da | |||
| 910e51f637 |
@@ -1,23 +1,26 @@
|
|||||||
The most recent stable windows build 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 an open source 2D multiplayer role playing game featuring permadeath (deletion of a character upon death). The emphasis of this game is on multiplayer cooperation, competition, exploration and customization. The game runs on customizable server software that can support up to 150 simultaneous players or more.
|
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.
|
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
|
||||||
|
|
||||||
|
Tortuga's full documentation can be found in a separate branch, see [Tortuga/docs](https://github.com/Ratstail91/Tortuga/tree/docs).
|
||||||
|
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).
|
||||||
|
For a list of known bugs, see the [GitHub bug tracker](https://github.com/Ratstail91/Tortuga/issues).
|
||||||
|
|
||||||
## External Dependencies
|
## External Dependencies
|
||||||
|
|
||||||
* [SDL 1.6](http://www.libsdl.org/) - Simple DirectMedia Layer API
|
* [SDL 1.2](http://www.libsdl.org/) - Simple DirectMedia Layer API
|
||||||
* [SDL_net 1.2](http://www.libsdl.org/projects/SDL_net/) - SDL's networking extension
|
* [SDL_net 1.2](http://www.libsdl.org/projects/SDL_net/) - SDL's networking extension
|
||||||
* [lua 5.2](http://www.lua.org/) - The lua programming language
|
* [lua 5.2](http://www.lua.org/) - The lua programming language
|
||||||
* [SQLite3](http://www.sqlite.org/) - A lightweight SQL database engine
|
* [SQLite3](http://www.sqlite.org/) - A lightweight SQL database engine
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
[Tortuga Game Design Document](https://github.com/Ratstail91/Tortuga/blob/docs/design%20doc.docx?raw=true)
|
|
||||||
[Tortuga Technical Document](https://github.com/Ratstail91/Tortuga/blob/docs/technical%20doc.docx?raw=true)
|
|
||||||
|
|
||||||
## Copyright
|
## Copyright
|
||||||
|
|
||||||
|
(Future versions (to be determined) may be released under a modified version of the [Uplink Developer's License](http://www.introversion.co.uk/uplink/developer/license.html).)
|
||||||
|
|
||||||
The current version of Tortuga is released under the [zlib license](http://en.wikipedia.org/wiki/Zlib_License).
|
The current version of Tortuga is released under the [zlib license](http://en.wikipedia.org/wiki/Zlib_License).
|
||||||
|
|
||||||
Copyright (c) 2013, 2014 Kayne Ruse
|
Copyright (c) 2013, 2014 Kayne Ruse
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -1,3 +1,24 @@
|
|||||||
|
/* 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 CHANNELS_HPP_
|
#ifndef CHANNELS_HPP_
|
||||||
#define CHANNELS_HPP_
|
#define CHANNELS_HPP_
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,137 @@
|
|||||||
|
/* 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 "clean_up.hpp"
|
||||||
|
|
||||||
|
#include "channels.hpp"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//Public access members
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
CleanUp::CleanUp(
|
||||||
|
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
|
||||||
|
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
||||||
|
image.SetClipH(image.GetClipH()/3);
|
||||||
|
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp");
|
||||||
|
|
||||||
|
//pass the utility objects
|
||||||
|
backButton.SetImage(&image);
|
||||||
|
backButton.SetFont(&font);
|
||||||
|
|
||||||
|
//set the button positions
|
||||||
|
backButton.SetX(50);
|
||||||
|
backButton.SetY(50 + image.GetClipH() * 0);
|
||||||
|
|
||||||
|
//set the button texts
|
||||||
|
backButton.SetText("Back");
|
||||||
|
|
||||||
|
//full reset
|
||||||
|
network.Unbind(Channels::SERVER);
|
||||||
|
clientIndex = -1;
|
||||||
|
accountIndex = -1;
|
||||||
|
characterIndex = -1;
|
||||||
|
combatMap.clear();
|
||||||
|
characterMap.clear();
|
||||||
|
enemyMap.clear();
|
||||||
|
|
||||||
|
//auto return
|
||||||
|
startTick = std::chrono::steady_clock::now();
|
||||||
|
}
|
||||||
|
|
||||||
|
CleanUp::~CleanUp() {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//Frame loop
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
void CleanUp::Update(double delta) {
|
||||||
|
if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(10)) {
|
||||||
|
QuitEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
//BUGFIX: Eat incoming packets
|
||||||
|
while(network.Receive());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanUp::RenderFrame() {
|
||||||
|
SDL_FillRect(GetScreen(), 0, 0);
|
||||||
|
Render(GetScreen());
|
||||||
|
SDL_Flip(GetScreen());
|
||||||
|
fps.Calculate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanUp::Render(SDL_Surface* const screen) {
|
||||||
|
backButton.DrawTo(screen);
|
||||||
|
font.DrawStringTo("You have been disconnected.", screen, 50, 30);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//Event handlers
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
void CleanUp::QuitEvent() {
|
||||||
|
SetNextScene(SceneList::QUIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanUp::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
||||||
|
backButton.MouseMotion(motion);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanUp::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
||||||
|
backButton.MouseButtonDown(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanUp::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
||||||
|
if (backButton.MouseButtonUp(button) == Button::State::HOVER) {
|
||||||
|
SetNextScene(SceneList::MAINMENU);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanUp::KeyDown(SDL_KeyboardEvent const& key) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanUp::KeyUp(SDL_KeyboardEvent const& key) {
|
||||||
|
//
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013, 2014
|
/* Copyright: (c) Kayne Ruse 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -19,62 +19,80 @@
|
|||||||
* 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 EDITORSCENE_HPP_
|
#ifndef CLEANUP_HPP_
|
||||||
#define EDITORSCENE_HPP_
|
#define CLEANUP_HPP_
|
||||||
|
|
||||||
#include "base_scene.hpp"
|
//network
|
||||||
|
#include "udp_network_utility.hpp"
|
||||||
|
|
||||||
#include "config_utility.hpp"
|
//graphics
|
||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
#include "raster_font.hpp"
|
#include "raster_font.hpp"
|
||||||
#include "menu_bar.hpp"
|
#include "button.hpp"
|
||||||
|
|
||||||
#include "region_pager.hpp"
|
//common
|
||||||
#include "map_allocator.hpp"
|
#include "config_utility.hpp"
|
||||||
#include "map_file_format.hpp"
|
#include "frame_rate.hpp"
|
||||||
#include "tile_sheet.hpp"
|
|
||||||
|
|
||||||
class EditorScene : public BaseScene {
|
#include "combat_data.hpp"
|
||||||
|
#include "character_data.hpp"
|
||||||
|
#include "enemy_data.hpp"
|
||||||
|
|
||||||
|
//client
|
||||||
|
#include "base_scene.hpp"
|
||||||
|
|
||||||
|
//std namespace
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
class CleanUp : public BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
//Public access members
|
||||||
EditorScene(ConfigUtility* const);
|
CleanUp(
|
||||||
~EditorScene();
|
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
|
||||||
|
);
|
||||||
|
~CleanUp();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//Frame loop
|
//Frame loop
|
||||||
void FrameStart();
|
|
||||||
void Update(double delta);
|
void Update(double delta);
|
||||||
void FrameEnd();
|
void RenderFrame();
|
||||||
void Render(SDL_Surface* const);
|
void Render(SDL_Surface* const);
|
||||||
|
|
||||||
//Event handlers
|
//Event handlers
|
||||||
|
void QuitEvent();
|
||||||
void MouseMotion(SDL_MouseMotionEvent const&);
|
void MouseMotion(SDL_MouseMotionEvent const&);
|
||||||
void MouseButtonDown(SDL_MouseButtonEvent const&);
|
void MouseButtonDown(SDL_MouseButtonEvent const&);
|
||||||
void MouseButtonUp(SDL_MouseButtonEvent const&);
|
void MouseButtonUp(SDL_MouseButtonEvent const&);
|
||||||
void KeyDown(SDL_KeyboardEvent const&);
|
void KeyDown(SDL_KeyboardEvent const&);
|
||||||
void KeyUp(SDL_KeyboardEvent const&);
|
void KeyUp(SDL_KeyboardEvent const&);
|
||||||
|
|
||||||
//members
|
//shared parameters
|
||||||
void HandleMenuOption(int entry, int drop);
|
|
||||||
|
|
||||||
//globals
|
|
||||||
ConfigUtility& config;
|
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;
|
||||||
|
|
||||||
//debugging tools
|
//graphics
|
||||||
void DrawToDebugInfo(std::string, int line);
|
Image image;
|
||||||
Image debugInfo;
|
|
||||||
bool debugOpen = true;
|
|
||||||
|
|
||||||
RasterFont font;
|
RasterFont font;
|
||||||
Image buttonImage;
|
|
||||||
MenuBar menuBar;
|
|
||||||
|
|
||||||
struct {
|
//UI
|
||||||
int x = 0, y = 0;
|
Button backButton;
|
||||||
} camera;
|
FrameRate fps;
|
||||||
|
|
||||||
RegionPager<BlankAllocator, DummyFormat> pager;
|
//auto return
|
||||||
TileSheet tsheet;
|
std::chrono::steady_clock::time_point startTick;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -37,6 +37,7 @@
|
|||||||
#include "lobby_menu.hpp"
|
#include "lobby_menu.hpp"
|
||||||
#include "in_world.hpp"
|
#include "in_world.hpp"
|
||||||
#include "in_combat.hpp"
|
#include "in_combat.hpp"
|
||||||
|
#include "clean_up.hpp"
|
||||||
|
|
||||||
//-------------------------
|
//-------------------------
|
||||||
//Public access members
|
//Public access members
|
||||||
@@ -50,13 +51,17 @@ void ClientApplication::Init(int argc, char** argv) {
|
|||||||
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"));
|
||||||
}
|
}
|
||||||
BaseScene::SetScreen(config.Int("screen.w"), config.Int("screen.h"), 0, (config.Bool("screen.f")) ? SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN : SDL_HWSURFACE|SDL_DOUBLEBUF);
|
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);
|
||||||
|
|
||||||
//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, PACKET_BUFFER_SIZE);
|
network.Open(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientApplication::Proc() {
|
void ClientApplication::Proc() {
|
||||||
@@ -119,13 +124,16 @@ void ClientApplication::LoadScene(SceneList sceneIndex) {
|
|||||||
activeScene = new OptionsMenu(&config);
|
activeScene = new OptionsMenu(&config);
|
||||||
break;
|
break;
|
||||||
case SceneList::LOBBYMENU:
|
case SceneList::LOBBYMENU:
|
||||||
activeScene = new LobbyMenu(&config, &network, &clientIndex, &characterIndex);
|
activeScene = new LobbyMenu(&config, &network, &clientIndex, &accountIndex);
|
||||||
break;
|
break;
|
||||||
case SceneList::INWORLD:
|
case SceneList::INWORLD:
|
||||||
activeScene = new InWorld(&config, &network, &clientIndex, &characterIndex);
|
activeScene = new InWorld(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap);
|
||||||
break;
|
break;
|
||||||
case SceneList::INCOMBAT:
|
case SceneList::INCOMBAT:
|
||||||
activeScene = new InCombat();
|
activeScene = new InCombat(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap, &enemyMap);
|
||||||
|
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"));
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -27,6 +27,11 @@
|
|||||||
|
|
||||||
#include "config_utility.hpp"
|
#include "config_utility.hpp"
|
||||||
#include "udp_network_utility.hpp"
|
#include "udp_network_utility.hpp"
|
||||||
|
#include "character_data.hpp"
|
||||||
|
#include "combat_data.hpp"
|
||||||
|
#include "enemy_data.hpp"
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
class ClientApplication {
|
class ClientApplication {
|
||||||
public:
|
public:
|
||||||
@@ -48,7 +53,12 @@ private:
|
|||||||
ConfigUtility config;
|
ConfigUtility config;
|
||||||
UDPNetworkUtility network;
|
UDPNetworkUtility network;
|
||||||
int clientIndex = -1;
|
int clientIndex = -1;
|
||||||
|
int accountIndex = -1;
|
||||||
int characterIndex = -1;
|
int characterIndex = -1;
|
||||||
|
|
||||||
|
std::map<int, CombatData> combatMap;
|
||||||
|
std::map<int, CharacterData> characterMap;
|
||||||
|
std::map<int, EnemyData> enemyMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,225 @@
|
|||||||
|
/* 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,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -22,12 +22,38 @@
|
|||||||
#ifndef INCOMBAT_HPP_
|
#ifndef INCOMBAT_HPP_
|
||||||
#define 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"
|
#include "base_scene.hpp"
|
||||||
|
|
||||||
class InCombat : public BaseScene {
|
class InCombat : public BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
//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
|
||||||
|
);
|
||||||
~InCombat();
|
~InCombat();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -35,14 +61,45 @@ protected:
|
|||||||
void FrameStart();
|
void FrameStart();
|
||||||
void Update(double delta);
|
void Update(double delta);
|
||||||
void FrameEnd();
|
void FrameEnd();
|
||||||
|
void RenderFrame();
|
||||||
void Render(SDL_Surface* const);
|
void Render(SDL_Surface* const);
|
||||||
|
|
||||||
//Event handlers
|
//Event handlers
|
||||||
|
void QuitEvent();
|
||||||
void MouseMotion(SDL_MouseMotionEvent const&);
|
void MouseMotion(SDL_MouseMotionEvent const&);
|
||||||
void MouseButtonDown(SDL_MouseButtonEvent const&);
|
void MouseButtonDown(SDL_MouseButtonEvent const&);
|
||||||
void MouseButtonUp(SDL_MouseButtonEvent const&);
|
void MouseButtonUp(SDL_MouseButtonEvent const&);
|
||||||
void KeyDown(SDL_KeyboardEvent const&);
|
void KeyDown(SDL_KeyboardEvent const&);
|
||||||
void KeyUp(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
|
#endif
|
||||||
@@ -0,0 +1,460 @@
|
|||||||
|
/* 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_world.hpp"
|
||||||
|
|
||||||
|
#include "channels.hpp"
|
||||||
|
#include "utility.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//Public access members
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
InWorld::InWorld(
|
||||||
|
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),
|
||||||
|
accountIndex(*argAccountIndex),
|
||||||
|
characterIndex(*argCharacterIndex),
|
||||||
|
combatMap(*argCombatMap),
|
||||||
|
characterMap(*argCharacterMap)
|
||||||
|
{
|
||||||
|
//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
|
||||||
|
disconnectButton.SetImage(&buttonImage);
|
||||||
|
disconnectButton.SetFont(&font);
|
||||||
|
shutDownButton.SetImage(&buttonImage);
|
||||||
|
shutDownButton.SetFont(&font);
|
||||||
|
|
||||||
|
//set the button positions
|
||||||
|
disconnectButton.SetX(50);
|
||||||
|
disconnectButton.SetY(50 + buttonImage.GetClipH() * 0);
|
||||||
|
shutDownButton.SetX(50);
|
||||||
|
shutDownButton.SetY(50 + buttonImage.GetClipH() * 1);
|
||||||
|
|
||||||
|
//set the button texts
|
||||||
|
disconnectButton.SetText("Disconnect");
|
||||||
|
shutDownButton.SetText("Shut Down");
|
||||||
|
|
||||||
|
//load the tilesheet
|
||||||
|
//TODO: add the tilesheet to the map system?
|
||||||
|
tileSheet.Load(config["dir.tilesets"] + "terrain.bmp", 12, 15);
|
||||||
|
|
||||||
|
//request a sync
|
||||||
|
RequestSynchronize();
|
||||||
|
|
||||||
|
//debug
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
InWorld::~InWorld() {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//Frame loop
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
void InWorld::FrameStart() {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::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));
|
||||||
|
|
||||||
|
//update the characters
|
||||||
|
for (auto& it : characterMap) {
|
||||||
|
it.second.Update(delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
//update the camera
|
||||||
|
if(localCharacter) {
|
||||||
|
camera.x = localCharacter->origin.x - camera.marginX;
|
||||||
|
camera.y = localCharacter->origin.y - camera.marginY;
|
||||||
|
}
|
||||||
|
|
||||||
|
//check the map
|
||||||
|
UpdateMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::FrameEnd() {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::RenderFrame() {
|
||||||
|
// SDL_FillRect(GetScreen(), 0, 0);
|
||||||
|
Render(GetScreen());
|
||||||
|
SDL_Flip(GetScreen());
|
||||||
|
fps.Calculate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::Render(SDL_Surface* const screen) {
|
||||||
|
//draw the map
|
||||||
|
for (std::list<Region>::iterator it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); it++) {
|
||||||
|
tileSheet.DrawRegionTo(screen, &(*it), camera.x, camera.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
//draw characters
|
||||||
|
for (auto& it : characterMap) {
|
||||||
|
//BUG: #29 drawing order according to Y origin
|
||||||
|
it.second.DrawTo(screen, camera.x, camera.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
//draw UI
|
||||||
|
disconnectButton.DrawTo(screen);
|
||||||
|
shutDownButton.DrawTo(screen);
|
||||||
|
font.DrawStringTo(to_string_custom(fps.GetFrameRate()), screen, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//Event handlers
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
void InWorld::QuitEvent() {
|
||||||
|
//exit the game AND the server
|
||||||
|
RequestDisconnect();
|
||||||
|
SetNextScene(SceneList::QUIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
||||||
|
disconnectButton.MouseMotion(motion);
|
||||||
|
shutDownButton.MouseMotion(motion);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
||||||
|
disconnectButton.MouseButtonDown(button);
|
||||||
|
shutDownButton.MouseButtonDown(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
||||||
|
if (disconnectButton.MouseButtonUp(button) == Button::State::HOVER) {
|
||||||
|
RequestDisconnect();
|
||||||
|
}
|
||||||
|
if (shutDownButton.MouseButtonUp(button) == Button::State::HOVER) {
|
||||||
|
RequestShutDown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::KeyDown(SDL_KeyboardEvent const& key) {
|
||||||
|
switch(key.keysym.sym) {
|
||||||
|
//player movement
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::KeyUp(SDL_KeyboardEvent const& key) {
|
||||||
|
switch(key.keysym.sym) {
|
||||||
|
//player movement
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//Network handlers
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
void InWorld::HandlePacket(SerialPacket* const argPacket) {
|
||||||
|
switch(argPacket->type) {
|
||||||
|
case SerialPacketType::DISCONNECT:
|
||||||
|
HandleDisconnect(argPacket);
|
||||||
|
break;
|
||||||
|
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::REGION_CONTENT:
|
||||||
|
HandleRegionContent(static_cast<RegionPacket*>(argPacket));
|
||||||
|
break;
|
||||||
|
//handle errors
|
||||||
|
default:
|
||||||
|
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in InWorld: " + to_string_custom(static_cast<int>(argPacket->type)) ));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::HandleDisconnect(SerialPacket* const argPacket) {
|
||||||
|
SetNextScene(SceneList::CLEANUP);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) {
|
||||||
|
if (characterMap.find(argPacket->characterIndex) != characterMap.end()) {
|
||||||
|
throw(std::runtime_error("Cannot create duplicate characters"));
|
||||||
|
}
|
||||||
|
|
||||||
|
//create the character object
|
||||||
|
CharacterData& character = characterMap[argPacket->characterIndex];
|
||||||
|
|
||||||
|
//set the members
|
||||||
|
character.handle = argPacket->handle;
|
||||||
|
character.avatar = 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();
|
||||||
|
|
||||||
|
//catch this client's player object
|
||||||
|
if (argPacket->accountIndex == accountIndex && !localCharacter) {
|
||||||
|
characterIndex = argPacket->characterIndex;
|
||||||
|
localCharacter = &character;
|
||||||
|
|
||||||
|
//setup the camera
|
||||||
|
camera.width = GetScreen()->w;
|
||||||
|
camera.height = GetScreen()->h;
|
||||||
|
|
||||||
|
//center on the player's character
|
||||||
|
camera.marginX = (GetScreen()->w / 2 - localCharacter->sprite.GetImage()->GetClipW() / 2);
|
||||||
|
camera.marginY = (GetScreen()->h / 2 - localCharacter->sprite.GetImage()->GetClipH() / 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) {
|
||||||
|
//TODO: authenticate when own character is being deleted (linked to a TODO in the server)
|
||||||
|
//catch this client's player object
|
||||||
|
if (argPacket->characterIndex == characterIndex) {
|
||||||
|
characterIndex = -1;
|
||||||
|
localCharacter = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
characterMap.erase(argPacket->characterIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::HandleCharacterUpdate(CharacterPacket* const argPacket) {
|
||||||
|
if (characterMap.find(argPacket->characterIndex) == characterMap.end()) {
|
||||||
|
HandleCharacterNew(argPacket);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CharacterData& character = characterMap[argPacket->characterIndex];
|
||||||
|
|
||||||
|
//other characters moving
|
||||||
|
if (argPacket->characterIndex != characterIndex) {
|
||||||
|
character.roomIndex = argPacket->roomIndex;
|
||||||
|
character.origin = argPacket->origin;
|
||||||
|
character.motion = argPacket->motion;
|
||||||
|
character.CorrectSprite();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::HandleRegionContent(RegionPacket* const argPacket) {
|
||||||
|
//replace existing regions
|
||||||
|
regionPager.UnloadRegion(argPacket->x, argPacket->y);
|
||||||
|
regionPager.PushRegion(argPacket->region);
|
||||||
|
|
||||||
|
//clean up after the serial code
|
||||||
|
delete argPacket->region;
|
||||||
|
argPacket->region = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//Server control
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
void InWorld::RequestSynchronize() {
|
||||||
|
ClientPacket newPacket;
|
||||||
|
|
||||||
|
//request a sync
|
||||||
|
newPacket.type = SerialPacketType::SYNCHRONIZE;
|
||||||
|
newPacket.clientIndex = clientIndex;
|
||||||
|
newPacket.accountIndex = accountIndex;
|
||||||
|
|
||||||
|
network.SendTo(Channels::SERVER, &newPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::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 InWorld::RequestDisconnect() {
|
||||||
|
ClientPacket newPacket;
|
||||||
|
|
||||||
|
//send a disconnect request
|
||||||
|
newPacket.type = SerialPacketType::DISCONNECT;
|
||||||
|
newPacket.clientIndex = clientIndex;
|
||||||
|
newPacket.accountIndex = accountIndex;
|
||||||
|
|
||||||
|
network.SendTo(Channels::SERVER, &newPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::RequestShutDown() {
|
||||||
|
ClientPacket newPacket;
|
||||||
|
|
||||||
|
//send a shutdown request
|
||||||
|
newPacket.type = SerialPacketType::SHUTDOWN;
|
||||||
|
newPacket.clientIndex = clientIndex;
|
||||||
|
newPacket.accountIndex = accountIndex;
|
||||||
|
|
||||||
|
network.SendTo(Channels::SERVER, &newPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::RequestRegion(int roomIndex, int x, int y) {
|
||||||
|
RegionPacket packet;
|
||||||
|
|
||||||
|
//pack the region's data
|
||||||
|
packet.type = SerialPacketType::REGION_REQUEST;
|
||||||
|
packet.roomIndex = roomIndex;
|
||||||
|
packet.x = x;
|
||||||
|
packet.y = y;
|
||||||
|
|
||||||
|
network.SendTo(Channels::SERVER, &packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//Utilities
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
//TODO: convert this into a more generic function?; using parameters for the bounds
|
||||||
|
void InWorld::UpdateMap() {
|
||||||
|
//these represent the zone of regions that the client needs loaded, including the mandatory buffers (+1/-1)
|
||||||
|
int xStart = snapToBase(REGION_WIDTH, camera.x/tileSheet.GetTileW()) - REGION_WIDTH;
|
||||||
|
int xEnd = snapToBase(REGION_WIDTH, (camera.x+camera.width)/tileSheet.GetTileW()) + REGION_WIDTH;
|
||||||
|
|
||||||
|
int yStart = snapToBase(REGION_HEIGHT, camera.y/tileSheet.GetTileH()) - REGION_HEIGHT;
|
||||||
|
int yEnd = snapToBase(REGION_HEIGHT, (camera.y+camera.height)/tileSheet.GetTileH()) + REGION_HEIGHT;
|
||||||
|
|
||||||
|
//prune distant regions
|
||||||
|
for (std::list<Region>::iterator it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); /* EMPTY */) {
|
||||||
|
//check if the region is outside off this area
|
||||||
|
if (it->GetX() < xStart || it->GetX() > xEnd || it->GetY() < yStart || it->GetY() > yEnd) {
|
||||||
|
|
||||||
|
//clunky, but the alternative was time consuming
|
||||||
|
int tmpX = it->GetX();
|
||||||
|
int tmpY = it->GetY();
|
||||||
|
++it;
|
||||||
|
|
||||||
|
regionPager.UnloadRegion(tmpX, tmpY);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
|
||||||
|
//request empty regions within this zone
|
||||||
|
for (int i = xStart; i <= xEnd; i += REGION_WIDTH) {
|
||||||
|
for (int j = yStart; j <= yEnd; j += REGION_HEIGHT) {
|
||||||
|
if (!regionPager.FindRegion(i, j)) {
|
||||||
|
RequestRegion(0, i, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -23,14 +23,10 @@
|
|||||||
#define INWORLD_HPP_
|
#define INWORLD_HPP_
|
||||||
|
|
||||||
//maps
|
//maps
|
||||||
#include "map_allocator.hpp"
|
#include "region_pager_base.hpp"
|
||||||
#include "map_file_format.hpp"
|
|
||||||
#include "region_pager.hpp"
|
|
||||||
|
|
||||||
//networking
|
//networking
|
||||||
#include "udp_network_utility.hpp"
|
#include "udp_network_utility.hpp"
|
||||||
#include "serial_packet.hpp"
|
|
||||||
#include "serial.hpp"
|
|
||||||
|
|
||||||
//graphics
|
//graphics
|
||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
@@ -42,9 +38,11 @@
|
|||||||
#include "config_utility.hpp"
|
#include "config_utility.hpp"
|
||||||
#include "frame_rate.hpp"
|
#include "frame_rate.hpp"
|
||||||
|
|
||||||
|
#include "combat_data.hpp"
|
||||||
|
#include "character_data.hpp"
|
||||||
|
|
||||||
//client
|
//client
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
#include "player_character.hpp"
|
|
||||||
|
|
||||||
//STL
|
//STL
|
||||||
#include <map>
|
#include <map>
|
||||||
@@ -52,7 +50,15 @@
|
|||||||
class InWorld : public BaseScene {
|
class InWorld : public BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
//Public access members
|
||||||
InWorld(ConfigUtility* const, UDPNetworkUtility* const, int* const, int* const);
|
InWorld(
|
||||||
|
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:
|
||||||
@@ -72,18 +78,19 @@ protected:
|
|||||||
void KeyUp(SDL_KeyboardEvent const&);
|
void KeyUp(SDL_KeyboardEvent const&);
|
||||||
|
|
||||||
//Network handlers
|
//Network handlers
|
||||||
void HandlePacket(SerialPacket);
|
void HandlePacket(SerialPacket* const);
|
||||||
void HandleDisconnect(SerialPacket);
|
void HandleDisconnect(SerialPacket* const);
|
||||||
void HandleCharacterNew(SerialPacket);
|
void HandleCharacterNew(CharacterPacket* const);
|
||||||
void HandleCharacterDelete(SerialPacket);
|
void HandleCharacterDelete(CharacterPacket* const);
|
||||||
void HandleCharacterUpdate(SerialPacket);
|
void HandleCharacterUpdate(CharacterPacket* const);
|
||||||
void HandleRegionContent(SerialPacket);
|
void HandleRegionContent(RegionPacket* const);
|
||||||
|
|
||||||
//Server control
|
//Server control
|
||||||
|
void RequestSynchronize();
|
||||||
void SendPlayerUpdate();
|
void SendPlayerUpdate();
|
||||||
void RequestDisconnect();
|
void RequestDisconnect();
|
||||||
void RequestShutDown();
|
void RequestShutDown();
|
||||||
void RequestRegion(int mapIndex, int x, int y);
|
void RequestRegion(int roomIndex, int x, int y);
|
||||||
|
|
||||||
//utilities
|
//utilities
|
||||||
void UpdateMap();
|
void UpdateMap();
|
||||||
@@ -92,7 +99,10 @@ protected:
|
|||||||
ConfigUtility& config;
|
ConfigUtility& config;
|
||||||
UDPNetworkUtility& network;
|
UDPNetworkUtility& network;
|
||||||
int& clientIndex;
|
int& clientIndex;
|
||||||
|
int& accountIndex;
|
||||||
int& characterIndex;
|
int& characterIndex;
|
||||||
|
std::map<int, CombatData>& combatMap;
|
||||||
|
std::map<int, CharacterData>& characterMap;
|
||||||
|
|
||||||
//graphics
|
//graphics
|
||||||
Image buttonImage;
|
Image buttonImage;
|
||||||
@@ -100,12 +110,12 @@ protected:
|
|||||||
TileSheet tileSheet;
|
TileSheet tileSheet;
|
||||||
|
|
||||||
//map
|
//map
|
||||||
RegionPager<BlankAllocator, DummyFormat> regionPager;
|
RegionPagerBase regionPager;
|
||||||
|
|
||||||
//UI
|
//UI
|
||||||
Button disconnectButton;
|
Button disconnectButton;
|
||||||
Button shutDownButton;
|
Button shutDownButton;
|
||||||
//TODO: Fix the camera
|
//TODO: Review the camera
|
||||||
struct {
|
struct {
|
||||||
int x = 0, y = 0;
|
int x = 0, y = 0;
|
||||||
int width = 0, height = 0;
|
int width = 0, height = 0;
|
||||||
@@ -114,8 +124,7 @@ protected:
|
|||||||
FrameRate fps;
|
FrameRate fps;
|
||||||
|
|
||||||
//game
|
//game
|
||||||
std::map<int, PlayerCharacter> playerCharacters;
|
CharacterData* localCharacter = nullptr;
|
||||||
PlayerCharacter* localCharacter = nullptr;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -30,11 +30,16 @@
|
|||||||
//Public access members
|
//Public access members
|
||||||
//-------------------------
|
//-------------------------
|
||||||
|
|
||||||
LobbyMenu::LobbyMenu(ConfigUtility* const argConfig, UDPNetworkUtility* const argNetwork, int* const argClientIndex, int* const argCharacterIndex):
|
LobbyMenu::LobbyMenu(
|
||||||
|
ConfigUtility* const argConfig,
|
||||||
|
UDPNetworkUtility* const argNetwork,
|
||||||
|
int* const argClientIndex,
|
||||||
|
int* const argAccountIndex
|
||||||
|
):
|
||||||
config(*argConfig),
|
config(*argConfig),
|
||||||
network(*argNetwork),
|
network(*argNetwork),
|
||||||
clientIndex(*argClientIndex),
|
clientIndex(*argClientIndex),
|
||||||
characterIndex(*argCharacterIndex)
|
accountIndex(*argAccountIndex)
|
||||||
{
|
{
|
||||||
//setup the utility objects
|
//setup the utility objects
|
||||||
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
||||||
@@ -64,6 +69,9 @@ LobbyMenu::LobbyMenu(ConfigUtility* const argConfig, UDPNetworkUtility* const ar
|
|||||||
|
|
||||||
//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
|
||||||
|
while(network.Receive());
|
||||||
}
|
}
|
||||||
|
|
||||||
LobbyMenu::~LobbyMenu() {
|
LobbyMenu::~LobbyMenu() {
|
||||||
@@ -79,13 +87,12 @@ void LobbyMenu::FrameStart() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::Update(double delta) {
|
void LobbyMenu::Update(double delta) {
|
||||||
//suck in all waiting packets
|
//suck in and process all waiting packets
|
||||||
SerialPacket packet;
|
SerialPacket* packetBuffer = static_cast<SerialPacket*>(malloc(MAX_PACKET_SIZE));
|
||||||
while(network.Receive()) {
|
while(network.Receive(packetBuffer)) {
|
||||||
deserialize(&packet, network.GetInData());
|
HandlePacket(packetBuffer);
|
||||||
packet.meta.srcAddress = network.GetInPacket()->address;
|
|
||||||
HandlePacket(packet);
|
|
||||||
}
|
}
|
||||||
|
free(static_cast<void*>(packetBuffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::FrameEnd() {
|
void LobbyMenu::FrameEnd() {
|
||||||
@@ -94,6 +101,7 @@ void LobbyMenu::FrameEnd() {
|
|||||||
|
|
||||||
void LobbyMenu::Render(SDL_Surface* const screen) {
|
void LobbyMenu::Render(SDL_Surface* const screen) {
|
||||||
//TODO: I need a proper UI system for the entire client and the editor
|
//TODO: I need a proper UI system for the entire client and the editor
|
||||||
|
|
||||||
//UI
|
//UI
|
||||||
search.DrawTo(screen);
|
search.DrawTo(screen);
|
||||||
join.DrawTo(screen);
|
join.DrawTo(screen);
|
||||||
@@ -119,7 +127,7 @@ void LobbyMenu::Render(SDL_Surface* const screen) {
|
|||||||
font.DrawStringTo("?", screen, listBox.x - font.GetCharW(), listBox.y + i*listBox.h);
|
font.DrawStringTo("?", screen, listBox.x - font.GetCharW(), listBox.y + i*listBox.h);
|
||||||
}
|
}
|
||||||
|
|
||||||
//ping?
|
//TODO: ping/delay?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,14 +149,10 @@ 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) {
|
||||||
//the vars
|
|
||||||
SerialPacket packet;
|
|
||||||
char buffer[PACKET_BUFFER_SIZE];
|
|
||||||
|
|
||||||
//broadcast to the network, or a specific server
|
//broadcast to the network, or a specific server
|
||||||
packet.meta.type = SerialPacket::Type::BROADCAST_REQUEST;
|
SerialPacket packet;
|
||||||
serialize(&packet, buffer);
|
packet.type = SerialPacketType::BROADCAST_REQUEST;
|
||||||
network.Send(config["server.host"].c_str(), config.Int("server.port"), buffer, PACKET_BUFFER_SIZE);
|
network.SendTo(config["server.host"].c_str(), config.Int("server.port"), &packet);
|
||||||
|
|
||||||
//reset the server list
|
//reset the server list
|
||||||
serverInfo.clear();
|
serverInfo.clear();
|
||||||
@@ -156,19 +160,13 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) {
|
else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) {
|
||||||
//the vars
|
|
||||||
SerialPacket packet;
|
|
||||||
char buffer[PACKET_BUFFER_SIZE];
|
|
||||||
|
|
||||||
//pack the packet
|
//pack the packet
|
||||||
packet.meta.type = SerialPacket::Type::JOIN_REQUEST;
|
ClientPacket packet;
|
||||||
strncpy(packet.clientInfo.username, config["client.username"].c_str(), PACKET_STRING_SIZE);
|
packet.type = SerialPacketType::JOIN_REQUEST;
|
||||||
strncpy(packet.clientInfo.handle, config["client.handle"].c_str(), PACKET_STRING_SIZE);
|
strncpy(packet.username, config["client.username"].c_str(), PACKET_STRING_SIZE);
|
||||||
strncpy(packet.clientInfo.avatar, config["client.avatar"].c_str(), PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//join the selected server
|
//join the selected server
|
||||||
serialize(&packet, buffer);
|
network.SendTo(&selection->address, &packet);
|
||||||
network.Send(&selection->address, buffer, PACKET_BUFFER_SIZE);
|
|
||||||
selection = nullptr;
|
selection = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -178,6 +176,7 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
|||||||
|
|
||||||
else if (
|
else if (
|
||||||
//has the user selected a server on the list?
|
//has the user selected a server on the list?
|
||||||
|
//TODO: replace with regular collision checker
|
||||||
button.x > listBox.x &&
|
button.x > listBox.x &&
|
||||||
button.x < listBox.x + listBox.w &&
|
button.x < listBox.x + listBox.w &&
|
||||||
button.y > listBox.y &&
|
button.y > listBox.y &&
|
||||||
@@ -191,44 +190,58 @@ 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) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::HandlePacket(SerialPacket packet) {
|
//-------------------------
|
||||||
switch(packet.meta.type) {
|
//Network handlers
|
||||||
case SerialPacket::Type::BROADCAST_RESPONSE: {
|
//-------------------------
|
||||||
//extract the data
|
|
||||||
ServerInformation server;
|
|
||||||
server.address = packet.meta.srcAddress;
|
|
||||||
server.networkVersion = packet.serverInfo.networkVersion;
|
|
||||||
server.name = packet.serverInfo.name;
|
|
||||||
server.playerCount = packet.serverInfo.playerCount;
|
|
||||||
|
|
||||||
//NOTE: Check compatibility here
|
void LobbyMenu::HandlePacket(SerialPacket* const argPacket) {
|
||||||
server.compatible = server.networkVersion == NETWORK_VERSION;
|
switch(argPacket->type) {
|
||||||
|
case SerialPacketType::BROADCAST_RESPONSE:
|
||||||
//push
|
HandleBroadcastResponse(static_cast<ServerPacket*>(argPacket));
|
||||||
serverInfo.push_back(server);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case SerialPacket::Type::JOIN_RESPONSE:
|
case SerialPacketType::JOIN_RESPONSE:
|
||||||
clientIndex = packet.clientInfo.clientIndex;
|
HandleJoinResponse(static_cast<ClientPacket*>(argPacket));
|
||||||
characterIndex = packet.clientInfo.characterIndex;
|
|
||||||
network.Bind(&packet.meta.srcAddress, Channels::SERVER);
|
|
||||||
SetNextScene(SceneList::INWORLD);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//handle errors
|
//handle errors
|
||||||
default:
|
default:
|
||||||
throw(std::runtime_error("Unknown SerialPacket::Type encountered"));
|
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in LobbyMenu: " + to_string_custom(static_cast<int>(argPacket->type)) ));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LobbyMenu::HandleBroadcastResponse(ServerPacket* const argPacket) {
|
||||||
|
//extract the data
|
||||||
|
ServerInformation server;
|
||||||
|
server.address = argPacket->srcAddress;
|
||||||
|
server.name = argPacket->name;
|
||||||
|
server.playerCount = argPacket->playerCount;
|
||||||
|
server.version = argPacket->version;
|
||||||
|
|
||||||
|
//Checking compatibility
|
||||||
|
server.compatible = server.version == NETWORK_VERSION;
|
||||||
|
|
||||||
|
//push
|
||||||
|
serverInfo.push_back(server);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LobbyMenu::HandleJoinResponse(ClientPacket* const argPacket) {
|
||||||
|
clientIndex = argPacket->clientIndex;
|
||||||
|
accountIndex = argPacket->accountIndex;
|
||||||
|
network.Bind(&argPacket->srcAddress, Channels::SERVER);
|
||||||
|
SetNextScene(SceneList::INWORLD);
|
||||||
|
|
||||||
|
//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);
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -22,16 +22,14 @@
|
|||||||
#ifndef LOBBYMENU_HPP_
|
#ifndef LOBBYMENU_HPP_
|
||||||
#define LOBBYMENU_HPP_
|
#define LOBBYMENU_HPP_
|
||||||
|
|
||||||
//graphics & utilities
|
//graphics & ui
|
||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
#include "raster_font.hpp"
|
#include "raster_font.hpp"
|
||||||
#include "button.hpp"
|
#include "button.hpp"
|
||||||
#include "config_utility.hpp"
|
|
||||||
|
|
||||||
//network
|
//utilities
|
||||||
|
#include "config_utility.hpp"
|
||||||
#include "udp_network_utility.hpp"
|
#include "udp_network_utility.hpp"
|
||||||
#include "serial_packet.hpp"
|
|
||||||
#include "serial.hpp"
|
|
||||||
|
|
||||||
//client
|
//client
|
||||||
#include "base_scene.hpp"
|
#include "base_scene.hpp"
|
||||||
@@ -42,7 +40,12 @@
|
|||||||
class LobbyMenu : public BaseScene {
|
class LobbyMenu : public BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
//Public access members
|
||||||
LobbyMenu(ConfigUtility* const, UDPNetworkUtility* const, int* const, int* const);
|
LobbyMenu(
|
||||||
|
ConfigUtility* const argConfig,
|
||||||
|
UDPNetworkUtility* const argNetwork,
|
||||||
|
int* const argClientIndex,
|
||||||
|
int* const argAccountIndex
|
||||||
|
);
|
||||||
~LobbyMenu();
|
~LobbyMenu();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -59,13 +62,16 @@ protected:
|
|||||||
void KeyDown(SDL_KeyboardEvent const&);
|
void KeyDown(SDL_KeyboardEvent const&);
|
||||||
void KeyUp(SDL_KeyboardEvent const&);
|
void KeyUp(SDL_KeyboardEvent const&);
|
||||||
|
|
||||||
void HandlePacket(SerialPacket);
|
//Network handlers
|
||||||
|
void HandlePacket(SerialPacket* const);
|
||||||
|
void HandleBroadcastResponse(ServerPacket* const);
|
||||||
|
void HandleJoinResponse(ClientPacket* const);
|
||||||
|
|
||||||
//shared parameters
|
//shared parameters
|
||||||
ConfigUtility& config;
|
ConfigUtility& config;
|
||||||
UDPNetworkUtility& network;
|
UDPNetworkUtility& network;
|
||||||
int& clientIndex;
|
int& clientIndex;
|
||||||
int& characterIndex;
|
int& accountIndex;
|
||||||
|
|
||||||
//members
|
//members
|
||||||
Image image;
|
Image image;
|
||||||
@@ -77,9 +83,9 @@ protected:
|
|||||||
//server list
|
//server list
|
||||||
struct ServerInformation {
|
struct ServerInformation {
|
||||||
IPaddress address;
|
IPaddress address;
|
||||||
int networkVersion;
|
|
||||||
std::string name;
|
std::string name;
|
||||||
int playerCount;
|
int playerCount;
|
||||||
|
int version;
|
||||||
bool compatible;
|
bool compatible;
|
||||||
};
|
};
|
||||||
|
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -53,6 +53,9 @@ MainMenu::MainMenu(ConfigUtility* const argConfig):
|
|||||||
startButton.SetText("Start");
|
startButton.SetText("Start");
|
||||||
optionsButton.SetText("Options");
|
optionsButton.SetText("Options");
|
||||||
quitButton.SetText("Quit");
|
quitButton.SetText("Quit");
|
||||||
|
|
||||||
|
//debug
|
||||||
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
MainMenu::~MainMenu() {
|
MainMenu::~MainMenu() {
|
||||||
@@ -110,11 +113,7 @@ void MainMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MainMenu::KeyDown(SDL_KeyboardEvent const& key) {
|
void MainMenu::KeyDown(SDL_KeyboardEvent const& key) {
|
||||||
switch(key.keysym.sym) {
|
//
|
||||||
case SDLK_ESCAPE:
|
|
||||||
QuitEvent();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenu::KeyUp(SDL_KeyboardEvent const& key) {
|
void MainMenu::KeyUp(SDL_KeyboardEvent const& key) {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
+3
-10
@@ -1,17 +1,14 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. scenes ../common ../common/graphics ../common/map ../common/network ../common/ui
|
INCLUDES+=. ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet ../common/network/serial ../common/ui ../common/utilities
|
||||||
LIBS+=libclient.a ../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua -lsqlite3
|
LIBS+=../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua
|
||||||
CXXFLAGS+=-std=c++11 -DDEBUG $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) -DGRAPHICS
|
||||||
CFLAGS+=-DDEBUG $(addprefix -I,$(INCLUDES))
|
|
||||||
|
|
||||||
#source
|
#source
|
||||||
CXXSRC=$(wildcard *.cpp)
|
CXXSRC=$(wildcard *.cpp)
|
||||||
CSRC=$(wildcard *.c)
|
|
||||||
|
|
||||||
#objects
|
#objects
|
||||||
OBJDIR=obj
|
OBJDIR=obj
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CSRC:.c=.o))
|
|
||||||
|
|
||||||
#output
|
#output
|
||||||
OUTDIR=../out
|
OUTDIR=../out
|
||||||
@@ -19,7 +16,6 @@ OUT=$(addprefix $(OUTDIR)/,client)
|
|||||||
|
|
||||||
#targets
|
#targets
|
||||||
all: $(OBJ) $(OUT)
|
all: $(OBJ) $(OUT)
|
||||||
$(MAKE) -C scenes
|
|
||||||
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)
|
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)
|
||||||
|
|
||||||
$(OBJ): | $(OBJDIR)
|
$(OBJ): | $(OBJDIR)
|
||||||
@@ -35,9 +31,6 @@ $(OUTDIR):
|
|||||||
$(OBJDIR)/%.o: %.cpp
|
$(OBJDIR)/%.o: %.cpp
|
||||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
$(OBJDIR)/%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.o *.a *.exe
|
$(RM) *.o *.a *.exe
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -90,11 +90,7 @@ 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) {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -29,6 +29,7 @@
|
|||||||
#include "raster_font.hpp"
|
#include "raster_font.hpp"
|
||||||
#include "button.hpp"
|
#include "button.hpp"
|
||||||
|
|
||||||
|
//TODO: The options screen needs to be USED
|
||||||
class OptionsMenu : public BaseScene {
|
class OptionsMenu : public BaseScene {
|
||||||
public:
|
public:
|
||||||
//Public access members
|
//Public access members
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
|
||||||
*
|
|
||||||
* 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 "player_character.hpp"
|
|
||||||
|
|
||||||
#define WALKING_SPEED 140
|
|
||||||
|
|
||||||
void PlayerCharacter::Update(double delta) {
|
|
||||||
if (diagonal) {
|
|
||||||
constexpr double d = 1.0/sqrt(2);
|
|
||||||
position += motion * delta * d;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
position += motion * delta;
|
|
||||||
}
|
|
||||||
sprite.Update(delta);
|
|
||||||
}
|
|
||||||
|
|
||||||
void PlayerCharacter::AdjustDirection(Direction direction) {
|
|
||||||
//shift the movement in this direction
|
|
||||||
switch(direction) {
|
|
||||||
case Direction::NORTH:
|
|
||||||
if (motion.y >= 0) {
|
|
||||||
motion.y -= WALKING_SPEED;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Direction::SOUTH:
|
|
||||||
if (motion.y <= 0) {
|
|
||||||
motion.y += WALKING_SPEED;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Direction::WEST:
|
|
||||||
if (motion.x >= 0) {
|
|
||||||
motion.x -= WALKING_SPEED;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Direction::EAST:
|
|
||||||
if (motion.x <= 0) {
|
|
||||||
motion.x += WALKING_SPEED;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//face the correct direction
|
|
||||||
ResetDirection();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PlayerCharacter::FaceDirection(Direction direction) {
|
|
||||||
//this function depends on the format of the sprite sheets
|
|
||||||
switch(direction) {
|
|
||||||
case Direction::NORTH:
|
|
||||||
sprite.SetYIndex(1);
|
|
||||||
break;
|
|
||||||
case Direction::SOUTH:
|
|
||||||
sprite.SetYIndex(0);
|
|
||||||
break;
|
|
||||||
case Direction::WEST:
|
|
||||||
sprite.SetYIndex(2);
|
|
||||||
break;
|
|
||||||
case Direction::EAST:
|
|
||||||
sprite.SetYIndex(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PlayerCharacter::ResetDirection() {
|
|
||||||
//base the direction on the character's movement
|
|
||||||
if (motion.y > 0) {
|
|
||||||
FaceDirection(Direction::SOUTH);
|
|
||||||
}
|
|
||||||
else if (motion.y < 0) {
|
|
||||||
FaceDirection(Direction::NORTH);
|
|
||||||
}
|
|
||||||
else if (motion.x > 0) {
|
|
||||||
FaceDirection(Direction::EAST);
|
|
||||||
}
|
|
||||||
else if (motion.x < 0) {
|
|
||||||
FaceDirection(Direction::WEST);
|
|
||||||
}
|
|
||||||
ResetSpeed();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PlayerCharacter::ResetSpeed() {
|
|
||||||
//diagonal
|
|
||||||
if (motion.x != 0 && motion.y != 0) {
|
|
||||||
sprite.SetDelay(0.1);
|
|
||||||
diagonal = true;
|
|
||||||
}
|
|
||||||
//cardinal
|
|
||||||
else if (motion != 0) {
|
|
||||||
sprite.SetDelay(0.1);
|
|
||||||
diagonal = false;
|
|
||||||
}
|
|
||||||
//not moving
|
|
||||||
else {
|
|
||||||
sprite.SetDelay(0);
|
|
||||||
sprite.SetXIndex(0);
|
|
||||||
diagonal = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
|
||||||
*
|
|
||||||
* 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 PLAYERCHARACTER_HPP_
|
|
||||||
#define PLAYERCHARACTER_HPP_
|
|
||||||
|
|
||||||
#include "vector2.hpp"
|
|
||||||
#include "sprite_sheet.hpp"
|
|
||||||
|
|
||||||
//TODO: correct the PlayerCharacter class and it's movement system
|
|
||||||
class PlayerCharacter {
|
|
||||||
public:
|
|
||||||
enum class Direction {
|
|
||||||
NORTH, SOUTH, EAST, WEST
|
|
||||||
};
|
|
||||||
|
|
||||||
PlayerCharacter() = default;
|
|
||||||
~PlayerCharacter() = default;
|
|
||||||
|
|
||||||
void Update(double delta);
|
|
||||||
|
|
||||||
void DrawTo(SDL_Surface* const dest, int camX, int camY) { sprite.DrawTo(dest, position.x - camX, position.y - camY); }
|
|
||||||
|
|
||||||
//clunky code results in smooth movement and controls
|
|
||||||
void AdjustDirection(Direction);
|
|
||||||
void FaceDirection(Direction);
|
|
||||||
void ResetDirection();
|
|
||||||
void ResetSpeed();
|
|
||||||
|
|
||||||
//accessors and mutators
|
|
||||||
Vector2 SetPosition(Vector2 v) { return position = v; }
|
|
||||||
Vector2 ShiftPosition(Vector2 v) { return position += v; }
|
|
||||||
Vector2 GetPosition() { return position; }
|
|
||||||
|
|
||||||
Vector2 SetMotion(Vector2 v) { return motion = v; }
|
|
||||||
Vector2 ShiftMotion(Vector2 v) { return motion += v; }
|
|
||||||
Vector2 GetMotion() { return motion; }
|
|
||||||
|
|
||||||
SpriteSheet* GetSprite() { return &sprite; }
|
|
||||||
private:
|
|
||||||
Vector2 position;
|
|
||||||
Vector2 motion;
|
|
||||||
SpriteSheet sprite;
|
|
||||||
|
|
||||||
//for moving diagonally
|
|
||||||
bool diagonal = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -35,6 +35,7 @@ enum class SceneList {
|
|||||||
LOBBYMENU,
|
LOBBYMENU,
|
||||||
INWORLD,
|
INWORLD,
|
||||||
INCOMBAT,
|
INCOMBAT,
|
||||||
|
CLEANUP,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,139 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#include "base_scene.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Static declarations
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
SDL_Surface* BaseScene::screen = nullptr;
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Public access members
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
BaseScene::BaseScene() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
BaseScene::~BaseScene() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Program control
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
SDL_Surface* BaseScene::SetScreen(int w, int h, int bpp, Uint32 flags) {
|
|
||||||
if (!bpp) {
|
|
||||||
bpp = SDL_GetVideoInfo()->vfmt->BitsPerPixel;
|
|
||||||
}
|
|
||||||
|
|
||||||
screen = SDL_SetVideoMode(w, h, bpp, flags);
|
|
||||||
|
|
||||||
if (!screen) {
|
|
||||||
throw(std::runtime_error("Failed to create the screen surface"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return screen;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Surface* BaseScene::GetScreen() {
|
|
||||||
return screen;
|
|
||||||
}
|
|
||||||
|
|
||||||
SceneList BaseScene::SetNextScene(SceneList sceneIndex) {
|
|
||||||
return nextScene = sceneIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
SceneList BaseScene::GetNextScene() const {
|
|
||||||
return nextScene;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Frame loop
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void BaseScene::RunFrame(double delta) {
|
|
||||||
FrameStart();
|
|
||||||
HandleEvents();
|
|
||||||
Update(delta);
|
|
||||||
FrameEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
void BaseScene::RenderFrame() {
|
|
||||||
SDL_FillRect(screen, 0, 0);
|
|
||||||
Render(screen);
|
|
||||||
SDL_Flip(screen);
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Event handlers
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void BaseScene::HandleEvents() {
|
|
||||||
SDL_Event event;
|
|
||||||
|
|
||||||
while(SDL_PollEvent(&event)) {
|
|
||||||
switch(event.type) {
|
|
||||||
case SDL_QUIT:
|
|
||||||
QuitEvent();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_VIDEORESIZE:
|
|
||||||
SetScreen(event.resize.w, event.resize.h, 0, screen->flags);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_MOUSEMOTION:
|
|
||||||
MouseMotion(event.motion);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
|
||||||
MouseButtonDown(event.button);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_MOUSEBUTTONUP:
|
|
||||||
MouseButtonUp(event.button);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_KEYDOWN:
|
|
||||||
KeyDown(event.key);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_KEYUP:
|
|
||||||
KeyUp(event.key);
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifdef USE_EVENT_JOYSTICK
|
|
||||||
//TODO: joystick/gamepad support
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_EVENT_UNKNOWN
|
|
||||||
default:
|
|
||||||
UnknownEvent(event);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}//switch
|
|
||||||
}//while
|
|
||||||
}
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
|
||||||
*
|
|
||||||
* 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 BASESCENE_HPP_
|
|
||||||
#define BASESCENE_HPP_
|
|
||||||
|
|
||||||
#include "scene_list.hpp"
|
|
||||||
|
|
||||||
#include "SDL/SDL.h"
|
|
||||||
|
|
||||||
class BaseScene {
|
|
||||||
public:
|
|
||||||
//Public access members
|
|
||||||
BaseScene();
|
|
||||||
virtual ~BaseScene();
|
|
||||||
|
|
||||||
//Program control
|
|
||||||
static SDL_Surface* SetScreen(int w, int h, int bpp = 0, Uint32 flags = SDL_HWSURFACE|SDL_DOUBLEBUF);
|
|
||||||
static SDL_Surface* GetScreen();
|
|
||||||
|
|
||||||
SceneList SetNextScene(SceneList sceneIndex);
|
|
||||||
SceneList GetNextScene() const;
|
|
||||||
|
|
||||||
//Frame loop
|
|
||||||
virtual void RunFrame(double delta);
|
|
||||||
virtual void RenderFrame();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void FrameStart() {}
|
|
||||||
virtual void HandleEvents();
|
|
||||||
virtual void Update(double delta) {}
|
|
||||||
virtual void FrameEnd() {}
|
|
||||||
virtual void Render(SDL_Surface* const screen) {}
|
|
||||||
|
|
||||||
//Event handlers
|
|
||||||
virtual void QuitEvent() { SetNextScene(SceneList::QUIT); }
|
|
||||||
virtual void MouseMotion(SDL_MouseMotionEvent const&) {}
|
|
||||||
virtual void MouseButtonDown(SDL_MouseButtonEvent const&) {}
|
|
||||||
virtual void MouseButtonUp(SDL_MouseButtonEvent const&) {}
|
|
||||||
virtual void KeyDown(SDL_KeyboardEvent const&) {}
|
|
||||||
virtual void KeyUp(SDL_KeyboardEvent const&) {}
|
|
||||||
|
|
||||||
#ifdef USE_EVENT_JOYSTICK
|
|
||||||
//TODO: joystick/gamepad support
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_EVENT_UNKNOWN
|
|
||||||
virtual void UnknownEvent(SDL_Event const&) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
private:
|
|
||||||
static SDL_Surface* screen;
|
|
||||||
SceneList nextScene = SceneList::CONTINUE;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
|
||||||
*
|
|
||||||
* 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"
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Public access members
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
InCombat::InCombat() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
InCombat::~InCombat() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Frame loop
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void InCombat::FrameStart() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::Update(double delta) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::FrameEnd() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::Render(SDL_Surface* const screen) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Event handlers
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
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) {
|
|
||||||
switch(key.keysym.sym) {
|
|
||||||
case SDLK_ESCAPE:
|
|
||||||
QuitEvent();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InCombat::KeyUp(SDL_KeyboardEvent const& key) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
@@ -1,431 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
|
||||||
*
|
|
||||||
* 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_world.hpp"
|
|
||||||
|
|
||||||
#include "channels.hpp"
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <cmath>
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Public access members
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
InWorld::InWorld(ConfigUtility* const argConfig, UDPNetworkUtility* const argNetwork, int* const argClientIndex, int* const argCharacterIndex):
|
|
||||||
config(*argConfig),
|
|
||||||
network(*argNetwork),
|
|
||||||
clientIndex(*argClientIndex),
|
|
||||||
characterIndex(*argCharacterIndex)
|
|
||||||
{
|
|
||||||
//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
|
|
||||||
disconnectButton.SetImage(&buttonImage);
|
|
||||||
disconnectButton.SetFont(&font);
|
|
||||||
shutDownButton.SetImage(&buttonImage);
|
|
||||||
shutDownButton.SetFont(&font);
|
|
||||||
|
|
||||||
//set the button positions
|
|
||||||
disconnectButton.SetX(50);
|
|
||||||
disconnectButton.SetY(50 + buttonImage.GetClipH() * 0);
|
|
||||||
shutDownButton.SetX(50);
|
|
||||||
shutDownButton.SetY(50 + buttonImage.GetClipH() * 1);
|
|
||||||
|
|
||||||
//set the button texts
|
|
||||||
disconnectButton.SetText("Disconnect");
|
|
||||||
shutDownButton.SetText("Shut Down");
|
|
||||||
|
|
||||||
//load the tilesheet
|
|
||||||
//TODO: add the tilesheet to the map system?
|
|
||||||
tileSheet.Load(config["dir.tilesets"] + "terrain.bmp", 12, 15);
|
|
||||||
|
|
||||||
//request a sync
|
|
||||||
SerialPacket packet;
|
|
||||||
char buffer[PACKET_STRING_SIZE];
|
|
||||||
packet.meta.type = SerialPacket::Type::SYNCHRONIZE;
|
|
||||||
packet.clientInfo.clientIndex = clientIndex;
|
|
||||||
packet.clientInfo.characterIndex = characterIndex;
|
|
||||||
serialize(&packet, buffer);
|
|
||||||
network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE);
|
|
||||||
|
|
||||||
//debug
|
|
||||||
// RequestRegion(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
InWorld::~InWorld() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Frame loop
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void InWorld::FrameStart() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::Update(double delta) {
|
|
||||||
SerialPacket packet;
|
|
||||||
|
|
||||||
//suck in all waiting packets
|
|
||||||
while(network.Receive()) {
|
|
||||||
deserialize(&packet, network.GetInData());
|
|
||||||
packet.meta.srcAddress = network.GetInPacket()->address;
|
|
||||||
HandlePacket(packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
//update the characters
|
|
||||||
for (auto& it : playerCharacters) {
|
|
||||||
it.second.Update(delta);
|
|
||||||
}
|
|
||||||
//TODO: sort the players and entities by Y position
|
|
||||||
|
|
||||||
//update the camera
|
|
||||||
if(localCharacter) {
|
|
||||||
camera.x = localCharacter->GetPosition().x - camera.marginX;
|
|
||||||
camera.y = localCharacter->GetPosition().y - camera.marginY;
|
|
||||||
}
|
|
||||||
|
|
||||||
//check the map
|
|
||||||
UpdateMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::FrameEnd() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::RenderFrame() {
|
|
||||||
// SDL_FillRect(GetScreen(), 0, 0);
|
|
||||||
Render(GetScreen());
|
|
||||||
SDL_Flip(GetScreen());
|
|
||||||
fps.Calculate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::Render(SDL_Surface* const screen) {
|
|
||||||
//draw the map
|
|
||||||
for (auto it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); it++) {
|
|
||||||
tileSheet.DrawRegionTo(screen, *it, camera.x, camera.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
//draw characters
|
|
||||||
for (auto& it : playerCharacters) {
|
|
||||||
it.second.DrawTo(screen, camera.x, camera.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
//draw UI
|
|
||||||
disconnectButton.DrawTo(screen);
|
|
||||||
shutDownButton.DrawTo(screen);
|
|
||||||
font.DrawStringTo(to_string_custom(fps.GetFrameRate()), screen, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Event handlers
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void InWorld::QuitEvent() {
|
|
||||||
//exit the game AND the server
|
|
||||||
RequestDisconnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::MouseMotion(SDL_MouseMotionEvent const& motion) {
|
|
||||||
disconnectButton.MouseMotion(motion);
|
|
||||||
shutDownButton.MouseMotion(motion);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::MouseButtonDown(SDL_MouseButtonEvent const& button) {
|
|
||||||
disconnectButton.MouseButtonDown(button);
|
|
||||||
shutDownButton.MouseButtonDown(button);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
|
||||||
if (disconnectButton.MouseButtonUp(button) == Button::State::HOVER) {
|
|
||||||
RequestDisconnect();
|
|
||||||
}
|
|
||||||
if (shutDownButton.MouseButtonUp(button) == Button::State::HOVER) {
|
|
||||||
RequestShutDown();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::KeyDown(SDL_KeyboardEvent const& key) {
|
|
||||||
switch(key.keysym.sym) {
|
|
||||||
case SDLK_ESCAPE: {
|
|
||||||
QuitEvent();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
//player movement
|
|
||||||
case SDLK_LEFT:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->AdjustDirection(PlayerCharacter::Direction::WEST);
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDLK_RIGHT:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->AdjustDirection(PlayerCharacter::Direction::EAST);
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDLK_UP:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->AdjustDirection(PlayerCharacter::Direction::NORTH);
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDLK_DOWN:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->AdjustDirection(PlayerCharacter::Direction::SOUTH);
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::KeyUp(SDL_KeyboardEvent const& key) {
|
|
||||||
switch(key.keysym.sym) {
|
|
||||||
//player movement
|
|
||||||
case SDLK_LEFT:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->AdjustDirection(PlayerCharacter::Direction::EAST);
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDLK_RIGHT:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->AdjustDirection(PlayerCharacter::Direction::WEST);
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDLK_UP:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->AdjustDirection(PlayerCharacter::Direction::SOUTH);
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDLK_DOWN:
|
|
||||||
if (localCharacter) {
|
|
||||||
localCharacter->AdjustDirection(PlayerCharacter::Direction::NORTH);
|
|
||||||
SendPlayerUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Network handlers
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void InWorld::HandlePacket(SerialPacket packet) {
|
|
||||||
switch(packet.meta.type) {
|
|
||||||
case SerialPacket::Type::DISCONNECT:
|
|
||||||
HandleDisconnect(packet);
|
|
||||||
break;
|
|
||||||
case SerialPacket::Type::REGION_CONTENT:
|
|
||||||
HandleRegionContent(packet);
|
|
||||||
break;
|
|
||||||
case SerialPacket::Type::CHARACTER_UPDATE:
|
|
||||||
HandleCharacterUpdate(packet);
|
|
||||||
break;
|
|
||||||
case SerialPacket::Type::CHARACTER_NEW:
|
|
||||||
HandleCharacterNew(packet);
|
|
||||||
break;
|
|
||||||
case SerialPacket::Type::CHARACTER_DELETE:
|
|
||||||
HandleCharacterDelete(packet);
|
|
||||||
break;
|
|
||||||
//handle errors
|
|
||||||
default:
|
|
||||||
throw(std::runtime_error("Unknown SerialPacket::Type encountered"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::HandleDisconnect(SerialPacket packet) {
|
|
||||||
network.Unbind(Channels::SERVER);
|
|
||||||
clientIndex = -1;
|
|
||||||
characterIndex = -1;
|
|
||||||
SetNextScene(SceneList::MAINMENU);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::HandleRegionContent(SerialPacket packet) {
|
|
||||||
//replace existing regions
|
|
||||||
//TODO: account for map index
|
|
||||||
if (regionPager.FindRegion(packet.regionInfo.x, packet.regionInfo.y)) {
|
|
||||||
regionPager.UnloadRegion(packet.regionInfo.x, packet.regionInfo.y);
|
|
||||||
}
|
|
||||||
regionPager.PushRegion(packet.regionInfo.region);
|
|
||||||
packet.regionInfo.region = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::HandleCharacterUpdate(SerialPacket packet) {
|
|
||||||
if (playerCharacters.find(packet.characterInfo.characterIndex) == playerCharacters.end()) {
|
|
||||||
HandleCharacterNew(packet);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//update only if the message didn't originate from here
|
|
||||||
if (packet.characterInfo.clientIndex != clientIndex) {
|
|
||||||
playerCharacters[packet.characterInfo.characterIndex].SetPosition(packet.characterInfo.position);
|
|
||||||
playerCharacters[packet.characterInfo.characterIndex].SetMotion(packet.characterInfo.motion);
|
|
||||||
}
|
|
||||||
playerCharacters[packet.characterInfo.characterIndex].ResetDirection();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::HandleCharacterNew(SerialPacket packet) {
|
|
||||||
if (playerCharacters.find(packet.characterInfo.characterIndex) != playerCharacters.end()) {
|
|
||||||
throw(std::runtime_error("Cannot create duplicate characters"));
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: set the player's handle
|
|
||||||
playerCharacters[packet.characterInfo.characterIndex].GetSprite()->LoadSurface(config["dir.sprites"] + packet.characterInfo.avatar, 4, 4);
|
|
||||||
playerCharacters[packet.characterInfo.characterIndex].SetPosition(packet.characterInfo.position);
|
|
||||||
playerCharacters[packet.characterInfo.characterIndex].SetMotion(packet.characterInfo.motion);
|
|
||||||
playerCharacters[packet.characterInfo.characterIndex].ResetDirection();
|
|
||||||
|
|
||||||
//catch this client's player object
|
|
||||||
if (packet.characterInfo.characterIndex == characterIndex && !localCharacter) {
|
|
||||||
localCharacter = &playerCharacters[characterIndex];
|
|
||||||
|
|
||||||
//setup the camera
|
|
||||||
camera.width = GetScreen()->w;
|
|
||||||
camera.height = GetScreen()->h;
|
|
||||||
//center on the player's character
|
|
||||||
camera.marginX = (GetScreen()->w / 2 - localCharacter->GetSprite()->GetImage()->GetClipW() / 2);
|
|
||||||
camera.marginY = (GetScreen()->h / 2 - localCharacter->GetSprite()->GetImage()->GetClipH() / 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::HandleCharacterDelete(SerialPacket packet) {
|
|
||||||
if (playerCharacters.find(packet.characterInfo.characterIndex) == playerCharacters.end()) {
|
|
||||||
throw(std::runtime_error("Cannot delete non-existant characters"));
|
|
||||||
}
|
|
||||||
|
|
||||||
playerCharacters.erase(packet.characterInfo.characterIndex);
|
|
||||||
|
|
||||||
//catch this client's player object
|
|
||||||
if (packet.characterInfo.characterIndex == characterIndex) {
|
|
||||||
characterIndex = -1;
|
|
||||||
localCharacter = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Server control
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void InWorld::SendPlayerUpdate() {
|
|
||||||
SerialPacket packet;
|
|
||||||
char buffer[PACKET_BUFFER_SIZE];
|
|
||||||
|
|
||||||
//pack the packet
|
|
||||||
packet.meta.type = SerialPacket::Type::CHARACTER_UPDATE;
|
|
||||||
packet.characterInfo.clientIndex = clientIndex;
|
|
||||||
packet.characterInfo.characterIndex = characterIndex;
|
|
||||||
packet.characterInfo.position = localCharacter->GetPosition();
|
|
||||||
packet.characterInfo.motion = localCharacter->GetMotion();
|
|
||||||
|
|
||||||
serialize(&packet, buffer);
|
|
||||||
network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::RequestDisconnect() {
|
|
||||||
SerialPacket packet;
|
|
||||||
char buffer[PACKET_BUFFER_SIZE];
|
|
||||||
|
|
||||||
//send a disconnect request
|
|
||||||
packet.meta.type = SerialPacket::Type::DISCONNECT;
|
|
||||||
packet.clientInfo.clientIndex = clientIndex;
|
|
||||||
serialize(&packet, buffer);
|
|
||||||
network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::RequestShutDown() {
|
|
||||||
SerialPacket packet;
|
|
||||||
char buffer[PACKET_BUFFER_SIZE];
|
|
||||||
|
|
||||||
//send a shutdown request
|
|
||||||
packet.meta.type = SerialPacket::Type::SHUTDOWN;
|
|
||||||
packet.clientInfo.clientIndex = clientIndex;
|
|
||||||
serialize(&packet, buffer);
|
|
||||||
network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InWorld::RequestRegion(int mapIndex, int x, int y) {
|
|
||||||
SerialPacket packet;
|
|
||||||
char buffer[PACKET_BUFFER_SIZE];
|
|
||||||
|
|
||||||
//pack the region's data
|
|
||||||
packet.meta.type = SerialPacket::Type::REGION_REQUEST;
|
|
||||||
packet.regionInfo.mapIndex = mapIndex;
|
|
||||||
packet.regionInfo.x = x;
|
|
||||||
packet.regionInfo.y = y;
|
|
||||||
serialize(&packet, buffer);
|
|
||||||
network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Utilities
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
//TODO: convert this into a more generic function?; using parameters for the bounds
|
|
||||||
void InWorld::UpdateMap() {
|
|
||||||
//these represent the zone of regions that the client needs loaded, including the mandatory buffers (+1/-1)
|
|
||||||
int xStart = snapToBase(REGION_WIDTH, camera.x/tileSheet.GetTileW()) - REGION_WIDTH;
|
|
||||||
int xEnd = snapToBase(REGION_WIDTH, (camera.x+camera.width)/tileSheet.GetTileW()) + REGION_WIDTH;
|
|
||||||
|
|
||||||
int yStart = snapToBase(REGION_HEIGHT, camera.y/tileSheet.GetTileH()) - REGION_HEIGHT;
|
|
||||||
int yEnd = snapToBase(REGION_HEIGHT, (camera.y+camera.height)/tileSheet.GetTileH()) + REGION_HEIGHT;
|
|
||||||
|
|
||||||
//prune distant regions
|
|
||||||
for (auto it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); /* EMPTY */) {
|
|
||||||
//check if the region is outside off this area
|
|
||||||
if ((*it)->GetX() < xStart || (*it)->GetX() > xEnd || (*it)->GetY() < yStart || (*it)->GetY() > yEnd) {
|
|
||||||
|
|
||||||
//clunky, but the alternative was time consuming
|
|
||||||
int tmpX = (*it)->GetX();
|
|
||||||
int tmpY = (*it)->GetY();
|
|
||||||
++it;
|
|
||||||
|
|
||||||
regionPager.UnloadRegion(tmpX, tmpY);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
|
|
||||||
//request empty regions within this zone
|
|
||||||
for (int i = xStart; i <= xEnd; i += REGION_WIDTH) {
|
|
||||||
for (int j = yStart; j <= yEnd; j += REGION_HEIGHT) {
|
|
||||||
if (!regionPager.FindRegion(i, j)) {
|
|
||||||
RequestRegion(0, i, j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -1,75 +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 BBOX_HPP_
|
|
||||||
#define BBOX_HPP_
|
|
||||||
|
|
||||||
#include <type_traits>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
//TODO: This is supposed to interact with the vector
|
|
||||||
class BBox {
|
|
||||||
public:
|
|
||||||
double x, y;
|
|
||||||
double w, h;
|
|
||||||
|
|
||||||
BBox() = default;
|
|
||||||
BBox(double i, double j, double k, double l): x(i), y(j), w(k), h(l) {};
|
|
||||||
~BBox() = default;
|
|
||||||
BBox& operator=(BBox const&) = default;
|
|
||||||
|
|
||||||
double Size() {
|
|
||||||
return std::max(w*h,0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsCollision(BBox rhs) {
|
|
||||||
return not (
|
|
||||||
x >= rhs.x + rhs.w ||
|
|
||||||
y >= rhs.y + rhs.h ||
|
|
||||||
rhs.x >= x + w ||
|
|
||||||
rhs.y >= y + h
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
BBox Intersection(BBox rhs) {
|
|
||||||
if (!IsCollision(rhs)) {
|
|
||||||
return {0, 0, 0, 0};
|
|
||||||
}
|
|
||||||
BBox 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
double operator[](size_t i) {
|
|
||||||
if (i >= 4)
|
|
||||||
throw(std::domain_error("Out of range"));
|
|
||||||
return *(&x+i);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//This is explicitly a POD
|
|
||||||
static_assert(std::is_pod<BBox>::value, "BBox is not a POD");
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
/* 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"
|
||||||
|
|
||||||
|
void CharacterData::Update(double delta) {
|
||||||
|
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
|
||||||
|
if (motion.y > 0) {
|
||||||
|
sprite.SetYIndex(0);
|
||||||
|
}
|
||||||
|
else if (motion.y < 0) {
|
||||||
|
sprite.SetYIndex(1);
|
||||||
|
}
|
||||||
|
else if (motion.x > 0) {
|
||||||
|
sprite.SetYIndex(3);
|
||||||
|
}
|
||||||
|
else if (motion.x < 0) {
|
||||||
|
sprite.SetYIndex(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
//animation
|
||||||
|
if (motion != 0) {
|
||||||
|
sprite.SetDelay(0.1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sprite.SetDelay(0);
|
||||||
|
sprite.SetXIndex(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#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.
|
||||||
|
*/
|
||||||
|
#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,70 @@
|
|||||||
|
/* 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 COMBATDATA_HPP_
|
||||||
|
#define COMBATDATA_HPP_
|
||||||
|
|
||||||
|
#include "vector2.hpp"
|
||||||
|
|
||||||
|
//gameplay members
|
||||||
|
#include "character_data.hpp"
|
||||||
|
#include "enemy_data.hpp"
|
||||||
|
|
||||||
|
//graphics
|
||||||
|
#ifdef GRAPHICS
|
||||||
|
#include "sprite_sheet.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//std namespace
|
||||||
|
#include <chrono>
|
||||||
|
#include <array>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#define COMBAT_MAX_CHARACTERS 12
|
||||||
|
#define COMBAT_MAX_ENEMIES 12
|
||||||
|
|
||||||
|
struct CombatData {
|
||||||
|
enum class Terrain {
|
||||||
|
//TODO: types of combat terrains
|
||||||
|
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;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -19,20 +19,39 @@
|
|||||||
* 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 SERIAL_HPP_
|
#ifndef ENEMYDATA_HPP_
|
||||||
#define SERIAL_HPP_
|
#define ENEMYDATA_HPP_
|
||||||
|
|
||||||
#include "serial_packet.hpp"
|
#include "vector2.hpp"
|
||||||
|
#include "statistics.hpp"
|
||||||
|
|
||||||
/* NOTE: Keep the PACKET_BUFFER_SIZE up to date
|
//graphics
|
||||||
* NOTE: REGION_CONTENT is currently the largest type of packet
|
#ifdef GRAPHICS
|
||||||
* map content: REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizoeof(region::type_t)
|
#include "sprite_sheet.hpp"
|
||||||
* map format: sizeof(int) * 3
|
#endif
|
||||||
* metadata: sizeof(metadata)
|
|
||||||
*/
|
|
||||||
#define PACKET_BUFFER_SIZE REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) + sizeof(int) * 3 + sizeof(SerialPacket::Metadata)
|
|
||||||
|
|
||||||
void serialize(SerialPacket* const, void*);
|
//std namespace
|
||||||
void deserialize(SerialPacket* const, void*);
|
#include <string>
|
||||||
|
|
||||||
|
struct EnemyData {
|
||||||
|
//metadata
|
||||||
|
std::string handle;
|
||||||
|
std::string avatar;
|
||||||
|
|
||||||
|
//gameplay
|
||||||
|
Statistics stats;
|
||||||
|
|
||||||
|
//TODO: gameplay components: equipment, items, buffs, debuffs, rewards
|
||||||
|
|
||||||
|
//active gameplay members
|
||||||
|
//NOTE: these are lost when unloaded
|
||||||
|
#ifdef GRAPHICS
|
||||||
|
SpriteSheet sprite;
|
||||||
|
Vector2 origin = {0.0,0.0};
|
||||||
|
Vector2 bounds = {0.0,0.0};
|
||||||
|
#endif
|
||||||
|
int tableIndex;
|
||||||
|
int atbGauge = 0;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,17 +1,14 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. .. ../map
|
INCLUDES+=. ../utilities ../graphics
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 -DDEBUG $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) -DGRAPHICS
|
||||||
CFLAGS+=-DDEBUG $(addprefix -I,$(INCLUDES))
|
|
||||||
|
|
||||||
#source
|
#source
|
||||||
CXXSRC=$(wildcard *.cpp)
|
CXXSRC=$(wildcard *.cpp)
|
||||||
CSRC=$(wildcard *.c)
|
|
||||||
|
|
||||||
#objects
|
#objects
|
||||||
OBJDIR=obj
|
OBJDIR=obj
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CSRC:.c=.o))
|
|
||||||
|
|
||||||
#output
|
#output
|
||||||
OUTDIR=../..
|
OUTDIR=../..
|
||||||
@@ -34,9 +31,6 @@ $(OUTDIR):
|
|||||||
$(OBJDIR)/%.o: %.cpp
|
$(OBJDIR)/%.o: %.cpp
|
||||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
$(OBJDIR)/%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.o *.a *.exe
|
$(RM) *.o *.a *.exe
|
||||||
|
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/* 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.
|
||||||
|
*/
|
||||||
@@ -19,29 +19,10 @@
|
|||||||
* 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 CHARACTERDATA_HPP_
|
#ifndef STATISTICS_HPP_
|
||||||
#define CHARACTERDATA_HPP_
|
#define STATISTICS_HPP_
|
||||||
|
|
||||||
//POD members
|
struct Statistics {
|
||||||
#include "bbox.hpp"
|
|
||||||
#include "vector2.hpp"
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
struct CharacterData {
|
|
||||||
//metadata
|
|
||||||
int clientIndex;
|
|
||||||
std::string username;
|
|
||||||
std::string handle;
|
|
||||||
std::string avatar;
|
|
||||||
|
|
||||||
//world position
|
|
||||||
int mapIndex = 0;
|
|
||||||
Vector2 position = {0.0,0.0};
|
|
||||||
Vector2 motion = {0.0,0.0};
|
|
||||||
BBox bbox = {0,0,0,0};
|
|
||||||
|
|
||||||
//statistics
|
|
||||||
int level = 0;
|
int level = 0;
|
||||||
int exp = 0;
|
int exp = 0;
|
||||||
int maxHP = 0;
|
int maxHP = 0;
|
||||||
@@ -52,12 +33,10 @@ struct CharacterData {
|
|||||||
int defence = 0;
|
int defence = 0;
|
||||||
int intelligence = 0;
|
int intelligence = 0;
|
||||||
int resistance = 0;
|
int resistance = 0;
|
||||||
|
int speed = 0;
|
||||||
float accuracy = 0.0;
|
float accuracy = 0.0;
|
||||||
float evasion = 0.0;
|
float evasion = 0.0;
|
||||||
float luck = 0.0;
|
float luck = 0.0;
|
||||||
|
|
||||||
//uid
|
|
||||||
static int uidCounter;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
|||||||
@@ -1,17 +1,14 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. .. ../map
|
INCLUDES+=. ../map
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 -DDEBUG $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
CFLAGS+=-DDEBUG $(addprefix -I,$(INCLUDES))
|
|
||||||
|
|
||||||
#source
|
#source
|
||||||
CXXSRC=$(wildcard *.cpp)
|
CXXSRC=$(wildcard *.cpp)
|
||||||
CSRC=$(wildcard *.c)
|
|
||||||
|
|
||||||
#objects
|
#objects
|
||||||
OBJDIR=obj
|
OBJDIR=obj
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CSRC:.c=.o))
|
|
||||||
|
|
||||||
#output
|
#output
|
||||||
OUTDIR=../..
|
OUTDIR=../..
|
||||||
@@ -34,9 +31,6 @@ $(OUTDIR):
|
|||||||
$(OBJDIR)/%.o: %.cpp
|
$(OBJDIR)/%.o: %.cpp
|
||||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
$(OBJDIR)/%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.o *.a *.exe
|
$(RM) *.o *.a *.exe
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
|||||||
+3
-39
@@ -1,46 +1,10 @@
|
|||||||
#config
|
all:
|
||||||
INCLUDES+=.
|
$(MAKE) -C gameplay
|
||||||
LIBS+=
|
|
||||||
CXXFLAGS+=-std=c++11 -DDEBUG $(addprefix -I,$(INCLUDES))
|
|
||||||
CFLAGS+=-DDEBUG $(addprefix -I,$(INCLUDES))
|
|
||||||
|
|
||||||
#source
|
|
||||||
CXXSRC=$(wildcard *.cpp)
|
|
||||||
CSRC=$(wildcard *.c)
|
|
||||||
|
|
||||||
#objects
|
|
||||||
OBJDIR=obj
|
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CSRC:.c=.o))
|
|
||||||
|
|
||||||
#output
|
|
||||||
OUTDIR=..
|
|
||||||
OUT=$(addprefix $(OUTDIR)/,libcommon.a)
|
|
||||||
|
|
||||||
#targets
|
|
||||||
all: $(OBJ) $(OUT)
|
|
||||||
ar -crs $(OUT) $(OBJ)
|
|
||||||
$(MAKE) -C graphics
|
$(MAKE) -C graphics
|
||||||
$(MAKE) -C map
|
$(MAKE) -C map
|
||||||
$(MAKE) -C script
|
|
||||||
$(MAKE) -C network
|
$(MAKE) -C network
|
||||||
$(MAKE) -C ui
|
$(MAKE) -C ui
|
||||||
|
$(MAKE) -C utilities
|
||||||
$(OBJ): | $(OBJDIR)
|
|
||||||
|
|
||||||
$(OUT): | $(OUTDIR)
|
|
||||||
|
|
||||||
$(OBJDIR):
|
|
||||||
mkdir $(OBJDIR)
|
|
||||||
|
|
||||||
$(OUTDIR):
|
|
||||||
mkdir $(OUTDIR)
|
|
||||||
|
|
||||||
$(OBJDIR)/%.o: %.cpp
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
$(OBJDIR)/%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.o *.a *.exe
|
$(RM) *.o *.a *.exe
|
||||||
|
|||||||
+2
-8
@@ -1,17 +1,14 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. .. ../graphics
|
INCLUDES+=. ../utilities
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 -DDEBUG $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
CFLAGS+=-DDEBUG $(addprefix -I,$(INCLUDES))
|
|
||||||
|
|
||||||
#source
|
#source
|
||||||
CXXSRC=$(wildcard *.cpp)
|
CXXSRC=$(wildcard *.cpp)
|
||||||
CSRC=$(wildcard *.c)
|
|
||||||
|
|
||||||
#objects
|
#objects
|
||||||
OBJDIR=obj
|
OBJDIR=obj
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CSRC:.c=.o))
|
|
||||||
|
|
||||||
#output
|
#output
|
||||||
OUTDIR=../..
|
OUTDIR=../..
|
||||||
@@ -34,9 +31,6 @@ $(OUTDIR):
|
|||||||
$(OBJDIR)/%.o: %.cpp
|
$(OBJDIR)/%.o: %.cpp
|
||||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
$(OBJDIR)/%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.o *.a *.exe
|
$(RM) *.o *.a *.exe
|
||||||
|
|
||||||
|
|||||||
@@ -1,60 +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 "map_allocator.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
void BlankAllocator::Create(Region** const ptr, int x, int y) {
|
|
||||||
(*ptr) = new Region(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BlankAllocator::Unload(Region* const ptr) {
|
|
||||||
delete ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LuaAllocator::Create(Region** const ptr, int x, int y) {
|
|
||||||
//something to work on
|
|
||||||
(*ptr) = new Region(x, y);
|
|
||||||
|
|
||||||
//API hook
|
|
||||||
lua_getglobal(state, "map");
|
|
||||||
lua_getfield(state, -1, "create");
|
|
||||||
lua_pushlightuserdata(state, *ptr);
|
|
||||||
if (lua_pcall(state, 1, 0, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(state, -1) ));
|
|
||||||
}
|
|
||||||
lua_pop(state, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LuaAllocator::Unload(Region* const ptr) {
|
|
||||||
//API hook
|
|
||||||
lua_getglobal(state, "map");
|
|
||||||
lua_getfield(state, -1, "unload");
|
|
||||||
lua_pushlightuserdata(state, ptr);
|
|
||||||
if (lua_pcall(state, 1, 0, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(state, -1) ));
|
|
||||||
}
|
|
||||||
lua_pop(state, 1);
|
|
||||||
|
|
||||||
//clean up the memory
|
|
||||||
delete ptr;
|
|
||||||
}
|
|
||||||
@@ -1,66 +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 "map_file_format.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
void DummyFormat::Load(Region** const ptr, int x, int y) {
|
|
||||||
//EMPTY
|
|
||||||
}
|
|
||||||
|
|
||||||
void DummyFormat::Save(Region* const ptr) {
|
|
||||||
//EMPTY
|
|
||||||
}
|
|
||||||
|
|
||||||
void LuaFormat::Load(Region** const ptr, int x, int y) {
|
|
||||||
//something to load into
|
|
||||||
|
|
||||||
if (!(*ptr)) {
|
|
||||||
(*ptr) = new Region(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
//API hook
|
|
||||||
lua_getglobal(state, "map");
|
|
||||||
lua_getfield(state, -1, "load");
|
|
||||||
lua_pushlightuserdata(state, *ptr);
|
|
||||||
lua_pushstring(state, saveDir.c_str());
|
|
||||||
if (lua_pcall(state, 2, 1, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(state, -1) ));
|
|
||||||
}
|
|
||||||
if (lua_toboolean(state, -1) == false) {
|
|
||||||
delete (*ptr);
|
|
||||||
(*ptr) = nullptr;
|
|
||||||
}
|
|
||||||
lua_pop(state, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LuaFormat::Save(Region* const ptr) {
|
|
||||||
//API hook
|
|
||||||
lua_getglobal(state, "map");
|
|
||||||
lua_getfield(state, -1, "save");
|
|
||||||
lua_pushlightuserdata(state, ptr);
|
|
||||||
lua_pushstring(state, saveDir.c_str());
|
|
||||||
if (lua_pcall(state, 2, 0, 0) != LUA_OK) {
|
|
||||||
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(state, -1) ));
|
|
||||||
}
|
|
||||||
lua_pop(state, 1);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,156 @@
|
|||||||
|
/* 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 "pager_api.hpp"
|
||||||
|
|
||||||
|
#include "region_pager_lua.hpp"
|
||||||
|
#include "region.hpp"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
static int setTile(lua_State* L) {
|
||||||
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
|
int ret = pager->SetTile(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5));
|
||||||
|
lua_pushinteger(L, ret);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getTile(lua_State* L) {
|
||||||
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
|
int ret = pager->GetTile(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4));
|
||||||
|
lua_pushinteger(L, ret);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getRegion(lua_State* L) {
|
||||||
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
|
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||||
|
lua_pushlightuserdata(L, region);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int 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) {
|
||||||
|
//get the parameters
|
||||||
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
|
Region* region = pager->GetRegion(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_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;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int saveRegion(lua_State* L) {
|
||||||
|
//get the parameters
|
||||||
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
|
Region* region = pager->GetRegion(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_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;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int createRegion(lua_State* L) {
|
||||||
|
//get the parameters
|
||||||
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
|
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||||
|
|
||||||
|
//push the parameters
|
||||||
|
lua_getglobal(L, "region");
|
||||||
|
lua_getfield(L, -1, "create");
|
||||||
|
lua_pushlightuserdata(L, region);
|
||||||
|
//TODO: parameters
|
||||||
|
|
||||||
|
//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) {
|
||||||
|
//get the parameters
|
||||||
|
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||||
|
Region* region = pager->GetRegion(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const luaL_Reg pagerlib[] = {
|
||||||
|
{"settile", setTile},
|
||||||
|
{"gettile", getTile},
|
||||||
|
{"getregion", getRegion},
|
||||||
|
{"setdirectory", setDirectory},
|
||||||
|
{"getdirectory", getDirectory},
|
||||||
|
{"loadregion", loadRegion},
|
||||||
|
{"saveregion", saveRegion},
|
||||||
|
{"createregion", createRegion},
|
||||||
|
{"unloadregion", unloadRegion},
|
||||||
|
{nullptr, nullptr}
|
||||||
|
};
|
||||||
|
|
||||||
|
LUAMOD_API int luaopen_pagerapi(lua_State* L) {
|
||||||
|
luaL_newlib(L, pagerlib);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
@@ -19,6 +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 "character_data.hpp"
|
#ifndef PAGERAPI_HPP_
|
||||||
|
#define PAGERAPI_HPP_
|
||||||
|
|
||||||
int CharacterData::uidCounter = 0;
|
#include "lua/lua.hpp"
|
||||||
|
|
||||||
|
#define LUA_PAGERLIBNAME "pager"
|
||||||
|
LUAMOD_API int luaopen_pagerapi(lua_State* L);
|
||||||
|
|
||||||
|
#endif
|
||||||
+13
-6
@@ -21,13 +21,20 @@
|
|||||||
*/
|
*/
|
||||||
#include "region.hpp"
|
#include "region.hpp"
|
||||||
|
|
||||||
Region::Region(int argX, int argY):
|
#include "utility.hpp"
|
||||||
x(argX),
|
|
||||||
y(argY)
|
#include <stdexcept>
|
||||||
{
|
#include <cstring>
|
||||||
for (register int i = 0; i < REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH; ++i) {
|
|
||||||
*(reinterpret_cast<type_t*>(tiles) + i) = 0;
|
Region::Region(int argX, int argY): x(argX), y(argY) {
|
||||||
|
if (x != snapToBase(REGION_WIDTH, x) || y != snapToBase(REGION_HEIGHT, y)) {
|
||||||
|
throw(std::invalid_argument("Region location is off grid"));
|
||||||
}
|
}
|
||||||
|
memset(tiles, 0, REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH*sizeof(type_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
Region::Region(Region const& rhs): x(rhs.x), y(rhs.y) {
|
||||||
|
memcpy(tiles, rhs.tiles, REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH*sizeof(type_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
|
|||||||
@@ -22,16 +22,17 @@
|
|||||||
#ifndef REGION_HPP_
|
#ifndef REGION_HPP_
|
||||||
#define REGION_HPP_
|
#define REGION_HPP_
|
||||||
|
|
||||||
#define REGION_WIDTH 20
|
constexpr int REGION_WIDTH = 20;
|
||||||
#define REGION_HEIGHT 20
|
constexpr int REGION_HEIGHT = 20;
|
||||||
#define REGION_DEPTH 3
|
constexpr int REGION_DEPTH = 3;
|
||||||
|
|
||||||
class Region {
|
class Region {
|
||||||
public:
|
public:
|
||||||
typedef unsigned short type_t;
|
typedef unsigned char type_t;
|
||||||
|
|
||||||
Region() = delete;
|
Region() = delete;
|
||||||
Region(int x, int y);
|
Region(int x, int y);
|
||||||
|
Region(Region const&);
|
||||||
~Region() = default;
|
~Region() = default;
|
||||||
|
|
||||||
type_t SetTile(int x, int y, int z, type_t v);
|
type_t SetTile(int x, int y, int z, type_t v);
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
/* 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_api.hpp"
|
||||||
|
|
||||||
|
#include "region.hpp"
|
||||||
|
|
||||||
|
static int setTile(lua_State* L) {
|
||||||
|
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||||
|
int ret = region->SetTile(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_tointeger(L, 4)-1, lua_tointeger(L, 5));
|
||||||
|
lua_pushinteger(L, ret);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getTile(lua_State* L) {
|
||||||
|
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||||
|
int ret = region->GetTile(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_tointeger(L, 4)-1);
|
||||||
|
lua_pushinteger(L, ret);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getX(lua_State* L) {
|
||||||
|
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||||
|
lua_pushinteger(L, region->GetX());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getY(lua_State* L) {
|
||||||
|
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||||
|
lua_pushinteger(L, region->GetY());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getWidth(lua_State* L) {
|
||||||
|
lua_pushinteger(L, REGION_WIDTH);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getHeight(lua_State* L) {
|
||||||
|
lua_pushinteger(L, REGION_HEIGHT);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getDepth(lua_State* L) {
|
||||||
|
lua_pushinteger(L, REGION_DEPTH);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int load(lua_State* L) {
|
||||||
|
//TODO: fill this
|
||||||
|
lua_pushboolean(L, false);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int save(lua_State* L) {
|
||||||
|
//TODO: fill this
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
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}
|
||||||
|
};
|
||||||
|
|
||||||
|
LUAMOD_API int luaopen_regionapi(lua_State* L) {
|
||||||
|
luaL_newlib(L, regionlib);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
@@ -19,6 +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 "client_data.hpp"
|
#ifndef REGIONAPI_HPP_
|
||||||
|
#define REGIONAPI_HPP_
|
||||||
|
|
||||||
int ClientData::uidCounter = 0;
|
#include "lua/lua.hpp"
|
||||||
|
|
||||||
|
#define LUA_REGIONLIBNAME "region"
|
||||||
|
LUAMOD_API int luaopen_regionapi(lua_State* L);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,133 +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 REGIONPAGER_HPP_
|
|
||||||
#define REGIONPAGER_HPP_
|
|
||||||
|
|
||||||
#include "region.hpp"
|
|
||||||
#include "utility.hpp"
|
|
||||||
|
|
||||||
#include <list>
|
|
||||||
|
|
||||||
class RegionPagerBase {
|
|
||||||
public:
|
|
||||||
RegionPagerBase() {};
|
|
||||||
virtual ~RegionPagerBase() {};
|
|
||||||
|
|
||||||
//tile manipulation
|
|
||||||
Region::type_t SetTile(int x, int y, int z, Region::type_t v);
|
|
||||||
Region::type_t GetTile(int x, int y, int z);
|
|
||||||
|
|
||||||
//region manipulation
|
|
||||||
Region* GetRegion(int x, int y);
|
|
||||||
Region* FindRegion(int x, int y);
|
|
||||||
Region* PushRegion(Region*);
|
|
||||||
|
|
||||||
//interface
|
|
||||||
virtual Region* LoadRegion(int x, int y) = 0;
|
|
||||||
virtual Region* SaveRegion(int x, int y) = 0;
|
|
||||||
virtual Region* CreateRegion(int x, int y) = 0;
|
|
||||||
virtual void UnloadRegion(int x, int y) = 0;
|
|
||||||
//TODO: delete existing regions
|
|
||||||
|
|
||||||
//accessors & mutators
|
|
||||||
std::list<Region*>* GetContainer() { return ®ionList; }
|
|
||||||
protected:
|
|
||||||
std::list<Region*> regionList;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename Allocator, typename FileFormat>
|
|
||||||
class RegionPager : public RegionPagerBase {
|
|
||||||
public:
|
|
||||||
RegionPager() {};
|
|
||||||
~RegionPager() {
|
|
||||||
UnloadAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
Region* LoadRegion(int x, int y) {
|
|
||||||
//snap the coords
|
|
||||||
x = snapToBase(REGION_WIDTH, x);
|
|
||||||
y = snapToBase(REGION_HEIGHT, y);
|
|
||||||
|
|
||||||
//load the region if possible
|
|
||||||
Region* ptr = nullptr;
|
|
||||||
format.Load(&ptr, x, y);
|
|
||||||
if (ptr) {
|
|
||||||
return PushRegion(ptr);
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
Region* SaveRegion(int x, int y) {
|
|
||||||
//snap the coords
|
|
||||||
x = snapToBase(REGION_WIDTH, x);
|
|
||||||
y = snapToBase(REGION_HEIGHT, y);
|
|
||||||
|
|
||||||
//find & save the region
|
|
||||||
Region* ptr = FindRegion(x, y);
|
|
||||||
if (ptr) {
|
|
||||||
format.Save(ptr);
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
Region* CreateRegion(int x, int y) {
|
|
||||||
//snap the coords
|
|
||||||
x = snapToBase(REGION_WIDTH, x);
|
|
||||||
y = snapToBase(REGION_HEIGHT, y);
|
|
||||||
|
|
||||||
//create and push the object
|
|
||||||
Region* ptr = nullptr;
|
|
||||||
allocator.Create(&ptr, x, y);
|
|
||||||
return PushRegion(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UnloadRegion(int x, int y) {
|
|
||||||
//snap the coords
|
|
||||||
x = snapToBase(REGION_WIDTH, x);
|
|
||||||
y = snapToBase(REGION_HEIGHT, y);
|
|
||||||
|
|
||||||
//custom loop
|
|
||||||
for (std::list<Region*>::iterator it = regionList.begin(); it != regionList.end(); /* EMPTY */) {
|
|
||||||
if ((*it)->GetX() == x && (*it)->GetY() == y) {
|
|
||||||
allocator.Unload(*it);
|
|
||||||
it = regionList.erase(it);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void UnloadAll() {
|
|
||||||
for (auto& it : regionList) {
|
|
||||||
allocator.Unload(it);
|
|
||||||
}
|
|
||||||
regionList.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
//accessors
|
|
||||||
Allocator* GetAllocator() { return &allocator; }
|
|
||||||
FileFormat* GetFormat() { return &format; }
|
|
||||||
protected:
|
|
||||||
Allocator allocator;
|
|
||||||
FileFormat format;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -19,10 +19,13 @@
|
|||||||
* 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 "region_pager.hpp"
|
#include "region_pager_base.hpp"
|
||||||
|
|
||||||
#include "utility.hpp"
|
#include "utility.hpp"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
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);
|
||||||
@@ -34,10 +37,6 @@ Region::type_t RegionPagerBase::GetTile(int x, int y, int z) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Region* RegionPagerBase::GetRegion(int x, int y) {
|
Region* RegionPagerBase::GetRegion(int x, int y) {
|
||||||
//snap the coords
|
|
||||||
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);
|
||||||
@@ -48,20 +47,41 @@ Region* RegionPagerBase::GetRegion(int x, int y) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Region* RegionPagerBase::FindRegion(int x, int y) {
|
Region* RegionPagerBase::FindRegion(int x, int y) {
|
||||||
//snap the coords
|
|
||||||
x = snapToBase(REGION_WIDTH, x);
|
|
||||||
y = snapToBase(REGION_HEIGHT, y);
|
|
||||||
|
|
||||||
//find the region
|
//find the region
|
||||||
for (std::list<Region*>::iterator it = regionList.begin(); it != regionList.end(); it++) {
|
std::list<Region>::iterator it = find_if(regionList.begin(), regionList.end(), [x, y](Region& region) -> bool {
|
||||||
if ((*it)->GetX() == x && (*it)->GetY() == y) {
|
return region.GetX() == x && region.GetY() == y;
|
||||||
return *it;
|
});
|
||||||
}
|
return it != regionList.end() ? &(*it) : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Region* RegionPagerBase::PushRegion(Region* const ptr) {
|
||||||
|
regionList.push_front(*ptr);
|
||||||
|
return ®ionList.front();
|
||||||
|
}
|
||||||
|
|
||||||
|
Region* RegionPagerBase::LoadRegion(int x, int y) {
|
||||||
|
//TODO: load the region if possible
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Region* RegionPagerBase::PushRegion(Region* ptr) {
|
Region* RegionPagerBase::SaveRegion(int x, int y) {
|
||||||
regionList.push_front(ptr);
|
//TODO: find & save the region
|
||||||
return regionList.front();
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
Region* RegionPagerBase::CreateRegion(int x, int y) {
|
||||||
|
if (FindRegion(x, y)) {
|
||||||
|
throw(std::logic_error("Cannot overwrite an existing region"));
|
||||||
|
}
|
||||||
|
regionList.emplace_front(x, y);
|
||||||
|
return ®ionList.front();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RegionPagerBase::UnloadRegion(int x, int y) {
|
||||||
|
//custom loop, not FindRegion()
|
||||||
|
regionList.remove_if([x, y](Region& region) -> bool { return region.GetX() == x && region.GetY() == y; });
|
||||||
|
}
|
||||||
|
|
||||||
|
void RegionPagerBase::UnloadAll() {
|
||||||
|
regionList.clear();
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
/* 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 REGIONPAGERBASE_HPP_
|
||||||
|
#define REGIONPAGERBASE_HPP_
|
||||||
|
|
||||||
|
#include "region.hpp"
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
class RegionPagerBase {
|
||||||
|
public:
|
||||||
|
RegionPagerBase() = default;
|
||||||
|
virtual ~RegionPagerBase() { UnloadAll(); };
|
||||||
|
|
||||||
|
//tile manipulation
|
||||||
|
virtual Region::type_t SetTile(int x, int y, int z, Region::type_t v);
|
||||||
|
virtual Region::type_t GetTile(int x, int y, int z);
|
||||||
|
|
||||||
|
//region manipulation
|
||||||
|
virtual Region* GetRegion(int x, int y);
|
||||||
|
virtual Region* FindRegion(int x, int y);
|
||||||
|
virtual Region* PushRegion(Region* const);
|
||||||
|
|
||||||
|
virtual Region* LoadRegion(int x, int y);
|
||||||
|
virtual Region* SaveRegion(int x, int y);
|
||||||
|
virtual Region* CreateRegion(int x, int y);
|
||||||
|
virtual void UnloadRegion(int x, int y);
|
||||||
|
|
||||||
|
virtual void UnloadAll();
|
||||||
|
|
||||||
|
//accessors & mutators
|
||||||
|
std::list<Region>* GetContainer() { return ®ionList; }
|
||||||
|
protected:
|
||||||
|
std::list<Region> regionList;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,126 @@
|
|||||||
|
/* 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_pager_lua.hpp"
|
||||||
|
|
||||||
|
#include "utility.hpp"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
Region* RegionPagerLua::LoadRegion(int x, int y) {
|
||||||
|
//load the region if possible
|
||||||
|
|
||||||
|
//something to work on
|
||||||
|
regionList.emplace_front(x, y);
|
||||||
|
|
||||||
|
//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;
|
||||||
|
}
|
||||||
|
lua_pop(luaState, 2);
|
||||||
|
return ®ionList.front();
|
||||||
|
}
|
||||||
|
|
||||||
|
Region* RegionPagerLua::SaveRegion(int x, int y) {
|
||||||
|
//find & save the region
|
||||||
|
Region* ptr = FindRegion(x, y);
|
||||||
|
if (ptr) {
|
||||||
|
//API hook
|
||||||
|
lua_getglobal(luaState, "region");
|
||||||
|
lua_getfield(luaState, -1, "save");
|
||||||
|
lua_pushlightuserdata(luaState, ptr);
|
||||||
|
lua_pushstring(luaState, directory.c_str());
|
||||||
|
if (lua_pcall(luaState, 2, 0, 0) != LUA_OK) {
|
||||||
|
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
|
||||||
|
}
|
||||||
|
lua_pop(luaState, 1);
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
Region* RegionPagerLua::CreateRegion(int x, int y) {
|
||||||
|
if (FindRegion(x, y)) {
|
||||||
|
throw(std::logic_error("Cannot overwrite an existing region"));
|
||||||
|
}
|
||||||
|
|
||||||
|
//something to work on
|
||||||
|
regionList.emplace_front(x, y);
|
||||||
|
|
||||||
|
//API hook
|
||||||
|
lua_getglobal(luaState, "region");
|
||||||
|
lua_getfield(luaState, -1, "create");
|
||||||
|
lua_pushlightuserdata(luaState, ®ionList.front());
|
||||||
|
//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();;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RegionPagerLua::UnloadRegion(int x, int y) {
|
||||||
|
lua_getglobal(luaState, "region");
|
||||||
|
|
||||||
|
regionList.remove_if([&](Region& region) -> bool {
|
||||||
|
if (region.GetX() == x && region.GetY() == y) {
|
||||||
|
|
||||||
|
//API hook
|
||||||
|
lua_getfield(luaState, -1, "unload");
|
||||||
|
lua_pushlightuserdata(luaState, ®ion);
|
||||||
|
lua_pushstring(luaState, directory.c_str());
|
||||||
|
if (lua_pcall(luaState, 2, 0, 0) != LUA_OK) {
|
||||||
|
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
lua_pop(luaState, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RegionPagerLua::UnloadAll() {
|
||||||
|
lua_getglobal(luaState, "region");
|
||||||
|
|
||||||
|
for (auto& it : regionList) {
|
||||||
|
//API hook
|
||||||
|
lua_getfield(luaState, -1, "unload");
|
||||||
|
lua_pushlightuserdata(luaState, &it);
|
||||||
|
lua_pushstring(luaState, directory.c_str());
|
||||||
|
if (lua_pcall(luaState, 2, 0, 0) != LUA_OK) {
|
||||||
|
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_pop(luaState, 1);
|
||||||
|
regionList.clear();
|
||||||
|
}
|
||||||
@@ -19,42 +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 MAPFILEFORMAT_HPP_
|
#ifndef REGIONPAGERLUA_HPP_
|
||||||
#define MAPFILEFORMAT_HPP_
|
#define REGIONPAGERLUA_HPP_
|
||||||
|
|
||||||
#include "region.hpp"
|
#include "region_pager_base.hpp"
|
||||||
|
|
||||||
#include "lua/lua.hpp"
|
#include "lua/lua.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class DummyFormat {
|
class RegionPagerLua : public RegionPagerBase {
|
||||||
public:
|
public:
|
||||||
void Load(Region** const, int x, int y);
|
RegionPagerLua() = default;
|
||||||
void Save(Region* const);
|
~RegionPagerLua() = default;
|
||||||
|
|
||||||
std::string SetSaveDir(std::string s) { return saveDir = s; }
|
//region manipulation
|
||||||
std::string GetSaveDir() { return saveDir; }
|
Region* LoadRegion(int x, int y) override;
|
||||||
private:
|
Region* SaveRegion(int x, int y) override;
|
||||||
std::string saveDir;
|
Region* CreateRegion(int x, int y) override;
|
||||||
};
|
void UnloadRegion(int x, int y) override;
|
||||||
|
|
||||||
//TODO: verbose save file format
|
void UnloadAll() override;
|
||||||
//TODO: compact save file format
|
|
||||||
|
|
||||||
class LuaFormat {
|
std::string SetDirectory(std::string s) { return directory = s; }
|
||||||
public:
|
std::string GetDirectory() { return directory; }
|
||||||
void Load(Region** const, int x, int y);
|
|
||||||
void Save(Region* const);
|
|
||||||
|
|
||||||
std::string SetSaveDir(std::string s) { return saveDir = s; }
|
lua_State* SetLuaState(lua_State* L) { return luaState = L; }
|
||||||
std::string GetSaveDir() { return saveDir; }
|
lua_State* GetLuaState() { return luaState; }
|
||||||
|
protected:
|
||||||
lua_State* SetLuaState(lua_State* L) { return state = L; }
|
std::string directory;
|
||||||
lua_State* GetLuaState() { return state; }
|
lua_State* luaState = nullptr;
|
||||||
private:
|
|
||||||
std::string saveDir;
|
|
||||||
lua_State* state = nullptr;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,17 +1,14 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. .. ../map
|
INCLUDES+=. packet serial ../gameplay ../map ../utilities
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 -DDEBUG $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
CFLAGS+=-DDEBUG $(addprefix -I,$(INCLUDES))
|
|
||||||
|
|
||||||
#source
|
#source
|
||||||
CXXSRC=$(wildcard *.cpp)
|
CXXSRC=$(wildcard *.cpp)
|
||||||
CSRC=$(wildcard *.c)
|
|
||||||
|
|
||||||
#objects
|
#objects
|
||||||
OBJDIR=obj
|
OBJDIR=obj
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CSRC:.c=.o))
|
|
||||||
|
|
||||||
#output
|
#output
|
||||||
OUTDIR=../..
|
OUTDIR=../..
|
||||||
@@ -20,6 +17,8 @@ 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 serial
|
||||||
|
|
||||||
$(OBJ): | $(OBJDIR)
|
$(OBJ): | $(OBJDIR)
|
||||||
|
|
||||||
@@ -34,9 +33,6 @@ $(OUTDIR):
|
|||||||
$(OBJDIR)/%.o: %.cpp
|
$(OBJDIR)/%.o: %.cpp
|
||||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
$(OBJDIR)/%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.o *.a *.exe
|
$(RM) *.o *.a *.exe
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
/* 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 CHARACTERPACKET_HPP_
|
||||||
|
#define CHARACTERPACKET_HPP_
|
||||||
|
|
||||||
|
#include "serial_packet_base.hpp"
|
||||||
|
|
||||||
|
#include "vector2.hpp"
|
||||||
|
#include "statistics.hpp"
|
||||||
|
|
||||||
|
struct CharacterPacket : SerialPacketBase {
|
||||||
|
//identify the character
|
||||||
|
int characterIndex;
|
||||||
|
char handle[PACKET_STRING_SIZE];
|
||||||
|
char avatar[PACKET_STRING_SIZE];
|
||||||
|
|
||||||
|
//the owner
|
||||||
|
int accountIndex;
|
||||||
|
|
||||||
|
//location
|
||||||
|
int roomIndex;
|
||||||
|
Vector2 origin;
|
||||||
|
Vector2 motion;
|
||||||
|
|
||||||
|
//gameplay
|
||||||
|
Statistics stats;
|
||||||
|
|
||||||
|
//TODO: gameplay components: equipment, items, buffs, debuffs
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/* 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 CLIENTPACKET_HPP_
|
||||||
|
#define CLIENTPACKET_HPP_
|
||||||
|
|
||||||
|
#include "serial_packet_base.hpp"
|
||||||
|
|
||||||
|
struct ClientPacket : SerialPacketBase {
|
||||||
|
int clientIndex;
|
||||||
|
int accountIndex;
|
||||||
|
char username[PACKET_STRING_SIZE];
|
||||||
|
// char password[PACKET_STRING_SIZE]; //hashed, not currently used
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -19,25 +19,28 @@
|
|||||||
* 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 "editor_application.hpp"
|
#ifndef COMBATPACKET_HPP_
|
||||||
|
#define COMBATPACKET_HPP_
|
||||||
|
|
||||||
#include <stdexcept>
|
#include "serial_packet_base.hpp"
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
using namespace std;
|
#include "combat_data.hpp"
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
struct CombatPacket : SerialPacketBase {
|
||||||
cout << "Beginning editor" << endl;
|
//identify the combat instance
|
||||||
try {
|
int combatIndex;
|
||||||
EditorApplication app;
|
int difficulty;
|
||||||
app.Init(argc, argv);
|
CombatData::Terrain terrainType;
|
||||||
app.Proc();
|
|
||||||
app.Quit();
|
//combatants
|
||||||
}
|
int characterArray[COMBAT_MAX_CHARACTERS];
|
||||||
catch(exception& e) {
|
int enemyArray[COMBAT_MAX_ENEMIES];
|
||||||
cerr << "Fatal exception thrown: " << e.what() << endl;
|
|
||||||
return 1;
|
//location
|
||||||
}
|
int mapIndex;
|
||||||
cout << "Clean exit" << endl;
|
Vector2 origin;
|
||||||
return 0;
|
|
||||||
}
|
//TODO: gameplay components: rewards
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
/* 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 ENEMYPACKET_HPP_
|
||||||
|
#define ENEMYPACKET_HPP_
|
||||||
|
|
||||||
|
#include "serial_packet_base.hpp"
|
||||||
|
|
||||||
|
struct EnemyPacket : SerialPacketBase {
|
||||||
|
//identify the enemy
|
||||||
|
int enemyIndex;
|
||||||
|
char handle[PACKET_STRING_SIZE];
|
||||||
|
char avatar[PACKET_STRING_SIZE];
|
||||||
|
|
||||||
|
//gameplay
|
||||||
|
Statistics stats;
|
||||||
|
|
||||||
|
//TODO: gameplay components: equipment, items, buffs, debuffs, rewards
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,21 +1,18 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. .. ../../common ../../common/graphics ../../common/map ../../common/network ../../common/ui
|
INCLUDES+=. ../../gameplay ../../map ../../utilities
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 -DDEBUG $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
CFLAGS+=-DDEBUG $(addprefix -I,$(INCLUDES))
|
|
||||||
|
|
||||||
#source
|
#source
|
||||||
CXXSRC=$(wildcard *.cpp)
|
CXXSRC=$(wildcard *.cpp)
|
||||||
CSRC=$(wildcard *.c)
|
|
||||||
|
|
||||||
#objects
|
#objects
|
||||||
OBJDIR=obj
|
OBJDIR=obj
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CSRC:.c=.o))
|
|
||||||
|
|
||||||
#output
|
#output
|
||||||
OUTDIR=..
|
OUTDIR=../../..
|
||||||
OUT=$(addprefix $(OUTDIR)/,libclient.a)
|
OUT=$(addprefix $(OUTDIR)/,libcommon.a)
|
||||||
|
|
||||||
#targets
|
#targets
|
||||||
all: $(OBJ) $(OUT)
|
all: $(OBJ) $(OUT)
|
||||||
@@ -34,9 +31,6 @@ $(OUTDIR):
|
|||||||
$(OBJDIR)/%.o: %.cpp
|
$(OBJDIR)/%.o: %.cpp
|
||||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
$(OBJDIR)/%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.o *.a *.exe
|
$(RM) *.o *.a *.exe
|
||||||
|
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/* 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 REGIONPACKET_HPP_
|
||||||
|
#define REGIONPACKET_HPP_
|
||||||
|
|
||||||
|
#include "serial_packet_base.hpp"
|
||||||
|
|
||||||
|
#include "region.hpp"
|
||||||
|
|
||||||
|
struct RegionPacket : SerialPacketBase {
|
||||||
|
//location/identify the region
|
||||||
|
int roomIndex;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
//the data
|
||||||
|
Region* region;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/* 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.
|
||||||
|
*/
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
/* 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 SERIALPACKET_HPP_
|
||||||
|
#define SERIALPACKET_HPP_
|
||||||
|
|
||||||
|
#include "character_packet.hpp"
|
||||||
|
#include "client_packet.hpp"
|
||||||
|
#include "combat_packet.hpp"
|
||||||
|
#include "enemy_packet.hpp"
|
||||||
|
#include "region_packet.hpp"
|
||||||
|
#include "server_packet.hpp"
|
||||||
|
|
||||||
|
//NOTE: SerialPacket is defined in serial_packet_base.hpp
|
||||||
|
|
||||||
|
union MaxPacket {
|
||||||
|
CharacterPacket a;
|
||||||
|
ClientPacket b;
|
||||||
|
CombatPacket c;
|
||||||
|
EnemyPacket d;
|
||||||
|
RegionPacket e;
|
||||||
|
ServerPacket f;
|
||||||
|
};
|
||||||
|
constexpr int MAX_PACKET_SIZE = sizeof(MaxPacket);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -19,31 +19,28 @@
|
|||||||
* 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 EDITORAPPLICATION_HPP_
|
#ifndef SERIALPACKETBASE_HPP_
|
||||||
#define EDITORAPPLICATION_HPP_
|
#define SERIALPACKETBASE_HPP_
|
||||||
|
|
||||||
#include "scene_list.hpp"
|
#ifndef SERIALPACKET_HPP_
|
||||||
#include "base_scene.hpp"
|
#error Cannot include this file without 'serial_packet.hpp'
|
||||||
#include "config_utility.hpp"
|
#endif
|
||||||
|
|
||||||
class EditorApplication {
|
#include "serial_packet_type.hpp"
|
||||||
public:
|
|
||||||
EditorApplication() = default;
|
|
||||||
~EditorApplication() = default;
|
|
||||||
|
|
||||||
void Init(int argc, char** argv);
|
#include "SDL/SDL_net.h"
|
||||||
void Proc();
|
|
||||||
void Quit();
|
|
||||||
|
|
||||||
private:
|
constexpr int NETWORK_VERSION = 20140607;
|
||||||
//Private access members
|
constexpr int PACKET_STRING_SIZE = 100;
|
||||||
void LoadScene(SceneList sceneIndex);
|
|
||||||
void UnloadScene();
|
|
||||||
|
|
||||||
//globals
|
struct SerialPacketBase {
|
||||||
ConfigUtility config;
|
//members
|
||||||
|
SerialPacketType type;
|
||||||
|
IPaddress srcAddress;
|
||||||
|
|
||||||
BaseScene* activeScene = nullptr;
|
virtual ~SerialPacketBase() {};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef SerialPacketBase SerialPacket;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
/* 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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -19,18 +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 SCENELIST_HPP_
|
#ifndef SERVERPACKET_HPP_
|
||||||
#define SCENELIST_HPP_
|
#define SERVERPACKET_HPP_
|
||||||
|
|
||||||
enum class SceneList {
|
#include "serial_packet_base.hpp"
|
||||||
//these are reserved
|
|
||||||
QUIT,
|
|
||||||
CONTINUE,
|
|
||||||
FIRST,
|
|
||||||
|
|
||||||
//custom indexes
|
struct ServerPacket : SerialPacketBase {
|
||||||
TESTIFICATESCENE,
|
//identify the server
|
||||||
EDITORSCENE,
|
char name[PACKET_STRING_SIZE];
|
||||||
|
int playerCount;
|
||||||
|
int version;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,282 +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 "map_allocator.hpp"
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//Convenience Macros
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
#define SERIALIZE(buffer, data, size) memcpy(buffer, data, size); buffer += size;
|
|
||||||
#define DESERIALIZE(buffer, data, size) memcpy(data, buffer, size); buffer += size;
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//internal serialization functions
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void serializeType(SerialPacket* packet, char* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
|
||||||
}
|
|
||||||
|
|
||||||
void serializeServer(SerialPacket* packet, char* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
|
||||||
|
|
||||||
//server info
|
|
||||||
SERIALIZE(buffer, &packet->serverInfo.networkVersion, sizeof(int));
|
|
||||||
SERIALIZE(buffer, packet->serverInfo.name, PACKET_STRING_SIZE);
|
|
||||||
SERIALIZE(buffer, &packet->serverInfo.playerCount, sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
void serializeClient(SerialPacket* packet, char* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
|
||||||
|
|
||||||
//indexes
|
|
||||||
SERIALIZE(buffer, &packet->clientInfo.clientIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->clientInfo.characterIndex, sizeof(int));
|
|
||||||
|
|
||||||
//texts
|
|
||||||
SERIALIZE(buffer, packet->clientInfo.username, PACKET_STRING_SIZE);
|
|
||||||
SERIALIZE(buffer, packet->clientInfo.handle, PACKET_STRING_SIZE);
|
|
||||||
SERIALIZE(buffer, packet->clientInfo.avatar, PACKET_STRING_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void serializeRegionFormat(SerialPacket* packet, char* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
|
||||||
|
|
||||||
//format
|
|
||||||
SERIALIZE(buffer, &packet->regionInfo.mapIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->regionInfo.x, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->regionInfo.y, sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
void serializeRegionContent(SerialPacket* packet, char* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
|
||||||
|
|
||||||
//format
|
|
||||||
SERIALIZE(buffer, &packet->regionInfo.mapIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->regionInfo.x, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->regionInfo.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->regionInfo.region->GetTile(i, j, k);
|
|
||||||
buffer += sizeof(Region::type_t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void serializeCharacter(SerialPacket* packet, char* buffer) {
|
|
||||||
SERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
|
||||||
|
|
||||||
//indexes
|
|
||||||
SERIALIZE(buffer, &packet->characterInfo.clientIndex, sizeof(int));
|
|
||||||
SERIALIZE(buffer, &packet->characterInfo.characterIndex, sizeof(int));
|
|
||||||
|
|
||||||
//texts
|
|
||||||
SERIALIZE(buffer, packet->clientInfo.handle, PACKET_STRING_SIZE);
|
|
||||||
SERIALIZE(buffer, packet->clientInfo.avatar, PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//vectors
|
|
||||||
SERIALIZE(buffer, &packet->characterInfo.position.x, sizeof(double));
|
|
||||||
SERIALIZE(buffer, &packet->characterInfo.position.y, sizeof(double));
|
|
||||||
SERIALIZE(buffer, &packet->characterInfo.motion.x, sizeof(double));
|
|
||||||
SERIALIZE(buffer, &packet->characterInfo.motion.y, sizeof(double));
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//internal deserialization functions
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void deserializeType(SerialPacket* packet, char* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeServer(SerialPacket* packet, char* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
|
||||||
|
|
||||||
//server info
|
|
||||||
DESERIALIZE(buffer, &packet->serverInfo.networkVersion, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, packet->serverInfo.name, PACKET_STRING_SIZE);
|
|
||||||
DESERIALIZE(buffer, &packet->serverInfo.playerCount, sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeClient(SerialPacket* packet, char* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
|
||||||
|
|
||||||
//indexes
|
|
||||||
DESERIALIZE(buffer, &packet->clientInfo.clientIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->clientInfo.characterIndex, sizeof(int));
|
|
||||||
|
|
||||||
//texts
|
|
||||||
DESERIALIZE(buffer, packet->clientInfo.username, PACKET_STRING_SIZE);
|
|
||||||
DESERIALIZE(buffer, packet->clientInfo.handle, PACKET_STRING_SIZE);
|
|
||||||
DESERIALIZE(buffer, packet->clientInfo.avatar, PACKET_STRING_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeRegionFormat(SerialPacket* packet, char* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
|
||||||
|
|
||||||
//format
|
|
||||||
DESERIALIZE(buffer, &packet->regionInfo.mapIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->regionInfo.x, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->regionInfo.y, sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeRegionContent(SerialPacket* packet, char* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
|
||||||
|
|
||||||
//format
|
|
||||||
DESERIALIZE(buffer, &packet->regionInfo.mapIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->regionInfo.x, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->regionInfo.y, sizeof(int));
|
|
||||||
|
|
||||||
//an object to work on
|
|
||||||
BlankAllocator().Create(
|
|
||||||
&packet->regionInfo.region,
|
|
||||||
packet->regionInfo.x,
|
|
||||||
packet->regionInfo.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->regionInfo.region->SetTile(i, j, k, *reinterpret_cast<Region::type_t*>(buffer));
|
|
||||||
buffer += sizeof(Region::type_t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeCharacter(SerialPacket* packet, char* buffer) {
|
|
||||||
DESERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
|
||||||
|
|
||||||
//indexes
|
|
||||||
DESERIALIZE(buffer, &packet->characterInfo.clientIndex, sizeof(int));
|
|
||||||
DESERIALIZE(buffer, &packet->characterInfo.characterIndex, sizeof(int));
|
|
||||||
|
|
||||||
//texts
|
|
||||||
DESERIALIZE(buffer, packet->clientInfo.handle, PACKET_STRING_SIZE);
|
|
||||||
DESERIALIZE(buffer, packet->clientInfo.avatar, PACKET_STRING_SIZE);
|
|
||||||
|
|
||||||
//vectors
|
|
||||||
DESERIALIZE(buffer, &packet->characterInfo.position.x, sizeof(double));
|
|
||||||
DESERIALIZE(buffer, &packet->characterInfo.position.y, sizeof(double));
|
|
||||||
DESERIALIZE(buffer, &packet->characterInfo.motion.x, sizeof(double));
|
|
||||||
DESERIALIZE(buffer, &packet->characterInfo.motion.y, sizeof(double));
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
//the interface functions
|
|
||||||
//-------------------------
|
|
||||||
|
|
||||||
void serialize(SerialPacket* packet, void* buffer) {
|
|
||||||
switch(packet->meta.type) {
|
|
||||||
//No extra data
|
|
||||||
case SerialPacket::Type::NONE:
|
|
||||||
case SerialPacket::Type::PING:
|
|
||||||
case SerialPacket::Type::PONG:
|
|
||||||
case SerialPacket::Type::BROADCAST_REQUEST:
|
|
||||||
serializeType(packet, reinterpret_cast<char*>(buffer));
|
|
||||||
break;
|
|
||||||
|
|
||||||
//Server info
|
|
||||||
case SerialPacket::Type::BROADCAST_RESPONSE:
|
|
||||||
serializeServer(packet, reinterpret_cast<char*>(buffer));
|
|
||||||
break;
|
|
||||||
|
|
||||||
//Client info
|
|
||||||
case SerialPacket::Type::JOIN_REQUEST:
|
|
||||||
case SerialPacket::Type::JOIN_RESPONSE:
|
|
||||||
case SerialPacket::Type::SYNCHRONIZE:
|
|
||||||
case SerialPacket::Type::DISCONNECT:
|
|
||||||
case SerialPacket::Type::SHUTDOWN:
|
|
||||||
serializeClient(packet, reinterpret_cast<char*>(buffer));
|
|
||||||
break;
|
|
||||||
|
|
||||||
//region info
|
|
||||||
case SerialPacket::Type::REGION_REQUEST:
|
|
||||||
serializeRegionFormat(packet, reinterpret_cast<char*>(buffer));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SerialPacket::Type::REGION_CONTENT:
|
|
||||||
serializeRegionContent(packet, reinterpret_cast<char*>(buffer));
|
|
||||||
break;
|
|
||||||
|
|
||||||
//Character info
|
|
||||||
case SerialPacket::Type::CHARACTER_NEW:
|
|
||||||
case SerialPacket::Type::CHARACTER_DELETE:
|
|
||||||
case SerialPacket::Type::CHARACTER_UPDATE:
|
|
||||||
serializeCharacter(packet, reinterpret_cast<char*>(buffer));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserialize(SerialPacket* packet, void* buffer) {
|
|
||||||
//find the type, so that you can actually deserialize the packet!
|
|
||||||
deserializeType(packet, reinterpret_cast<char*>(buffer));
|
|
||||||
switch(packet->meta.type) {
|
|
||||||
//No extra data
|
|
||||||
case SerialPacket::Type::NONE:
|
|
||||||
case SerialPacket::Type::PING:
|
|
||||||
case SerialPacket::Type::PONG:
|
|
||||||
case SerialPacket::Type::BROADCAST_REQUEST:
|
|
||||||
//NOTHING
|
|
||||||
break;
|
|
||||||
|
|
||||||
//Server info
|
|
||||||
case SerialPacket::Type::BROADCAST_RESPONSE:
|
|
||||||
deserializeServer(packet, reinterpret_cast<char*>(buffer));
|
|
||||||
break;
|
|
||||||
|
|
||||||
//Client info
|
|
||||||
case SerialPacket::Type::JOIN_REQUEST:
|
|
||||||
case SerialPacket::Type::JOIN_RESPONSE:
|
|
||||||
case SerialPacket::Type::SYNCHRONIZE:
|
|
||||||
case SerialPacket::Type::DISCONNECT:
|
|
||||||
case SerialPacket::Type::SHUTDOWN:
|
|
||||||
deserializeClient(packet, reinterpret_cast<char*>(buffer));
|
|
||||||
break;
|
|
||||||
|
|
||||||
//region info
|
|
||||||
case SerialPacket::Type::REGION_REQUEST:
|
|
||||||
deserializeRegionFormat(packet, reinterpret_cast<char*>(buffer));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SerialPacket::Type::REGION_CONTENT:
|
|
||||||
deserializeRegionContent(packet, reinterpret_cast<char*>(buffer));
|
|
||||||
break;
|
|
||||||
|
|
||||||
//Character info
|
|
||||||
case SerialPacket::Type::CHARACTER_NEW:
|
|
||||||
case SerialPacket::Type::CHARACTER_DELETE:
|
|
||||||
case SerialPacket::Type::CHARACTER_UPDATE:
|
|
||||||
deserializeCharacter(packet, reinterpret_cast<char*>(buffer));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#config
|
||||||
|
INCLUDES+=. ../packet ../../gameplay ../../map ../../utilities
|
||||||
|
LIBS+=
|
||||||
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
|
#source
|
||||||
|
CXXSRC=$(wildcard *.cpp)
|
||||||
|
|
||||||
|
#objects
|
||||||
|
OBJDIR=obj
|
||||||
|
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||||
|
|
||||||
|
#output
|
||||||
|
OUTDIR=../../..
|
||||||
|
OUT=$(addprefix $(OUTDIR)/,libcommon.a)
|
||||||
|
|
||||||
|
#targets
|
||||||
|
all: $(OBJ) $(OUT)
|
||||||
|
ar -crs $(OUT) $(OBJ)
|
||||||
|
|
||||||
|
$(OBJ): | $(OBJDIR)
|
||||||
|
|
||||||
|
$(OUT): | $(OUTDIR)
|
||||||
|
|
||||||
|
$(OBJDIR):
|
||||||
|
mkdir $(OBJDIR)
|
||||||
|
|
||||||
|
$(OUTDIR):
|
||||||
|
mkdir $(OUTDIR)
|
||||||
|
|
||||||
|
$(OBJDIR)/%.o: %.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) *.o *.a *.exe
|
||||||
|
|
||||||
|
rebuild: clean all
|
||||||
@@ -0,0 +1,182 @@
|
|||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
/* 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
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
/* 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
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/* 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);
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/* 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
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
/* 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
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
/* 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/* 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 serializeServer(ServerPacket* packet, void* buffer) {
|
||||||
|
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
||||||
|
|
||||||
|
//identify the server
|
||||||
|
SERIALIZE(buffer, &packet->name, PACKET_STRING_SIZE);
|
||||||
|
SERIALIZE(buffer, &packet->playerCount, sizeof(int));
|
||||||
|
SERIALIZE(buffer, &packet->version, sizeof(int));
|
||||||
|
}
|
||||||
|
|
||||||
|
void deserializeServer(ServerPacket* packet, void* buffer) {
|
||||||
|
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
|
||||||
|
|
||||||
|
//identify the server
|
||||||
|
DESERIALIZE(buffer, &packet->name, PACKET_STRING_SIZE);
|
||||||
|
DESERIALIZE(buffer, &packet->playerCount, sizeof(int));
|
||||||
|
DESERIALIZE(buffer, &packet->version, sizeof(int));
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
/* 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));
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/* 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 SERIALIZEUTIL_HPP_
|
||||||
|
#define SERIALIZEUTIL_HPP_
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
//NOTE: The strange assignments here used in order to move the void* parameter
|
||||||
|
#define SERIALIZE(buffer, data, size) memcpy(buffer, data, size); buffer = reinterpret_cast<char*>(buffer) + size;
|
||||||
|
#define DESERIALIZE(buffer, data, size) memcpy(data, buffer, size); buffer = reinterpret_cast<char*>(buffer) + size;
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
*
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
*
|
|
||||||
* 3. This notice may not be removed or altered from any source
|
|
||||||
* distribution.
|
|
||||||
*/
|
|
||||||
#ifndef SERIALPACKET_HPP_
|
|
||||||
#define SERIALPACKET_HPP_
|
|
||||||
|
|
||||||
#include "vector2.hpp"
|
|
||||||
#include "region.hpp"
|
|
||||||
|
|
||||||
#include "SDL/SDL_net.h"
|
|
||||||
|
|
||||||
#define NETWORK_VERSION 20140428
|
|
||||||
#define PACKET_STRING_SIZE 100
|
|
||||||
|
|
||||||
#pragma pack(push, 0)
|
|
||||||
|
|
||||||
union SerialPacket {
|
|
||||||
//types of packets
|
|
||||||
enum class Type {
|
|
||||||
//default: there is something wrong
|
|
||||||
NONE = 0,
|
|
||||||
|
|
||||||
//not used
|
|
||||||
PING = 1,
|
|
||||||
PONG = 2,
|
|
||||||
|
|
||||||
//Searching for a server to join
|
|
||||||
BROADCAST_REQUEST = 3,
|
|
||||||
BROADCAST_RESPONSE = 4,
|
|
||||||
|
|
||||||
//try to join the server
|
|
||||||
JOIN_REQUEST = 5,
|
|
||||||
JOIN_RESPONSE = 6,
|
|
||||||
|
|
||||||
//mass update
|
|
||||||
SYNCHRONIZE = 7,
|
|
||||||
|
|
||||||
//disconnect from the server
|
|
||||||
DISCONNECT = 8,
|
|
||||||
|
|
||||||
//shut down the server
|
|
||||||
SHUTDOWN = 9,
|
|
||||||
|
|
||||||
//map data
|
|
||||||
REGION_REQUEST = 10,
|
|
||||||
REGION_CONTENT = 11,
|
|
||||||
|
|
||||||
//Character movement, etc.
|
|
||||||
CHARACTER_NEW = 12,
|
|
||||||
CHARACTER_DELETE = 13,
|
|
||||||
CHARACTER_UPDATE = 14,
|
|
||||||
|
|
||||||
//TODO: combat packets
|
|
||||||
};
|
|
||||||
|
|
||||||
//metadata on the packet itself
|
|
||||||
struct Metadata {
|
|
||||||
Type type;
|
|
||||||
IPaddress srcAddress;
|
|
||||||
}meta;
|
|
||||||
|
|
||||||
//information about the server
|
|
||||||
struct ServerInformation {
|
|
||||||
Metadata meta;
|
|
||||||
int networkVersion;
|
|
||||||
char name[PACKET_STRING_SIZE];
|
|
||||||
int playerCount;
|
|
||||||
}serverInfo;
|
|
||||||
|
|
||||||
//information about the client
|
|
||||||
struct ClientInformation {
|
|
||||||
Metadata meta;
|
|
||||||
int clientIndex;
|
|
||||||
int characterIndex;
|
|
||||||
char username[PACKET_STRING_SIZE];
|
|
||||||
char handle[PACKET_STRING_SIZE];
|
|
||||||
char avatar[PACKET_STRING_SIZE];
|
|
||||||
}clientInfo;
|
|
||||||
|
|
||||||
//map data
|
|
||||||
struct RegionInformation {
|
|
||||||
Metadata meta;
|
|
||||||
int mapIndex;
|
|
||||||
int x, y;
|
|
||||||
Region* region;
|
|
||||||
}regionInfo;
|
|
||||||
|
|
||||||
//information about a character
|
|
||||||
struct CharacterInformation {
|
|
||||||
Metadata meta;
|
|
||||||
int clientIndex;
|
|
||||||
int characterIndex;
|
|
||||||
char handle[PACKET_STRING_SIZE];
|
|
||||||
char avatar[PACKET_STRING_SIZE];
|
|
||||||
int mapIndex;
|
|
||||||
Vector2 position;
|
|
||||||
Vector2 motion;
|
|
||||||
}characterInfo;
|
|
||||||
|
|
||||||
//defaults
|
|
||||||
SerialPacket() {
|
|
||||||
meta.type = Type::NONE;
|
|
||||||
meta.srcAddress = {0,0};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -21,34 +21,33 @@
|
|||||||
*/
|
*/
|
||||||
#include "udp_network_utility.hpp"
|
#include "udp_network_utility.hpp"
|
||||||
|
|
||||||
|
#include "serial.hpp"
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
void UDPNetworkUtility::Open(int port, int packSize) {
|
//BUGFIX: memset() is used before sending a packet to remove old data; you don't want to send sensitive data over the network
|
||||||
if (!(socket = SDLNet_UDP_Open(port))) {
|
//NOTE: don't confuse SerialPacket with UDPpacket
|
||||||
Close();
|
|
||||||
throw(std::runtime_error("Failed to open a UDP socket"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(packOut = SDLNet_AllocPacket(packSize))) {
|
void UDPNetworkUtility::Open(int port) {
|
||||||
|
socket = SDLNet_UDP_Open(port);
|
||||||
|
packet = SDLNet_AllocPacket(PACKET_BUFFER_SIZE);
|
||||||
|
if (!socket || !packet) {
|
||||||
Close();
|
Close();
|
||||||
throw(std::runtime_error("Failed to allocate the out packet"));
|
throw(std::runtime_error("Failed to open UDPNetworkUtility"));
|
||||||
}
|
|
||||||
|
|
||||||
if (!(packIn = SDLNet_AllocPacket(packSize))) {
|
|
||||||
Close();
|
|
||||||
throw(std::runtime_error("Failed to allocate the in packet"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UDPNetworkUtility::Close() {
|
void UDPNetworkUtility::Close() {
|
||||||
SDLNet_UDP_Close(socket);
|
SDLNet_UDP_Close(socket);
|
||||||
SDLNet_FreePacket(packOut);
|
SDLNet_FreePacket(packet);
|
||||||
SDLNet_FreePacket(packIn);
|
|
||||||
socket = nullptr;
|
socket = nullptr;
|
||||||
packOut = nullptr;
|
packet = nullptr;
|
||||||
packIn = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//bind to a channel
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
int UDPNetworkUtility::Bind(const char* ip, int port, int channel) {
|
int UDPNetworkUtility::Bind(const char* ip, int port, int channel) {
|
||||||
IPaddress add;
|
IPaddress add;
|
||||||
if (SDLNet_ResolveHost(&add, ip, port) == -1) {
|
if (SDLNet_ResolveHost(&add, ip, port) == -1) {
|
||||||
@@ -61,7 +60,7 @@ int UDPNetworkUtility::Bind(const char* ip, int port, int 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 == -1) {
|
if (ret < 0) {
|
||||||
throw(std::runtime_error("Failed to bind to a channel"));
|
throw(std::runtime_error("Failed to bind to a channel"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,25 +71,29 @@ void UDPNetworkUtility::Unbind(int channel) {
|
|||||||
SDLNet_UDP_Unbind(socket, channel);
|
SDLNet_UDP_Unbind(socket, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
int UDPNetworkUtility::Send(const char* ip, int port, void* data, int len) {
|
//-------------------------
|
||||||
|
//send a buffer
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
int UDPNetworkUtility::SendTo(const char* ip, int port, void* data, int len) {
|
||||||
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"));
|
||||||
}
|
}
|
||||||
|
|
||||||
Send(&add, data, len);
|
SendTo(&add, data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
int UDPNetworkUtility::Send(IPaddress* add, void* data, int len) {
|
int UDPNetworkUtility::SendTo(IPaddress* add, void* data, int len) {
|
||||||
if (len > packOut->maxlen) {
|
if (len > packet->maxlen) {
|
||||||
throw(std::runtime_error("Failed to copy the data into the packet"));
|
throw(std::runtime_error("The buffer is to large for the UDPpacket"));
|
||||||
}
|
}
|
||||||
memset(packOut->data, 0, packOut->maxlen);
|
memset(packet->data, 0, packet->maxlen);
|
||||||
memcpy(packOut->data, data, len);
|
memcpy(packet->data, data, len);
|
||||||
packOut->len = len;
|
packet->len = len;
|
||||||
packOut->address = *add;
|
packet->address = *add;
|
||||||
|
|
||||||
int ret = SDLNet_UDP_Send(socket, -1, packOut);
|
int ret = SDLNet_UDP_Send(socket, -1, packet);
|
||||||
|
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
throw(std::runtime_error("Failed to send a packet"));
|
throw(std::runtime_error("Failed to send a packet"));
|
||||||
@@ -99,15 +102,15 @@ int UDPNetworkUtility::Send(IPaddress* add, void* data, int len) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int UDPNetworkUtility::Send(int channel, void* data, int len) {
|
int UDPNetworkUtility::SendTo(int channel, void* data, int len) {
|
||||||
if (len > packOut->maxlen) {
|
if (len > packet->maxlen) {
|
||||||
throw(std::runtime_error("Failed to copy the data into the packet"));
|
throw(std::runtime_error("The buffer is to large for the UDPpacket"));
|
||||||
}
|
}
|
||||||
memset(packOut->data, 0, packOut->maxlen);
|
memset(packet->data, 0, packet->maxlen);
|
||||||
memcpy(packOut->data, data, len);
|
memcpy(packet->data, data, len);
|
||||||
packOut->len = len;
|
packet->len = len;
|
||||||
|
|
||||||
int ret = SDLNet_UDP_Send(socket, channel, packOut);
|
int ret = SDLNet_UDP_Send(socket, channel, packet);
|
||||||
|
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
throw(std::runtime_error("Failed to send a packet"));
|
throw(std::runtime_error("Failed to send a packet"));
|
||||||
@@ -116,29 +119,30 @@ int UDPNetworkUtility::Send(int channel, void* data, int len) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int UDPNetworkUtility::SendAll(void* data, int len) {
|
int UDPNetworkUtility::SendToAllChannels(void* data, int len) {
|
||||||
if (len > packOut->maxlen) {
|
if (len > packet->maxlen) {
|
||||||
throw(std::runtime_error("Failed to copy the data into the packet"));
|
throw(std::runtime_error("The buffer is to large for the UDPpacket"));
|
||||||
}
|
}
|
||||||
memset(packOut->data, 0, packOut->maxlen);
|
memset(packet->data, 0, packet->maxlen);
|
||||||
memcpy(packOut->data, data, len);
|
memcpy(packet->data, data, len);
|
||||||
packOut->len = len;
|
packet->len = len;
|
||||||
|
|
||||||
int sent = 0;
|
int sent = 0;
|
||||||
|
|
||||||
//send to all bound channels
|
//send to all bound channels
|
||||||
for (int i = 0; i < SDLNET_MAX_UDPCHANNELS; i++) {
|
for (int i = 0; i < SDLNET_MAX_UDPCHANNELS; i++) {
|
||||||
if (SDLNet_UDP_GetPeerAddress(socket, i)) {
|
if (SDLNet_UDP_GetPeerAddress(socket, i)) {
|
||||||
sent += SDLNet_UDP_Send(socket, i, packOut);
|
sent += SDLNet_UDP_Send(socket, i, packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return sent;
|
return sent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: put a void* and int* parameter list here
|
||||||
int UDPNetworkUtility::Receive() {
|
int UDPNetworkUtility::Receive() {
|
||||||
memset(packIn->data, 0, packIn->maxlen);
|
memset(packet->data, 0, packet->maxlen);
|
||||||
int ret = SDLNet_UDP_Recv(socket, packIn);
|
int ret = SDLNet_UDP_Recv(socket, packet);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
throw(std::runtime_error("Unknown network error occured"));
|
throw(std::runtime_error("Unknown network error occured"));
|
||||||
@@ -146,3 +150,75 @@ int UDPNetworkUtility::Receive() {
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-------------------------
|
||||||
|
//send a SerialPacket
|
||||||
|
//-------------------------
|
||||||
|
|
||||||
|
int UDPNetworkUtility::SendTo(const char* ip, int port, SerialPacket* serialPacket) {
|
||||||
|
IPaddress add;
|
||||||
|
if (SDLNet_ResolveHost(&add, ip, port) == -1) {
|
||||||
|
throw(std::runtime_error("Failed to resolve a host"));
|
||||||
|
}
|
||||||
|
|
||||||
|
SendTo(&add, serialPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UDPNetworkUtility::SendTo(IPaddress* add, SerialPacket* serialPacket) {
|
||||||
|
memset(packet->data, 0, packet->maxlen);
|
||||||
|
serializePacket(serialPacket, packet->data);
|
||||||
|
packet->len = PACKET_BUFFER_SIZE;
|
||||||
|
packet->address = *add;
|
||||||
|
|
||||||
|
int ret = SDLNet_UDP_Send(socket, -1, packet);
|
||||||
|
|
||||||
|
if (ret <= 0) {
|
||||||
|
throw(std::runtime_error("Failed to send a packet"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int UDPNetworkUtility::SendTo(int channel, SerialPacket* serialPacket) {
|
||||||
|
memset(packet->data, 0, packet->maxlen);
|
||||||
|
serializePacket(serialPacket, packet->data);
|
||||||
|
packet->len = PACKET_BUFFER_SIZE;
|
||||||
|
|
||||||
|
int ret = SDLNet_UDP_Send(socket, channel, packet);
|
||||||
|
|
||||||
|
if (ret <= 0) {
|
||||||
|
throw(std::runtime_error("Failed to send a packet"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int UDPNetworkUtility::SendToAllChannels(SerialPacket* serialPacket) {
|
||||||
|
memset(packet->data, 0, packet->maxlen);
|
||||||
|
serializePacket(serialPacket, packet->data);
|
||||||
|
packet->len = PACKET_BUFFER_SIZE;
|
||||||
|
|
||||||
|
int sent = 0;
|
||||||
|
|
||||||
|
//send to all bound channels
|
||||||
|
for (int i = 0; i < SDLNET_MAX_UDPCHANNELS; i++) {
|
||||||
|
if (SDLNet_UDP_GetPeerAddress(socket, i)) {
|
||||||
|
sent += SDLNet_UDP_Send(socket, i, packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sent;
|
||||||
|
}
|
||||||
|
|
||||||
|
int UDPNetworkUtility::Receive(SerialPacket* serialPacket) {
|
||||||
|
memset(packet->data, 0, packet->maxlen);
|
||||||
|
int ret = SDLNet_UDP_Recv(socket, packet);
|
||||||
|
deserializePacket(serialPacket, packet->data);
|
||||||
|
serialPacket->srcAddress = packet->address;
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
throw(std::runtime_error("Unknown network error occured"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -24,12 +24,14 @@
|
|||||||
|
|
||||||
#include "SDL/SDL_net.h"
|
#include "SDL/SDL_net.h"
|
||||||
|
|
||||||
|
#include "serial_packet.hpp"
|
||||||
|
|
||||||
class UDPNetworkUtility {
|
class UDPNetworkUtility {
|
||||||
public:
|
public:
|
||||||
UDPNetworkUtility() = default;
|
UDPNetworkUtility() = default;
|
||||||
~UDPNetworkUtility() = default;
|
~UDPNetworkUtility() = default;
|
||||||
|
|
||||||
void Open(int port, int packSize);
|
void Open(int port);
|
||||||
void Close();
|
void Close();
|
||||||
|
|
||||||
//bind to a channel
|
//bind to a channel
|
||||||
@@ -41,31 +43,30 @@ public:
|
|||||||
return SDLNet_UDP_GetPeerAddress(socket, channel);
|
return SDLNet_UDP_GetPeerAddress(socket, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Send(const char* ip, int port, void* data, int len);
|
//send a buffer
|
||||||
int Send(IPaddress* add, void* data, int len);
|
int SendTo(const char* ip, int port, void* data, int len);
|
||||||
int Send(int channel, void* data, int len);
|
int SendTo(IPaddress* add, void* data, int len);
|
||||||
int SendAll(void* data, int len);
|
int SendTo(int channel, void* data, int len);
|
||||||
|
int SendToAllChannels(void* data, int len);
|
||||||
int Receive();
|
int Receive();
|
||||||
|
|
||||||
void* GetOutData() const {
|
//send a SerialPacket
|
||||||
return reinterpret_cast<void*>(packOut->data);
|
int SendTo(const char* ip, int port, SerialPacket* serialPacket);
|
||||||
};
|
int SendTo(IPaddress* add, SerialPacket* serialPacket);
|
||||||
void* GetInData() const {
|
int SendTo(int channel, SerialPacket* serialPacket);
|
||||||
return reinterpret_cast<void*>(packIn->data);
|
int SendToAllChannels(SerialPacket* serialPacket);
|
||||||
};
|
int Receive(SerialPacket* serialPacket);
|
||||||
UDPpacket* GetOutPacket() const {
|
|
||||||
return packOut;
|
//accessors
|
||||||
}
|
UDPpacket* GetPacket() const {
|
||||||
UDPpacket* GetInPacket() const {
|
return packet;
|
||||||
return packIn;
|
|
||||||
}
|
}
|
||||||
UDPsocket GetSocket() const {
|
UDPsocket GetSocket() const {
|
||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
UDPsocket socket = nullptr;
|
UDPsocket socket = nullptr;
|
||||||
UDPpacket* packOut = nullptr;
|
UDPpacket* packet = nullptr;
|
||||||
UDPpacket* packIn = nullptr;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
/*
|
|
||||||
** $Id: linit.c,v 1.32 2011/04/08 19:17:36 roberto Exp $
|
|
||||||
** Initialization of libraries for lua.c and other clients
|
|
||||||
** See Copyright Notice in lua.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Modified for use in Tortuga, renamed to linit.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
** If you embed Lua in your program and need to open the standard
|
|
||||||
** libraries, call luaL_openlibs in your program. If you need a
|
|
||||||
** different set of libraries, copy this file to your project and edit
|
|
||||||
** it to suit your needs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define linit_c
|
|
||||||
#define LUA_LIB
|
|
||||||
|
|
||||||
#include "lua/lua.hpp"
|
|
||||||
#include "map_api.hpp"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
** these libs are loaded by lua.c and are readily available to any Lua
|
|
||||||
** program
|
|
||||||
*/
|
|
||||||
static const luaL_Reg loadedlibs[] = {
|
|
||||||
/* Standard libs */
|
|
||||||
{"_G", luaopen_base},
|
|
||||||
{LUA_LOADLIBNAME, luaopen_package},
|
|
||||||
{LUA_COLIBNAME, luaopen_coroutine},
|
|
||||||
{LUA_TABLIBNAME, luaopen_table},
|
|
||||||
{LUA_IOLIBNAME, luaopen_io},
|
|
||||||
{LUA_OSLIBNAME, luaopen_os},
|
|
||||||
{LUA_STRLIBNAME, luaopen_string},
|
|
||||||
{LUA_BITLIBNAME, luaopen_bit32},
|
|
||||||
{LUA_MATHLIBNAME, luaopen_math},
|
|
||||||
{LUA_DBLIBNAME, luaopen_debug},
|
|
||||||
|
|
||||||
/* custom libs */
|
|
||||||
{LUA_MAPLIBNAME, luaopen_mapapi},
|
|
||||||
|
|
||||||
{NULL, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
** these libs are preloaded and must be required before used
|
|
||||||
*/
|
|
||||||
static const luaL_Reg preloadedlibs[] = {
|
|
||||||
{NULL, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
LUALIB_API void luaL_openlibs (lua_State *L) {
|
|
||||||
const luaL_Reg *lib;
|
|
||||||
/* call open functions from 'loadedlibs' and set results to global table */
|
|
||||||
for (lib = loadedlibs; lib->func; lib++) {
|
|
||||||
luaL_requiref(L, lib->name, lib->func, 1);
|
|
||||||
lua_pop(L, 1); /* remove lib */
|
|
||||||
}
|
|
||||||
/* add open functions from 'preloadedlibs' into 'package.preload' table */
|
|
||||||
luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD");
|
|
||||||
for (lib = preloadedlibs; lib->func; lib++) {
|
|
||||||
lua_pushcfunction(L, lib->func);
|
|
||||||
lua_setfield(L, -2, lib->name);
|
|
||||||
}
|
|
||||||
lua_pop(L, 1); /* remove _PRELOAD table */
|
|
||||||
}
|
|
||||||
@@ -1,126 +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 "map_api.hpp"
|
|
||||||
|
|
||||||
//map headers
|
|
||||||
#include "map_allocator.hpp"
|
|
||||||
#include "map_file_format.hpp"
|
|
||||||
#include "region_pager.hpp"
|
|
||||||
|
|
||||||
//NOTE: When operating on a region, setTile() & getTile() *are not* zero indexed, but when operating on the entire map they *are* zero indexed.
|
|
||||||
|
|
||||||
static int setTile(lua_State* L) {
|
|
||||||
if (lua_gettop(L) == 5) {
|
|
||||||
//operating on a region
|
|
||||||
Region* ptr = (Region*)lua_touserdata(L, 1);
|
|
||||||
ptr->SetTile(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_tointeger(L, 4)-1, lua_tointeger(L, 5));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
//operating on the whole map
|
|
||||||
lua_pushstring(L, "pager");
|
|
||||||
lua_gettable(L, LUA_REGISTRYINDEX);
|
|
||||||
|
|
||||||
//assume the pager is using lua
|
|
||||||
RegionPager<LuaAllocator, LuaFormat>* pager = reinterpret_cast<RegionPager<LuaAllocator, LuaFormat>*>(lua_touserdata(L, -1));
|
|
||||||
|
|
||||||
//balance the stack
|
|
||||||
lua_pop(L, 1);
|
|
||||||
|
|
||||||
pager->SetTile(lua_tointeger(L, 1), lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4));
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getTile(lua_State* L) {
|
|
||||||
if (lua_gettop(L) == 4) {
|
|
||||||
//operating on a region
|
|
||||||
Region* ptr = (Region*)lua_touserdata(L, 1);
|
|
||||||
int ret = ptr->GetTile(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_tointeger(L, 4)-1);
|
|
||||||
lua_pushnumber(L, ret);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
//operating on the whole map
|
|
||||||
lua_pushstring(L, "pager");
|
|
||||||
lua_gettable(L, LUA_REGISTRYINDEX);
|
|
||||||
|
|
||||||
//assume the pager is using lua
|
|
||||||
RegionPager<LuaAllocator, LuaFormat>* pager = reinterpret_cast<RegionPager<LuaAllocator, LuaFormat>*>(lua_touserdata(L, -1));
|
|
||||||
|
|
||||||
//balance the stack
|
|
||||||
lua_pop(L, 1);
|
|
||||||
|
|
||||||
int ret = pager->GetTile(lua_tointeger(L, 1), lua_tointeger(L, 2), lua_tointeger(L, 3));
|
|
||||||
lua_pushnumber(L, ret);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getX(lua_State* L) {
|
|
||||||
Region* ptr = (Region*)lua_touserdata(L, 1);
|
|
||||||
lua_pushinteger(L, ptr->GetX());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getY(lua_State* L) {
|
|
||||||
Region* ptr = (Region*)lua_touserdata(L, 1);
|
|
||||||
lua_pushinteger(L, ptr->GetY());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dummy(lua_State* L) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const luaL_Reg regionlib[] = {
|
|
||||||
{"create", dummy},
|
|
||||||
{"unload", dummy},
|
|
||||||
{"load", dummy},
|
|
||||||
{"save", dummy},
|
|
||||||
{"settile",setTile},
|
|
||||||
{"gettile",getTile},
|
|
||||||
{"getx",getX},
|
|
||||||
{"gety",getY},
|
|
||||||
{"getregionwidth",getRegionWidth},
|
|
||||||
{"getregionheight",getRegionHeight},
|
|
||||||
{"getregiondepth",getRegionDepth},
|
|
||||||
{nullptr, nullptr}
|
|
||||||
};
|
|
||||||
|
|
||||||
LUAMOD_API int luaopen_mapapi(lua_State* L) {
|
|
||||||
luaL_newlib(L, regionlib);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
|||||||
+2
-8
@@ -1,17 +1,14 @@
|
|||||||
#config
|
#config
|
||||||
INCLUDES+=. .. ../graphics
|
INCLUDES+=. ../graphics
|
||||||
LIBS+=
|
LIBS+=
|
||||||
CXXFLAGS+=-std=c++11 -DDEBUG $(addprefix -I,$(INCLUDES))
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
CFLAGS+=-DDEBUG $(addprefix -I,$(INCLUDES))
|
|
||||||
|
|
||||||
#source
|
#source
|
||||||
CXXSRC=$(wildcard *.cpp)
|
CXXSRC=$(wildcard *.cpp)
|
||||||
CSRC=$(wildcard *.c)
|
|
||||||
|
|
||||||
#objects
|
#objects
|
||||||
OBJDIR=obj
|
OBJDIR=obj
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||||
OBJ+=$(addprefix $(OBJDIR)/,$(CSRC:.c=.o))
|
|
||||||
|
|
||||||
#output
|
#output
|
||||||
OUTDIR=../..
|
OUTDIR=../..
|
||||||
@@ -34,9 +31,6 @@ $(OUTDIR):
|
|||||||
$(OBJDIR)/%.o: %.cpp
|
$(OBJDIR)/%.o: %.cpp
|
||||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
$(OBJDIR)/%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.o *.a *.exe
|
$(RM) *.o *.a *.exe
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
|||||||
@@ -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 "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
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
/* 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 CHECKBOUNDS_HPP_
|
||||||
|
#define CHECKBOUNDS_HPP_
|
||||||
|
|
||||||
|
#include "vector2.hpp"
|
||||||
|
|
||||||
|
bool checkPoint(Vector2 const& origin, Vector2 const& bound, Vector2 const& point);
|
||||||
|
bool checkOverlap(Vector2 const& originOne, Vector2 const& boundOne, Vector2 const& originTwo, Vector2 const& boundTwo);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright: (c) Kayne Ruse 2013
|
/* Copyright: (c) Kayne Ruse 2013, 2014
|
||||||
*
|
*
|
||||||
* This software is provided 'as-is', without any express or implied
|
* This software is provided 'as-is', without any express or implied
|
||||||
* warranty. In no event will the authors be held liable for any damages
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#config
|
||||||
|
INCLUDES+=.
|
||||||
|
LIBS+=
|
||||||
|
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||||
|
|
||||||
|
#source
|
||||||
|
CXXSRC=$(wildcard *.cpp)
|
||||||
|
|
||||||
|
#objects
|
||||||
|
OBJDIR=obj
|
||||||
|
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||||
|
|
||||||
|
#output
|
||||||
|
OUTDIR=../..
|
||||||
|
OUT=$(addprefix $(OUTDIR)/,libcommon.a)
|
||||||
|
|
||||||
|
#targets
|
||||||
|
all: $(OBJ) $(OUT)
|
||||||
|
ar -crs $(OUT) $(OBJ)
|
||||||
|
|
||||||
|
$(OBJ): | $(OBJDIR)
|
||||||
|
|
||||||
|
$(OUT): | $(OUTDIR)
|
||||||
|
|
||||||
|
$(OBJDIR):
|
||||||
|
mkdir $(OBJDIR)
|
||||||
|
|
||||||
|
$(OUTDIR):
|
||||||
|
mkdir $(OUTDIR)
|
||||||
|
|
||||||
|
$(OBJDIR)/%.o: %.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) *.o *.a *.exe
|
||||||
|
|
||||||
|
rebuild: clean all
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
* 3. This notice may not be removed or altered from any source
|
* 3. This notice may not be removed or altered from any source
|
||||||
* distribution.
|
* distribution.
|
||||||
*/
|
*/
|
||||||
#include "server_utility.hpp"
|
#include "sql_utility.hpp"
|
||||||
|
|
||||||
#include "utility.hpp"
|
#include "utility.hpp"
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user