Compare commits

...

75 Commits

Author SHA1 Message Date
Kayne Ruse 6ca62db16d Merged network changes from branch 'develop', read more
After several days of trying, I decided to discard changes to the networking system:

> discard-encapsulated-packets

Instead, I've moved the packets and specialized serial functions into the same directory, and renamed them accordingly. The serialization code is only accessed by UDPNetworkUtility.

I've also removed the combat and enemy code from the network system, and reduced the number of packet types in SerialPacketType. These changes should make it easier to add more features in the future.
2014-08-31 15:35:35 +10:00
Kayne Ruse 5536bf366d Implemented the serialization switch statement 2014-08-31 15:35:14 +10:00
Kayne Ruse 094efad728 Rearranged the packet and serial code to make more sense
This mostly just reimplements the best parts of the discarded branch:

> discard-encapsulated-packets

There may still be some work needed.
2014-08-31 13:24:53 +10:00
Kayne Ruse f77aec6dd7 Merge branch 'develop' 2014-08-27 14:01:46 +10:00
Kayne Ruse 6f4334f84d Moved serialization globals 2014-08-25 00:07:17 +10:00
Kayne Ruse 4ed512e0e2 Moved the snapToBase() utility function to region.*pp
I've also adjusted the TODO file, which really shouldn't be committed.
Still, it's there now, so it stays. I don't think the logger is going to
be possible any time soon, so I'll probably look into the disconnection
handler.
2014-08-24 13:23:50 +10:00
Kayne Ruse d0cc5521da Merge branch 'develop' 2014-08-19 04:19:21 +10:00
Kayne Ruse af8e7b70a0 Merge branch 'refactor-server' into develop
This is mostly just back end refactoring.
2014-08-19 04:14:34 +10:00
Kayne Ruse 8bc1326fef Added the "package" target to the root makefile 2014-08-19 04:11:12 +10:00
Kayne Ruse dfe8c108de Minor tweaks 2014-08-19 03:42:55 +10:00
Kayne Ruse 61337e29f6 Split the ServerApplication's source into two files 2014-08-19 03:22:25 +10:00
Kayne Ruse 5dea53ad50 Removed delta time system from the framework 2014-08-19 02:52:15 +10:00
Kayne Ruse f52a022e64 Bugfixes, read more
* Manual modifications to the database caused the map to act unusual
* The server's packet must be created and deleted as a char array
* removed UnloadAll() from several singleton destructors
* added SDL_Delay() to BaseScene::RenderFrame(), to reduce heavy CPU use in menus
2014-08-19 01:48:48 +10:00
Kayne Ruse 0fdaa90a83 Minor code tweaks 2014-08-17 11:46:02 +10:00
Kayne Ruse e7ba097e6a Converted the server's managers to singletons 2014-08-17 10:06:29 +10:00
Kayne Ruse 3b409a8608 Merge branch 'refactor-server' into develop, read more
This branch connects unique functions to the indevidual pagers, hopefully
allowing multiple different rooms in the future. That of course, will
require more work, but hopefully I can get that done soon.
2014-08-15 10:04:53 +10:00
Kayne Ruse ce97245131 Project builds, and runs with no obvious differences 2014-08-15 09:39:17 +10:00
Kayne Ruse 59c9ba698f Implemented the new system in the startup script, needs testing 2014-08-15 09:12:22 +10:00
Kayne Ruse 52ab9f0087 Minor tweaks 2014-08-15 08:53:41 +10:00
Kayne Ruse 4ea1f8b016 Added glue functions to set the pager triggers 2014-08-15 08:34:33 +10:00
Kayne Ruse f1080151e3 Minor preemptive bugfixes 2014-08-15 08:19:22 +10:00
Kayne Ruse 5af0a7999c Recoded the pager to use lua registry functions, needs testing 2014-08-15 07:10:27 +10:00
Kayne Ruse 1e9ac9815b Merge branch 'develop' into refactor-server 2014-08-14 01:04:22 +10:00
Kayne Ruse 98ffcb8cd3 Encapsulated RoomData, did some other refactoring 2014-08-14 00:13:19 +10:00
Kayne Ruse 1b041d7771 Tied region_pager_lua.cpp to region_api.hpp 2014-08-14 00:03:22 +10:00
Kayne Ruse 6d98bab000 Began refactoring the server (read more)
* deleted the enemy and combat stubs
* encapsulated the character and account stubs

TODO:

* The remaining managers should be singletons
2014-08-13 09:45:54 +10:00
Kayne Ruse b6c70cbc0d Tweaked the bounds values 2014-08-13 09:05:26 +10:00
Kayne Ruse e56a3d121c Merge branch 'develop' 2014-08-13 08:24:08 +10:00
Kayne Ruse 1776583e01 Added the escape hotkey, refined BoundingBox a bit
LobbyMenu also searches for a server as soon as you enter, so you don't
have to press an extra button, a good feature.
2014-08-13 08:08:16 +10:00
Kayne Ruse 74f809a801 UDPNetworkUtility is a singleton, disabled InCombat scene
I found incombat to be way too finicky to keep up to date, so I disabled
it for now.
2014-08-13 06:53:47 +10:00
Kayne Ruse 182101b592 Minor tweaks 2014-08-13 06:19:07 +10:00
Kayne Ruse 07885cca1b Merge branch 'develop' into master (read more)
Following a rather educational "game jam" using components of Tortuga, I've
made a significant number of revisions.

A brief summary:

* The entirety of the map system now have lua APIs
* The ConfigUtility handles recusive config files
* Collisions are functional
* I've added a singleton template base class, which is used by the apps
* I've decided that focusing on the engine's stability is important
* I need to push through the generated TODO list
2014-08-04 01:32:21 +10:00
Kayne Ruse 956e920b7a Added the debug and release targets 2014-08-04 01:04:13 +10:00
Kayne Ruse 908f91d674 ClientApplication and ServerApplication are now Singletons 2014-08-04 00:45:09 +10:00
Kayne Ruse fd320767c5 Implemented the changes to ConfigUtility in the client and server
The server's changes were easy. The clients means that the constructors
for each scene have one less argument, and each scene has one less member.
The exception to this is LobbyMenu, where the config is used in multiple
places, so it was easier to have the config's reference as a member.

To replace the config's usage, I added this line in most cases:

ConfigUtility& config = ConfigUtility::GetSingleton();

The only requirement is that ConfigUtility::Create() and
ConfigUtility::Delete() are called from the main() function.
2014-08-03 23:20:39 +10:00
Kayne Ruse c830fa0537 ConfigUtility now supports recursion; is a Singleton
If you have "config.next" set, the config system will load that as another
config file. Higher config files have a higher precedence over subfiles
when conflicting keys are encountered.

* Added singleton.hpp, containing Singleton<T>
* ConfigUtility now inherits from Singleton
* Tweaked timer.*pp layouts
2014-08-03 23:14:56 +10:00
Kayne Ruse 10c89970cc Merge branch 'splice' into develop, read more
This branch's primary purpose has been to intergrate changes from the "jam" branch into the main repository. I decided to do a 48 hour jam, to see what I could accomplish. I believe that, although nothing major came out of it, the result are beneficial overall. The changes in this branch, while still experimental, will hopefully help me to push towards something playable soon.
2014-07-31 20:17:31 +10:00
Kayne Ruse 0b512305a9 Added last additions from jam (read more)
I should also mention that the client is throwing up a warning that
HandleCharacterUpdate() is passing to HandleCharacterNew().
2014-07-31 20:04:58 +10:00
Kayne Ruse 555abf9c95 Fixed the map issue (read more)
The map generation was being written to a trigger function instead of a
glue method. Fixed, map is being drawn correctly now.
2014-07-31 19:17:29 +10:00
Kayne Ruse 2b3ea5eb80 Updated map system (read more)
Project compiles and runs, multiplayer works, but the map is not visible

There are a number of major changes to the map system, beth directly from the
jam branch and from the splicing process. The changes that are listed here have
been noted as they were added to the index for committing.

* tile_sheet.*pp moved from 'common/graphics/' to 'common/map/'
* Minor method and member name changes to TileSheet
* TileSheet has a lua API, but it isn't used anywhere
    NOTE: Nothing uses both lua and graphics, but a theoretical editor might
* Region API's glue functions have been changed from triggers to simple dummy
    methods. These should simply be over written.
* RegionPagerBase::GetRegion(int x, int y) now snaps it's parameters
    Presicely why is unknown, but I do remember there was a bug without it
* RegionPagerLua has been rewritten to use the Region API's methods, rather
    than the triggers.
* RegionPagerLua no longer stores the map's save directory, or passes it to the
    the Region API's methods.
* RegionPagerLua::luaState renamed to RegionPagerLua::lua
    conforms to changes elsewhere
* Removed the directory glue functions from the RegionPager API
* region_pager_api.hpp preprocessor guard changed
* Adjusted makefiles to account for TileSheet's movement
2014-07-31 18:01:50 +10:00
Kayne Ruse 66815016ba Fixed the debugging makefile's output directory 2014-07-31 17:18:25 +10:00
Kayne Ruse 46f02dcfdd Minor tweak to ConfigUtility 2014-07-31 17:14:40 +10:00
Kayne Ruse 414a0896c9 Began merging the jam branch into the development (read more)
The list of changes committed:

* Removed SimpleRNG
* Added Timer (for debugging)
* Added BoundingBox
* Added floating point snapToBase()
* Added error check to Vector2::Normalize()
* Updated makefiles, project compiles
2014-07-30 21:10:43 +10:00
Kayne Ruse 0077d501ac Merge branch 'develop' 2014-07-08 16:28:07 +10:00
Kayne Ruse e946a0741d Encapsulated the Character class 2014-07-04 00:55:12 +10:00
Kayne Ruse 839c2af940 Merge branch 'rebuild' into develop, read more
This branch was mostly used for streamlining the code after not seeing it
for a week. It's quite surprising what you realize after taking a break
for a while.
2014-07-03 02:26:42 +10:00
Kayne Ruse f70241cc57 Merge branch 'config' into rebuild 2014-07-03 02:17:44 +10:00
Kayne Ruse 36d30ce39b Moved the scenes into a subdirectory 2014-07-03 02:01:53 +10:00
Kayne Ruse 28d083cba4 Hammered out server-side issues, read more
* Removed the client-only code from CharacterData, including the .cpp file
* Removed CombatManager and EnemyManager instanciation
2014-07-03 01:41:58 +10:00
Kayne Ruse 4dd4b37fc0 It now builds cleanly, but I cut a few code stubs 2014-07-03 00:56:30 +10:00
Kayne Ruse 82b1b589dc Moved some files around 2014-07-03 00:23:43 +10:00
Kayne Ruse bac493c96b Rearranged the debug output 2014-07-02 21:59:26 +10:00
Kayne Ruse d5520e83c6 Merge branch 'collision' into develop, read more
Began working on the collision system. Currently, the collision data which
is set server-side is transferred to the client, and stored in the Region
class. It's incomplete, but it's going well.
2014-07-02 01:10:23 +10:00
Kayne Ruse 93480be685 Solid data is moving from the server to the client, read more
The APIs have access to the solid data, and I fixed a bug: Basically, the
template parameter for std::bitset  expects an integer representing the
number of bits to hold, but I initially misread it as the number of bytes.
This has been corrected.

I've also added a sandy beach to the generated island. I'm tempted to
start working on some simple generators soon.
2014-07-02 00:47:37 +10:00
Kayne Ruse 8ed308e89a Switched the hack for the bitset
I've also added acessors and mutators to the Region and RegionPagerBase
classes.
2014-07-01 22:55:43 +10:00
Kayne Ruse 8df1ecd804 This hack for the collision map was a terrible idea
I'm committing these changes before undoing these, and coding it properly.
2014-07-01 22:04:45 +10:00
Kayne Ruse 8c9d071c7a Minor tweaks 2014-07-01 01:03:03 +10:00
Kayne Ruse ac1098fa86 Merge branch 'develop', Major API expansion 2014-06-24 02:46:39 +10:00
Kayne Ruse deba324449 Merge branch 'api' into develop 2014-06-23 10:46:39 +10:00
Kayne Ruse 95362286f8 Committing the island generator script, and a bugfix
region_api.cpp had a bug, where a glue function's name was used twice. It
was an easy catch, but there was an issue in the new script, where I was
counting from 0 instead of 1. As a result, I was chasing a segfault for 5
hours.
2014-06-23 10:29:39 +10:00
Kayne Ruse f5c58bf5ad Minor tweaks after a failed attempt at metatables 2014-06-23 05:58:54 +10:00
Kayne Ruse 316db43b0a Fixed CreateRoom()'s return type 2014-06-23 04:54:01 +10:00
Kayne Ruse 46ed196bf4 All current lua hooks are being called 2014-06-23 04:10:21 +10:00
Kayne Ruse 64baa63d12 Changed the naming conventions (read more)
I've changed some naming concentions in the lua APIs. I've also made a few
other tweaks, like region_pager_api.cpp delegating to the passed
RegionPager object. This won't explicitly run, becuase there's still a few
more changes needed.
2014-06-23 03:45:30 +10:00
Kayne Ruse e19b6fbc23 Updated RoomManager and the API 2014-06-21 19:02:43 +10:00
Kayne Ruse a64411a567 Filled out the APIs a bit 2014-06-21 18:24:58 +10:00
Kayne Ruse 3662a97475 Added mapType to BaseGenerator 2014-06-21 18:24:01 +10:00
Kayne Ruse 97aaacbc23 Merge branch 'mapgen' into develop 2014-06-21 07:25:46 +10:00
Kayne Ruse 8afd0e7c8a Created a separate API for the RoomManager class 2014-06-21 07:19:51 +10:00
Kayne Ruse 82c776df83 Moved the generators into a subdirectory 2014-06-21 07:00:48 +10:00
Kayne Ruse 924ebc2ee9 Created the generator hierarchy 2014-06-21 06:47:30 +10:00
Kayne Ruse d3bf099a98 Arranged server's source into directories 2014-06-21 05:52:27 +10:00
Kayne Ruse a6de5f9e69 Imported the files from branch 'fixed-map' 2014-06-21 05:28:06 +10:00
Kayne Ruse 618666de43 Renamed the Restart scene to CleanUp 2014-06-15 22:39:10 +10:00
Kayne Ruse 5c74ecdd72 Removed ESC key exit, and tweaked some comments 2014-06-15 22:24:50 +10:00
121 changed files with 2582 additions and 2805 deletions
+1
View File
@@ -8,6 +8,7 @@ This game is inspired by classic 2D RPGs, as well as more modern sandbox MMOs. T
Tortuga's full documentation can be found in a separate branch, see [Tortuga/docs](https://github.com/Ratstail91/Tortuga/tree/docs). 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 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
@@ -19,27 +19,23 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#include "character_data.hpp" #include "character.hpp"
void CharacterData::Update(double delta) { void Character::Update() {
if (motion.x && motion.y) { if (motion.x && motion.y) {
origin += motion * delta * CHARACTER_WALKING_MOD; origin += motion * CHARACTER_WALKING_MOD;
} }
else if (motion != 0) { else if (motion != 0) {
origin += motion * delta; origin += motion;
} }
#ifdef GRAPHICS sprite.Update(0.016);
sprite.Update(delta);
#endif
} }
#ifdef GRAPHICS void Character::DrawTo(SDL_Surface* const dest, int camX, int camY) {
void CharacterData::DrawTo(SDL_Surface* const dest, int camX, int camY) {
sprite.DrawTo(dest, origin.x - camX, origin.y - camY); sprite.DrawTo(dest, origin.x - camX, origin.y - camY);
} }
void CharacterData::CorrectSprite() { void Character::CorrectSprite() {
//NOTE: These must correspond to the sprite sheet in use //NOTE: These must correspond to the sprite sheet in use
if (motion.y > 0) { if (motion.y > 0) {
sprite.SetYIndex(0); sprite.SetYIndex(0);
@@ -63,5 +59,3 @@ void CharacterData::CorrectSprite() {
sprite.SetXIndex(0); sprite.SetXIndex(0);
} }
} }
#endif
+95
View File
@@ -0,0 +1,95 @@
/* 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 CHARACTER_HPP_
#define CHARACTER_HPP_
//components
#include "character_defines.hpp"
#include "vector2.hpp"
#include "bounding_box.hpp"
#include "statistics.hpp"
//graphics
#include "sprite_sheet.hpp"
//std namespace
#include <string>
#include <cmath>
class Character {
public:
Character() = default;
~Character() = default;
void Update();
//graphics
void DrawTo(SDL_Surface* const, int camX, int camY);
void CorrectSprite();
SpriteSheet* GetSprite() { return &sprite; }
//gameplay
Statistics* GetStats() { return &stats; }
//accessors and mutators
//metadata
int SetOwner(int i) { return owner = i; }
int GetOwner() { return owner; }
std::string SetHandle(std::string s) { return handle = s; }
std::string GetHandle() const { return handle; }
std::string SetAvatar(std::string s) { return avatar = s; }
std::string GetAvatar() const { return avatar; }
//position
Vector2 SetOrigin(Vector2 v) { return origin = v; }
Vector2 GetOrigin() const { return origin; }
Vector2 SetMotion(Vector2 v) { return motion = v; }
Vector2 GetMotion() const { return motion; }
BoundingBox SetBounds(BoundingBox b) { return bounds = b; }
BoundingBox GetBounds() { return bounds; }
private:
//graphics
SpriteSheet sprite;
//base statistics
Statistics stats;
//TODO: gameplay components: equipment, items, buffs, debuffs
//metadata
int owner;
std::string handle;
std::string avatar;
//position
Vector2 origin = {0.0,0.0};
Vector2 motion = {0.0,0.0};
BoundingBox bounds;
};
//tmp
#include <map>
typedef std::map<int, Character> CharacterMap;
#endif
+75 -23
View File
@@ -21,10 +21,12 @@
*/ */
#include "client_application.hpp" #include "client_application.hpp"
#include "serial.hpp" #include "serial_packet.hpp"
#include "config_utility.hpp"
#include <stdexcept> #include <stdexcept>
#include <chrono> #include <chrono>
#include <iostream>
//------------------------- //-------------------------
//Scene headers //Scene headers
@@ -36,32 +38,80 @@
#include "options_menu.hpp" #include "options_menu.hpp"
#include "lobby_menu.hpp" #include "lobby_menu.hpp"
#include "in_world.hpp" #include "in_world.hpp"
#include "in_combat.hpp" //#include "in_combat.hpp"
#include "restart.hpp" #include "clean_up.hpp"
//------------------------- //-------------------------
//Public access members //Public access members
//------------------------- //-------------------------
void ClientApplication::Init(int argc, char** argv) { void ClientApplication::Init(int argc, char** argv) {
std::cout << "Beginning " << argv[0] << std::endl;
//load the prerequisites //load the prerequisites
ConfigUtility& config = ConfigUtility::GetSingleton();
config.Load("rsc\\config.cfg"); config.Load("rsc\\config.cfg");
//-------------------------
//Initialize the APIs
//-------------------------
//initialize SDL //initialize SDL
if (SDL_Init(SDL_INIT_VIDEO)) { if (SDL_Init(SDL_INIT_VIDEO)) {
throw(std::runtime_error("Failed to initialize SDL")); throw(std::runtime_error("Failed to initialize SDL"));
} }
int w = config.Int("client.screen.w"); std::cout << "Initialized SDL" << std::endl;
int h = config.Int("client.screen.h");
int f = config.Bool("client.screen.f") ? SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN : SDL_HWSURFACE|SDL_DOUBLEBUF;
BaseScene::SetScreen(w ? w : 800, h ? h : 600, 0, f);
//initialize SDL_net //initialize SDL_net
if (SDLNet_Init()) { if (SDLNet_Init()) {
throw(std::runtime_error("Failed to initialize SDL_net")); throw(std::runtime_error("Failed to initialize SDL_net"));
} }
network.Open(0); UDPNetworkUtility::GetSingleton().Open(0);
std::cout << "Initialized SDL_net" << std::endl;
//-------------------------
//Setup the screen
//-------------------------
int w = config.Int("client.screen.w");
int h = config.Int("client.screen.h");
int f = config.Bool("client.screen.f") ? SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN : SDL_HWSURFACE|SDL_DOUBLEBUF;
BaseScene::SetScreen(w ? w : 800, h ? h : 600, 0, f);
std::cout << "Initialized the screen" << std::endl;
//-------------------------
//debug output
//-------------------------
//TODO: enable/disable these with a switch
#define DEBUG_OUTPUT_VAR(x) std::cout << "\t" << #x << ": " << x << std::endl;
std::cout << "Internal sizes:" << std::endl;
DEBUG_OUTPUT_VAR(sizeof(Region::type_t));
DEBUG_OUTPUT_VAR(sizeof(Region));
DEBUG_OUTPUT_VAR(REGION_WIDTH);
DEBUG_OUTPUT_VAR(REGION_HEIGHT);
DEBUG_OUTPUT_VAR(REGION_DEPTH);
DEBUG_OUTPUT_VAR(REGION_TILE_FOOTPRINT);
DEBUG_OUTPUT_VAR(REGION_SOLID_FOOTPRINT);
DEBUG_OUTPUT_VAR(PACKET_BUFFER_SIZE);
DEBUG_OUTPUT_VAR(MAX_PACKET_SIZE);
#undef DEBUG_OUTPUT_VAR
//-------------------------
//finalize the startup
//-------------------------
std::cout << "Startup completed successfully" << std::endl;
//-------------------------
//debugging
//-------------------------
//...
} }
void ClientApplication::Proc() { void ClientApplication::Proc() {
@@ -70,7 +120,6 @@ void ClientApplication::Proc() {
//prepare the time system //prepare the time system
typedef std::chrono::steady_clock Clock; typedef std::chrono::steady_clock Clock;
std::chrono::duration<int, std::milli> delta(16);
Clock::time_point simTime = Clock::now(); Clock::time_point simTime = Clock::now();
Clock::time_point realTime; Clock::time_point realTime;
@@ -88,8 +137,9 @@ void ClientApplication::Proc() {
//simulate game time //simulate game time
while (simTime < realTime) { while (simTime < realTime) {
//call each user defined function //call each user defined function
activeScene->RunFrame(double(delta.count()) / std::chrono::duration<int, std::milli>::period::den); activeScene->RunFrame();
simTime += delta; //~60 FPS
simTime += std::chrono::duration<int, std::milli>(16);
} }
//draw the game to the screen //draw the game to the screen
@@ -100,9 +150,11 @@ void ClientApplication::Proc() {
} }
void ClientApplication::Quit() { void ClientApplication::Quit() {
network.Close(); std::cout << "Shutting down" << std::endl;
UDPNetworkUtility::GetSingleton().Close();
SDLNet_Quit(); SDLNet_Quit();
SDL_Quit(); SDL_Quit();
std::cout << "Clean exit" << std::endl;
} }
//------------------------- //-------------------------
@@ -115,25 +167,25 @@ void ClientApplication::LoadScene(SceneList sceneIndex) {
//add scene creation calls here //add scene creation calls here
case SceneList::FIRST: case SceneList::FIRST:
case SceneList::SPLASHSCREEN: case SceneList::SPLASHSCREEN:
activeScene = new SplashScreen(&config); activeScene = new SplashScreen();
break; break;
case SceneList::MAINMENU: case SceneList::MAINMENU:
activeScene = new MainMenu(&config); activeScene = new MainMenu();
break; break;
case SceneList::OPTIONSMENU: case SceneList::OPTIONSMENU:
activeScene = new OptionsMenu(&config); activeScene = new OptionsMenu();
break; break;
case SceneList::LOBBYMENU: case SceneList::LOBBYMENU:
activeScene = new LobbyMenu(&config, &network, &clientIndex, &accountIndex); activeScene = new LobbyMenu(&clientIndex, &accountIndex);
break; break;
case SceneList::INWORLD: case SceneList::INWORLD:
activeScene = new InWorld(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap); activeScene = new InWorld(&clientIndex, &accountIndex, &characterIndex, &characterMap);
break; break;
case SceneList::INCOMBAT: // case SceneList::INCOMBAT:
activeScene = new InCombat(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap, &enemyMap); // activeScene = new InCombat(&clientIndex, &accountIndex, &characterIndex, &characterMap);
break; // break;
case SceneList::RESTART: case SceneList::CLEANUP:
activeScene = new Restart(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap, &enemyMap); activeScene = new CleanUp(&clientIndex, &accountIndex, &characterIndex, &characterMap);
break; break;
default: default:
throw(std::logic_error("Failed to recognize the scene index")); throw(std::logic_error("Failed to recognize the scene index"));
+11 -13
View File
@@ -25,24 +25,26 @@
#include "scene_list.hpp" #include "scene_list.hpp"
#include "base_scene.hpp" #include "base_scene.hpp"
#include "config_utility.hpp"
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
#include "character_data.hpp" #include "character.hpp"
#include "combat_data.hpp"
#include "enemy_data.hpp" #include "singleton.hpp"
#include <map> #include <map>
class ClientApplication { class ClientApplication: public Singleton<ClientApplication> {
public: public:
ClientApplication() = default; //public methods
~ClientApplication() = default;
void Init(int argc, char** argv); void Init(int argc, char** argv);
void Proc(); void Proc();
void Quit(); void Quit();
private: private:
friend Singleton<ClientApplication>;
ClientApplication() = default;
~ClientApplication() = default;
//Private access members //Private access members
void LoadScene(SceneList sceneIndex); void LoadScene(SceneList sceneIndex);
void UnloadScene(); void UnloadScene();
@@ -50,15 +52,11 @@ private:
BaseScene* activeScene = nullptr; BaseScene* activeScene = nullptr;
//shared parameters //shared parameters
ConfigUtility config;
UDPNetworkUtility network;
int clientIndex = -1; int clientIndex = -1;
int accountIndex = -1; int accountIndex = -1;
int characterIndex = -1; int characterIndex = -1;
std::map<int, CombatData> combatMap; CharacterMap characterMap;
std::map<int, CharacterData> characterMap;
std::map<int, EnemyData> enemyMap;
}; };
#endif #endif
-232
View File
@@ -1,232 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013, 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "in_combat.hpp"
#include "channels.hpp"
#include "utility.hpp"
#include <stdexcept>
//-------------------------
//Public access members
//-------------------------
InCombat::InCombat(
ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork,
int* const argClientIndex,
int* const argAccountIndex,
int* const argCharacterIndex,
std::map<int, CombatData>* argCombatMap,
std::map<int, CharacterData>* argCharacterMap,
std::map<int, EnemyData>* argEnemyMap
):
config(*argConfig),
network(*argNetwork),
clientIndex(*argClientIndex),
accountIndex(*argAccountIndex),
characterIndex(*argCharacterIndex),
combatMap(*argCombatMap),
characterMap(*argCharacterMap),
enemyMap(*argEnemyMap)
{
/* //setup the utility objects
buttonImage.LoadSurface(config["dir.interface"] + "button_menu.bmp");
buttonImage.SetClipH(buttonImage.GetClipH()/3);
font.LoadSurface(config["dir.fonts"] + "pk_white_8.bmp");
//pass the utility objects
backButton.SetImage(&buttonImage);
backButton.SetFont(&font);
//set the button positions
backButton.SetX(50);
backButton.SetY(50 + buttonImage.GetClipH() * 0);
//set the button texts
backButton.SetText("Back");
//request a sync
RequestSynchronize();
*/
//debug
//
}
InCombat::~InCombat() {
//
}
//-------------------------
//Frame loop
//-------------------------
void InCombat::FrameStart() {
//
}
void InCombat::Update(double delta) {
//suck in and process all waiting packets
SerialPacket* packetBuffer = static_cast<SerialPacket*>(malloc(MAX_PACKET_SIZE));
while(network.Receive(packetBuffer)) {
HandlePacket(packetBuffer);
}
free(static_cast<void*>(packetBuffer));
//TODO: more
}
void InCombat::FrameEnd() {
//
}
void InCombat::RenderFrame() {
SDL_FillRect(GetScreen(), 0, 0);
Render(GetScreen());
SDL_Flip(GetScreen());
fps.Calculate();
}
void InCombat::Render(SDL_Surface* const screen) {
//TODO: draw the background
//TODO: draw the characters
//TODO: draw the enemies
//TODO: draw the UI
}
//-------------------------
//Event handlers
//-------------------------
void InCombat::QuitEvent() {
//exit the game AND the server
RequestDisconnect();
SetNextScene(SceneList::MAINMENU);
}
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) {
//
}
//-------------------------
//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::RESTART);
}
//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: equipment
//TODO: items
//TODO: buffs
//TODO: 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);
}
-105
View File
@@ -1,105 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013, 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#ifndef INCOMBAT_HPP_
#define INCOMBAT_HPP_
//network
#include "udp_network_utility.hpp"
//graphics
#include "image.hpp"
#include "raster_font.hpp"
#include "button.hpp"
//common
#include "config_utility.hpp"
#include "frame_rate.hpp"
#include "combat_data.hpp"
#include "character_data.hpp"
#include "enemy_data.hpp"
//client
#include "base_scene.hpp"
class InCombat : public BaseScene {
public:
//Public access members
InCombat(
ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork,
int* const argClientIndex,
int* const argAccountIndex,
int* const argCharacterIndex,
std::map<int, CombatData>* argCombatMap,
std::map<int, CharacterData>* argCharacterMap,
std::map<int, EnemyData>* argEnemyMap
);
~InCombat();
protected:
//Frame loop
void FrameStart();
void Update(double delta);
void FrameEnd();
void RenderFrame();
void Render(SDL_Surface* const);
//Event handlers
void QuitEvent();
void MouseMotion(SDL_MouseMotionEvent const&);
void MouseButtonDown(SDL_MouseButtonEvent const&);
void MouseButtonUp(SDL_MouseButtonEvent const&);
void KeyDown(SDL_KeyboardEvent const&);
void KeyUp(SDL_KeyboardEvent const&);
//Network handlers
void HandlePacket(SerialPacket* const);
void HandleDisconnect(SerialPacket* const);
//TODO: more network handlers
//Server control
void RequestSynchronize();
void SendPlayerUpdate();
void RequestDisconnect();
void RequestShutdown();
//TODO: more
//shared parameters
ConfigUtility& config;
UDPNetworkUtility& network;
int& clientIndex;
int& accountIndex;
int& characterIndex;
std::map<int, CombatData>& combatMap;
std::map<int, CharacterData>& characterMap;
std::map<int, EnemyData>& enemyMap;
//graphics
//TODO: graphics
//UI
//TODO: UI
FrameRate fps;
};
#endif
+19 -4
View File
@@ -21,23 +21,38 @@
*/ */
#include "client_application.hpp" #include "client_application.hpp"
//singletons
#include "config_utility.hpp"
#include "udp_network_utility.hpp"
#include <stdexcept> #include <stdexcept>
#include <iostream> #include <iostream>
using namespace std; using namespace std;
int main(int argc, char** argv) { int main(int argc, char** argv) {
cout << "Beginning client" << endl;
try { try {
ClientApplication app; //create the singletons
ConfigUtility::Create();
UDPNetworkUtility::Create();
//call the server's routines
ClientApplication::Create();
ClientApplication& app = ClientApplication::GetSingleton();
app.Init(argc, argv); app.Init(argc, argv);
app.Proc(); app.Proc();
app.Quit(); app.Quit();
ClientApplication::Delete();
//delete the singletons
ConfigUtility::Delete();
UDPNetworkUtility::Delete();
} }
catch(exception& e) { catch(exception& e) {
cerr << "Fatal exception thrown: " << e.what() << endl; cerr << "Fatal exception thrown: " << e.what() << endl;
return 1; return 1;
} }
cout << "Clean exit" << endl;
return 0; return 0;
} }
+4 -3
View File
@@ -1,7 +1,7 @@
#config #config
INCLUDES+=. ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet ../common/network/serial ../common/ui ../common/utilities INCLUDES+=. scenes ../common/debugging ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet_types ../common/ui ../common/utilities
LIBS+=../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua LIBS+=client.a ../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) -DGRAPHICS CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
#source #source
CXXSRC=$(wildcard *.cpp) CXXSRC=$(wildcard *.cpp)
@@ -16,6 +16,7 @@ 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)
+1 -1
View File
@@ -35,7 +35,7 @@ enum class SceneList {
LOBBYMENU, LOBBYMENU,
INWORLD, INWORLD,
INCOMBAT, INCOMBAT,
RESTART, CLEANUP,
}; };
#endif #endif
@@ -75,10 +75,10 @@ SceneList BaseScene::GetNextScene() const {
//Frame loop //Frame loop
//------------------------- //-------------------------
void BaseScene::RunFrame(double delta) { void BaseScene::RunFrame() {
FrameStart(); FrameStart();
HandleEvents(); HandleEvents();
Update(delta); Update();
FrameEnd(); FrameEnd();
} }
@@ -86,6 +86,7 @@ void BaseScene::RenderFrame() {
SDL_FillRect(screen, 0, 0); SDL_FillRect(screen, 0, 0);
Render(screen); Render(screen);
SDL_Flip(screen); SDL_Flip(screen);
SDL_Delay(10);
} }
//------------------------- //-------------------------
@@ -40,13 +40,13 @@ public:
SceneList GetNextScene() const; SceneList GetNextScene() const;
//Frame loop //Frame loop
virtual void RunFrame(double delta); virtual void RunFrame();
virtual void RenderFrame(); virtual void RenderFrame();
protected: protected:
virtual void FrameStart() {} virtual void FrameStart() {}
virtual void HandleEvents(); virtual void HandleEvents();
virtual void Update(double delta) {} virtual void Update() {}
virtual void FrameEnd() {} virtual void FrameEnd() {}
virtual void Render(SDL_Surface* const screen) {} virtual void Render(SDL_Surface* const screen) {}
@@ -19,9 +19,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.
*/ */
#include "restart.hpp" #include "clean_up.hpp"
#include "channels.hpp" #include "channels.hpp"
#include "config_utility.hpp"
#include <stdexcept> #include <stdexcept>
@@ -29,25 +30,19 @@
//Public access members //Public access members
//------------------------- //-------------------------
Restart::Restart( CleanUp::CleanUp(
ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork,
int* const argClientIndex, int* const argClientIndex,
int* const argAccountIndex, int* const argAccountIndex,
int* const argCharacterIndex, int* const argCharacterIndex,
std::map<int, CombatData>* argCombatMap, CharacterMap* argCharacterMap
std::map<int, CharacterData>* argCharacterMap,
std::map<int, EnemyData>* argEnemyMap
): ):
config(*argConfig),
network(*argNetwork),
clientIndex(*argClientIndex), clientIndex(*argClientIndex),
accountIndex(*argAccountIndex), accountIndex(*argAccountIndex),
characterIndex(*argCharacterIndex), characterIndex(*argCharacterIndex),
combatMap(*argCombatMap), characterMap(*argCharacterMap)
characterMap(*argCharacterMap),
enemyMap(*argEnemyMap)
{ {
ConfigUtility& config = ConfigUtility::GetSingleton();
//setup the utility objects //setup the utility objects
image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
image.SetClipH(image.GetClipH()/3); image.SetClipH(image.GetClipH()/3);
@@ -69,15 +64,15 @@ Restart::Restart(
clientIndex = -1; clientIndex = -1;
accountIndex = -1; accountIndex = -1;
characterIndex = -1; characterIndex = -1;
combatMap.clear(); // combatMap.clear();
characterMap.clear(); characterMap.clear();
enemyMap.clear(); // enemyMap.clear();
//auto return //auto return
startTick = std::chrono::steady_clock::now(); startTick = std::chrono::steady_clock::now();
} }
Restart::~Restart() { CleanUp::~CleanUp() {
// //
} }
@@ -85,24 +80,16 @@ Restart::~Restart() {
//Frame loop //Frame loop
//------------------------- //-------------------------
void Restart::Update(double delta) { void CleanUp::Update() {
if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(10)) { if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(10)) {
QuitEvent(); SetNextScene(SceneList::MAINMENU);
} }
while(network.Receive()) { //BUGFIX: Eat incoming packets
//EAT INCOMING PACKETS while(network.Receive());
}
} }
void Restart::RenderFrame() { void CleanUp::Render(SDL_Surface* const screen) {
SDL_FillRect(GetScreen(), 0, 0);
Render(GetScreen());
SDL_Flip(GetScreen());
fps.Calculate();
}
void Restart::Render(SDL_Surface* const screen) {
backButton.DrawTo(screen); backButton.DrawTo(screen);
font.DrawStringTo("You have been disconnected.", screen, 50, 30); font.DrawStringTo("You have been disconnected.", screen, 50, 30);
} }
@@ -111,32 +98,32 @@ void Restart::Render(SDL_Surface* const screen) {
//Event handlers //Event handlers
//------------------------- //-------------------------
void Restart::QuitEvent() { void CleanUp::QuitEvent() {
SetNextScene(SceneList::MAINMENU); SetNextScene(SceneList::QUIT);
} }
void Restart::MouseMotion(SDL_MouseMotionEvent const& motion) { void CleanUp::MouseMotion(SDL_MouseMotionEvent const& motion) {
backButton.MouseMotion(motion); backButton.MouseMotion(motion);
} }
void Restart::MouseButtonDown(SDL_MouseButtonEvent const& button) { void CleanUp::MouseButtonDown(SDL_MouseButtonEvent const& button) {
backButton.MouseButtonDown(button); backButton.MouseButtonDown(button);
} }
void Restart::MouseButtonUp(SDL_MouseButtonEvent const& button) { void CleanUp::MouseButtonUp(SDL_MouseButtonEvent const& button) {
if (backButton.MouseButtonUp(button) == Button::State::HOVER) { if (backButton.MouseButtonUp(button) == Button::State::HOVER) {
QuitEvent(); SetNextScene(SceneList::MAINMENU);
} }
} }
void Restart::KeyDown(SDL_KeyboardEvent const& key) { void CleanUp::KeyDown(SDL_KeyboardEvent const& key) {
switch(key.keysym.sym) { switch(key.keysym.sym) {
case SDLK_ESCAPE: case SDLK_ESCAPE:
QuitEvent(); SetNextScene(SceneList::MAINMENU);
break; break;
} }
} }
void Restart::KeyUp(SDL_KeyboardEvent const& key) { void CleanUp::KeyUp(SDL_KeyboardEvent const& key) {
// //
} }
@@ -19,8 +19,8 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#ifndef RESTART_HPP_ #ifndef CLEANUP_HPP_
#define RESTART_HPP_ #define CLEANUP_HPP_
//network //network
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
@@ -30,39 +30,27 @@
#include "raster_font.hpp" #include "raster_font.hpp"
#include "button.hpp" #include "button.hpp"
//common
#include "config_utility.hpp"
#include "frame_rate.hpp"
#include "combat_data.hpp"
#include "character_data.hpp"
#include "enemy_data.hpp"
//client //client
#include "character.hpp"
#include "base_scene.hpp" #include "base_scene.hpp"
//std namespace //std namespace
#include <chrono> #include <chrono>
class Restart : public BaseScene { class CleanUp : public BaseScene {
public: public:
//Public access members //Public access members
Restart( CleanUp(
ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork,
int* const argClientIndex, int* const argClientIndex,
int* const argAccountIndex, int* const argAccountIndex,
int* const argCharacterIndex, int* const argCharacterIndex,
std::map<int, CombatData>* argCombatMap, CharacterMap* argCharacterMap
std::map<int, CharacterData>* argCharacterMap,
std::map<int, EnemyData>* argEnemyMap
); );
~Restart(); ~CleanUp();
protected: protected:
//Frame loop //Frame loop
void Update(double delta); void Update();
void RenderFrame();
void Render(SDL_Surface* const); void Render(SDL_Surface* const);
//Event handlers //Event handlers
@@ -74,14 +62,11 @@ protected:
void KeyUp(SDL_KeyboardEvent const&); void KeyUp(SDL_KeyboardEvent const&);
//shared parameters //shared parameters
ConfigUtility& config; UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton();
UDPNetworkUtility& network;
int& clientIndex; int& clientIndex;
int& accountIndex; int& accountIndex;
int& characterIndex; int& characterIndex;
std::map<int, CombatData>& combatMap; CharacterMap& characterMap;
std::map<int, CharacterData>& characterMap;
std::map<int, EnemyData>& enemyMap;
//graphics //graphics
Image image; Image image;
@@ -89,7 +74,6 @@ protected:
//UI //UI
Button backButton; Button backButton;
FrameRate fps;
//auto return //auto return
std::chrono::steady_clock::time_point startTick; std::chrono::steady_clock::time_point startTick;
+139 -118
View File
@@ -23,32 +23,30 @@
#include "channels.hpp" #include "channels.hpp"
#include "utility.hpp" #include "utility.hpp"
#include "config_utility.hpp"
#include <stdexcept>
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
#include <stdexcept> #include <iostream>
//------------------------- //-------------------------
//Public access members //Public access members
//------------------------- //-------------------------
InWorld::InWorld( InWorld::InWorld(
ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork,
int* const argClientIndex, int* const argClientIndex,
int* const argAccountIndex, int* const argAccountIndex,
int* const argCharacterIndex, int* const argCharacterIndex,
std::map<int, CombatData>* argCombatMap, CharacterMap* argCharacterMap
std::map<int, CharacterData>* argCharacterMap
): ):
config(*argConfig),
network(*argNetwork),
clientIndex(*argClientIndex), clientIndex(*argClientIndex),
accountIndex(*argAccountIndex), accountIndex(*argAccountIndex),
characterIndex(*argCharacterIndex), characterIndex(*argCharacterIndex),
combatMap(*argCombatMap),
characterMap(*argCharacterMap) characterMap(*argCharacterMap)
{ {
ConfigUtility& config = ConfigUtility::GetSingleton();
//setup the utility objects //setup the utility objects
buttonImage.LoadSurface(config["dir.interface"] + "button_menu.bmp"); buttonImage.LoadSurface(config["dir.interface"] + "button_menu.bmp");
buttonImage.SetClipH(buttonImage.GetClipH()/3); buttonImage.SetClipH(buttonImage.GetClipH()/3);
@@ -72,7 +70,8 @@ InWorld::InWorld(
//load the tilesheet //load the tilesheet
//TODO: add the tilesheet to the map system? //TODO: add the tilesheet to the map system?
tileSheet.Load(config["dir.tilesets"] + "terrain.bmp", 12, 15); //TODO: Tile size and tile sheet should be loaded elsewhere
tileSheet.Load(config["dir.tilesets"] + "terrain.bmp", 32, 32);
//request a sync //request a sync
RequestSynchronize(); RequestSynchronize();
@@ -93,27 +92,54 @@ void InWorld::FrameStart() {
// //
} }
void InWorld::Update(double delta) { void InWorld::Update() {
//suck in and process all waiting packets //suck in and process all waiting packets
SerialPacket* packetBuffer = static_cast<SerialPacket*>(malloc(MAX_PACKET_SIZE)); SerialPacket* packetBuffer = reinterpret_cast<SerialPacket*>(new char[MAX_PACKET_SIZE]);
while(network.Receive(packetBuffer)) { while(network.Receive(packetBuffer)) {
HandlePacket(packetBuffer); HandlePacket(packetBuffer);
} }
free(static_cast<void*>(packetBuffer)); delete reinterpret_cast<char*>(packetBuffer);
//update the characters //update the characters
for (auto& it : characterMap) { for (auto& it : characterMap) {
it.second.Update(delta); it.second.Update();
}
//update the camera
if(localCharacter) {
camera.x = localCharacter->origin.x - camera.marginX;
camera.y = localCharacter->origin.y - camera.marginY;
} }
//check the map //check the map
UpdateMap(); UpdateMap();
//skip the rest
if (!localCharacter) {
return;
}
//check for collisions with the map
BoundingBox wallBounds = {0, 0, tileSheet.GetTileW(), tileSheet.GetTileH()};
const int xCount = localCharacter->GetBounds().w / wallBounds.w + 1;
const int yCount = localCharacter->GetBounds().h / wallBounds.h + 1;
for (int i = -1; i <= xCount; ++i) {
for (int j = -1; j <= yCount; ++j) {
//set the wall's position
wallBounds.x = wallBounds.w * i + snapToBase((double)wallBounds.w, localCharacter->GetOrigin().x);
wallBounds.y = wallBounds.h * j + snapToBase((double)wallBounds.h, localCharacter->GetOrigin().y);
if (!regionPager.GetSolid(wallBounds.x / wallBounds.w, wallBounds.y / wallBounds.h)) {
continue;
}
if ((localCharacter->GetOrigin() + localCharacter->GetBounds()).CheckOverlap(wallBounds)) {
localCharacter->SetOrigin(localCharacter->GetOrigin() - (localCharacter->GetMotion()));
localCharacter->SetMotion({0,0});
localCharacter->CorrectSprite();
SendPlayerUpdate();
}
}
}
//update the camera
camera.x = localCharacter->GetOrigin().x - camera.marginX;
camera.y = localCharacter->GetOrigin().y - camera.marginY;
} }
void InWorld::FrameEnd() { void InWorld::FrameEnd() {
@@ -135,7 +161,7 @@ void InWorld::Render(SDL_Surface* const screen) {
//draw characters //draw characters
for (auto& it : characterMap) { for (auto& it : characterMap) {
//TODO: drawing order according to Y origin //BUG: #29 drawing order according to Y origin
it.second.DrawTo(screen, camera.x, camera.y); it.second.DrawTo(screen, camera.x, camera.y);
} }
@@ -152,7 +178,7 @@ void InWorld::Render(SDL_Surface* const screen) {
void InWorld::QuitEvent() { void InWorld::QuitEvent() {
//exit the game AND the server //exit the game AND the server
RequestDisconnect(); RequestDisconnect();
SetNextScene(SceneList::MAINMENU); SetNextScene(SceneList::QUIT);
} }
void InWorld::MouseMotion(SDL_MouseMotionEvent const& motion) { void InWorld::MouseMotion(SDL_MouseMotionEvent const& motion) {
@@ -175,82 +201,67 @@ void InWorld::MouseButtonUp(SDL_MouseButtonEvent const& button) {
} }
void InWorld::KeyDown(SDL_KeyboardEvent const& key) { void InWorld::KeyDown(SDL_KeyboardEvent const& key) {
if (!localCharacter) {
return;
}
//hotkeys
switch(key.keysym.sym) { switch(key.keysym.sym) {
case SDLK_ESCAPE: { case SDLK_ESCAPE:
QuitEvent(); RequestDisconnect();
}
break;
//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; break;
} }
//player movement
Vector2 motion = localCharacter->GetMotion();
switch(key.keysym.sym) {
case SDLK_LEFT:
motion.x -= CHARACTER_WALKING_SPEED;
break;
case SDLK_RIGHT:
motion.x += CHARACTER_WALKING_SPEED;
break;
case SDLK_UP:
motion.y -= CHARACTER_WALKING_SPEED;
break;
case SDLK_DOWN:
motion.y += CHARACTER_WALKING_SPEED;
break;
default:
return;
}
localCharacter->SetMotion(motion);
localCharacter->CorrectSprite();
SendPlayerUpdate();
} }
void InWorld::KeyUp(SDL_KeyboardEvent const& key) { void InWorld::KeyUp(SDL_KeyboardEvent const& key) {
switch(key.keysym.sym) { if (!localCharacter) {
//player movement return;
case SDLK_LEFT:
if (localCharacter) {
localCharacter->motion.x += CHARACTER_WALKING_SPEED;
localCharacter->CorrectSprite();
SendPlayerUpdate();
}
break;
case SDLK_RIGHT:
if (localCharacter) {
localCharacter->motion.x -= CHARACTER_WALKING_SPEED;
localCharacter->CorrectSprite();
SendPlayerUpdate();
}
break;
case SDLK_UP:
if (localCharacter) {
localCharacter->motion.y += CHARACTER_WALKING_SPEED;
localCharacter->CorrectSprite();
SendPlayerUpdate();
}
break;
case SDLK_DOWN:
if (localCharacter) {
localCharacter->motion.y -= CHARACTER_WALKING_SPEED;
localCharacter->CorrectSprite();
SendPlayerUpdate();
}
break;
} }
//player movement
Vector2 motion = localCharacter->GetMotion();
switch(key.keysym.sym) {
//NOTE: The use of min/max here are to prevent awkward movements
case SDLK_LEFT:
motion.x = std::min(motion.x + CHARACTER_WALKING_SPEED, 0.0);
break;
case SDLK_RIGHT:
motion.x = std::max(motion.x - CHARACTER_WALKING_SPEED, 0.0);
break;
case SDLK_UP:
motion.y = std::min(motion.y + CHARACTER_WALKING_SPEED, 0.0);
break;
case SDLK_DOWN:
motion.y = std::max(motion.y - CHARACTER_WALKING_SPEED, 0.0);
break;
default:
return;
}
localCharacter->SetMotion(motion);
localCharacter->CorrectSprite();
SendPlayerUpdate();
} }
//------------------------- //-------------------------
@@ -282,7 +293,7 @@ void InWorld::HandlePacket(SerialPacket* const argPacket) {
} }
void InWorld::HandleDisconnect(SerialPacket* const argPacket) { void InWorld::HandleDisconnect(SerialPacket* const argPacket) {
SetNextScene(SceneList::RESTART); SetNextScene(SceneList::CLEANUP);
} }
void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) { void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) {
@@ -291,36 +302,47 @@ void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) {
} }
//create the character object //create the character object
CharacterData& character = characterMap[argPacket->characterIndex]; Character& newCharacter = characterMap[argPacket->characterIndex];
//set the members //fill out the character's members
character.handle = argPacket->handle; newCharacter.SetHandle(argPacket->handle);
character.avatar = argPacket->avatar; newCharacter.SetAvatar(argPacket->avatar);
character.sprite.LoadSurface(config["dir.sprites"] + character.avatar, 4, 4);
character.roomIndex = argPacket->roomIndex;
character.origin = argPacket->origin;
character.motion = argPacket->motion;
character.stats = argPacket->stats;
character.CorrectSprite(); newCharacter.GetSprite()->LoadSurface(ConfigUtility::GetSingleton()["dir.sprites"] + newCharacter.GetAvatar(), 4, 4);
newCharacter.SetOrigin(argPacket->origin);
newCharacter.SetMotion(argPacket->motion);
newCharacter.SetBounds({
CHARACTER_BOUNDS_X,
CHARACTER_BOUNDS_Y,
CHARACTER_BOUNDS_WIDTH,
CHARACTER_BOUNDS_HEIGHT
});
(*newCharacter.GetStats()) = argPacket->stats;
//bookkeeping code
newCharacter.CorrectSprite();
//catch this client's player object //catch this client's player object
if (argPacket->accountIndex == accountIndex && !localCharacter) { if (argPacket->accountIndex == accountIndex && !localCharacter) {
characterIndex = argPacket->characterIndex; characterIndex = argPacket->characterIndex;
localCharacter = &character; localCharacter = &newCharacter;
//setup the camera //setup the camera
//TODO: move this?
camera.width = GetScreen()->w; camera.width = GetScreen()->w;
camera.height = GetScreen()->h; camera.height = GetScreen()->h;
//center on the player's character //center on the player's character
camera.marginX = (GetScreen()->w / 2 - localCharacter->sprite.GetImage()->GetClipW() / 2); camera.marginX = (GetScreen()->w / 2 - localCharacter->GetSprite()->GetImage()->GetClipW() / 2);
camera.marginY = (GetScreen()->h / 2 - localCharacter->sprite.GetImage()->GetClipH() / 2); camera.marginY = (GetScreen()->h / 2 - localCharacter->GetSprite()->GetImage()->GetClipH() / 2);
} }
} }
void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) { void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) {
//TODO: authenticate when own character is being deleted (linked to a TODO in the server) //TODO: authenticate when own character is being deleted (linked to a TODO in the server)
//catch this client's player object //catch this client's player object
if (argPacket->characterIndex == characterIndex) { if (argPacket->characterIndex == characterIndex) {
characterIndex = -1; characterIndex = -1;
@@ -332,17 +354,17 @@ void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) {
void InWorld::HandleCharacterUpdate(CharacterPacket* const argPacket) { void InWorld::HandleCharacterUpdate(CharacterPacket* const argPacket) {
if (characterMap.find(argPacket->characterIndex) == characterMap.end()) { if (characterMap.find(argPacket->characterIndex) == characterMap.end()) {
std::cout << "Warning: HandleCharacterUpdate() is passing to HandleCharacterNew()" << std::endl;
HandleCharacterNew(argPacket); HandleCharacterNew(argPacket);
return; return;
} }
CharacterData& character = characterMap[argPacket->characterIndex]; Character& character = characterMap[argPacket->characterIndex];
//other characters moving //other characters moving
if (argPacket->characterIndex != characterIndex) { if (argPacket->characterIndex != characterIndex) {
character.roomIndex = argPacket->roomIndex; character.SetOrigin(argPacket->origin);
character.origin = argPacket->origin; character.SetMotion(argPacket->motion);
character.motion = argPacket->motion;
character.CorrectSprite(); character.CorrectSprite();
} }
} }
@@ -369,6 +391,8 @@ void InWorld::RequestSynchronize() {
newPacket.clientIndex = clientIndex; newPacket.clientIndex = clientIndex;
newPacket.accountIndex = accountIndex; newPacket.accountIndex = accountIndex;
//TODO: location, range for sync request
network.SendTo(Channels::SERVER, &newPacket); network.SendTo(Channels::SERVER, &newPacket);
} }
@@ -379,17 +403,14 @@ void InWorld::SendPlayerUpdate() {
newPacket.type = SerialPacketType::CHARACTER_UPDATE; newPacket.type = SerialPacketType::CHARACTER_UPDATE;
newPacket.characterIndex = characterIndex; newPacket.characterIndex = characterIndex;
//handle, avatar //NOTE: omitting the handle and avatar here
newPacket.accountIndex = accountIndex; newPacket.accountIndex = accountIndex;
newPacket.roomIndex = localCharacter->roomIndex; newPacket.roomIndex = 0; //TODO: room index
newPacket.origin = localCharacter->origin; newPacket.origin = localCharacter->GetOrigin();
newPacket.motion = localCharacter->motion; newPacket.motion = localCharacter->GetMotion();
newPacket.stats = localCharacter->stats; newPacket.stats = *localCharacter->GetStats();
//TODO: equipment //TODO: gameplay components: equipment, items, buffs, debuffs
//TODO: items
//TODO: buffs
//TODO: debuffs
network.SendTo(Channels::SERVER, &newPacket); network.SendTo(Channels::SERVER, &newPacket);
} }
@@ -443,7 +464,7 @@ void InWorld::UpdateMap() {
//prune distant regions //prune distant regions
for (std::list<Region>::iterator it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); /* EMPTY */) { for (std::list<Region>::iterator it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); /* EMPTY */) {
//check if the region is outside off this area //check if the region is outside of this area
if (it->GetX() < xStart || it->GetX() > xEnd || it->GetY() < yStart || it->GetY() > yEnd) { if (it->GetX() < xStart || it->GetX() > xEnd || it->GetY() < yStart || it->GetY() > yEnd) {
//clunky, but the alternative was time consuming //clunky, but the alternative was time consuming
@@ -27,6 +27,7 @@
//networking //networking
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
#include "serial_packet.hpp"
//graphics //graphics
#include "image.hpp" #include "image.hpp"
@@ -35,11 +36,9 @@
#include "tile_sheet.hpp" #include "tile_sheet.hpp"
//common //common
#include "config_utility.hpp"
#include "frame_rate.hpp" #include "frame_rate.hpp"
#include "combat_data.hpp" #include "character.hpp"
#include "character_data.hpp"
//client //client
#include "base_scene.hpp" #include "base_scene.hpp"
@@ -51,20 +50,17 @@ class InWorld : public BaseScene {
public: public:
//Public access members //Public access members
InWorld( InWorld(
ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork,
int* const argClientIndex, int* const argClientIndex,
int* const argAccountIndex, int* const argAccountIndex,
int* const argCharacterIndex, int* const argCharacterIndex,
std::map<int, CombatData>* argCombatMap, CharacterMap* argCharacterMap
std::map<int, CharacterData>* argCharacterMap
); );
~InWorld(); ~InWorld();
protected: protected:
//Frame loop //Frame loop
void FrameStart(); void FrameStart();
void Update(double delta); void Update();
void FrameEnd(); void FrameEnd();
void RenderFrame(); void RenderFrame();
void Render(SDL_Surface* const); void Render(SDL_Surface* const);
@@ -96,13 +92,11 @@ protected:
void UpdateMap(); void UpdateMap();
//shared parameters //shared parameters
ConfigUtility& config; UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton();
UDPNetworkUtility& network;
int& clientIndex; int& clientIndex;
int& accountIndex; int& accountIndex;
int& characterIndex; int& characterIndex;
std::map<int, CombatData>& combatMap; CharacterMap& characterMap;
std::map<int, CharacterData>& characterMap;
//graphics //graphics
Image buttonImage; Image buttonImage;
@@ -124,7 +118,7 @@ protected:
FrameRate fps; FrameRate fps;
//game //game
CharacterData* localCharacter = nullptr; Character* localCharacter = nullptr;
}; };
#endif #endif
@@ -30,14 +30,7 @@
//Public access members //Public access members
//------------------------- //-------------------------
LobbyMenu::LobbyMenu( LobbyMenu::LobbyMenu(int* const argClientIndex, int* const argAccountIndex):
ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork,
int* const argClientIndex,
int* const argAccountIndex
):
config(*argConfig),
network(*argNetwork),
clientIndex(*argClientIndex), clientIndex(*argClientIndex),
accountIndex(*argAccountIndex) accountIndex(*argAccountIndex)
{ {
@@ -69,6 +62,12 @@ LobbyMenu::LobbyMenu(
//set the server list's position //set the server list's position
listBox = {300, 50, 200, font.GetCharH()}; listBox = {300, 50, 200, font.GetCharH()};
//BUGFIX: Eat incoming packets
while(network.Receive());
//Initial broadcast
SendBroadcastRequest();
} }
LobbyMenu::~LobbyMenu() { LobbyMenu::~LobbyMenu() {
@@ -83,13 +82,13 @@ void LobbyMenu::FrameStart() {
// //
} }
void LobbyMenu::Update(double delta) { void LobbyMenu::Update() {
//suck in and process all waiting packets //suck in and process all waiting packets
SerialPacket* packetBuffer = static_cast<SerialPacket*>(malloc(MAX_PACKET_SIZE)); SerialPacket* packetBuffer = reinterpret_cast<SerialPacket*>(new char[MAX_PACKET_SIZE]);
while(network.Receive(packetBuffer)) { while(network.Receive(packetBuffer)) {
HandlePacket(packetBuffer); HandlePacket(packetBuffer);
} }
free(static_cast<void*>(packetBuffer)); delete reinterpret_cast<char*>(packetBuffer);
} }
void LobbyMenu::FrameEnd() { void LobbyMenu::FrameEnd() {
@@ -108,7 +107,10 @@ void LobbyMenu::Render(SDL_Surface* const screen) {
for (int i = 0; i < serverInfo.size(); i++) { for (int i = 0; i < serverInfo.size(); i++) {
//draw the selected server's highlight //draw the selected server's highlight
if (selection == &serverInfo[i]) { if (selection == &serverInfo[i]) {
SDL_Rect r = listBox; SDL_Rect r = {
(Sint16)listBox.x, (Sint16)listBox.y,
(Uint16)listBox.w, (Uint16)listBox.h
};
r.y += i * listBox.h; r.y += i * listBox.h;
SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 255, 127, 39)); SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 255, 127, 39));
} }
@@ -146,39 +148,19 @@ void LobbyMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) {
void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
if (search.MouseButtonUp(button) == Button::State::HOVER) { if (search.MouseButtonUp(button) == Button::State::HOVER) {
//broadcast to the network, or a specific server SendBroadcastRequest();
SerialPacket packet;
packet.type = SerialPacketType::BROADCAST_REQUEST;
network.SendTo(config["server.host"].c_str(), config.Int("server.port"), &packet);
//reset the server list
serverInfo.clear();
selection = nullptr;
} }
else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) { else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) {
//pack the packet SendJoinRequest();
ClientPacket packet;
packet.type = SerialPacketType::JOIN_REQUEST;
strncpy(packet.username, config["client.username"].c_str(), PACKET_STRING_SIZE);
//join the selected server
network.SendTo(&selection->address, &packet);
selection = nullptr;
} }
else if (back.MouseButtonUp(button) == Button::State::HOVER) { else if (back.MouseButtonUp(button) == Button::State::HOVER) {
SetNextScene(SceneList::MAINMENU); SetNextScene(SceneList::MAINMENU);
} }
else if ( //has the user selected a server on the list?
//has the user selected a server on the list? BoundingBox tmpBox = listBox;
//TODO: replace with regular collision checker tmpBox.h *= serverInfo.size();
button.x > listBox.x && if (tmpBox.CheckOverlap({button.x, button.y})) {
button.x < listBox.x + listBox.w &&
button.y > listBox.y &&
button.y < listBox.y + listBox.h * serverInfo.size()
) {
selection = &serverInfo[(button.y - listBox.y)/listBox.h]; selection = &serverInfo[(button.y - listBox.y)/listBox.h];
} }
else { else {
@@ -225,7 +207,7 @@ void LobbyMenu::HandleBroadcastResponse(ServerPacket* const argPacket) {
server.playerCount = argPacket->playerCount; server.playerCount = argPacket->playerCount;
server.version = argPacket->version; server.version = argPacket->version;
//NOTE: Check compatibility here //Checking compatibility
server.compatible = server.version == NETWORK_VERSION; server.compatible = server.version == NETWORK_VERSION;
//push //push
@@ -245,4 +227,30 @@ void LobbyMenu::HandleJoinResponse(ClientPacket* const argPacket) {
strncpy(newPacket.avatar, config["client.avatar"].c_str(), PACKET_STRING_SIZE); strncpy(newPacket.avatar, config["client.avatar"].c_str(), PACKET_STRING_SIZE);
newPacket.accountIndex = accountIndex; newPacket.accountIndex = accountIndex;
network.SendTo(Channels::SERVER, &newPacket); network.SendTo(Channels::SERVER, &newPacket);
} }
//-------------------------
//server control
//-------------------------
void LobbyMenu::SendBroadcastRequest() {
//broadcast to the network, or a specific server
ClientPacket packet;
packet.type = SerialPacketType::BROADCAST_REQUEST;
network.SendTo(config["server.host"].c_str(), config.Int("server.port"), &packet);
//reset the server list
serverInfo.clear();
selection = nullptr;
}
void LobbyMenu::SendJoinRequest() {
//pack the packet
ClientPacket packet;
packet.type = SerialPacketType::JOIN_REQUEST;
strncpy(packet.username, config["client.username"].c_str(), PACKET_STRING_SIZE);
//join the selected server
network.SendTo(&selection->address, &packet);
selection = nullptr;
}
@@ -26,10 +26,12 @@
#include "image.hpp" #include "image.hpp"
#include "raster_font.hpp" #include "raster_font.hpp"
#include "button.hpp" #include "button.hpp"
#include "bounding_box.hpp"
//utilities //utilities
#include "config_utility.hpp" #include "config_utility.hpp"
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
#include "serial_packet.hpp"
//client //client
#include "base_scene.hpp" #include "base_scene.hpp"
@@ -40,18 +42,13 @@
class LobbyMenu : public BaseScene { class LobbyMenu : public BaseScene {
public: public:
//Public access members //Public access members
LobbyMenu( LobbyMenu(int* const argClientIndex, int* const argAccountIndex);
ConfigUtility* const argConfig,
UDPNetworkUtility* const argNetwork,
int* const argClientIndex,
int* const argAccountIndex
);
~LobbyMenu(); ~LobbyMenu();
protected: protected:
//Frame loop //Frame loop
void FrameStart(); void FrameStart();
void Update(double delta); void Update();
void FrameEnd(); void FrameEnd();
void Render(SDL_Surface* const); void Render(SDL_Surface* const);
@@ -67,9 +64,13 @@ protected:
void HandleBroadcastResponse(ServerPacket* const); void HandleBroadcastResponse(ServerPacket* const);
void HandleJoinResponse(ClientPacket* const); void HandleJoinResponse(ClientPacket* const);
//server control
void SendBroadcastRequest();
void SendJoinRequest();
//shared parameters //shared parameters
ConfigUtility& config; ConfigUtility& config = ConfigUtility::GetSingleton();
UDPNetworkUtility& network; UDPNetworkUtility& network = UDPNetworkUtility::GetSingleton();
int& clientIndex; int& clientIndex;
int& accountIndex; int& accountIndex;
@@ -91,9 +92,9 @@ protected:
std::vector<ServerInformation> serverInfo; std::vector<ServerInformation> serverInfo;
//a terrible hack, forgive me //NOTE: a terrible hack
//I'd love a proper gui system for this //I'd love a proper gui system for this
SDL_Rect listBox; BoundingBox listBox;
ServerInformation* selection = nullptr; ServerInformation* selection = nullptr;
}; };
@@ -21,13 +21,15 @@
*/ */
#include "main_menu.hpp" #include "main_menu.hpp"
#include "config_utility.hpp"
//------------------------- //-------------------------
//Public access members //Public access members
//------------------------- //-------------------------
MainMenu::MainMenu(ConfigUtility* const argConfig): MainMenu::MainMenu() {
config(*argConfig) ConfigUtility& config = ConfigUtility::GetSingleton();
{
//setup the utility objects //setup the utility objects
image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
image.SetClipH(image.GetClipH()/3); image.SetClipH(image.GetClipH()/3);
@@ -70,7 +72,7 @@ void MainMenu::FrameStart() {
// //
} }
void MainMenu::Update(double delta) { void MainMenu::Update() {
// //
} }
@@ -101,6 +103,7 @@ void MainMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) {
} }
void MainMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { void MainMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
//TODO: Buttons should only register as "selected" when the left button is used
if (startButton.MouseButtonUp(button) == Button::State::HOVER) { if (startButton.MouseButtonUp(button) == Button::State::HOVER) {
SetNextScene(SceneList::LOBBYMENU); SetNextScene(SceneList::LOBBYMENU);
} }
@@ -113,11 +116,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) {
@@ -24,7 +24,6 @@
#include "base_scene.hpp" #include "base_scene.hpp"
#include "config_utility.hpp"
#include "image.hpp" #include "image.hpp"
#include "raster_font.hpp" #include "raster_font.hpp"
#include "button.hpp" #include "button.hpp"
@@ -32,13 +31,13 @@
class MainMenu : public BaseScene { class MainMenu : public BaseScene {
public: public:
//Public access members //Public access members
MainMenu(ConfigUtility* const); MainMenu();
~MainMenu(); ~MainMenu();
protected: protected:
//Frame loop //Frame loop
void FrameStart(); void FrameStart();
void Update(double delta); void Update();
void FrameEnd(); void FrameEnd();
void Render(SDL_Surface* const); void Render(SDL_Surface* const);
@@ -49,9 +48,6 @@ protected:
void KeyDown(SDL_KeyboardEvent const&); void KeyDown(SDL_KeyboardEvent const&);
void KeyUp(SDL_KeyboardEvent const&); void KeyUp(SDL_KeyboardEvent const&);
//shared parameters
ConfigUtility& config;
//members //members
Image image; Image image;
RasterFont font; RasterFont font;
+37
View File
@@ -0,0 +1,37 @@
#config
INCLUDES+=. .. ../../common/gameplay ../../common/graphics ../../common/map ../../common/network ../../common/network/packet_types ../../common/ui ../../common/utilities
LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
#source
CXXSRC=$(wildcard *.cpp)
#objects
OBJDIR=obj
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
#output
OUTDIR=..
OUT=$(addprefix $(OUTDIR)/,client.a)
#targets
all: $(OBJ) $(OUT)
ar -crs $(OUT) $(OBJ)
$(OBJ): | $(OBJDIR)
$(OUT): | $(OUTDIR)
$(OBJDIR):
mkdir $(OBJDIR)
$(OUTDIR):
mkdir $(OUTDIR)
$(OBJDIR)/%.o: %.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<
clean:
$(RM) *.o *.a *.exe
rebuild: clean all
@@ -21,13 +21,15 @@
*/ */
#include "options_menu.hpp" #include "options_menu.hpp"
#include "config_utility.hpp"
//------------------------- //-------------------------
//Public access members //Public access members
//------------------------- //-------------------------
OptionsMenu::OptionsMenu(ConfigUtility* const argConfig): OptionsMenu::OptionsMenu() {
config(*argConfig) ConfigUtility& config = ConfigUtility::GetSingleton();
{
//setup the utility objects //setup the utility objects
image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
image.SetClipH(image.GetClipH()/3); image.SetClipH(image.GetClipH()/3);
@@ -57,7 +59,7 @@ void OptionsMenu::FrameStart() {
// //
} }
void OptionsMenu::Update(double delta) { void OptionsMenu::Update() {
// //
} }
@@ -24,7 +24,6 @@
#include "base_scene.hpp" #include "base_scene.hpp"
#include "config_utility.hpp"
#include "image.hpp" #include "image.hpp"
#include "raster_font.hpp" #include "raster_font.hpp"
#include "button.hpp" #include "button.hpp"
@@ -33,13 +32,13 @@
class OptionsMenu : public BaseScene { class OptionsMenu : public BaseScene {
public: public:
//Public access members //Public access members
OptionsMenu(ConfigUtility* const); OptionsMenu();
~OptionsMenu(); ~OptionsMenu();
protected: protected:
//Frame loop //Frame loop
void FrameStart(); void FrameStart();
void Update(double delta); void Update();
void FrameEnd(); void FrameEnd();
void Render(SDL_Surface* const); void Render(SDL_Surface* const);
@@ -50,9 +49,6 @@ protected:
void KeyDown(SDL_KeyboardEvent const&); void KeyDown(SDL_KeyboardEvent const&);
void KeyUp(SDL_KeyboardEvent const&); void KeyUp(SDL_KeyboardEvent const&);
//shared parameters
ConfigUtility& config;
//members //members
Image image; Image image;
RasterFont font; RasterFont font;
@@ -21,14 +21,14 @@
*/ */
#include "splash_screen.hpp" #include "splash_screen.hpp"
#include "config_utility.hpp"
//------------------------- //-------------------------
//Public access members //Public access members
//------------------------- //-------------------------
SplashScreen::SplashScreen(ConfigUtility* const argConfig): SplashScreen::SplashScreen() {
config(*argConfig) logo.LoadSurface(ConfigUtility::GetSingleton()["dir.logos"] + "krstudios.bmp");
{
logo.LoadSurface(config["dir.logos"] + "krstudios.bmp");
startTick = std::chrono::steady_clock::now(); startTick = std::chrono::steady_clock::now();
} }
@@ -40,7 +40,7 @@ SplashScreen::~SplashScreen() {
//Frame loop //Frame loop
//------------------------- //-------------------------
void SplashScreen::Update(double delta) { void SplashScreen::Update() {
if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(1)) { if (std::chrono::steady_clock::now() - startTick > std::chrono::duration<int>(1)) {
SetNextScene(SceneList::MAINMENU); SetNextScene(SceneList::MAINMENU);
} }
@@ -24,7 +24,6 @@
#include "base_scene.hpp" #include "base_scene.hpp"
#include "config_utility.hpp"
#include "image.hpp" #include "image.hpp"
#include <chrono> #include <chrono>
@@ -32,17 +31,14 @@
class SplashScreen : public BaseScene { class SplashScreen : public BaseScene {
public: public:
//Public access members //Public access members
SplashScreen(ConfigUtility* const); SplashScreen();
~SplashScreen(); ~SplashScreen();
protected: protected:
//Frame loop //Frame loop
void Update(double delta); void Update();
void Render(SDL_Surface* const); void Render(SDL_Surface* const);
//shared parameters
ConfigUtility& config;
//members //members
std::chrono::steady_clock::time_point startTick; std::chrono::steady_clock::time_point startTick;
Image logo; Image logo;
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. ../packet ../../gameplay ../../map ../../utilities INCLUDES+=.
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
@@ -11,7 +11,7 @@ OBJDIR=obj
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
#output #output
OUTDIR=../../.. OUTDIR=../..
OUT=$(addprefix $(OUTDIR)/,libcommon.a) OUT=$(addprefix $(OUTDIR)/,libcommon.a)
#targets #targets
+45
View File
@@ -0,0 +1,45 @@
/* 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 "timer.hpp"
Timer::Timer(): start(Timer::Clock::now()) {
//
}
Timer::Timer(std::string s): name(s), start(Timer::Clock::now()) {
//
}
void Timer::Start() {
start = Clock::now();
}
void Timer::Stop() {
timeSpan = Clock::now() - start;
}
std::ostream& operator<<(std::ostream& os, Timer& t) {
os << t.GetName() << ": ";
os << std::chrono::duration_cast<std::chrono::milliseconds>(t.GetTime()).count();
os << "ms";
return os;
}
@@ -19,33 +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 ENEMYMANAGER_HPP_ #ifndef TIMER_HPP_
#define ENEMYMANAGER_HPP_ #define TIMER_HPP_
#include "enemy_data.hpp" #include <chrono>
#include <string>
#include <ostream>
#include "lua/lua.hpp" class Timer {
#include <map>
class EnemyManager {
public: public:
EnemyManager() = default; typedef std::chrono::high_resolution_clock Clock;
~EnemyManager() = default;
//public access methods Timer();
//TODO Timer(std::string s);
~Timer() = default;
inline void Start();
inline void Stop();
//accessors and mutators //accessors and mutators
EnemyData* GetEnemy(int uid); Clock::duration GetTime() { return timeSpan; }
std::map<int, EnemyData>* GetContainer();
lua_State* SetLuaState(lua_State*); std::string SetName(std::string s) { return name = s; }
lua_State* GetLuaState(); std::string GetName() { return name; }
private: private:
std::map<int, EnemyData> enemyMap; std::string name;
lua_State* luaState = nullptr; Clock::time_point start;
Clock::duration timeSpan;
}; };
#endif std::ostream& operator<<(std::ostream& os, Timer& t);
#endif
+37
View File
@@ -0,0 +1,37 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#ifndef CHARACTERDEFINES_HPP_
#define CHARACTERDEFINES_HPP_
#include <cmath>
//the speeds that the characters move
constexpr double CHARACTER_WALKING_SPEED = 2.24;
constexpr double CHARACTER_WALKING_MOD = 1.0/sqrt(2.0);
//the bounds for the character objects, mapped to the default sprites
constexpr int CHARACTER_BOUNDS_X = 0;
constexpr int CHARACTER_BOUNDS_Y = 16;
constexpr int CHARACTER_BOUNDS_WIDTH = 32;
constexpr int CHARACTER_BOUNDS_HEIGHT = 32;
#endif
-70
View File
@@ -1,70 +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 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,16 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#ifndef ACCOUNTDATA_HPP_ #ifndef COMBATDEFINES_HPP_
#define ACCOUNTDATA_HPP_ #define COMBATDEFINES_HPP_
#include <string> #define COMBAT_MAX_CHARACTERS 16
#define COMBAT_MAX_ENEMIES 16
struct AccountData { enum class TerrainType {
std::string username; NONE = 0,
//TODO: password GRASSLANDS,
bool blackListed = false; //etc.
bool whiteListed = true;
bool mod = false;
bool admin = false;
int clientIndex;
}; };
#endif #endif
-62
View File
@@ -1,62 +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 ENEMYDATA_HPP_
#define ENEMYDATA_HPP_
#include "vector2.hpp"
#include "statistics.hpp"
//graphics
#ifdef GRAPHICS
#include "sprite_sheet.hpp"
#endif
//std namespace
#include <string>
struct EnemyData {
//metadata
std::string handle;
std::string avatar;
//gameplay
Statistics stats;
//TODO: equipment
//TODO: items
//TODO: buffs
//TODO: debuffs
//TODO: 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
+2 -2
View File
@@ -1,7 +1,7 @@
#config #config
INCLUDES+=. ../utilities ../graphics INCLUDES+=.
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) -DGRAPHICS CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
#source #source
CXXSRC=$(wildcard *.cpp) CXXSRC=$(wildcard *.cpp)
-31
View File
@@ -1,31 +0,0 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "character_data.hpp"
#include "combat_data.hpp"
#include "enemy_data.hpp"
#include "statistics.hpp"
/* DOCS: Sanity check, read more
* Since most/all of the files in this directory are header files, I've created
* this source file as a "sanity check", to ensure that the above header files
* are written correctly via make.
*/
+1 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. ../map INCLUDES+=.
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
+1
View File
@@ -1,4 +1,5 @@
all: all:
$(MAKE) -C debugging
$(MAKE) -C gameplay $(MAKE) -C gameplay
$(MAKE) -C graphics $(MAKE) -C graphics
$(MAKE) -C map $(MAKE) -C map
+1 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. ../utilities INCLUDES+=. ../graphics ../utilities
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
+14 -2
View File
@@ -21,11 +21,14 @@
*/ */
#include "region.hpp" #include "region.hpp"
#include "utility.hpp"
#include <stdexcept> #include <stdexcept>
#include <cmath>
#include <cstring> #include <cstring>
int snapToBase(int base, int x) {
return floor((double)x / base) * base;
}
Region::Region(int argX, int argY): x(argX), y(argY) { Region::Region(int argX, int argY): x(argX), y(argY) {
if (x != snapToBase(REGION_WIDTH, x) || y != snapToBase(REGION_HEIGHT, y)) { if (x != snapToBase(REGION_WIDTH, x) || y != snapToBase(REGION_HEIGHT, y)) {
throw(std::invalid_argument("Region location is off grid")); throw(std::invalid_argument("Region location is off grid"));
@@ -35,6 +38,7 @@ Region::Region(int argX, int argY): x(argX), y(argY) {
Region::Region(Region const& rhs): x(rhs.x), y(rhs.y) { Region::Region(Region const& rhs): x(rhs.x), y(rhs.y) {
memcpy(tiles, rhs.tiles, REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH*sizeof(type_t)); memcpy(tiles, rhs.tiles, REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH*sizeof(type_t));
solid = rhs.solid;
} }
Region::type_t Region::SetTile(int x, int y, int z, type_t v) { Region::type_t Region::SetTile(int x, int y, int z, type_t v) {
@@ -44,3 +48,11 @@ Region::type_t Region::SetTile(int x, int y, int z, type_t v) {
Region::type_t Region::GetTile(int x, int y, int z) { Region::type_t Region::GetTile(int x, int y, int z) {
return tiles[x][y][z]; return tiles[x][y][z];
} }
bool Region::SetSolid(int x, int y, bool b) {
return solid[x * REGION_WIDTH + y] = b;
}
bool Region::GetSolid(int x, int y) {
return solid[x * REGION_WIDTH + y];
}
+12
View File
@@ -22,10 +22,16 @@
#ifndef REGION_HPP_ #ifndef REGION_HPP_
#define REGION_HPP_ #define REGION_HPP_
#include <bitset>
//the region's storage format
constexpr int REGION_WIDTH = 20; constexpr int REGION_WIDTH = 20;
constexpr int REGION_HEIGHT = 20; constexpr int REGION_HEIGHT = 20;
constexpr int REGION_DEPTH = 3; constexpr int REGION_DEPTH = 3;
//utility function
int snapToBase(int base, int x);
class Region { class Region {
public: public:
typedef unsigned char type_t; typedef unsigned char type_t;
@@ -38,14 +44,20 @@ public:
type_t SetTile(int x, int y, int z, type_t v); type_t SetTile(int x, int y, int z, type_t v);
type_t GetTile(int x, int y, int z); type_t GetTile(int x, int y, int z);
bool SetSolid(int x, int y, bool b);
bool GetSolid(int x, int y);
//accessors //accessors
int GetX() const { return x; } int GetX() const { return x; }
int GetY() const { return y; } int GetY() const { return y; }
std::bitset<REGION_WIDTH*REGION_HEIGHT>* GetSolidBitset() { return &solid; }
private: private:
const int x; const int x;
const int y; const int y;
type_t tiles[REGION_WIDTH][REGION_HEIGHT][REGION_DEPTH]; type_t tiles[REGION_WIDTH][REGION_HEIGHT][REGION_DEPTH];
std::bitset<REGION_WIDTH*REGION_HEIGHT> solid;
}; };
#endif #endif
+26 -35
View File
@@ -37,6 +37,20 @@ static int getTile(lua_State* L) {
return 1; return 1;
} }
static int setSolid(lua_State* L) {
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
bool ret = region->SetSolid(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_toboolean(L, 4));
lua_pushboolean(L, ret);
return 1;
}
static int getSolid(lua_State* L) {
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
bool ret = region->GetSolid(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1);
lua_pushboolean(L, ret);
return 1;
}
static int getX(lua_State* L) { static int getX(lua_State* L) {
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1)); Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
lua_pushinteger(L, region->GetX()); lua_pushinteger(L, region->GetX());
@@ -64,43 +78,20 @@ static int getDepth(lua_State* L) {
return 1; return 1;
} }
static int load(lua_State* L) { static const luaL_Reg regionLib[] = {
//TODO: fill this {"SetTile",setTile},
lua_pushboolean(L, false); {"GetTile",getTile},
return 1; {"SetSolid",setSolid},
} {"GetSolid",getSolid},
{"GetX",getX},
static int save(lua_State* L) { {"GetY",getY},
//TODO: fill this {"GetWidth",getWidth},
return 0; {"GetHeight",getHeight},
} {"GetDepth",getDepth},
static int create(lua_State* L) {
//TODO: fill this
return 0;
}
static int unload(lua_State* L) {
//TODO: fill this
return 0;
}
static const luaL_Reg regionlib[] = {
{"settile",setTile},
{"gettile",getTile},
{"getx",getX},
{"gety",getY},
{"getwidth",getWidth},
{"getheight",getHeight},
{"getdepth",getDepth},
{"load",load},
{"save",save},
{"create",create},
{"unload",unload},
{nullptr, nullptr} {nullptr, nullptr}
}; };
LUAMOD_API int luaopen_regionapi(lua_State* L) { LUAMOD_API int openRegionAPI(lua_State* L) {
luaL_newlib(L, regionlib); luaL_newlib(L, regionLib);
return 1; return 1;
} }
+2 -2
View File
@@ -24,7 +24,7 @@
#include "lua/lua.hpp" #include "lua/lua.hpp"
#define LUA_REGIONLIBNAME "region" #define TORTUGA_REGION_NAME "Region"
LUAMOD_API int luaopen_regionapi(lua_State* L); LUAMOD_API int openRegionAPI(lua_State* L);
#endif #endif
@@ -19,13 +19,12 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#include "pager_api.hpp" #include "region_pager_api.hpp"
#include "region_pager_lua.hpp" #include "region_pager_lua.hpp"
#include "region.hpp" #include "region.hpp"
#include <stdexcept> //DOCS: These glue functions simply wrap RegionPagerLua's methods
#include <string>
static int setTile(lua_State* L) { static int setTile(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1)); RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
@@ -41,6 +40,20 @@ static int getTile(lua_State* L) {
return 1; return 1;
} }
static int setSolid(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
bool ret = pager->SetSolid(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_toboolean(L, 4));
lua_pushboolean(L, ret);
return 1;
}
static int getSolid(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
bool ret = pager->GetSolid(lua_tointeger(L, 2), lua_tointeger(L, 3));
lua_pushboolean(L, ret);
return 1;
}
static int getRegion(lua_State* L) { static int getRegion(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1)); RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
@@ -48,109 +61,86 @@ static int getRegion(lua_State* L) {
return 1; return 1;
} }
static int setDirectory(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
std::string s = pager->SetDirectory(lua_tostring(L, 2));
lua_pushstring(L, s.c_str());
return 1;
}
static int getDirectory(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
std::string s = pager->GetDirectory();
lua_pushstring(L, s.c_str());
return 1;
}
static int loadRegion(lua_State* L) { static int loadRegion(lua_State* L) {
//get the parameters
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1)); RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); Region* region = pager->LoadRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
std::string s = pager->GetDirectory();
//push the parameters
lua_getglobal(L, "region");
lua_getfield(L, -1, "load");
lua_pushlightuserdata(L, region); lua_pushlightuserdata(L, region);
lua_pushstring(L, s.c_str());
//call the method
if (lua_pcall(L, 2, 1, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(L, -1) ));
}
return 1; return 1;
} }
static int saveRegion(lua_State* L) { static int saveRegion(lua_State* L) {
//get the parameters
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1)); RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); Region* region = pager->SaveRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
std::string s = pager->GetDirectory();
//push the parameters
lua_getglobal(L, "region");
lua_getfield(L, -1, "save");
lua_pushlightuserdata(L, region); lua_pushlightuserdata(L, region);
lua_pushstring(L, s.c_str()); return 1;
//call the method
if (lua_pcall(L, 2, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(L, -1) ));
}
return 0;
} }
static int createRegion(lua_State* L) { static int createRegion(lua_State* L) {
//get the parameters
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1)); RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); Region* region = pager->CreateRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
//push the parameters
lua_getglobal(L, "region");
lua_getfield(L, -1, "create");
lua_pushlightuserdata(L, region); lua_pushlightuserdata(L, region);
//TODO: parameters return 1;
//call the method
if (lua_pcall(L, 1, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(L, -1) ));
}
return 0;
} }
static int unloadRegion(lua_State* L) { static int unloadRegion(lua_State* L) {
//get the parameters
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1)); RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); pager->UnloadRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
std::string s = pager->GetDirectory();
//push the parameters
lua_getglobal(L, "region");
lua_getfield(L, -1, "unload");
lua_pushlightuserdata(L, region);
lua_pushstring(L, s.c_str());
//call the method
if (lua_pcall(L, 2, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(L, -1) ));
}
return 0; return 0;
} }
static const luaL_Reg pagerlib[] = { static int setOnLoad(lua_State* L) {
{"settile", setTile}, RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
{"gettile", getTile}, luaL_unref(L, LUA_REGISTRYINDEX, pager->GetLoadReference());
{"getregion", getRegion}, pager->SetLoadReference(luaL_ref(L, LUA_REGISTRYINDEX));
{"setdirectory", setDirectory}, return 0;
{"getdirectory", getDirectory}, }
{"loadregion", loadRegion},
{"saveregion", saveRegion}, static int setOnSave(lua_State* L) {
{"createregion", createRegion}, RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
{"unloadregion", unloadRegion}, luaL_unref(L, LUA_REGISTRYINDEX, pager->GetSaveReference());
pager->SetSaveReference(luaL_ref(L, LUA_REGISTRYINDEX));
return 0;
}
static int setOnCreate(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetCreateReference());
pager->SetCreateReference(luaL_ref(L, LUA_REGISTRYINDEX));
return 0;
}
static int setOnUnload(lua_State* L) {
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
luaL_unref(L, LUA_REGISTRYINDEX, pager->GetUnloadReference());
pager->SetUnloadReference(luaL_ref(L, LUA_REGISTRYINDEX));
return 0;
}
static const luaL_Reg regionPagerLib[] = {
//curry
{"SetTile", setTile},
{"GetTile", getTile},
{"SetSolid", setSolid},
{"GetSolid", getSolid},
//access and control
{"GetRegion", getRegion},
{"LoadRegion", loadRegion},
{"SaveRegion", saveRegion},
{"CreateRegion", createRegion},
{"UnloadRegion", unloadRegion},
//triggers
{"SetOnLoad",setOnLoad},
{"SetOnSave",setOnSave},
{"SetOnCreate",setOnCreate},
{"SetOnUnload",setOnUnload},
//sentinel
{nullptr, nullptr} {nullptr, nullptr}
}; };
LUAMOD_API int luaopen_pagerapi(lua_State* L) { LUAMOD_API int openRegionPagerAPI(lua_State* L) {
luaL_newlib(L, pagerlib); luaL_newlib(L, regionPagerLib);
return 1; return 1;
} }
@@ -19,12 +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.
*/ */
#ifndef CHECKBOUNDS_HPP_ #ifndef REGIONPAGERAPI_HPP_
#define CHECKBOUNDS_HPP_ #define REGIONPAGERAPI_HPP_
#include "vector2.hpp" #include "lua/lua.hpp"
bool checkPoint(Vector2 const& origin, Vector2 const& bound, Vector2 const& point); #define TORTUGA_REGION_PAGER_NAME "RegionPager"
bool checkOverlap(Vector2 const& originOne, Vector2 const& boundOne, Vector2 const& originTwo, Vector2 const& boundTwo); LUAMOD_API int openRegionPagerAPI(lua_State* L);
#endif #endif
+18 -6
View File
@@ -21,8 +21,6 @@
*/ */
#include "region_pager_base.hpp" #include "region_pager_base.hpp"
#include "utility.hpp"
#include <stdexcept> #include <stdexcept>
#include <algorithm> #include <algorithm>
@@ -36,7 +34,20 @@ Region::type_t RegionPagerBase::GetTile(int x, int y, int z) {
return ptr->GetTile(x - ptr->GetX(), y - ptr->GetY(), z); return ptr->GetTile(x - ptr->GetX(), y - ptr->GetY(), z);
} }
bool RegionPagerBase::SetSolid(int x, int y, int b) {
Region* ptr = GetRegion(x, y);
return ptr->SetSolid(x - ptr->GetX(), y - ptr->GetY(), b);
}
bool RegionPagerBase::GetSolid(int x, int y) {
Region* ptr = GetRegion(x, y);
return ptr->GetSolid(x - ptr->GetX(), y - ptr->GetY());
}
Region* RegionPagerBase::GetRegion(int x, int y) { Region* RegionPagerBase::GetRegion(int x, int y) {
x = snapToBase(REGION_WIDTH, x);
y = snapToBase(REGION_HEIGHT, y);
//get the region by various means //get the region by various means
Region* ptr = nullptr; Region* ptr = nullptr;
ptr = FindRegion(x, y); ptr = FindRegion(x, y);
@@ -60,12 +71,12 @@ Region* RegionPagerBase::PushRegion(Region* const ptr) {
} }
Region* RegionPagerBase::LoadRegion(int x, int y) { Region* RegionPagerBase::LoadRegion(int x, int y) {
//TODO: load the region if possible //EMPTY, intended for override
return nullptr; return nullptr;
} }
Region* RegionPagerBase::SaveRegion(int x, int y) { Region* RegionPagerBase::SaveRegion(int x, int y) {
//TODO: find & save the region //EMPTY, intended for override
return nullptr; return nullptr;
} }
@@ -78,8 +89,9 @@ Region* RegionPagerBase::CreateRegion(int x, int y) {
} }
void RegionPagerBase::UnloadRegion(int x, int y) { void RegionPagerBase::UnloadRegion(int x, int y) {
//custom loop, not FindRegion() regionList.remove_if([x, y](Region& region) -> bool {
regionList.remove_if([x, y](Region& region) -> bool { return region.GetX() == x && region.GetY() == y; }); return region.GetX() == x && region.GetY() == y;
});
} }
void RegionPagerBase::UnloadAll() { void RegionPagerBase::UnloadAll() {
+4
View File
@@ -35,6 +35,10 @@ public:
virtual Region::type_t SetTile(int x, int y, int z, Region::type_t v); virtual Region::type_t SetTile(int x, int y, int z, Region::type_t v);
virtual Region::type_t GetTile(int x, int y, int z); virtual Region::type_t GetTile(int x, int y, int z);
//solid manipulation
virtual bool SetSolid(int x, int y, int b);
virtual bool GetSolid(int x, int y);
//region manipulation //region manipulation
virtual Region* GetRegion(int x, int y); virtual Region* GetRegion(int x, int y);
virtual Region* FindRegion(int x, int y); virtual Region* FindRegion(int x, int y);
+113 -60
View File
@@ -21,49 +21,71 @@
*/ */
#include "region_pager_lua.hpp" #include "region_pager_lua.hpp"
#include "utility.hpp"
#include <stdexcept> #include <stdexcept>
Region* RegionPagerLua::LoadRegion(int x, int y) { Region* RegionPagerLua::LoadRegion(int x, int y) {
//load the region if possible //get the pager's function from the registry
lua_rawgeti(lua, LUA_REGISTRYINDEX, loadRef);
//something to work on //check if this function is available
regionList.emplace_front(x, y); if (lua_isnil(lua, -1)) {
lua_pop(lua, 1);
//API hook return nullptr;
lua_getglobal(luaState, "region"); }
lua_getfield(luaState, -1, "load");
lua_pushlightuserdata(luaState, &regionList.front()); //something to work on
lua_pushstring(luaState, directory.c_str()); Region tmpRegion(x, y);
if (lua_pcall(luaState, 2, 1, 0) != LUA_OK) { lua_pushlightuserdata(lua, &tmpRegion);
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
} //call the funtion, 1 arg, 1 return
//success or failure if (lua_pcall(lua, 1, 1, 0) != LUA_OK) {
if (!lua_toboolean(luaState, -1)) { throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
lua_pop(luaState, 2); }
regionList.pop_front();
//check the return value, success or failure
if (lua_toboolean(lua, -1)) {
lua_pop(lua, 1);
regionList.push_front(tmpRegion);
return &regionList.front();
}
else {
lua_pop(lua, 1);
return nullptr; return nullptr;
} }
lua_pop(luaState, 2);
return &regionList.front();
} }
Region* RegionPagerLua::SaveRegion(int x, int y) { Region* RegionPagerLua::SaveRegion(int x, int y) {
//find & save the region //get the pager's function from the registry
Region* ptr = FindRegion(x, y); lua_rawgeti(lua, LUA_REGISTRYINDEX, saveRef);
if (ptr) {
//API hook //check if this function is available
lua_getglobal(luaState, "region"); if (lua_isnil(lua, -1)) {
lua_getfield(luaState, -1, "save"); lua_pop(lua, 1);
lua_pushlightuserdata(luaState, ptr); return nullptr;
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) )); //find the specified region
} Region* ptr = FindRegion(x, y);
lua_pop(luaState, 1); if (!ptr) {
lua_pop(lua, 1);
return nullptr;
}
lua_pushlightuserdata(lua, ptr);
//call the function, 1 arg, 1 return
if (lua_pcall(lua, 1, 1, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
}
//check the return value, success or failure
if (lua_toboolean(lua, -1)) {
lua_pop(lua, 1);
return ptr;
}
else {
lua_pop(lua, 1);
return nullptr;
} }
return ptr;
} }
Region* RegionPagerLua::CreateRegion(int x, int y) { Region* RegionPagerLua::CreateRegion(int x, int y) {
@@ -71,56 +93,87 @@ Region* RegionPagerLua::CreateRegion(int x, int y) {
throw(std::logic_error("Cannot overwrite an existing region")); throw(std::logic_error("Cannot overwrite an existing region"));
} }
//something to work on //get the pager's function from the registry
regionList.emplace_front(x, y); lua_rawgeti(lua, LUA_REGISTRYINDEX, createRef);
//API hook //check if this function is available
lua_getglobal(luaState, "region"); if (lua_isnil(lua, -1)) {
lua_getfield(luaState, -1, "create"); lua_pop(lua, 1);
lua_pushlightuserdata(luaState, &regionList.front()); return nullptr;
//TODO: parameters
if (lua_pcall(luaState, 1, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
} }
lua_pop(luaState, 1);
return &regionList.front();; //something to work on
Region tmpRegion(x, y);
lua_pushlightuserdata(lua, &tmpRegion);
//call the function, 1 arg, 0 return
if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
}
//return the new region
regionList.push_front(tmpRegion);
return &regionList.front();
} }
void RegionPagerLua::UnloadRegion(int x, int y) { void RegionPagerLua::UnloadRegion(int x, int y) {
lua_getglobal(luaState, "region"); //get the pager's function from the registry
lua_rawgeti(lua, LUA_REGISTRYINDEX, unloadRef);
//check if this function is available
if (lua_isnil(lua, -1)) {
lua_pop(lua, 1);
return;
}
//run each region through this lambda
regionList.remove_if([&](Region& region) -> bool { regionList.remove_if([&](Region& region) -> bool {
if (region.GetX() == x && region.GetY() == y) { if (region.GetX() == x && region.GetY() == y) {
//API hook //push a copy of the function onto the stack with the region
lua_getfield(luaState, -1, "unload"); lua_pushvalue(lua, -1);
lua_pushlightuserdata(luaState, &region); lua_pushlightuserdata(lua, &region);
lua_pushstring(luaState, directory.c_str());
if (lua_pcall(luaState, 2, 0, 0) != LUA_OK) { //call the function, 1 arg, 0 return
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) )); if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
} }
//signal to the container
return true; return true;
} }
//signal to the container
return false; return false;
}); });
lua_pop(luaState, 1); //pop the base copy of the function
lua_pop(lua, 1);
} }
void RegionPagerLua::UnloadAll() { void RegionPagerLua::UnloadAll() {
lua_getglobal(luaState, "region"); //get the pager's function from the registry
lua_rawgeti(lua, LUA_REGISTRYINDEX, unloadRef);
//check if this function is available
if (lua_isnil(lua, -1)) {
lua_pop(lua, 1);
return;
}
for (auto& it : regionList) { for (auto& it : regionList) {
//API hook //push a copy of the function onto the stack with the region
lua_getfield(luaState, -1, "unload"); lua_pushvalue(lua, -1);
lua_pushlightuserdata(luaState, &it); lua_pushlightuserdata(lua, &it);
lua_pushstring(luaState, directory.c_str());
if (lua_pcall(luaState, 2, 0, 0) != LUA_OK) { //call the function, 1 arg, 0 return
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) )); if (lua_pcall(lua, 1, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) ));
} }
} }
lua_pop(luaState, 1); //pop the base copy of the function
lua_pop(lua, 1);
//remove from memory
regionList.clear(); regionList.clear();
} }
+20 -6
View File
@@ -41,14 +41,28 @@ public:
void UnloadAll() override; void UnloadAll() override;
std::string SetDirectory(std::string s) { return directory = s; } //accessors & mutators
std::string GetDirectory() { return directory; } lua_State* SetLuaState(lua_State* L) { return lua = L; }
lua_State* GetLuaState() { return lua; }
//utilities for the API
int SetLoadReference(int i) { return loadRef = i; }
int SetSaveReference(int i) { return saveRef = i; }
int SetCreateReference(int i) { return createRef = i; }
int SetUnloadReference(int i) { return unloadRef = i; }
int GetLoadReference() { return loadRef; }
int GetSaveReference() { return saveRef; }
int GetCreateReference() { return createRef; }
int GetUnloadReference() { return unloadRef; }
lua_State* SetLuaState(lua_State* L) { return luaState = L; }
lua_State* GetLuaState() { return luaState; }
protected: protected:
std::string directory; lua_State* lua = nullptr;
lua_State* luaState = nullptr;
int loadRef = LUA_NOREF;
int saveRef = LUA_NOREF;
int createRef = LUA_NOREF;
int unloadRef = LUA_NOREF;
}; };
#endif #endif
@@ -21,24 +21,24 @@
*/ */
#include "tile_sheet.hpp" #include "tile_sheet.hpp"
void TileSheet::Load(std::string fname, int xc, int yc) { void TileSheet::Load(std::string fname, int tileWidth, int tileHeight) {
XCount = xc;
YCount = yc;
image.LoadSurface(fname); image.LoadSurface(fname);
image.SetClipW(image.GetClipW()/XCount); image.SetClipW(tileWidth);
image.SetClipH(image.GetClipH()/YCount); image.SetClipH(tileHeight);
xCount = image.GetSurface()->w / image.GetClipW();
yCount = image.GetSurface()->h / image.GetClipH();
} }
void TileSheet::Unload() { void TileSheet::Unload() {
image.FreeSurface(); image.FreeSurface();
XCount = YCount = 0; xCount = yCount = 0;
} }
void TileSheet::DrawTo(SDL_Surface* const dest, int x, int y, Region::type_t tile) { void TileSheet::DrawTileTo(SDL_Surface* const dest, int x, int y, Region::type_t tile) {
//0 is invisible //0 is invisible
if (tile == 0) return; if (tile == 0) return;
image.SetClipX((tile-1) % XCount * image.GetClipW()); image.SetClipX((tile-1) % xCount * image.GetClipW());
image.SetClipY((tile-1) / XCount * image.GetClipH()); image.SetClipY((tile-1) / xCount * image.GetClipH());
image.DrawTo(dest, x, y); image.DrawTo(dest, x, y);
} }
@@ -50,8 +50,8 @@ void TileSheet::DrawRegionTo(SDL_Surface* const dest, Region* const region, int
tile = region->GetTile(i, j, k); tile = region->GetTile(i, j, k);
//0 is invisible //0 is invisible
if (tile == 0) continue; if (tile == 0) continue;
image.SetClipX((tile-1) % XCount * image.GetClipW()); image.SetClipX((tile-1) % xCount * image.GetClipW());
image.SetClipY((tile-1) / XCount * image.GetClipH()); image.SetClipY((tile-1) / xCount * image.GetClipH());
image.DrawTo(dest, image.DrawTo(dest,
(region->GetX() + i) * image.GetClipW() - camX, (region->GetX() + i) * image.GetClipW() - camX,
(region->GetY() + j) * image.GetClipH() - camY); (region->GetY() + j) * image.GetClipH() - camY);
@@ -31,24 +31,24 @@
class TileSheet { class TileSheet {
public: public:
TileSheet() = default; TileSheet() = default;
TileSheet(std::string f, int x, int y) { Load(f, x, y); } TileSheet(std::string f, int w, int h) { Load(f, w, h); }
~TileSheet() = default; ~TileSheet() = default;
void Load(std::string fname, int XCount, int YCount); void Load(std::string fname, int tileWidth, int tileHeight);
void Unload(); void Unload();
void DrawTo(SDL_Surface* const dest, int x, int y, Region::type_t tile); void DrawTileTo(SDL_Surface* const dest, int x, int y, Region::type_t tile);
void DrawRegionTo(SDL_Surface* const dest, Region* const region, int camX, int camY); void DrawRegionTo(SDL_Surface* const dest, Region* const region, int camX, int camY);
//accessors //accessors
Image* GetImage() { return &image; } Image* GetImage() { return &image; }
int GetXCount() { return XCount; } int GetXCount() { return xCount; }
int GetYCount() { return YCount; } int GetYCount() { return yCount; }
int GetTileW() { return image.GetClipW(); } int GetTileW() { return image.GetClipW(); }
int GetTileH() { return image.GetClipH(); } int GetTileH() { return image.GetClipH(); }
private: private:
Image image; Image image;
int XCount = 0, YCount = 0; int xCount = 0, yCount = 0;
}; };
#endif #endif
+75
View File
@@ -0,0 +1,75 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "tile_sheet_api.hpp"
#include "tile_sheet.hpp"
static int load(lua_State* L) {
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
sheet->Load(lua_tostring(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4));
return 0;
}
static int unload(lua_State* L) {
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
sheet->Unload();
return 0;
}
static int getXCount(lua_State* L) {
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
lua_pushinteger(L, sheet->GetXCount());
return 1;
}
static int getYCount(lua_State* L) {
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
lua_pushinteger(L, sheet->GetYCount());
return 1;
}
static int getTileW(lua_State* L) {
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
lua_pushinteger(L, sheet->GetTileW());
return 1;
}
static int getTileH(lua_State* L) {
TileSheet* sheet = reinterpret_cast<TileSheet*>(lua_touserdata(L, 1));
lua_pushinteger(L, sheet->GetTileH());
return 1;
}
static const luaL_Reg tileSheetLib[] = {
{"Load",load},
{"Unload",unload},
{"GetXCount",getXCount},
{"GetYCount",getYCount},
{"GetTileW",getTileW},
{"GetTileH",getTileH},
{nullptr, nullptr}
};
LUAMOD_API int openTileSheetAPI(lua_State* L) {
luaL_newlib(L, tileSheetLib);
return 1;
}
@@ -19,12 +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.
*/ */
#ifndef PAGERAPI_HPP_ #ifndef TILESHEETAPI_HPP_
#define PAGERAPI_HPP_ #define TILESHEETAPI_HPP_
#include "lua/lua.hpp" #include "lua/lua.hpp"
#define LUA_PAGERLIBNAME "pager" #define TORTUGA_TILE_SHEET_NAME "TileSheet"
LUAMOD_API int luaopen_pagerapi(lua_State* L); LUAMOD_API int openTileSheetAPI(lua_State* L);
#endif #endif
+2 -3
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. packet serial ../gameplay ../map ../utilities INCLUDES+=. packet_types ../gameplay ../map ../utilities
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
@@ -17,8 +17,7 @@ OUT=$(addprefix $(OUTDIR)/,libcommon.a)
#targets #targets
all: $(OBJ) $(OUT) all: $(OBJ) $(OUT)
ar -crs $(OUT) $(OBJ) ar -crs $(OUT) $(OBJ)
$(MAKE) -C packet $(MAKE) -C packet_types
$(MAKE) -C serial
$(OBJ): | $(OBJDIR) $(OBJ): | $(OBJDIR)
-44
View File
@@ -1,44 +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 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: equipment
//TODO: items
//TODO: buffs
//TODO: debuffs
//TODO: rewards
};
#endif
-28
View File
@@ -1,28 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013, 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "serial_packet.hpp"
/* DOCS: Sanity check, read more
* Since most/all of the files in this directory are header files, I've created
* this source file as a "sanity check", to ensure that the above header files
* are written correctly via make.
*/
@@ -1,113 +0,0 @@
/* Copyright: (c) Kayne Ruse 2013, 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#ifndef SERIALPACKETTYPE_HPP_
#define SERIALPACKETTYPE_HPP_
/* Key for the comments:
* request => response
*/
enum class SerialPacketType {
//default: there is something wrong
NONE = 0,
//keep alive
//ping => pong
PING = 1,
PONG = 2,
//search for the server list
//none => server name, player count, version info (and source address)
BROADCAST_REQUEST = 3,
BROADCAST_RESPONSE = 4,
//try to join the server
//username, and password => client index, account index
JOIN_REQUEST = 5,
JOIN_RESPONSE = 6,
JOIN_REJECTION = 7,
//mass update of all surrounding content
//character.x, character.y => packet barrage
SYNCHRONIZE = 8,
//disconnect from the server
//autentication, account index => disconnect that account
DISCONNECT = 9,
//shut down the server
//autentication => disconnect, shutdown
SHUTDOWN = 10,
//map data
//room index, region.x, region.y => room index, region.x, region.y, region content
REGION_REQUEST = 11,
REGION_CONTENT = 12,
//combat data
//TODO: system incomplete
COMBAT_NEW = 13,
COMBAT_DELETE = 14,
COMBAT_UPDATE = 15,
COMBAT_ENTER_REQUEST = 16,
COMBAT_ENTER_RESPONSE = 17,
COMBAT_EXIT_REQUEST = 18,
COMBAT_EXIT_RESPONSE = 19,
//TODO: COMBAT info
COMBAT_REJECTION = 20,
//character data
//character data => etc.
CHARACTER_NEW = 21,
CHARACTER_DELETE = 22,
CHARACTER_UPDATE = 23,
//authentication, character index => character stats
CHARACTER_STATS_REQUEST= 24,
CHARACTER_STATS_RESPONSE = 25,
//character new => character rejection, disconnect?
CHARACTER_REJECTION = 26,
//enemy data
//enemy data => etc.
ENEMY_NEW = 27,
ENEMY_DELETE = 28,
ENEMY_UPDATE = 29,
ENEMY_STATS_REQUEST = 30,
ENEMY_STATS_RESPONSE = 31,
//enemy index => enemy doens't exist
ENEMY_REJECTION= 32,
//NOTE: more packet types go here
//not used
LAST
};
#endif
@@ -0,0 +1,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 "character_packet.hpp"
#include "serial_utility.hpp"
#include "serial_statistics.hpp"
void serializeCharacter(void* buffer, CharacterPacket* packet) {
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
//identify the character
serialCopy(&buffer, &packet->characterIndex, sizeof(int));
serialCopy(&buffer, packet->handle, PACKET_STRING_SIZE);
serialCopy(&buffer, packet->avatar, PACKET_STRING_SIZE);
//the owner
serialCopy(&buffer, &packet->accountIndex, sizeof(int));
//location
serialCopy(&buffer, &packet->roomIndex, sizeof(int));
serialCopy(&buffer, &packet->origin.x, sizeof(double));
serialCopy(&buffer, &packet->origin.y, sizeof(double));
serialCopy(&buffer, &packet->motion.x, sizeof(double));
serialCopy(&buffer, &packet->motion.y, sizeof(double));
//stats structure
serializeStatistics(&buffer, &packet->stats);
//TODO: gameplay components: equipment, items, buffs, debuffs
}
void deserializeCharacter(void* buffer, CharacterPacket* packet) {
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
//identify the character
deserialCopy(&buffer, &packet->characterIndex, sizeof(int));
deserialCopy(&buffer, packet->handle, PACKET_STRING_SIZE);
deserialCopy(&buffer, packet->avatar, PACKET_STRING_SIZE);
//the owner
deserialCopy(&buffer, &packet->accountIndex, sizeof(int));
//location
deserialCopy(&buffer, &packet->roomIndex, sizeof(int));
deserialCopy(&buffer, &packet->origin.x, sizeof(double));
deserialCopy(&buffer, &packet->origin.y, sizeof(double));
deserialCopy(&buffer, &packet->motion.x, sizeof(double));
deserialCopy(&buffer, &packet->motion.y, sizeof(double));
//stats structure
deserializeStatistics(&buffer, &packet->stats);
//TODO: gameplay components: equipment, items, buffs, debuffs
}
@@ -44,10 +44,10 @@ struct CharacterPacket : SerialPacketBase {
//gameplay //gameplay
Statistics stats; Statistics stats;
//TODO: equipment //TODO: gameplay components: equipment, items, buffs, debuffs
//TODO: items
//TODO: buffs
//TODO: debuffs
}; };
void serializeCharacter(void* buffer, CharacterPacket* packet);
void deserializeCharacter(void* buffer, CharacterPacket* packet);
#endif #endif
@@ -19,36 +19,22 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#include "combat_manager.hpp" #include "client_packet.hpp"
//------------------------- #include "serial_utility.hpp"
//public access methods
//-------------------------
//TODO void serializeClient(void* buffer, ClientPacket* packet) {
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
//------------------------- serialCopy(&buffer, &packet->clientIndex, sizeof(int));
//accessors and mutators serialCopy(&buffer, &packet->accountIndex, sizeof(int));
//------------------------- serialCopy(&buffer, packet->username, PACKET_STRING_SIZE);
CombatData* CombatManager::GetCombat(int uid) {
std::map<int, CombatData>::iterator it = combatMap.find(uid);
if (it == combatMap.end()) {
return nullptr;
}
return &it->second;
} }
std::map<int, CombatData>* CombatManager::GetContainer() { void deserializeClient(void* buffer, ClientPacket* packet) {
return &combatMap; deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
}
lua_State* CombatManager::SetLuaState(lua_State* L) { deserialCopy(&buffer, &packet->clientIndex, sizeof(int));
return luaState = L; deserialCopy(&buffer, &packet->accountIndex, sizeof(int));
} deserialCopy(&buffer, packet->username, PACKET_STRING_SIZE);
lua_State* CombatManager::GetLuaState() {
return luaState;
} }
@@ -28,7 +28,9 @@ struct ClientPacket : SerialPacketBase {
int clientIndex; int clientIndex;
int accountIndex; int accountIndex;
char username[PACKET_STRING_SIZE]; char username[PACKET_STRING_SIZE];
// char password[PACKET_STRING_SIZE]; //hashed, not currently used
}; };
void serializeClient(void* buffer, ClientPacket* packet);
void deserializeClient(void* buffer, ClientPacket* packet);
#endif #endif
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. ../../gameplay ../../map ../../utilities INCLUDES+=. .. ../../gameplay ../../map ../../utilities
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
@@ -0,0 +1,79 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "region_packet.hpp"
#include "serial_utility.hpp"
void serializeRegion(void* buffer, RegionPacket* packet) {
serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
//format
serialCopy(&buffer, &packet->roomIndex, sizeof(int));
serialCopy(&buffer, &packet->x, sizeof(int));
serialCopy(&buffer, &packet->y, sizeof(int));
if (packet->type != SerialPacketType::REGION_CONTENT) {
return;
}
//tiles
for (int i = 0; i < REGION_WIDTH; i++) {
for (int j = 0; j < REGION_HEIGHT; j++) {
for (int k = 0; k < REGION_DEPTH; k++) {
*reinterpret_cast<Region::type_t*>(buffer) = packet->region->GetTile(i, j, k);
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
}
}
}
//solids
serialCopy(&buffer, packet->region->GetSolidBitset(), REGION_SOLID_FOOTPRINT);
}
void deserializeRegion(void* buffer, RegionPacket* packet) {
deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
//format
deserialCopy(&buffer, &packet->roomIndex, sizeof(int));
deserialCopy(&buffer, &packet->x, sizeof(int));
deserialCopy(&buffer, &packet->y, sizeof(int));
if (packet->type != SerialPacketType::REGION_CONTENT) {
return;
}
//an object to work on
packet->region = new Region(packet->x, packet->y);
//tiles
for (int i = 0; i < REGION_WIDTH; i++) {
for (int j = 0; j < REGION_HEIGHT; j++) {
for (int k = 0; k < REGION_DEPTH; k++) {
packet->region->SetTile(i, j, k, *reinterpret_cast<Region::type_t*>(buffer));
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
}
}
}
//solids
deserialCopy(&buffer, packet->region->GetSolidBitset(), REGION_SOLID_FOOTPRINT);
}
@@ -19,28 +19,30 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#ifndef COMBATPACKET_HPP_ #ifndef REGIONPACKET_HPP_
#define COMBATPACKET_HPP_ #define REGIONPACKET_HPP_
#include "serial_packet_base.hpp" #include "serial_packet_base.hpp"
#include "combat_data.hpp" #include "region.hpp"
struct CombatPacket : SerialPacketBase { #include <cmath>
//identify the combat instance
int combatIndex;
int difficulty;
CombatData::Terrain terrainType;
//combatants //define the memory footprint for the region's members
int characterArray[COMBAT_MAX_CHARACTERS]; constexpr int REGION_TILE_FOOTPRINT = sizeof(Region::type_t) * REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH;
int enemyArray[COMBAT_MAX_ENEMIES]; constexpr int REGION_SOLID_FOOTPRINT = ceil(REGION_WIDTH * REGION_HEIGHT / 8.0);
constexpr int REGION_METADATA_FOOTPRINT = sizeof(int) * 3;
//location struct RegionPacket : SerialPacketBase {
int mapIndex; //location/identify the region
Vector2 origin; int roomIndex;
int x, y;
//TODO: rewards //the data
Region* region;
}; };
void serializeRegion(void* buffer, RegionPacket* packet);
void deserializeRegion(void* buffer, RegionPacket* packet);
#endif #endif
@@ -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,20 +19,6 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#ifndef REGIONPACKET_HPP_
#define REGIONPACKET_HPP_
#include "serial_packet_base.hpp" #include "serial_packet_base.hpp"
#include "region.hpp" //sanity check
struct RegionPacket : SerialPacketBase {
//location/identify the region
int roomIndex;
int x, y;
//the data
Region* region;
};
#endif
@@ -22,15 +22,10 @@
#ifndef SERIALPACKETBASE_HPP_ #ifndef SERIALPACKETBASE_HPP_
#define SERIALPACKETBASE_HPP_ #define SERIALPACKETBASE_HPP_
#ifndef SERIALPACKET_HPP_
#error Cannot include this file without 'serial_packet.hpp'
#endif
#include "serial_packet_type.hpp" #include "serial_packet_type.hpp"
#include "SDL/SDL_net.h" #include "SDL/SDL_net.h"
constexpr int NETWORK_VERSION = 20140607;
constexpr int PACKET_STRING_SIZE = 100; constexpr int PACKET_STRING_SIZE = 100;
struct SerialPacketBase { struct SerialPacketBase {
@@ -41,6 +36,4 @@ struct SerialPacketBase {
virtual ~SerialPacketBase() {}; virtual ~SerialPacketBase() {};
}; };
typedef SerialPacketBase SerialPacket;
#endif #endif
@@ -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_statistics.hpp"
#include "serial_utility.hpp"
void serializeStatistics(void** buffer, Statistics* stats) {
//integers
serialCopy(buffer, &stats->level, sizeof(int));
serialCopy(buffer, &stats->exp, sizeof(int));
serialCopy(buffer, &stats->maxHP, sizeof(int));
serialCopy(buffer, &stats->health, sizeof(int));
serialCopy(buffer, &stats->maxMP, sizeof(int));
serialCopy(buffer, &stats->mana, sizeof(int));
serialCopy(buffer, &stats->attack, sizeof(int));
serialCopy(buffer, &stats->defence, sizeof(int));
serialCopy(buffer, &stats->intelligence, sizeof(int));
serialCopy(buffer, &stats->resistance, sizeof(int));
serialCopy(buffer, &stats->speed, sizeof(int));
//floats
serialCopy(buffer, &stats->accuracy, sizeof(float));
serialCopy(buffer, &stats->evasion, sizeof(float));
serialCopy(buffer, &stats->luck, sizeof(float));
}
void deserializeStatistics(void** buffer, Statistics* stats) {
//integers
deserialCopy(buffer, &stats->level, sizeof(int));
deserialCopy(buffer, &stats->exp, sizeof(int));
deserialCopy(buffer, &stats->maxHP, sizeof(int));
deserialCopy(buffer, &stats->health, sizeof(int));
deserialCopy(buffer, &stats->maxMP, sizeof(int));
deserialCopy(buffer, &stats->mana, sizeof(int));
deserialCopy(buffer, &stats->attack, sizeof(int));
deserialCopy(buffer, &stats->defence, sizeof(int));
deserialCopy(buffer, &stats->intelligence, sizeof(int));
deserialCopy(buffer, &stats->resistance, sizeof(int));
deserialCopy(buffer, &stats->speed, sizeof(int));
//floats
deserialCopy(buffer, &stats->accuracy, sizeof(float));
deserialCopy(buffer, &stats->evasion, sizeof(float));
deserialCopy(buffer, &stats->luck, sizeof(float));
}
@@ -19,16 +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 "enemy_factory_generic.hpp" #ifndef SERIALSTATISTICS_HPP_
#define SERIALSTATISTICS_HPP_
EnemyFactoryGeneric::EnemyFactoryGeneric() : EnemyFactoryInterface() { #include "statistics.hpp"
//EMPTY
}
EnemyFactoryGeneric::~EnemyFactoryGeneric() noexcept { void serializeStatistics(void** buffer, Statistics* stats);
//EMPTY void deserializeStatistics(void** buffer, Statistics* stats);
}
void EnemyFactoryGeneric::Generate(std::list<EnemyData>* container) { #endif
//TODO: fill this out
}
@@ -19,24 +19,24 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#include "serial.hpp" #include "server_packet.hpp"
#include "serial_util.hpp" #include "serial_utility.hpp"
void serializeServer(ServerPacket* packet, void* buffer) { void serializeServer(void* buffer, ServerPacket* packet) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType)); serialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
//identify the server //identify the server
SERIALIZE(buffer, &packet->name, PACKET_STRING_SIZE); serialCopy(&buffer, packet->name, PACKET_STRING_SIZE);
SERIALIZE(buffer, &packet->playerCount, sizeof(int)); serialCopy(&buffer, &packet->playerCount, sizeof(int));
SERIALIZE(buffer, &packet->version, sizeof(int)); serialCopy(&buffer, &packet->version, sizeof(int));
} }
void deserializeServer(ServerPacket* packet, void* buffer) { void deserializeServer(void* buffer, ServerPacket* packet) {
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType)); deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType));
//identify the server //identify the server
DESERIALIZE(buffer, &packet->name, PACKET_STRING_SIZE); deserialCopy(&buffer, packet->name, PACKET_STRING_SIZE);
DESERIALIZE(buffer, &packet->playerCount, sizeof(int)); deserialCopy(&buffer, &packet->playerCount, sizeof(int));
DESERIALIZE(buffer, &packet->version, sizeof(int)); deserialCopy(&buffer, &packet->version, sizeof(int));
} }
@@ -31,4 +31,7 @@ struct ServerPacket : SerialPacketBase {
int version; int version;
}; };
void serializeServer(void* buffer, ServerPacket* packet);
void deserializeServer(void* buffer, ServerPacket* packet);
#endif #endif
-183
View File
@@ -1,183 +0,0 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "serial.hpp"
#include "serial_util.hpp"
//simple type functions
void serializeType(SerialPacketBase* packet, void* buffer) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
}
void deserializeType(SerialPacketBase* packet, void* buffer) {
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
}
//main switch functions
void serializePacket(SerialPacketBase* packet, void* buffer) {
switch(packet->type) {
//no extra data
case SerialPacketType::NONE:
case SerialPacketType::PING:
case SerialPacketType::PONG:
case SerialPacketType::BROADCAST_REQUEST:
//all rejections
case SerialPacketType::JOIN_REJECTION:
case SerialPacketType::CHARACTER_REJECTION:
case SerialPacketType::ENEMY_REJECTION:
case SerialPacketType::COMBAT_REJECTION:
serializeType(packet, buffer);
break;
//character info
case SerialPacketType::CHARACTER_NEW:
case SerialPacketType::CHARACTER_DELETE:
case SerialPacketType::CHARACTER_UPDATE:
case SerialPacketType::CHARACTER_STATS_REQUEST:
case SerialPacketType::CHARACTER_STATS_RESPONSE:
serializeCharacter(static_cast<CharacterPacket*>(packet), buffer);
break;
//client info
case SerialPacketType::JOIN_REQUEST:
case SerialPacketType::JOIN_RESPONSE:
case SerialPacketType::SYNCHRONIZE:
case SerialPacketType::DISCONNECT:
case SerialPacketType::SHUTDOWN:
serializeClient(static_cast<ClientPacket*>(packet), buffer);
break;
//combat info
case SerialPacketType::COMBAT_NEW:
case SerialPacketType::COMBAT_DELETE:
case SerialPacketType::COMBAT_UPDATE:
case SerialPacketType::COMBAT_ENTER_REQUEST:
case SerialPacketType::COMBAT_ENTER_RESPONSE:
case SerialPacketType::COMBAT_EXIT_REQUEST:
case SerialPacketType::COMBAT_EXIT_RESPONSE:
serializeCombat(static_cast<CombatPacket*>(packet), buffer);
break;
//enemy info
case SerialPacketType::ENEMY_NEW:
case SerialPacketType::ENEMY_DELETE:
case SerialPacketType::ENEMY_UPDATE:
case SerialPacketType::ENEMY_STATS_REQUEST:
case SerialPacketType::ENEMY_STATS_RESPONSE:
serializeEnemy(static_cast<EnemyPacket*>(packet), buffer);
break;
//region info
case SerialPacketType::REGION_REQUEST:
serializeRegionFormat(static_cast<RegionPacket*>(packet), buffer);
break;
case SerialPacketType::REGION_CONTENT:
serializeRegionContent(static_cast<RegionPacket*>(packet), buffer);
break;
//server info
case SerialPacketType::BROADCAST_RESPONSE:
serializeServer(static_cast<ServerPacket*>(packet), buffer);
break;
}
}
void deserializePacket(SerialPacketBase* packet, void* buffer) {
//find the type, so that you can actually deserialize the packet!
deserializeType(packet, buffer);
switch(packet->type) {
//no extra data
case SerialPacketType::NONE:
case SerialPacketType::PING:
case SerialPacketType::PONG:
case SerialPacketType::BROADCAST_REQUEST:
//all rejections
case SerialPacketType::JOIN_REJECTION:
case SerialPacketType::CHARACTER_REJECTION:
case SerialPacketType::ENEMY_REJECTION:
case SerialPacketType::COMBAT_REJECTION:
//NOTHING
break;
//character info
case SerialPacketType::CHARACTER_NEW:
case SerialPacketType::CHARACTER_DELETE:
case SerialPacketType::CHARACTER_UPDATE:
case SerialPacketType::CHARACTER_STATS_REQUEST:
case SerialPacketType::CHARACTER_STATS_RESPONSE:
deserializeCharacter(static_cast<CharacterPacket*>(packet), buffer);
break;
//client info
case SerialPacketType::JOIN_REQUEST:
case SerialPacketType::JOIN_RESPONSE:
case SerialPacketType::SYNCHRONIZE:
case SerialPacketType::DISCONNECT:
case SerialPacketType::SHUTDOWN:
deserializeClient(static_cast<ClientPacket*>(packet), buffer);
break;
//combat info
case SerialPacketType::COMBAT_NEW:
case SerialPacketType::COMBAT_DELETE:
case SerialPacketType::COMBAT_UPDATE:
//TODO: is this the best fit?
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;
}
}
-65
View File
@@ -1,65 +0,0 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#ifndef SERIALIZE_HPP_
#define SERIALIZE_HPP_
#include "serial_packet.hpp"
#include "region.hpp"
#include "statistics.hpp"
//Primary interface functions
void serializePacket(SerialPacketBase*, void* dest);
void deserializePacket(SerialPacketBase*, void* src);
void serializeType(SerialPacketBase*, void*);
void deserializeType(SerialPacketBase*, void*);
//utility functions, exposed
void serializeCharacter(CharacterPacket*, void*);
void serializeClient(ClientPacket*, void*);
void serializeCombat(CombatPacket*, void*);
void serializeEnemy(EnemyPacket*, void*);
void serializeRegionFormat(RegionPacket*, void*);
void serializeRegionContent(RegionPacket*, void*);
void serializeServer(ServerPacket*, void*);
void serializeStatistics(Statistics*, void*);
void deserializeCharacter(CharacterPacket*, void*);
void deserializeClient(ClientPacket*, void*);
void deserializeCombat(CombatPacket*, void*);
void deserializeEnemy(EnemyPacket*, void*);
void deserializeRegionFormat(RegionPacket*, void*);
void deserializeRegionContent(RegionPacket*, void*);
void deserializeServer(ServerPacket*, void*);
void deserializeStatistics(Statistics*, void*);
/* DOCS: Keep the PACKET_BUFFER_SIZE up to date
* DOCS: REGION_CONTENT is currently the largest type of packet, read more
* map content: REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizoeof(region::type_t)
* map format: sizeof(int) * 3
* metadata: sizeof(SerialPacket::Type)
*/
constexpr int PACKET_BUFFER_SIZE = REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) + sizeof(int) * 3 + sizeof(SerialPacketType);
#endif
@@ -1,80 +0,0 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "serial.hpp"
#include "serial_util.hpp"
void serializeCharacter(CharacterPacket* packet, void* buffer) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//identify the character
SERIALIZE(buffer, &packet->characterIndex, sizeof(int));
SERIALIZE(buffer, &packet->handle, PACKET_STRING_SIZE);
SERIALIZE(buffer, &packet->avatar, PACKET_STRING_SIZE);
//the owner
SERIALIZE(buffer, &packet->accountIndex, sizeof(int));
//location
SERIALIZE(buffer, &packet->roomIndex, sizeof(int));
SERIALIZE(buffer, &packet->origin.x, sizeof(double));
SERIALIZE(buffer, &packet->origin.y, sizeof(double));
SERIALIZE(buffer, &packet->motion.x, sizeof(double));
SERIALIZE(buffer, &packet->motion.y, sizeof(double));
//stats structure
serializeStatistics(&packet->stats, buffer);
buffer = reinterpret_cast<char*>(buffer) + sizeof(Statistics);
//TODO: equipment
//TODO: items
//TODO: buffs
//TODO: 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: equipment
//TODO: items
//TODO: buffs
//TODO: debuffs
}
-42
View File
@@ -1,42 +0,0 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "serial.hpp"
#include "serial_util.hpp"
void serializeClient(ClientPacket* packet, void* buffer) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
SERIALIZE(buffer, &packet->clientIndex, sizeof(int));
SERIALIZE(buffer, &packet->accountIndex, sizeof(int));
SERIALIZE(buffer, &packet->username, PACKET_STRING_SIZE);
// SERIALIZE(buffer, &packet->password, PACKET_STRING_SIZE);
}
void deserializeClient(ClientPacket* packet, void* buffer) {
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
DESERIALIZE(buffer, &packet->clientIndex, sizeof(int));
DESERIALIZE(buffer, &packet->accountIndex, sizeof(int));
DESERIALIZE(buffer, &packet->username, PACKET_STRING_SIZE);
// DESERIALIZE(buffer, &packet->password, PACKET_STRING_SIZE);
}
-64
View File
@@ -1,64 +0,0 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "serial.hpp"
#include "serial_util.hpp"
void serializeCombat(CombatPacket* packet, void* buffer) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//identify the combat instance
SERIALIZE(buffer, &packet->combatIndex, sizeof(int));
SERIALIZE(buffer, &packet->difficulty, sizeof(int));
SERIALIZE(buffer, &packet->terrainType, sizeof(CombatData::Terrain));
//combatants
SERIALIZE(buffer, &packet->characterArray, sizeof(int) * COMBAT_MAX_CHARACTERS);
SERIALIZE(buffer, &packet->enemyArray, sizeof(int) * COMBAT_MAX_ENEMIES);
//location
SERIALIZE(buffer, &packet->mapIndex, sizeof(int));
SERIALIZE(buffer, &packet->origin.x, sizeof(double));
SERIALIZE(buffer, &packet->origin.y, sizeof(double));
//TODO: 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: rewards
}
-66
View File
@@ -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 "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: equipment
//TODO: items
//TODO: buffs
//TODO: debuffs
//TODO: 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: equipment
//TODO: items
//TODO: buffs
//TODO: debuffs
//TODO: rewards
}
-83
View File
@@ -1,83 +0,0 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "serial.hpp"
#include "serial_util.hpp"
void serializeRegionFormat(RegionPacket* packet, void* buffer) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//format
SERIALIZE(buffer, &packet->roomIndex, sizeof(int));
SERIALIZE(buffer, &packet->x, sizeof(int));
SERIALIZE(buffer, &packet->y, sizeof(int));
}
void serializeRegionContent(RegionPacket* packet, void* buffer) {
SERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//format
SERIALIZE(buffer, &packet->roomIndex, sizeof(int));
SERIALIZE(buffer, &packet->x, sizeof(int));
SERIALIZE(buffer, &packet->y, sizeof(int));
//content
for (register int i = 0; i < REGION_WIDTH; i++) {
for (register int j = 0; j < REGION_HEIGHT; j++) {
for (register int k = 0; k < REGION_DEPTH; k++) {
*reinterpret_cast<Region::type_t*>(buffer) = packet->region->GetTile(i, j, k);
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
}
}
}
}
void deserializeRegionFormat(RegionPacket* packet, void* buffer) {
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//format
DESERIALIZE(buffer, &packet->roomIndex, sizeof(int));
DESERIALIZE(buffer, &packet->x, sizeof(int));
DESERIALIZE(buffer, &packet->y, sizeof(int));
}
void deserializeRegionContent(RegionPacket* packet, void* buffer) {
DESERIALIZE(buffer, &packet->type, sizeof(SerialPacketType));
//format
DESERIALIZE(buffer, &packet->roomIndex, sizeof(int));
DESERIALIZE(buffer, &packet->x, sizeof(int));
DESERIALIZE(buffer, &packet->y, sizeof(int));
//an object to work on
packet->region = new Region(packet->x, packet->y);
//content
for (register int i = 0; i < REGION_WIDTH; i++) {
for (register int j = 0; j < REGION_HEIGHT; j++) {
for (register int k = 0; k < REGION_DEPTH; k++) {
packet->region->SetTile(i, j, k, *reinterpret_cast<Region::type_t*>(buffer));
buffer = reinterpret_cast<char*>(buffer) + sizeof(Region::type_t);
}
}
}
}
@@ -1,65 +0,0 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "serial.hpp"
#include "serial_util.hpp"
void serializeStatistics(Statistics* stats, void* buffer) {
//integers
SERIALIZE(buffer, &stats->level, sizeof(int));
SERIALIZE(buffer, &stats->exp, sizeof(int));
SERIALIZE(buffer, &stats->maxHP, sizeof(int));
SERIALIZE(buffer, &stats->health, sizeof(int));
SERIALIZE(buffer, &stats->maxMP, sizeof(int));
SERIALIZE(buffer, &stats->mana, sizeof(int));
SERIALIZE(buffer, &stats->attack, sizeof(int));
SERIALIZE(buffer, &stats->defence, sizeof(int));
SERIALIZE(buffer, &stats->intelligence, sizeof(int));
SERIALIZE(buffer, &stats->resistance, sizeof(int));
SERIALIZE(buffer, &stats->speed, sizeof(int));
//floats
SERIALIZE(buffer, &stats->accuracy, sizeof(float));
SERIALIZE(buffer, &stats->evasion, sizeof(float));
SERIALIZE(buffer, &stats->luck, sizeof(float));
}
void deserializeStatistics(Statistics* stats, void* buffer) {
//integers
DESERIALIZE(buffer, &stats->level, sizeof(int));
DESERIALIZE(buffer, &stats->exp, sizeof(int));
DESERIALIZE(buffer, &stats->maxHP, sizeof(int));
DESERIALIZE(buffer, &stats->health, sizeof(int));
DESERIALIZE(buffer, &stats->maxMP, sizeof(int));
DESERIALIZE(buffer, &stats->mana, sizeof(int));
DESERIALIZE(buffer, &stats->attack, sizeof(int));
DESERIALIZE(buffer, &stats->defence, sizeof(int));
DESERIALIZE(buffer, &stats->intelligence, sizeof(int));
DESERIALIZE(buffer, &stats->resistance, sizeof(int));
DESERIALIZE(buffer, &stats->speed, sizeof(int));
//floats
DESERIALIZE(buffer, &stats->accuracy, sizeof(float));
DESERIALIZE(buffer, &stats->evasion, sizeof(float));
DESERIALIZE(buffer, &stats->luck, sizeof(float));
}
@@ -22,23 +22,41 @@
#ifndef SERIALPACKET_HPP_ #ifndef SERIALPACKET_HPP_
#define SERIALPACKET_HPP_ #define SERIALPACKET_HPP_
#include "serial_packet_base.hpp"
#include "character_packet.hpp" #include "character_packet.hpp"
#include "client_packet.hpp" #include "client_packet.hpp"
#include "combat_packet.hpp"
#include "enemy_packet.hpp"
#include "region_packet.hpp" #include "region_packet.hpp"
#include "server_packet.hpp" #include "server_packet.hpp"
//NOTE: SerialPacket is defined in serial_packet_base.hpp //SerialPacketBase is defined in serial_packet_base.hpp
typedef SerialPacketBase SerialPacket;
//DOCS: NETWORK_VERSION is used to discern compatible servers and clients
constexpr int NETWORK_VERSION = 20140831;
union MaxPacket { union MaxPacket {
CharacterPacket a; CharacterPacket a;
ClientPacket b; ClientPacket b;
CombatPacket c; RegionPacket c;
EnemyPacket d; ServerPacket d;
RegionPacket e;
ServerPacket f;
}; };
constexpr int MAX_PACKET_SIZE = sizeof(MaxPacket); constexpr int MAX_PACKET_SIZE = sizeof(MaxPacket);
/* DOCS: PACKET_BUFFER_SIZE is the memory required to store serialized data
* DOCS: SerialPacketType::REGION_CONTENT is currently the largest packet type
* Serialized RegionPacket structure:
* SerialPacketType
* room index (int)
* X & Y position (int)
* tile data (3 layers)
* solid data (bitset)
*/
constexpr int PACKET_BUFFER_SIZE =
sizeof(SerialPacketType) +
REGION_METADATA_FOOTPRINT +
REGION_TILE_FOOTPRINT +
REGION_SOLID_FOOTPRINT;
#endif #endif
+98
View File
@@ -0,0 +1,98 @@
/* Copyright: (c) Kayne Ruse 2013, 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#ifndef SERIALPACKETTYPE_HPP_
#define SERIALPACKETTYPE_HPP_
/* DOCS: The headers indicate what packet type is used for each message
* different messages under the same header will carry different amounts of
* valid data, but it will still be carried in that packet's format.
*/
enum class SerialPacketType {
//default: there is something wrong
NONE = 0,
//-------------------------
//ServerPacket
// name, player count, version
//-------------------------
//heartbeat
PING,
PONG,
//Used for finding available servers
BROADCAST_REQUEST,
BROADCAST_RESPONSE,
//-------------------------
//ClientPacket
// client index, account index, character index
//-------------------------
//Connecting to a server as a client
JOIN_REQUEST,
JOIN_RESPONSE,
JOIN_REJECTION,
//client requests all information from the server
SYNCHRONIZE,
//disconnect from the server
DISCONNECT,
//shut down the server
SHUTDOWN,
//-------------------------
//RegionPacket
// room index, x, y, raw data
//-------------------------
//map data
REGION_REQUEST,
REGION_CONTENT,
//-------------------------
//CharacterPacket
// handle, avatar, character index, account index,
// room index, origin, motion
// statistics
//-------------------------
//controlling characters
CHARACTER_NEW,
CHARACTER_DELETE,
CHARACTER_UPDATE,
//authentication, character index => character stats
CHARACTER_STATS_REQUEST,
CHARACTER_STATS_RESPONSE,
//reject a character request
CHARACTER_REJECTION,
//not used
LAST
};
#endif
+108
View File
@@ -0,0 +1,108 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "serial_utility.hpp"
//packet types
#include "character_packet.hpp"
#include "client_packet.hpp"
#include "region_packet.hpp"
#include "server_packet.hpp"
#include <cstring>
//raw memory copy
void serialCopy(void** buffer, void* data, int size) {
memcpy(*buffer, data, size);
*buffer = reinterpret_cast<char*>(*buffer) + size;
}
void deserialCopy(void** buffer, void* data, int size) {
memcpy(data, *buffer, size);
*buffer = reinterpret_cast<char*>(*buffer) + size;
}
//main switch functions
void serializePacket(void* buffer, SerialPacketBase* packet) {
switch(packet->type) {
case SerialPacketType::PING:
case SerialPacketType::PONG:
case SerialPacketType::BROADCAST_REQUEST:
case SerialPacketType::BROADCAST_RESPONSE:
serializeServer(buffer, static_cast<ServerPacket*>(packet));
break;
case SerialPacketType::JOIN_REQUEST:
case SerialPacketType::JOIN_RESPONSE:
case SerialPacketType::JOIN_REJECTION:
case SerialPacketType::SYNCHRONIZE:
case SerialPacketType::DISCONNECT:
case SerialPacketType::SHUTDOWN:
serializeClient(buffer, static_cast<ClientPacket*>(packet));
break;
case SerialPacketType::REGION_REQUEST:
case SerialPacketType::REGION_CONTENT:
serializeRegion(buffer, static_cast<RegionPacket*>(packet));
break;
case SerialPacketType::CHARACTER_NEW:
case SerialPacketType::CHARACTER_DELETE:
case SerialPacketType::CHARACTER_UPDATE:
case SerialPacketType::CHARACTER_STATS_REQUEST:
case SerialPacketType::CHARACTER_STATS_RESPONSE:
case SerialPacketType::CHARACTER_REJECTION:
serializeCharacter(buffer, static_cast<CharacterPacket*>(packet));
break;
}
}
void deserializePacket(void* buffer, SerialPacketBase* packet) {
//find the type, so that you can actually deserialize the packet!
SerialPacketType type;
memcpy(&type, buffer, sizeof(SerialPacketType));
switch(type) {
case SerialPacketType::PING:
case SerialPacketType::PONG:
case SerialPacketType::BROADCAST_REQUEST:
case SerialPacketType::BROADCAST_RESPONSE:
deserializeServer(buffer, static_cast<ServerPacket*>(packet));
break;
case SerialPacketType::JOIN_REQUEST:
case SerialPacketType::JOIN_RESPONSE:
case SerialPacketType::JOIN_REJECTION:
case SerialPacketType::SYNCHRONIZE:
case SerialPacketType::DISCONNECT:
case SerialPacketType::SHUTDOWN:
deserializeClient(buffer, static_cast<ClientPacket*>(packet));
break;
case SerialPacketType::REGION_REQUEST:
case SerialPacketType::REGION_CONTENT:
deserializeRegion(buffer, static_cast<RegionPacket*>(packet));
break;
case SerialPacketType::CHARACTER_NEW:
case SerialPacketType::CHARACTER_DELETE:
case SerialPacketType::CHARACTER_UPDATE:
case SerialPacketType::CHARACTER_STATS_REQUEST:
case SerialPacketType::CHARACTER_STATS_RESPONSE:
case SerialPacketType::CHARACTER_REJECTION:
deserializeCharacter(buffer, static_cast<CharacterPacket*>(packet));
break;
}
}
@@ -19,13 +19,19 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#ifndef SERIALIZEUTIL_HPP_ #ifndef SERIALIZEUTILITY_HPP_
#define SERIALIZEUTIL_HPP_ #define SERIALIZEUTILITY_HPP_
#include "serial_packet_base.hpp"
#include <cstring> #include <cstring>
//NOTE: The strange assignments here used in order to move the void* parameter //raw memory copy
#define SERIALIZE(buffer, data, size) memcpy(buffer, data, size); buffer = reinterpret_cast<char*>(buffer) + size; void serialCopy(void** buffer, void* data, int size);
#define DESERIALIZE(buffer, data, size) memcpy(data, buffer, size); buffer = reinterpret_cast<char*>(buffer) + size; void deserialCopy(void** buffer, void* data, int size);
//primary functions
void serializePacket(void* buffer, SerialPacketBase* packet);
void deserializePacket(void* buffer, SerialPacketBase* packet);
#endif #endif
+14 -13
View File
@@ -21,12 +21,13 @@
*/ */
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
#include "serial.hpp" #include "serial_packet.hpp"
#include "serial_utility.hpp"
#include <stdexcept> #include <stdexcept>
//DOCS: memset() is used before sending a packet to remove old data; you don't want to send sensitive data over the network //BUGFIX: memset() is used before sending a packet to remove old data; you don't want to send sensitive data over the network
//NOTE: don't confuse SerialPacket with UDPpacket //NOTE: don't confuse SerialPacketBase with UDPpacket
void UDPNetworkUtility::Open(int port) { void UDPNetworkUtility::Open(int port) {
socket = SDLNet_UDP_Open(port); socket = SDLNet_UDP_Open(port);
@@ -152,10 +153,10 @@ int UDPNetworkUtility::Receive() {
} }
//------------------------- //-------------------------
//send a SerialPacket //send a SerialPacketBase
//------------------------- //-------------------------
int UDPNetworkUtility::SendTo(const char* ip, int port, SerialPacket* serialPacket) { int UDPNetworkUtility::SendTo(const char* ip, int port, SerialPacketBase* serialPacket) {
IPaddress add; IPaddress add;
if (SDLNet_ResolveHost(&add, ip, port) == -1) { if (SDLNet_ResolveHost(&add, ip, port) == -1) {
throw(std::runtime_error("Failed to resolve a host")); throw(std::runtime_error("Failed to resolve a host"));
@@ -164,9 +165,9 @@ int UDPNetworkUtility::SendTo(const char* ip, int port, SerialPacket* serialPack
SendTo(&add, serialPacket); SendTo(&add, serialPacket);
} }
int UDPNetworkUtility::SendTo(IPaddress* add, SerialPacket* serialPacket) { int UDPNetworkUtility::SendTo(IPaddress* add, SerialPacketBase* serialPacket) {
memset(packet->data, 0, packet->maxlen); memset(packet->data, 0, packet->maxlen);
serializePacket(serialPacket, packet->data); serializePacket(packet->data, serialPacket);
packet->len = PACKET_BUFFER_SIZE; packet->len = PACKET_BUFFER_SIZE;
packet->address = *add; packet->address = *add;
@@ -179,9 +180,9 @@ int UDPNetworkUtility::SendTo(IPaddress* add, SerialPacket* serialPacket) {
return ret; return ret;
} }
int UDPNetworkUtility::SendTo(int channel, SerialPacket* serialPacket) { int UDPNetworkUtility::SendTo(int channel, SerialPacketBase* serialPacket) {
memset(packet->data, 0, packet->maxlen); memset(packet->data, 0, packet->maxlen);
serializePacket(serialPacket, packet->data); serializePacket(packet->data, serialPacket);
packet->len = PACKET_BUFFER_SIZE; packet->len = PACKET_BUFFER_SIZE;
int ret = SDLNet_UDP_Send(socket, channel, packet); int ret = SDLNet_UDP_Send(socket, channel, packet);
@@ -193,9 +194,9 @@ int UDPNetworkUtility::SendTo(int channel, SerialPacket* serialPacket) {
return ret; return ret;
} }
int UDPNetworkUtility::SendToAllChannels(SerialPacket* serialPacket) { int UDPNetworkUtility::SendToAllChannels(SerialPacketBase* serialPacket) {
memset(packet->data, 0, packet->maxlen); memset(packet->data, 0, packet->maxlen);
serializePacket(serialPacket, packet->data); serializePacket(packet->data, serialPacket);
packet->len = PACKET_BUFFER_SIZE; packet->len = PACKET_BUFFER_SIZE;
int sent = 0; int sent = 0;
@@ -210,10 +211,10 @@ int UDPNetworkUtility::SendToAllChannels(SerialPacket* serialPacket) {
return sent; return sent;
} }
int UDPNetworkUtility::Receive(SerialPacket* serialPacket) { int UDPNetworkUtility::Receive(SerialPacketBase* serialPacket) {
memset(packet->data, 0, packet->maxlen); memset(packet->data, 0, packet->maxlen);
int ret = SDLNet_UDP_Recv(socket, packet); int ret = SDLNet_UDP_Recv(socket, packet);
deserializePacket(serialPacket, packet->data); deserializePacket(packet->data, serialPacket);
serialPacket->srcAddress = packet->address; serialPacket->srcAddress = packet->address;
if (ret < 0) { if (ret < 0) {
+17 -12
View File
@@ -22,15 +22,15 @@
#ifndef UDPNETWORKUTILITY_HPP_ #ifndef UDPNETWORKUTILITY_HPP_
#define UDPNETWORKUTILITY_HPP_ #define UDPNETWORKUTILITY_HPP_
//common
#include "serial_packet_base.hpp"
#include "singleton.hpp"
//APIs
#include "SDL/SDL_net.h" #include "SDL/SDL_net.h"
#include "serial_packet.hpp" class UDPNetworkUtility : public Singleton<UDPNetworkUtility> {
class UDPNetworkUtility {
public: public:
UDPNetworkUtility() = default;
~UDPNetworkUtility() = default;
void Open(int port); void Open(int port);
void Close(); void Close();
@@ -50,12 +50,12 @@ public:
int SendToAllChannels(void* data, int len); int SendToAllChannels(void* data, int len);
int Receive(); int Receive();
//send a SerialPacket //send a SerialPacketBase
int SendTo(const char* ip, int port, SerialPacket* serialPacket); int SendTo(const char* ip, int port, SerialPacketBase* serialPacket);
int SendTo(IPaddress* add, SerialPacket* serialPacket); int SendTo(IPaddress* add, SerialPacketBase* serialPacket);
int SendTo(int channel, SerialPacket* serialPacket); int SendTo(int channel, SerialPacketBase* serialPacket);
int SendToAllChannels(SerialPacket* serialPacket); int SendToAllChannels(SerialPacketBase* serialPacket);
int Receive(SerialPacket* serialPacket); int Receive(SerialPacketBase* serialPacket);
//accessors //accessors
UDPpacket* GetPacket() const { UDPpacket* GetPacket() const {
@@ -65,6 +65,11 @@ public:
return socket; return socket;
} }
private: private:
friend Singleton<UDPNetworkUtility>;
UDPNetworkUtility() = default;
~UDPNetworkUtility() = default;
UDPsocket socket = nullptr; UDPsocket socket = nullptr;
UDPpacket* packet = nullptr; UDPpacket* packet = nullptr;
}; };
+1
View File
@@ -36,6 +36,7 @@
* This class needs a rewrite. * This class needs a rewrite.
*/ */
//TODO: This thing is fucking terrible, fix it and the button class
class MenuBar { class MenuBar {
public: public:
MenuBar() = default; MenuBar() = default;
+78
View File
@@ -0,0 +1,78 @@
/* Copyright: (c) Kayne Ruse 2013, 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#ifndef BOUNDINGBOX_HPP_
#define BOUNDINGBOX_HPP_
#include <type_traits>
#include <algorithm>
class BoundingBox {
public:
//This is explicitly a POD
int x, y;
int w, h;
BoundingBox() = default;
BoundingBox(int i, int j): x(i), y(j), w(0), h(0) {};
BoundingBox(int i, int j, int k, int l): x(i), y(j), w(k), h(l) {};
~BoundingBox() = default;
BoundingBox& operator=(BoundingBox const&) = default;
int Size() {
return std::max(w*h,0);
}
bool CheckOverlap(BoundingBox rhs) {
return !(
x >= rhs.x + rhs.w ||
y >= rhs.y + rhs.h ||
rhs.x >= x + w ||
rhs.y >= y + h);
}
BoundingBox CalcOverlap(BoundingBox rhs) {
if (!CheckOverlap(rhs)) {
return {0, 0, 0, 0};
}
BoundingBox ret;
ret.x = std::max(x, rhs.x);
ret.y = std::max(y, rhs.y);
ret.w = std::min(x+w, rhs.x+rhs.w) - ret.x;
ret.h = std::min(y+h, rhs.y+rhs.h) - ret.y;
return ret;
}
};
//This is explicitly a POD
static_assert(std::is_pod<BoundingBox>::value, "BoundingBox is not a POD");
#include "vector2.hpp"
//operators
inline BoundingBox operator+(BoundingBox b, Vector2 v) {
return {b.x + (int)v.x, b.y + (int)v.y, b.w, b.h};
}
inline BoundingBox operator+(Vector2 v, BoundingBox b) {
return b + v;
}
#endif
-40
View File
@@ -1,40 +0,0 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include "check_bounds.hpp"
bool checkPoint(Vector2 const& origin, Vector2 const& bound, Vector2 const& point) {
return !(
point.x < origin.x ||
point.y < origin.y ||
point.x >= origin.x + bound.x ||
point.y >= origin.y + bound.y
);
}
bool checkOverlap(Vector2 const& originOne, Vector2 const& boundOne, Vector2 const& originTwo, Vector2 const& boundTwo) {
return !(
originOne.x >= originTwo.x + boundTwo.x ||
originOne.x + boundOne.x >= originTwo.x ||
originOne.y >= originTwo.y + boundTwo.y ||
originOne.y + boundOne.y >= originTwo.y
);
}
+42 -17
View File
@@ -25,25 +25,37 @@
#include <fstream> #include <fstream>
#include <stdexcept> #include <stdexcept>
using namespace std; void ConfigUtility::Load(std::string fname) {
//clear the stored configuration
configMap.clear();
//pass to the recursive method
configMap = Read(fname);
}
void ConfigUtility::Load(string fname) { ConfigUtility::table_t ConfigUtility::Read(std::string fname) {
ifstream is(fname); //read in and return this file's data
table_t retTable;
std::ifstream is(fname);
if (!is.is_open()) { if (!is.is_open()) {
throw(runtime_error("Failed to open config file")); std::string msg;
msg += "Failed to open a config file: ";
msg += fname;
throw(std::runtime_error(msg));
} }
string key, val; std::string key, val;
for (;;) { //forever while(true) { //forever
//eat whitespace //eat whitespace
while(isspace(is.peek())) while(isspace(is.peek())) {
is.ignore(); is.ignore();
}
//end of file //end of file
if (is.eof()) if (is.eof()) {
break; break;
}
//skip comment lines //skip comment lines
if (is.peek() == '#') { if (is.peek() == '#') {
@@ -64,41 +76,54 @@ void ConfigUtility::Load(string fname) {
while(key.size() && isspace(*(key.end()-1))) key.erase(key.end() - 1); while(key.size() && isspace(*(key.end()-1))) key.erase(key.end() - 1);
while(val.size() && isspace(*(val.end()-1))) val.erase(val.end() - 1); while(val.size() && isspace(*(val.end()-1))) val.erase(val.end() - 1);
//allow empty/wiped values //disallow empty/wiped values
if (key.size() == 0) { if (key.size() == 0) {
continue; continue;
} }
//save the pair //save the pair
table[key] = val; retTable[key] = val;
} }
is.close(); is.close();
//load in any subordinate config files
//TODO: Possibility of nesting config levels?
if (retTable.find("config.next") != retTable.end()) {
table_t subTable = Read(retTable["config.next"]);
retTable.insert(subTable.begin(), subTable.end());
}
return retTable;
} }
//-------------------------
//Convert to a type
//-------------------------
std::string& ConfigUtility::String(std::string s) { std::string& ConfigUtility::String(std::string s) {
return table[s]; return configMap[s];
} }
int ConfigUtility::Integer(std::string s) { int ConfigUtility::Integer(std::string s) {
std::map<std::string, std::string>::iterator it = table.find(s); table_t::iterator it = configMap.find(s);
if (it == table.end()) { if (it == configMap.end()) {
return 0; return 0;
} }
return atoi(it->second.c_str()); return atoi(it->second.c_str());
} }
double ConfigUtility::Double(std::string s) { double ConfigUtility::Double(std::string s) {
std::map<std::string, std::string>::iterator it = table.find(s); table_t::iterator it = configMap.find(s);
if (it == table.end()) { if (it == configMap.end()) {
return 0.0; return 0.0;
} }
return atof(it->second.c_str()); return atof(it->second.c_str());
} }
bool ConfigUtility::Boolean(std::string s) { bool ConfigUtility::Boolean(std::string s) {
std::map<std::string, std::string>::iterator it = table.find(s); table_t::iterator it = configMap.find(s);
if (it == table.end()) { if (it == configMap.end()) {
return false; return false;
} }
return it->second == "true"; return it->second == "true";
+16 -18
View File
@@ -22,14 +22,13 @@
#ifndef CONFIGUTILITY_HPP_ #ifndef CONFIGUTILITY_HPP_
#define CONFIGUTILITY_HPP_ #define CONFIGUTILITY_HPP_
#include "singleton.hpp"
#include <map> #include <map>
#include <string> #include <string>
class ConfigUtility { class ConfigUtility : public Singleton<ConfigUtility> {
public: public:
ConfigUtility() = default;
ConfigUtility(std::string s) { Load(s); }
void Load(std::string fname); void Load(std::string fname);
//convert to a type //convert to a type
@@ -39,22 +38,21 @@ public:
bool Boolean(std::string); bool Boolean(std::string);
//shorthand //shorthand
std::string& operator[](std::string s) { inline std::string& operator[](std::string s) { return configMap[s]; }
return String(s); inline int Int(std::string s) { return Integer(s); }
} inline bool Bool(std::string s) { return Boolean(s); }
int Int(std::string s) {
return Integer(s);
}
bool Bool(std::string s) {
return Boolean(s);
}
//OO breaker
std::map<std::string, std::string>* GetMap() {
return &table;
}
private: private:
std::map<std::string, std::string> table; typedef std::map<std::string, std::string> table_t;
friend Singleton<ConfigUtility>;
ConfigUtility() = default;
~ConfigUtility() = default;
table_t Read(std::string fname);
table_t configMap;
}; };
#endif #endif
@@ -19,30 +19,45 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#ifndef ENEMYFACTORYINTERFACE_HPP_ #ifndef SINGLETON_HPP_
#define ENEMYFACTORYINTERFACE_HPP_ #define SINGLETON_HPP_
#include "enemy_data.hpp" #include <stdexcept>
#include "room_data.hpp"
#include <list> template<typename T>
class Singleton {
//NOTE: Based on biome, world difficulty, etc.
class EnemyFactoryInterface {
public: public:
EnemyFactoryInterface() = default; static T& GetSingleton() {
virtual ~EnemyFactoryInterface() = default; if (!ptr) {
throw(std::logic_error("This singleton has not been created"));
}
return *ptr;
}
static void Create() {
if (ptr) {
throw(std::logic_error("This singleton has already been created"));
}
ptr = new T();
}
static void Delete() {
if (!ptr) {
throw(std::logic_error("A non-existant singleton cannot be deleted"));
}
delete ptr;
ptr = nullptr;
}
virtual void Generate(std::list<EnemyData>* container) = 0;
//control the difficulty of the room
RoomData::RoomType SetType(RoomData::RoomType t) { return type = t; }
int SetDifficulty(int d) { return difficulty = d; }
RoomData::RoomType GetType() { return type; }
int GetDifficulty() { return difficulty; }
protected: protected:
RoomData::RoomType type; Singleton() = default;
int difficulty; Singleton(Singleton const&) = default;
Singleton(Singleton&&) = default;
~Singleton() = default;
private:
static T* ptr;
}; };
#endif template<typename T>
T* Singleton<T>::ptr = nullptr;
#endif
-9
View File
@@ -23,15 +23,6 @@
#include <algorithm> #include <algorithm>
int snapToBase(int base, int x) {
//snap to a grid
if (x < 0) {
++x;
return x / base * base - base;
}
return x / base * base;
}
std::string truncatePath(std::string pathname) { std::string truncatePath(std::string pathname) {
return std::string( return std::string(
std::find_if( std::find_if(
-1
View File
@@ -24,7 +24,6 @@
#include <string> #include <string>
int snapToBase(int base, int x);
std::string truncatePath(std::string pathname); std::string truncatePath(std::string pathname);
//fixing known bugs in g++ //fixing known bugs in g++
+7 -9
View File
@@ -41,6 +41,13 @@ public:
double SquaredLength() const { double SquaredLength() const {
return x*x+y*y; return x*x+y*y;
} }
void Normalize() {
double l = Length();
if (l == 0)
throw(std::domain_error("Divide by zero"));
x /= l;
y /= l;
}
//Arithmetic operators //Arithmetic operators
Vector2 operator+(Vector2 v) const { Vector2 operator+(Vector2 v) const {
@@ -97,15 +104,6 @@ public:
template<typename T> bool operator!=(T t) { return (x != t || y != t); } template<typename T> bool operator!=(T t) { return (x != t || y != t); }
}; };
//non-member templates (flip the order)
template<typename T> Vector2 operator+(T t, Vector2 v) { return v + t; }
template<typename T> Vector2 operator-(T t, Vector2 v) { return v - t; }
template<typename T> Vector2 operator*(T t, Vector2 v) { return v * t; }
template<typename T> Vector2 operator/(T t, Vector2 v) { return v / t; }
template<typename T> bool operator==(T t, Vector2 v) { return v == t; }
template<typename T> bool operator!=(T t, Vector2 v) { return v != t; }
//This is explicitly a POD //This is explicitly a POD
static_assert(std::is_pod<Vector2>::value, "Vector2 is not a POD"); static_assert(std::is_pod<Vector2>::value, "Vector2 is not a POD");
+15
View File
@@ -0,0 +1,15 @@
Future versions (to be determined) may be released under a modified version of the Uplink Developer's License.
The current version of Tortuga is released under the zlib license.
Copyright (c) 2013, 2014 Kayne Ruse
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
+11 -4
View File
@@ -3,10 +3,6 @@
#MKDIR=mkdir #MKDIR=mkdir
#RM=del /y #RM=del /y
CXXFLAGS+=-static-libgcc -static-libstdc++
export
OUTDIR=out OUTDIR=out
all: $(OUTDIR) all: $(OUTDIR)
@@ -14,6 +10,17 @@ all: $(OUTDIR)
$(MAKE) -C server $(MAKE) -C server
$(MAKE) -C client $(MAKE) -C client
debug: export CXXFLAGS+=-g
debug: clean all
release: export CXXFLAGS+=-static-libgcc -static-libstdc++
release: clean all package
#For use on my machine ONLY
package:
rar a -r -ep Tortuga.rar $(OUTDIR)/*.exe $(OUTDIR)/*.dll
rar a -r Tortuga.rar rsc/* copyright.txt
$(OUTDIR): $(OUTDIR):
mkdir $(OUTDIR) mkdir $(OUTDIR)
+2
View File
@@ -8,6 +8,8 @@ server.name = local
server.dbname = database.db server.dbname = database.db
#client specific settings #client specific settings
#client.screen.w = 800
#client.screen.h = 600
client.screen.f = false client.screen.f = false
client.username = Kayne Ruse client.username = Kayne Ruse
+45 -13
View File
@@ -1,20 +1,52 @@
print("Lua script check (./rsc)") print("Lua script check")
------------------------- --uber lazy declarations
--Map API overrides function math.sqr(x) return x*x end
------------------------- function math.dist(x, y, i, j) return math.sqrt(math.sqr(x - i) + math.sqr(y - j)) end
function region.create(r) --tile macros, mapped to the tilesheet
for i = 1, region.getwidth() do local base = 14
for j = 1, region.getheight() do local shift = 36
if math.abs(region.getx(r) + i -1) == math.abs(region.gety(r) + j -1) then tiles = {
region.settile(r, i, j, 1, 50) plains = base + shift * 0,
grass = base + shift * 1,
dirt = base + shift * 2,
sand = base + shift * 3,
water = base + shift * 4
}
--custom generation systems here
function islandGenerator(region)
io.write("Generating (", Region.GetX(region), ", ", Region.GetY(region), ")\n")
for i = 1, Region.GetWidth(region) do
for j = 1, Region.GetHeight(region) do
local dist = math.dist(0, 0, i + Region.GetX(region) -1, j + Region.GetY(region) -1)
if dist < 10 then
Region.SetTile(region, i, j, 1, tiles.plains)
elseif dist < 12 then
Region.SetTile(region, i, j, 1, tiles.sand)
else else
region.settile(r, i, j, 1, 14) Region.SetTile(region, i, j, 1, tiles.water)
Region.SetSolid(region, i, j, true)
end end
end end
end end
--signal
region.settile(r, 4, 5, 2, 86)
end end
--Get some regions
--BUG: The server fails without at least one room
--TODO: Create rooms with names?
newRoom = RoomManager.CreateRoom()
pager = Room.GetPager(newRoom)
RegionPager.SetOnCreate(pager, islandGenerator)
--[[
regionTable = {
RegionPager.GetRegion(pager, Region.GetWidth() * 0, Region.GetHeight() * 0),
RegionPager.GetRegion(pager, Region.GetWidth() *-1, Region.GetHeight() * 0),
RegionPager.GetRegion(pager, Region.GetWidth() * 0, Region.GetHeight() *-1),
RegionPager.GetRegion(pager, Region.GetWidth() *-1, Region.GetHeight() *-1)
}
]]
print("Finished the lua script")
@@ -19,33 +19,40 @@
* 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 COMBATMANAGER_HPP_ #ifndef ACCOUNTDATA_HPP_
#define COMBATMANAGER_HPP_ #define ACCOUNTDATA_HPP_
#include "combat_data.hpp" #include <string>
#include "lua/lua.hpp" class AccountData {
#include <map>
class CombatManager {
public: public:
CombatManager() = default; AccountData() = default;
~CombatManager() = default; ~AccountData() = default;
//public access methods
//TODO
//accessors and mutators //accessors and mutators
CombatData* GetCombat(int uid); int SetClientIndex(int i) { return clientIndex = i; }
std::map<int, CombatData>* GetContainer(); int GetClientIndex() { return clientIndex; }
lua_State* SetLuaState(lua_State*); std::string SetUsername(std::string s) { return username = s; }
lua_State* GetLuaState(); std::string GetUsername() { return username; }
//database stuff
bool GetBlackListed() { return blackListed; }
bool GetWhiteListed() { return whiteListed; }
bool GetModerator() { return mod; }
bool GetAdministrator() { return admin; }
private: private:
std::map<int, CombatData> combatMap; friend class AccountManager;
lua_State* luaState = nullptr;
int clientIndex;
std::string username;
//TODO: password
bool blackListed = false;
bool whiteListed = true;
bool mod = false;
bool admin = false;
}; };
#endif #endif
@@ -23,16 +23,14 @@
#define ACCOUNTMANAGER_HPP_ #define ACCOUNTMANAGER_HPP_
#include "account_data.hpp" #include "account_data.hpp"
#include "singleton.hpp"
#include "sqlite3/sqlite3.h" #include "sqlite3/sqlite3.h"
#include <map> #include <map>
class AccountManager { class AccountManager : public Singleton<AccountManager> {
public: public:
AccountManager() = default;
~AccountManager() { UnloadAll(); };
//public access methods //public access methods
int CreateAccount(std::string username, int clientIndex); int CreateAccount(std::string username, int clientIndex);
int LoadAccount(std::string username, int clientIndex); int LoadAccount(std::string username, int clientIndex);
@@ -50,6 +48,11 @@ public:
sqlite3* GetDatabase(); sqlite3* GetDatabase();
private: private:
friend Singleton<AccountManager>;
AccountManager() = default;
~AccountManager() = default;
std::map<int, AccountData> accountMap; std::map<int, AccountData> accountMap;
sqlite3* database = nullptr; sqlite3* database = nullptr;
}; };
+37
View File
@@ -0,0 +1,37 @@
#config
INCLUDES+=. ../../common/utilities
LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
#source
CXXSRC=$(wildcard *.cpp)
#objects
OBJDIR=obj
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
#output
OUTDIR=..
OUT=$(addprefix $(OUTDIR)/,server.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
@@ -22,57 +22,50 @@
#ifndef CHARACTERDATA_HPP_ #ifndef CHARACTERDATA_HPP_
#define CHARACTERDATA_HPP_ #define CHARACTERDATA_HPP_
//components
#include "character_defines.hpp"
#include "vector2.hpp" #include "vector2.hpp"
#include "statistics.hpp" #include "statistics.hpp"
//graphics
#ifdef GRAPHICS
#include "sprite_sheet.hpp"
#endif
//std namespace //std namespace
#include <string> #include <string>
#include <cmath> #include <cmath>
//the speeds that the characters move class CharacterData {
constexpr double CHARACTER_WALKING_SPEED = 140.0; public:
constexpr double CHARACTER_WALKING_MOD = 1.0/sqrt(2.0); CharacterData() = default;
~CharacterData() = default;
struct CharacterData { //location and movement
//metadata int SetRoomIndex(int i) { return roomIndex = i; }
int owner; Vector2 SetOrigin(Vector2 v) { return origin = v; }
std::string handle; Vector2 SetMotion(Vector2 v) { return motion = v; }
std::string avatar;
int GetRoomIndex() { return roomIndex; }
Vector2 GetOrigin() { return origin; }
Vector2 GetMotion() { return motion; }
//accessors and mutators
Statistics* GetBaseStats() { return &baseStats; }
//database stuff
int GetOwner() { return owner; }
std::string GetHandle() { return handle; }
std::string GetAvatar() { return avatar; }
private:
friend class CharacterManager;
//world position //world position
int roomIndex = 0; int roomIndex = 0;
Vector2 origin = {0.0,0.0}; Vector2 origin = {0.0,0.0};
Vector2 motion = {0.0,0.0}; Vector2 motion = {0.0,0.0};
Vector2 bounds = {0.0,0.0};
//base statistics Statistics baseStats;
Statistics stats;
//TODO: equipment int owner;
//TODO: items std::string handle;
//TODO: buffs std::string avatar;
//TODO: 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 #endif

Some files were not shown because too many files have changed in this diff Show More