Merge branch 'develop'
This commit is contained in:
@@ -19,27 +19,23 @@
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "character_data.hpp"
|
||||
#include "character.hpp"
|
||||
|
||||
void CharacterData::Update(double delta) {
|
||||
void Character::Update(double delta) {
|
||||
if (motion.x && motion.y) {
|
||||
origin += motion * delta * CHARACTER_WALKING_MOD;
|
||||
}
|
||||
else if (motion != 0) {
|
||||
origin += motion * delta;
|
||||
}
|
||||
#ifdef GRAPHICS
|
||||
sprite.Update(delta);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef GRAPHICS
|
||||
|
||||
void CharacterData::DrawTo(SDL_Surface* const dest, int camX, int camY) {
|
||||
void Character::DrawTo(SDL_Surface* const dest, int camX, int 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
|
||||
if (motion.y > 0) {
|
||||
sprite.SetYIndex(0);
|
||||
@@ -63,5 +59,3 @@ void CharacterData::CorrectSprite() {
|
||||
sprite.SetXIndex(0);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,94 @@
|
||||
/* 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 "statistics.hpp"
|
||||
|
||||
//graphics
|
||||
#include "sprite_sheet.hpp"
|
||||
|
||||
//std namespace
|
||||
#include <string>
|
||||
#include <cmath>
|
||||
|
||||
class Character {
|
||||
public:
|
||||
Character() = default;
|
||||
~Character() = default;
|
||||
|
||||
void Update(double delta);
|
||||
|
||||
//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; }
|
||||
Vector2 SetBounds(Vector2 v) { return bounds = v; }
|
||||
Vector2 GetBounds() const { 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};
|
||||
Vector2 bounds = {CHARACTER_BOUNDS_WIDTH,CHARACTER_BOUNDS_HEIGHT};
|
||||
};
|
||||
|
||||
//tmp
|
||||
#include <map>
|
||||
typedef std::map<int, Character> CharacterMap;
|
||||
|
||||
#endif
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include <stdexcept>
|
||||
#include <chrono>
|
||||
#include <iostream>
|
||||
|
||||
//-------------------------
|
||||
//Scene headers
|
||||
@@ -44,24 +45,71 @@
|
||||
//-------------------------
|
||||
|
||||
void ClientApplication::Init(int argc, char** argv) {
|
||||
std::cout << "Beginning " << argv[0] << std::endl;
|
||||
|
||||
//load the prerequisites
|
||||
config.Load("rsc\\config.cfg");
|
||||
|
||||
//-------------------------
|
||||
//Initialize the APIs
|
||||
//-------------------------
|
||||
|
||||
//initialize SDL
|
||||
if (SDL_Init(SDL_INIT_VIDEO)) {
|
||||
throw(std::runtime_error("Failed to initialize SDL"));
|
||||
}
|
||||
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 SDL" << std::endl;
|
||||
|
||||
//initialize SDL_net
|
||||
if (SDLNet_Init()) {
|
||||
throw(std::runtime_error("Failed to initialize SDL_net"));
|
||||
}
|
||||
network.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_SOLID_FOOTPRINT);
|
||||
DEBUG_OUTPUT_VAR(REGION_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() {
|
||||
@@ -100,9 +148,11 @@ void ClientApplication::Proc() {
|
||||
}
|
||||
|
||||
void ClientApplication::Quit() {
|
||||
std::cout << "Shutting down" << std::endl;
|
||||
network.Close();
|
||||
SDLNet_Quit();
|
||||
SDL_Quit();
|
||||
std::cout << "Clean exit" << std::endl;
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
@@ -127,13 +177,13 @@ void ClientApplication::LoadScene(SceneList sceneIndex) {
|
||||
activeScene = new LobbyMenu(&config, &network, &clientIndex, &accountIndex);
|
||||
break;
|
||||
case SceneList::INWORLD:
|
||||
activeScene = new InWorld(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap);
|
||||
activeScene = new InWorld(&config, &network, &clientIndex, &accountIndex, &characterIndex, &characterMap);
|
||||
break;
|
||||
case SceneList::INCOMBAT:
|
||||
activeScene = new InCombat(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap, &enemyMap);
|
||||
activeScene = new InCombat(&config, &network, &clientIndex, &accountIndex, &characterIndex, &characterMap);
|
||||
break;
|
||||
case SceneList::CLEANUP:
|
||||
activeScene = new CleanUp(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap, &enemyMap);
|
||||
activeScene = new CleanUp(&config, &network, &clientIndex, &accountIndex, &characterIndex, &characterMap);
|
||||
break;
|
||||
default:
|
||||
throw(std::logic_error("Failed to recognize the scene index"));
|
||||
|
||||
@@ -27,9 +27,7 @@
|
||||
|
||||
#include "config_utility.hpp"
|
||||
#include "udp_network_utility.hpp"
|
||||
#include "character_data.hpp"
|
||||
#include "combat_data.hpp"
|
||||
#include "enemy_data.hpp"
|
||||
#include "character.hpp"
|
||||
|
||||
#include <map>
|
||||
|
||||
@@ -56,9 +54,7 @@ private:
|
||||
int accountIndex = -1;
|
||||
int characterIndex = -1;
|
||||
|
||||
std::map<int, CombatData> combatMap;
|
||||
std::map<int, CharacterData> characterMap;
|
||||
std::map<int, EnemyData> enemyMap;
|
||||
CharacterMap characterMap;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
using namespace std;
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
cout << "Beginning client" << endl;
|
||||
try {
|
||||
ClientApplication app;
|
||||
app.Init(argc, argv);
|
||||
@@ -38,6 +37,5 @@ int main(int argc, char** argv) {
|
||||
cerr << "Fatal exception thrown: " << e.what() << endl;
|
||||
return 1;
|
||||
}
|
||||
cout << "Clean exit" << endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
+4
-3
@@ -1,7 +1,7 @@
|
||||
#config
|
||||
INCLUDES+=. ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet ../common/network/serial ../common/ui ../common/utilities
|
||||
LIBS+=../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) -DGRAPHICS
|
||||
INCLUDES+=. scenes ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet ../common/network/serial ../common/ui ../common/utilities
|
||||
LIBS+=client.a ../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
#source
|
||||
CXXSRC=$(wildcard *.cpp)
|
||||
@@ -16,6 +16,7 @@ OUT=$(addprefix $(OUTDIR)/,client)
|
||||
|
||||
#targets
|
||||
all: $(OBJ) $(OUT)
|
||||
$(MAKE) -C scenes
|
||||
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)
|
||||
|
||||
$(OBJ): | $(OBJDIR)
|
||||
|
||||
@@ -35,18 +35,14 @@ CleanUp::CleanUp(
|
||||
int* const argClientIndex,
|
||||
int* const argAccountIndex,
|
||||
int* const argCharacterIndex,
|
||||
std::map<int, CombatData>* argCombatMap,
|
||||
std::map<int, CharacterData>* argCharacterMap,
|
||||
std::map<int, EnemyData>* argEnemyMap
|
||||
CharacterMap* argCharacterMap
|
||||
):
|
||||
config(*argConfig),
|
||||
network(*argNetwork),
|
||||
clientIndex(*argClientIndex),
|
||||
accountIndex(*argAccountIndex),
|
||||
characterIndex(*argCharacterIndex),
|
||||
combatMap(*argCombatMap),
|
||||
characterMap(*argCharacterMap),
|
||||
enemyMap(*argEnemyMap)
|
||||
characterMap(*argCharacterMap)
|
||||
{
|
||||
//setup the utility objects
|
||||
image.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
||||
@@ -69,9 +65,9 @@ CleanUp::CleanUp(
|
||||
clientIndex = -1;
|
||||
accountIndex = -1;
|
||||
characterIndex = -1;
|
||||
combatMap.clear();
|
||||
// combatMap.clear();
|
||||
characterMap.clear();
|
||||
enemyMap.clear();
|
||||
// enemyMap.clear();
|
||||
|
||||
//auto return
|
||||
startTick = std::chrono::steady_clock::now();
|
||||
@@ -34,9 +34,7 @@
|
||||
#include "config_utility.hpp"
|
||||
#include "frame_rate.hpp"
|
||||
|
||||
#include "combat_data.hpp"
|
||||
#include "character_data.hpp"
|
||||
#include "enemy_data.hpp"
|
||||
#include "character.hpp"
|
||||
|
||||
//client
|
||||
#include "base_scene.hpp"
|
||||
@@ -53,9 +51,7 @@ public:
|
||||
int* const argClientIndex,
|
||||
int* const argAccountIndex,
|
||||
int* const argCharacterIndex,
|
||||
std::map<int, CombatData>* argCombatMap,
|
||||
std::map<int, CharacterData>* argCharacterMap,
|
||||
std::map<int, EnemyData>* argEnemyMap
|
||||
CharacterMap* argCharacterMap
|
||||
);
|
||||
~CleanUp();
|
||||
|
||||
@@ -79,9 +75,7 @@ protected:
|
||||
int& clientIndex;
|
||||
int& accountIndex;
|
||||
int& characterIndex;
|
||||
std::map<int, CombatData>& combatMap;
|
||||
std::map<int, CharacterData>& characterMap;
|
||||
std::map<int, EnemyData>& enemyMap;
|
||||
CharacterMap& characterMap;
|
||||
|
||||
//graphics
|
||||
Image image;
|
||||
@@ -36,18 +36,14 @@ InCombat::InCombat(
|
||||
int* const argClientIndex,
|
||||
int* const argAccountIndex,
|
||||
int* const argCharacterIndex,
|
||||
std::map<int, CombatData>* argCombatMap,
|
||||
std::map<int, CharacterData>* argCharacterMap,
|
||||
std::map<int, EnemyData>* argEnemyMap
|
||||
CharacterMap* argCharacterMap
|
||||
):
|
||||
config(*argConfig),
|
||||
network(*argNetwork),
|
||||
clientIndex(*argClientIndex),
|
||||
accountIndex(*argAccountIndex),
|
||||
characterIndex(*argCharacterIndex),
|
||||
combatMap(*argCombatMap),
|
||||
characterMap(*argCharacterMap),
|
||||
enemyMap(*argEnemyMap)
|
||||
characterMap(*argCharacterMap)
|
||||
{
|
||||
/* //setup the utility objects
|
||||
buttonImage.LoadSurface(config["dir.interface"] + "button_menu.bmp");
|
||||
@@ -34,9 +34,7 @@
|
||||
#include "config_utility.hpp"
|
||||
#include "frame_rate.hpp"
|
||||
|
||||
#include "combat_data.hpp"
|
||||
#include "character_data.hpp"
|
||||
#include "enemy_data.hpp"
|
||||
#include "character.hpp"
|
||||
|
||||
//client
|
||||
#include "base_scene.hpp"
|
||||
@@ -50,9 +48,7 @@ public:
|
||||
int* const argClientIndex,
|
||||
int* const argAccountIndex,
|
||||
int* const argCharacterIndex,
|
||||
std::map<int, CombatData>* argCombatMap,
|
||||
std::map<int, CharacterData>* argCharacterMap,
|
||||
std::map<int, EnemyData>* argEnemyMap
|
||||
CharacterMap* argCharacterMap
|
||||
);
|
||||
~InCombat();
|
||||
|
||||
@@ -75,14 +71,12 @@ protected:
|
||||
//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;
|
||||
@@ -90,9 +84,7 @@ protected:
|
||||
int& clientIndex;
|
||||
int& accountIndex;
|
||||
int& characterIndex;
|
||||
std::map<int, CombatData>& combatMap;
|
||||
std::map<int, CharacterData>& characterMap;
|
||||
std::map<int, EnemyData>& enemyMap;
|
||||
CharacterMap& characterMap;
|
||||
|
||||
//graphics
|
||||
//TODO: graphics
|
||||
@@ -24,9 +24,10 @@
|
||||
#include "channels.hpp"
|
||||
#include "utility.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <stdexcept>
|
||||
#include <iostream>
|
||||
|
||||
//-------------------------
|
||||
//Public access members
|
||||
@@ -38,15 +39,13 @@ InWorld::InWorld(
|
||||
int* const argClientIndex,
|
||||
int* const argAccountIndex,
|
||||
int* const argCharacterIndex,
|
||||
std::map<int, CombatData>* argCombatMap,
|
||||
std::map<int, CharacterData>* argCharacterMap
|
||||
CharacterMap* argCharacterMap
|
||||
):
|
||||
config(*argConfig),
|
||||
network(*argNetwork),
|
||||
clientIndex(*argClientIndex),
|
||||
accountIndex(*argAccountIndex),
|
||||
characterIndex(*argCharacterIndex),
|
||||
combatMap(*argCombatMap),
|
||||
characterMap(*argCharacterMap)
|
||||
{
|
||||
//setup the utility objects
|
||||
@@ -106,10 +105,12 @@ void InWorld::Update(double delta) {
|
||||
it.second.Update(delta);
|
||||
}
|
||||
|
||||
//TODO: Check collisions here
|
||||
|
||||
//update the camera
|
||||
if(localCharacter) {
|
||||
camera.x = localCharacter->origin.x - camera.marginX;
|
||||
camera.y = localCharacter->origin.y - camera.marginY;
|
||||
camera.x = localCharacter->GetOrigin().x - camera.marginX;
|
||||
camera.y = localCharacter->GetOrigin().y - camera.marginY;
|
||||
}
|
||||
|
||||
//check the map
|
||||
@@ -175,77 +176,60 @@ void InWorld::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
||||
}
|
||||
|
||||
void InWorld::KeyDown(SDL_KeyboardEvent const& key) {
|
||||
switch(key.keysym.sym) {
|
||||
//player movement
|
||||
case SDLK_LEFT:
|
||||
if (localCharacter) {
|
||||
localCharacter->motion.x -= CHARACTER_WALKING_SPEED;
|
||||
localCharacter->CorrectSprite();
|
||||
SendPlayerUpdate();
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_RIGHT:
|
||||
if (localCharacter) {
|
||||
localCharacter->motion.x += CHARACTER_WALKING_SPEED;
|
||||
localCharacter->CorrectSprite();
|
||||
SendPlayerUpdate();
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_UP:
|
||||
if (localCharacter) {
|
||||
localCharacter->motion.y -= CHARACTER_WALKING_SPEED;
|
||||
localCharacter->CorrectSprite();
|
||||
SendPlayerUpdate();
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_DOWN:
|
||||
if (localCharacter) {
|
||||
localCharacter->motion.y += CHARACTER_WALKING_SPEED;
|
||||
localCharacter->CorrectSprite();
|
||||
SendPlayerUpdate();
|
||||
}
|
||||
break;
|
||||
if (!localCharacter) {
|
||||
return;
|
||||
}
|
||||
|
||||
//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) {
|
||||
switch(key.keysym.sym) {
|
||||
//player movement
|
||||
case SDLK_LEFT:
|
||||
if (localCharacter) {
|
||||
localCharacter->motion.x += CHARACTER_WALKING_SPEED;
|
||||
localCharacter->CorrectSprite();
|
||||
SendPlayerUpdate();
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_RIGHT:
|
||||
if (localCharacter) {
|
||||
localCharacter->motion.x -= CHARACTER_WALKING_SPEED;
|
||||
localCharacter->CorrectSprite();
|
||||
SendPlayerUpdate();
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_UP:
|
||||
if (localCharacter) {
|
||||
localCharacter->motion.y += CHARACTER_WALKING_SPEED;
|
||||
localCharacter->CorrectSprite();
|
||||
SendPlayerUpdate();
|
||||
}
|
||||
break;
|
||||
|
||||
case SDLK_DOWN:
|
||||
if (localCharacter) {
|
||||
localCharacter->motion.y -= CHARACTER_WALKING_SPEED;
|
||||
localCharacter->CorrectSprite();
|
||||
SendPlayerUpdate();
|
||||
}
|
||||
break;
|
||||
if (!localCharacter) {
|
||||
return;
|
||||
}
|
||||
|
||||
//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();
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
@@ -286,36 +270,41 @@ void InWorld::HandleCharacterNew(CharacterPacket* const argPacket) {
|
||||
}
|
||||
|
||||
//create the character object
|
||||
CharacterData& character = characterMap[argPacket->characterIndex];
|
||||
Character& newCharacter = characterMap[argPacket->characterIndex];
|
||||
|
||||
//set the members
|
||||
character.handle = argPacket->handle;
|
||||
character.avatar = argPacket->avatar;
|
||||
character.sprite.LoadSurface(config["dir.sprites"] + character.avatar, 4, 4);
|
||||
character.roomIndex = argPacket->roomIndex;
|
||||
character.origin = argPacket->origin;
|
||||
character.motion = argPacket->motion;
|
||||
character.stats = argPacket->stats;
|
||||
//fill out the character's members
|
||||
newCharacter.SetHandle(argPacket->handle);
|
||||
newCharacter.SetAvatar(argPacket->avatar);
|
||||
|
||||
character.CorrectSprite();
|
||||
newCharacter.GetSprite()->LoadSurface(config["dir.sprites"] + newCharacter.GetAvatar(), 4, 4);
|
||||
|
||||
newCharacter.SetOrigin(argPacket->origin);
|
||||
newCharacter.SetMotion(argPacket->motion);
|
||||
|
||||
(*newCharacter.GetStats()) = argPacket->stats;
|
||||
|
||||
//bookkeeping code
|
||||
newCharacter.CorrectSprite();
|
||||
|
||||
//catch this client's player object
|
||||
if (argPacket->accountIndex == accountIndex && !localCharacter) {
|
||||
characterIndex = argPacket->characterIndex;
|
||||
localCharacter = &character;
|
||||
localCharacter = &newCharacter;
|
||||
|
||||
//setup the camera
|
||||
//TODO: move this?
|
||||
camera.width = GetScreen()->w;
|
||||
camera.height = GetScreen()->h;
|
||||
|
||||
//center on the player's character
|
||||
camera.marginX = (GetScreen()->w / 2 - localCharacter->sprite.GetImage()->GetClipW() / 2);
|
||||
camera.marginY = (GetScreen()->h / 2 - localCharacter->sprite.GetImage()->GetClipH() / 2);
|
||||
camera.marginX = (GetScreen()->w / 2 - localCharacter->GetSprite()->GetImage()->GetClipW() / 2);
|
||||
camera.marginY = (GetScreen()->h / 2 - localCharacter->GetSprite()->GetImage()->GetClipH() / 2);
|
||||
}
|
||||
}
|
||||
|
||||
void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) {
|
||||
//TODO: authenticate when own character is being deleted (linked to a TODO in the server)
|
||||
|
||||
//catch this client's player object
|
||||
if (argPacket->characterIndex == characterIndex) {
|
||||
characterIndex = -1;
|
||||
@@ -327,17 +316,17 @@ void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) {
|
||||
|
||||
void InWorld::HandleCharacterUpdate(CharacterPacket* const argPacket) {
|
||||
if (characterMap.find(argPacket->characterIndex) == characterMap.end()) {
|
||||
std::cout << "Warning: HandleCharacterUpdate() is passing to HandleCharacterNew()" << std::endl;
|
||||
HandleCharacterNew(argPacket);
|
||||
return;
|
||||
}
|
||||
|
||||
CharacterData& character = characterMap[argPacket->characterIndex];
|
||||
Character& character = characterMap[argPacket->characterIndex];
|
||||
|
||||
//other characters moving
|
||||
if (argPacket->characterIndex != characterIndex) {
|
||||
character.roomIndex = argPacket->roomIndex;
|
||||
character.origin = argPacket->origin;
|
||||
character.motion = argPacket->motion;
|
||||
character.SetOrigin(argPacket->origin);
|
||||
character.SetMotion(argPacket->motion);
|
||||
character.CorrectSprite();
|
||||
}
|
||||
}
|
||||
@@ -364,6 +353,8 @@ void InWorld::RequestSynchronize() {
|
||||
newPacket.clientIndex = clientIndex;
|
||||
newPacket.accountIndex = accountIndex;
|
||||
|
||||
//TODO: location, range for sync request
|
||||
|
||||
network.SendTo(Channels::SERVER, &newPacket);
|
||||
}
|
||||
|
||||
@@ -374,12 +365,12 @@ void InWorld::SendPlayerUpdate() {
|
||||
newPacket.type = SerialPacketType::CHARACTER_UPDATE;
|
||||
|
||||
newPacket.characterIndex = characterIndex;
|
||||
//handle, avatar
|
||||
//NOTE: omitting the handle and avatar here
|
||||
newPacket.accountIndex = accountIndex;
|
||||
newPacket.roomIndex = localCharacter->roomIndex;
|
||||
newPacket.origin = localCharacter->origin;
|
||||
newPacket.motion = localCharacter->motion;
|
||||
newPacket.stats = localCharacter->stats;
|
||||
newPacket.roomIndex = 0; //TODO: room index
|
||||
newPacket.origin = localCharacter->GetOrigin();
|
||||
newPacket.motion = localCharacter->GetMotion();
|
||||
newPacket.stats = *localCharacter->GetStats();
|
||||
|
||||
//TODO: gameplay components: equipment, items, buffs, debuffs
|
||||
|
||||
@@ -435,7 +426,7 @@ void InWorld::UpdateMap() {
|
||||
|
||||
//prune distant regions
|
||||
for (std::list<Region>::iterator it = regionPager.GetContainer()->begin(); it != regionPager.GetContainer()->end(); /* EMPTY */) {
|
||||
//check if the region is outside off this area
|
||||
//check if the region is outside of this area
|
||||
if (it->GetX() < xStart || it->GetX() > xEnd || it->GetY() < yStart || it->GetY() > yEnd) {
|
||||
|
||||
//clunky, but the alternative was time consuming
|
||||
@@ -38,8 +38,7 @@
|
||||
#include "config_utility.hpp"
|
||||
#include "frame_rate.hpp"
|
||||
|
||||
#include "combat_data.hpp"
|
||||
#include "character_data.hpp"
|
||||
#include "character.hpp"
|
||||
|
||||
//client
|
||||
#include "base_scene.hpp"
|
||||
@@ -56,8 +55,7 @@ public:
|
||||
int* const argClientIndex,
|
||||
int* const argAccountIndex,
|
||||
int* const argCharacterIndex,
|
||||
std::map<int, CombatData>* argCombatMap,
|
||||
std::map<int, CharacterData>* argCharacterMap
|
||||
CharacterMap* argCharacterMap
|
||||
);
|
||||
~InWorld();
|
||||
|
||||
@@ -101,8 +99,7 @@ protected:
|
||||
int& clientIndex;
|
||||
int& accountIndex;
|
||||
int& characterIndex;
|
||||
std::map<int, CombatData>& combatMap;
|
||||
std::map<int, CharacterData>& characterMap;
|
||||
CharacterMap& characterMap;
|
||||
|
||||
//graphics
|
||||
Image buttonImage;
|
||||
@@ -124,7 +121,7 @@ protected:
|
||||
FrameRate fps;
|
||||
|
||||
//game
|
||||
CharacterData* localCharacter = nullptr;
|
||||
Character* localCharacter = nullptr;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,5 +1,5 @@
|
||||
#config
|
||||
INCLUDES+=. generators
|
||||
INCLUDES+=. .. ../../common/gameplay ../../common/graphics ../../common/map ../../common/network ../../common/network/packet ../../common/network/serial ../../common/ui ../../common/utilities
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
@@ -12,12 +12,11 @@ OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||
|
||||
#output
|
||||
OUTDIR=..
|
||||
OUT=$(addprefix $(OUTDIR)/,server.a)
|
||||
OUT=$(addprefix $(OUTDIR)/,client.a)
|
||||
|
||||
#targets
|
||||
all: $(OBJ) $(OUT)
|
||||
ar -crs $(OUT) $(OBJ)
|
||||
$(MAKE) -C generators
|
||||
|
||||
$(OBJ): | $(OBJDIR)
|
||||
|
||||
+9
-10
@@ -19,18 +19,17 @@
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#ifndef CAVESGENERATOR_HPP_
|
||||
#define CAVESGENERATOR_HPP_
|
||||
#ifndef CHARACTERDEFINES_HPP_
|
||||
#define CHARACTERDEFINES_HPP_
|
||||
|
||||
#include "base_generator.hpp"
|
||||
#include <cmath>
|
||||
|
||||
class CavesGenerator : public BaseGenerator {
|
||||
public:
|
||||
CavesGenerator();
|
||||
~CavesGenerator();
|
||||
//the speeds that the characters move
|
||||
constexpr double CHARACTER_WALKING_SPEED = 140.0;
|
||||
constexpr double CHARACTER_WALKING_MOD = 1.0/sqrt(2.0);
|
||||
|
||||
private:
|
||||
//
|
||||
};
|
||||
//the bounding boxes for the characters
|
||||
constexpr double CHARACTER_BOUNDS_WIDTH = 32.0;
|
||||
constexpr double CHARACTER_BOUNDS_HEIGHT = 32.0;
|
||||
|
||||
#endif
|
||||
@@ -19,22 +19,16 @@
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#ifndef TERRAINTYPE_HPP_
|
||||
#define TERRAINTYPE_HPP_
|
||||
#ifndef COMBATDEFINES_HPP_
|
||||
#define COMBATDEFINES_HPP_
|
||||
|
||||
#define COMBAT_MAX_CHARACTERS 16
|
||||
#define COMBAT_MAX_ENEMIES 16
|
||||
|
||||
enum class TerrainType {
|
||||
//default: something's wrong
|
||||
NONE = 0,
|
||||
|
||||
//standard overworld
|
||||
PLAINS,
|
||||
GRASS,
|
||||
DIRT,
|
||||
SAND,
|
||||
WATER,
|
||||
|
||||
//not used
|
||||
LAST,
|
||||
GRASSLANDS,
|
||||
//etc.
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,7 +1,7 @@
|
||||
#config
|
||||
INCLUDES+=. ../utilities ../graphics
|
||||
INCLUDES+=.
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) -DGRAPHICS
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
#source
|
||||
CXXSRC=$(wildcard *.cpp)
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
/* Copyright: (c) Kayne Ruse 2014
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "character_data.hpp"
|
||||
#include "combat_data.hpp"
|
||||
#include "enemy_data.hpp"
|
||||
#include "statistics.hpp"
|
||||
|
||||
/* DOCS: Sanity check, read more
|
||||
* Since most/all of the files in this directory are header files, I've created
|
||||
* this source file as a "sanity check", to ensure that the above header files
|
||||
* are written correctly via make.
|
||||
*/
|
||||
@@ -35,6 +35,7 @@ Region::Region(int argX, int argY): x(argX), y(argY) {
|
||||
|
||||
Region::Region(Region const& rhs): x(rhs.x), y(rhs.y) {
|
||||
memcpy(tiles, rhs.tiles, REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH*sizeof(type_t));
|
||||
solid = rhs.solid;
|
||||
}
|
||||
|
||||
Region::type_t Region::SetTile(int x, int y, int z, type_t v) {
|
||||
@@ -44,3 +45,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) {
|
||||
return tiles[x][y][z];
|
||||
}
|
||||
|
||||
bool Region::SetSolid(int x, int y, bool b) {
|
||||
return solid[x * REGION_WIDTH + y] = b;
|
||||
}
|
||||
|
||||
bool Region::GetSolid(int x, int y) {
|
||||
return solid[x * REGION_WIDTH + y];
|
||||
}
|
||||
@@ -22,10 +22,17 @@
|
||||
#ifndef REGION_HPP_
|
||||
#define REGION_HPP_
|
||||
|
||||
#include <bitset>
|
||||
#include <cmath>
|
||||
|
||||
//the region's storage format
|
||||
constexpr int REGION_WIDTH = 20;
|
||||
constexpr int REGION_HEIGHT = 20;
|
||||
constexpr int REGION_DEPTH = 3;
|
||||
|
||||
//the size of the solid map
|
||||
constexpr int REGION_SOLID_FOOTPRINT = ceil(REGION_WIDTH * REGION_HEIGHT / 8.0);
|
||||
|
||||
class Region {
|
||||
public:
|
||||
typedef unsigned char type_t;
|
||||
@@ -38,14 +45,23 @@ public:
|
||||
type_t SetTile(int x, int y, int z, type_t v);
|
||||
type_t GetTile(int x, int y, int z);
|
||||
|
||||
bool SetSolid(int x, int y, bool b);
|
||||
bool GetSolid(int x, int y);
|
||||
|
||||
//accessors
|
||||
int GetX() const { return x; }
|
||||
int GetY() const { return y; }
|
||||
|
||||
std::bitset<REGION_WIDTH*REGION_HEIGHT>* GetSolidBitset() { return &solid; }
|
||||
private:
|
||||
const int x;
|
||||
const int y;
|
||||
|
||||
type_t tiles[REGION_WIDTH][REGION_HEIGHT][REGION_DEPTH];
|
||||
std::bitset<REGION_WIDTH*REGION_HEIGHT> solid;
|
||||
};
|
||||
|
||||
//the memory footprint of the tile and solid data; not including any metadata
|
||||
constexpr int REGION_FOOTPRINT = REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) + REGION_SOLID_FOOTPRINT;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -37,6 +37,20 @@ static int getTile(lua_State* L) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int setSolid(lua_State* L) {
|
||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||
bool ret = region->SetSolid(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_toboolean(L, 4));
|
||||
lua_pushboolean(L, ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getSolid(lua_State* L) {
|
||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||
bool ret = region->GetSolid(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1);
|
||||
lua_pushboolean(L, ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getX(lua_State* L) {
|
||||
Region* region = reinterpret_cast<Region*>(lua_touserdata(L, 1));
|
||||
lua_pushinteger(L, region->GetX());
|
||||
@@ -85,9 +99,12 @@ static int onUnload(lua_State* L) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
//TODO: wrappers for the collision map
|
||||
static const luaL_Reg regionLib[] = {
|
||||
{"SetTile",setTile},
|
||||
{"GetTile",getTile},
|
||||
{"SetSolid",setSolid},
|
||||
{"GetSolid",getSolid},
|
||||
{"GetX",getX},
|
||||
{"GetY",getY},
|
||||
{"GetWidth",getWidth},
|
||||
|
||||
@@ -43,6 +43,20 @@ static int getTile(lua_State* L) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int setSolid(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
bool ret = pager->SetSolid(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_toboolean(L, 4));
|
||||
lua_pushboolean(L, ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getSolid(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
bool ret = pager->GetSolid(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||
lua_pushboolean(L, ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getRegion(lua_State* L) {
|
||||
RegionPagerLua* pager = reinterpret_cast<RegionPagerLua*>(lua_touserdata(L, 1));
|
||||
Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||
@@ -94,6 +108,8 @@ static int unloadRegion(lua_State* L) {
|
||||
static const luaL_Reg pagerlib[] = {
|
||||
{"SetTile", setTile},
|
||||
{"GetTile", getTile},
|
||||
{"SetSolid", setSolid},
|
||||
{"GetSolid", getSolid},
|
||||
{"GetRegion", getRegion},
|
||||
{"SetDirectory", setDirectory},
|
||||
{"GetDirectory", getDirectory},
|
||||
|
||||
@@ -36,6 +36,16 @@ Region::type_t RegionPagerBase::GetTile(int x, int y, int 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) {
|
||||
//get the region by various means
|
||||
Region* ptr = nullptr;
|
||||
|
||||
@@ -35,6 +35,10 @@ public:
|
||||
virtual Region::type_t SetTile(int x, int y, int z, Region::type_t v);
|
||||
virtual Region::type_t GetTile(int x, int y, int z);
|
||||
|
||||
//solid manipulation
|
||||
virtual bool SetSolid(int x, int y, int b);
|
||||
virtual bool GetSolid(int x, int y);
|
||||
|
||||
//region manipulation
|
||||
virtual Region* GetRegion(int x, int y);
|
||||
virtual Region* FindRegion(int x, int y);
|
||||
|
||||
@@ -24,13 +24,13 @@
|
||||
|
||||
#include "serial_packet_base.hpp"
|
||||
|
||||
#include "combat_data.hpp"
|
||||
#include "combat_defines.hpp"
|
||||
|
||||
struct CombatPacket : SerialPacketBase {
|
||||
//identify the combat instance
|
||||
int combatIndex;
|
||||
int difficulty;
|
||||
CombatData::Terrain terrainType;
|
||||
TerrainType terrainType;
|
||||
|
||||
//combatants
|
||||
int characterArray[COMBAT_MAX_CHARACTERS];
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
#include "SDL/SDL_net.h"
|
||||
|
||||
constexpr int NETWORK_VERSION = 20140607;
|
||||
constexpr int NETWORK_VERSION = 20140701;
|
||||
constexpr int PACKET_STRING_SIZE = 100;
|
||||
|
||||
struct SerialPacketBase {
|
||||
|
||||
@@ -53,13 +53,15 @@ 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)
|
||||
/* DOCS: Keep PACKET_BUFFER_SIZE up to date
|
||||
* DOCS: SerialPacketType::REGION_CONTENT is currently the largest type of packet, read more
|
||||
* The metadata used are:
|
||||
* SerialPacketType
|
||||
* room index
|
||||
* X & Y positon
|
||||
* The rest is taken up by the Regions's content.
|
||||
*/
|
||||
|
||||
constexpr int PACKET_BUFFER_SIZE = REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) + sizeof(int) * 3 + sizeof(SerialPacketType);
|
||||
constexpr int PACKET_BUFFER_SIZE = sizeof(SerialPacketType) + sizeof(int) * 3 + REGION_FOOTPRINT;
|
||||
|
||||
#endif
|
||||
@@ -29,7 +29,7 @@ void serializeCombat(CombatPacket* packet, void* buffer) {
|
||||
//identify the combat instance
|
||||
SERIALIZE(buffer, &packet->combatIndex, sizeof(int));
|
||||
SERIALIZE(buffer, &packet->difficulty, sizeof(int));
|
||||
SERIALIZE(buffer, &packet->terrainType, sizeof(CombatData::Terrain));
|
||||
SERIALIZE(buffer, &packet->terrainType, sizeof(TerrainType));
|
||||
|
||||
//combatants
|
||||
SERIALIZE(buffer, &packet->characterArray, sizeof(int) * COMBAT_MAX_CHARACTERS);
|
||||
@@ -49,7 +49,7 @@ void deserializeCombat(CombatPacket* packet, void* buffer) {
|
||||
//identify the combat instance
|
||||
DESERIALIZE(buffer, &packet->combatIndex, sizeof(int));
|
||||
DESERIALIZE(buffer, &packet->difficulty, sizeof(int));
|
||||
DESERIALIZE(buffer, &packet->terrainType, sizeof(CombatData::Terrain));
|
||||
DESERIALIZE(buffer, &packet->terrainType, sizeof(TerrainType));
|
||||
|
||||
//combatants
|
||||
DESERIALIZE(buffer, &packet->characterArray, sizeof(int) * COMBAT_MAX_CHARACTERS);
|
||||
|
||||
@@ -40,7 +40,7 @@ void serializeRegionContent(RegionPacket* packet, void* buffer) {
|
||||
SERIALIZE(buffer, &packet->x, sizeof(int));
|
||||
SERIALIZE(buffer, &packet->y, sizeof(int));
|
||||
|
||||
//content
|
||||
//tiles
|
||||
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++) {
|
||||
@@ -49,6 +49,9 @@ void serializeRegionContent(RegionPacket* packet, void* buffer) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//solids
|
||||
SERIALIZE(buffer, packet->region->GetSolidBitset(), REGION_SOLID_FOOTPRINT);
|
||||
}
|
||||
|
||||
void deserializeRegionFormat(RegionPacket* packet, void* buffer) {
|
||||
@@ -71,7 +74,7 @@ void deserializeRegionContent(RegionPacket* packet, void* buffer) {
|
||||
//an object to work on
|
||||
packet->region = new Region(packet->x, packet->y);
|
||||
|
||||
//content
|
||||
//tiles
|
||||
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++) {
|
||||
@@ -80,4 +83,7 @@ void deserializeRegionContent(RegionPacket* packet, void* buffer) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//solids
|
||||
DESERIALIZE(buffer, packet->region->GetSolidBitset(), REGION_SOLID_FOOTPRINT);
|
||||
}
|
||||
@@ -36,6 +36,7 @@
|
||||
* This class needs a rewrite.
|
||||
*/
|
||||
|
||||
//TODO: This thing is fucking terrible, fix it and the button class
|
||||
class MenuBar {
|
||||
public:
|
||||
MenuBar() = default;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
print("Lua script check (./rsc)")
|
||||
print("Lua script check")
|
||||
|
||||
--uber lazy declarations
|
||||
function square(x) return x*x end
|
||||
@@ -19,10 +19,13 @@ Region.OnCreate = function(region)
|
||||
local ret = Region.hcOnCreate(region) --best practices
|
||||
for i = 1, Region.GetWidth() do
|
||||
for j = 1, Region.GetHeight() do
|
||||
if distance(0, 0, i + Region.GetX(region) -1, j + Region.GetY(region) -1) > 10 then
|
||||
Region.SetTile(region, i, j, 1, water)
|
||||
else
|
||||
local dist = distance(0, 0, i + Region.GetX(region) -1, j + Region.GetY(region) -1)
|
||||
if dist < 10 then
|
||||
Region.SetTile(region, i, j, 1, plains)
|
||||
elseif dist < 12 then
|
||||
Region.SetTile(region, i, j, 1, sand)
|
||||
else
|
||||
Region.SetTile(region, i, j, 1, water)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -33,10 +36,10 @@ end
|
||||
newRoom = RoomMgr.CreateRoom("overworld")
|
||||
pager = Room.GetPager(newRoom)
|
||||
regionTable = {
|
||||
RegionPager.GetRegion(pager, 0, 0),
|
||||
RegionPager.GetRegion(pager, 0, -20),
|
||||
RegionPager.GetRegion(pager, -20, 0),
|
||||
RegionPager.GetRegion(pager, -20, -20)
|
||||
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")
|
||||
@@ -22,22 +22,15 @@
|
||||
#ifndef CHARACTERDATA_HPP_
|
||||
#define CHARACTERDATA_HPP_
|
||||
|
||||
//components
|
||||
#include "character_defines.hpp"
|
||||
#include "vector2.hpp"
|
||||
#include "statistics.hpp"
|
||||
|
||||
//graphics
|
||||
#ifdef GRAPHICS
|
||||
#include "sprite_sheet.hpp"
|
||||
#endif
|
||||
|
||||
//std namespace
|
||||
#include <string>
|
||||
#include <cmath>
|
||||
|
||||
//the speeds that the characters move
|
||||
constexpr double CHARACTER_WALKING_SPEED = 140.0;
|
||||
constexpr double CHARACTER_WALKING_MOD = 1.0/sqrt(2.0);
|
||||
|
||||
struct CharacterData {
|
||||
//metadata
|
||||
int owner;
|
||||
@@ -48,25 +41,14 @@ struct CharacterData {
|
||||
int roomIndex = 0;
|
||||
Vector2 origin = {0.0,0.0};
|
||||
Vector2 motion = {0.0,0.0};
|
||||
Vector2 bounds = {0.0,0.0};
|
||||
|
||||
//base statistics
|
||||
Statistics stats;
|
||||
|
||||
//TODO: gameplay components: equipment, items, buffs, debuffs
|
||||
|
||||
//methods
|
||||
void Update(double delta);
|
||||
#ifdef GRAPHICS
|
||||
void DrawTo(SDL_Surface* const, int camX, int camY);
|
||||
void CorrectSprite();
|
||||
#endif
|
||||
|
||||
//active gameplay members
|
||||
//NOTE: these are lost when unloaded
|
||||
#ifdef GRAPHICS
|
||||
SpriteSheet sprite;
|
||||
#endif
|
||||
bool inCombat = false;
|
||||
int atbGauge = 0;
|
||||
//TODO: stored command
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
struct ClientData {
|
||||
IPaddress address = {0,0};
|
||||
//TODO: ping system?
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -23,31 +23,18 @@
|
||||
#define COMBATDATA_HPP_
|
||||
|
||||
#include "vector2.hpp"
|
||||
#include "combat_defines.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;
|
||||
@@ -60,11 +47,6 @@ struct CombatData {
|
||||
|
||||
//time interval
|
||||
Clock::time_point lastTick = Clock::now();
|
||||
|
||||
//graphics
|
||||
#ifdef GRAPHICS
|
||||
SpriteSheet sprite;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,5 +1,5 @@
|
||||
#config
|
||||
INCLUDES+=. ../../common/gameplay ../../common/utilities
|
||||
INCLUDES+=. ../../common/gameplay ../../common/utilities ../characters ../enemies
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
|
||||
@@ -25,11 +25,6 @@
|
||||
#include "vector2.hpp"
|
||||
#include "statistics.hpp"
|
||||
|
||||
//graphics
|
||||
#ifdef GRAPHICS
|
||||
#include "sprite_sheet.hpp"
|
||||
#endif
|
||||
|
||||
//std namespace
|
||||
#include <string>
|
||||
|
||||
@@ -45,11 +40,6 @@ struct EnemyData {
|
||||
|
||||
//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;
|
||||
};
|
||||
@@ -1,34 +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 "enemy_factory_generic.hpp"
|
||||
|
||||
EnemyFactoryGeneric::EnemyFactoryGeneric() : EnemyFactoryInterface() {
|
||||
//EMPTY
|
||||
}
|
||||
|
||||
EnemyFactoryGeneric::~EnemyFactoryGeneric() noexcept {
|
||||
//EMPTY
|
||||
}
|
||||
|
||||
void EnemyFactoryGeneric::Generate(std::list<EnemyData>* container) {
|
||||
//TODO: fill this out
|
||||
}
|
||||
@@ -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.
|
||||
*/
|
||||
#ifndef ENEMYFACTORYGENERIC_HPP_
|
||||
#define ENEMYFACTORYGENERIC_HPP_
|
||||
|
||||
#include "enemy_factory_interface.hpp"
|
||||
|
||||
#include "enemy_data.hpp"
|
||||
|
||||
#include <list>
|
||||
|
||||
//DOCS: Not really intended for use, but rather for copying and tweaking
|
||||
class EnemyFactoryGeneric : public EnemyFactoryInterface {
|
||||
public:
|
||||
EnemyFactoryGeneric();
|
||||
~EnemyFactoryGeneric() noexcept override;
|
||||
|
||||
void Generate(std::list<EnemyData>* container) override;
|
||||
private:
|
||||
//TODO: hold the parameters specified by the room
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,49 +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 ENEMYFACTORYINTERFACE_HPP_
|
||||
#define ENEMYFACTORYINTERFACE_HPP_
|
||||
|
||||
#include "enemy_data.hpp"
|
||||
#include "map_type.hpp"
|
||||
|
||||
#include <list>
|
||||
|
||||
//NOTE: Based on biome, world difficulty, etc.
|
||||
class EnemyFactoryInterface {
|
||||
public:
|
||||
EnemyFactoryInterface() = default;
|
||||
virtual ~EnemyFactoryInterface() = default;
|
||||
|
||||
virtual void Generate(std::list<EnemyData>* container) = 0;
|
||||
|
||||
//control the difficulty of the room
|
||||
MapType SetType(MapType t) { return type = t; }
|
||||
MapType GetType() { return type; }
|
||||
|
||||
int SetDifficulty(int d) { return difficulty = d; }
|
||||
int GetDifficulty() { return difficulty; }
|
||||
protected:
|
||||
MapType type;
|
||||
int difficulty = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -40,7 +40,6 @@
|
||||
#include "region_pager_api.hpp"
|
||||
#include "room_api.hpp"
|
||||
#include "room_mgr_api.hpp"
|
||||
#include "generator_api.hpp"
|
||||
|
||||
//these libs are loaded by lua.c and are readily available to any Lua program
|
||||
static const luaL_Reg loadedlibs[] = {
|
||||
@@ -61,7 +60,6 @@ static const luaL_Reg loadedlibs[] = {
|
||||
{TORTUGA_REGION_PAGER_NAME, openRegionPagerAPI},
|
||||
{TORTUGA_ROOM_NAME, openRoomAPI},
|
||||
{TORTUGA_ROOM_MGR_NAME, openRoomMgrAPI},
|
||||
{TORTUGA_GENRATOR_NAME, openGeneratorAPI},
|
||||
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
+1
-5
@@ -21,15 +21,12 @@
|
||||
*/
|
||||
#include "server_application.hpp"
|
||||
|
||||
#include "SDL/SDL.h"
|
||||
|
||||
#include <stdexcept>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
cout << "Beginning server" << endl;
|
||||
try {
|
||||
ServerApplication app;
|
||||
app.Init(argc, argv);
|
||||
@@ -37,9 +34,8 @@ int main(int argc, char** argv) {
|
||||
app.Quit();
|
||||
}
|
||||
catch(exception& e) {
|
||||
cerr << "Fatal error: " << e.what() << endl;
|
||||
cerr << "Fatal exception thrown: " << e.what() << endl;
|
||||
return 1;
|
||||
}
|
||||
cout << "Clean exit" << endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -20,7 +20,6 @@ all: $(OBJ) $(OUT)
|
||||
$(MAKE) -C characters
|
||||
$(MAKE) -C combat
|
||||
$(MAKE) -C enemies
|
||||
$(MAKE) -C mapgen
|
||||
$(MAKE) -C rooms
|
||||
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)
|
||||
|
||||
|
||||
@@ -1,44 +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 CHUNKDATA_HPP_
|
||||
#define CHUNKDATA_HPP_
|
||||
|
||||
#include "terrain_type.hpp"
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
struct ChunkData {
|
||||
enum class Moddable {
|
||||
LOCKED, //do not change
|
||||
HARD, //minor changes
|
||||
SOFT, //major changes
|
||||
CLEAR, //untouched
|
||||
};
|
||||
|
||||
TerrainType type;
|
||||
// int fountainCount;
|
||||
Moddable mod;
|
||||
};
|
||||
|
||||
static_assert(std::is_pod<ChunkData>::value, "ChunkData is not a POD");
|
||||
|
||||
#endif
|
||||
@@ -1,79 +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 "generator_api.hpp"
|
||||
|
||||
#include "base_generator.hpp"
|
||||
|
||||
static int getMapType(lua_State* L) {
|
||||
BaseGenerator* ptr = reinterpret_cast<BaseGenerator*>(lua_touserdata(L, 1));
|
||||
switch(ptr->GetMapType()) {
|
||||
case MapType::NONE:
|
||||
lua_pushstring(L, "none");
|
||||
break;
|
||||
case MapType::OVERWORLD:
|
||||
lua_pushstring(L, "overworld");
|
||||
break;
|
||||
case MapType::RUINS:
|
||||
lua_pushstring(L, "ruins");
|
||||
break;
|
||||
case MapType::TOWERS:
|
||||
lua_pushstring(L, "towers");
|
||||
break;
|
||||
case MapType::FORESTS:
|
||||
lua_pushstring(L, "forests");
|
||||
break;
|
||||
case MapType::CAVES:
|
||||
lua_pushstring(L, "caves");
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getChunk(lua_State* L) {
|
||||
BaseGenerator* ptr = reinterpret_cast<BaseGenerator*>(lua_touserdata(L, 1));
|
||||
ChunkData* chunk = ptr->GetChunk(lua_tointeger(L, 2), lua_tointeger(L, 3));
|
||||
lua_pushlightuserdata(L, reinterpret_cast<void*>(chunk));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getMapWidth(lua_State* L) {
|
||||
lua_pushinteger(L, MAP_WIDTH);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getMapHeight(lua_State* L) {
|
||||
lua_pushinteger(L, MAP_HEIGHT);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const luaL_Reg generatorLib[] = {
|
||||
{"GetMapType", getMapType},
|
||||
{"GetChunk", getChunk},
|
||||
{"GetMapWidth", getMapWidth},
|
||||
{"GetMapHeight", getMapHeight},
|
||||
{nullptr, nullptr}
|
||||
};
|
||||
|
||||
LUAMOD_API int openGeneratorAPI(lua_State* L) {
|
||||
luaL_newlib(L, generatorLib);
|
||||
return 1;
|
||||
}
|
||||
@@ -1,30 +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 GENERATORAPI_HPP_
|
||||
#define GENERATORAPI_HPP_
|
||||
|
||||
#include "lua/lua.hpp"
|
||||
|
||||
#define TORTUGA_GENRATOR_NAME "Generator"
|
||||
LUAMOD_API int openGeneratorAPI(lua_State* L);
|
||||
|
||||
#endif
|
||||
@@ -1,36 +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 "base_generator.hpp"
|
||||
|
||||
BaseGenerator::BaseGenerator(MapType t) {
|
||||
mapType = t;
|
||||
for (int i = 0; i < MAP_WIDTH; i++) {
|
||||
for (int j = 0; j < MAP_HEIGHT; j++) {
|
||||
chunks[i][j].type = TerrainType::NONE;
|
||||
chunks[i][j].mod = ChunkData::Moddable::CLEAR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BaseGenerator::~BaseGenerator() {
|
||||
//
|
||||
}
|
||||
@@ -1,54 +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 BASEGENERATOR_HPP_
|
||||
#define BASEGENERATOR_HPP_
|
||||
|
||||
#include "map_type.hpp"
|
||||
#include "chunk_data.hpp"
|
||||
|
||||
#include "lua/lua.hpp"
|
||||
|
||||
constexpr int MAP_WIDTH = 256;
|
||||
constexpr int MAP_HEIGHT = 256;
|
||||
|
||||
class BaseGenerator {
|
||||
public:
|
||||
virtual ~BaseGenerator();
|
||||
|
||||
//accessors and mutators
|
||||
virtual ChunkData* GetChunk(int x, int y) { return &chunks[x][y]; }
|
||||
|
||||
MapType GetMapType() { return mapType; }
|
||||
|
||||
lua_State* SetLuaState(lua_State* L) { return luaState = L; }
|
||||
lua_State* GetLuaState() { return luaState; }
|
||||
|
||||
protected:
|
||||
BaseGenerator() = delete;
|
||||
BaseGenerator(MapType t);
|
||||
|
||||
ChunkData chunks[MAP_WIDTH][MAP_HEIGHT];
|
||||
MapType mapType = MapType::NONE;
|
||||
lua_State* luaState = nullptr;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,30 +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 "caves_generator.hpp"
|
||||
|
||||
CavesGenerator::CavesGenerator() : BaseGenerator(MapType::CAVES) {
|
||||
//
|
||||
}
|
||||
|
||||
CavesGenerator::~CavesGenerator() {
|
||||
//
|
||||
}
|
||||
@@ -1,30 +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 "forests_generator.hpp"
|
||||
|
||||
ForestsGenerator::ForestsGenerator() : BaseGenerator(MapType::FORESTS) {
|
||||
//
|
||||
}
|
||||
|
||||
ForestsGenerator::~ForestsGenerator() {
|
||||
//
|
||||
}
|
||||
@@ -1,36 +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 FORESTSGENERATOR_HPP_
|
||||
#define FORESTSGENERATOR_HPP_
|
||||
|
||||
#include "base_generator.hpp"
|
||||
|
||||
class ForestsGenerator : public BaseGenerator {
|
||||
public:
|
||||
ForestsGenerator();
|
||||
~ForestsGenerator();
|
||||
|
||||
private:
|
||||
//
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,37 +0,0 @@
|
||||
#config
|
||||
INCLUDES+=. ..
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
#source
|
||||
CXXSRC=$(wildcard *.cpp)
|
||||
|
||||
#objects
|
||||
OBJDIR=obj
|
||||
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
|
||||
|
||||
#output
|
||||
OUTDIR=../..
|
||||
OUT=$(addprefix $(OUTDIR)/,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
|
||||
@@ -1,30 +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 "overworld_generator.hpp"
|
||||
|
||||
OverworldGenerator::OverworldGenerator() : BaseGenerator(MapType::OVERWORLD) {
|
||||
//
|
||||
}
|
||||
|
||||
OverworldGenerator::~OverworldGenerator() {
|
||||
//
|
||||
}
|
||||
@@ -1,36 +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 OVERWORLDGENERATOR_HPP_
|
||||
#define OVERWORLDGENERATOR_HPP_
|
||||
|
||||
#include "base_generator.hpp"
|
||||
|
||||
class OverworldGenerator : public BaseGenerator {
|
||||
public:
|
||||
OverworldGenerator();
|
||||
~OverworldGenerator();
|
||||
|
||||
private:
|
||||
//
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,30 +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 "ruins_generator.hpp"
|
||||
|
||||
RuinsGenerator::RuinsGenerator() : BaseGenerator(MapType::RUINS) {
|
||||
//
|
||||
}
|
||||
|
||||
RuinsGenerator::~RuinsGenerator() {
|
||||
//
|
||||
}
|
||||
@@ -1,36 +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 RUINSGENERATOR_HPP_
|
||||
#define RUINSGENERATOR_HPP_
|
||||
|
||||
#include "base_generator.hpp"
|
||||
|
||||
class RuinsGenerator : public BaseGenerator {
|
||||
public:
|
||||
RuinsGenerator();
|
||||
~RuinsGenerator();
|
||||
|
||||
private:
|
||||
//
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,30 +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 "towers_generator.hpp"
|
||||
|
||||
TowersGenerator::TowersGenerator() : BaseGenerator(MapType::TOWERS) {
|
||||
//
|
||||
}
|
||||
|
||||
TowersGenerator::~TowersGenerator() {
|
||||
//
|
||||
}
|
||||
@@ -1,36 +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 TOWERSGENERATOR_HPP_
|
||||
#define TOWERSGENERATOR_HPP_
|
||||
|
||||
#include "base_generator.hpp"
|
||||
|
||||
class TowersGenerator : public BaseGenerator {
|
||||
public:
|
||||
TowersGenerator();
|
||||
~TowersGenerator();
|
||||
|
||||
private:
|
||||
//
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,34 +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 MAPTYPE_HPP_
|
||||
#define MAPTYPE_HPP_
|
||||
|
||||
enum class MapType {
|
||||
NONE,
|
||||
OVERWORLD,
|
||||
RUINS,
|
||||
TOWERS,
|
||||
FORESTS,
|
||||
CAVES,
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -29,12 +29,6 @@ static int getPager(lua_State* L) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int getGenerator(lua_State* L) {
|
||||
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
|
||||
lua_pushlightuserdata(L, reinterpret_cast<void*>(room->generator));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int onCreate(lua_State* L) {
|
||||
//TODO: onCreate()
|
||||
return 0;
|
||||
@@ -49,7 +43,6 @@ static int onUnload(lua_State* L) {
|
||||
|
||||
static const luaL_Reg roomLib[] = {
|
||||
{"GetPager",getPager},
|
||||
{"GetGenerator",getGenerator},
|
||||
{"OnCreate", onCreate},
|
||||
{"OnUnload", onUnload},
|
||||
{nullptr, nullptr}
|
||||
|
||||
@@ -23,14 +23,11 @@
|
||||
#define ROOMDATA_HPP_
|
||||
|
||||
//map system
|
||||
#include "map_type.hpp"
|
||||
#include "region_pager_lua.hpp"
|
||||
#include "base_generator.hpp"
|
||||
|
||||
struct RoomData {
|
||||
//members
|
||||
RegionPagerLua pager;
|
||||
BaseGenerator* generator = nullptr;
|
||||
|
||||
//TODO: collision map
|
||||
//TODO: NPCs?
|
||||
|
||||
@@ -21,41 +21,19 @@
|
||||
*/
|
||||
#include "room_manager.hpp"
|
||||
|
||||
//the generator types
|
||||
#include "overworld_generator.hpp"
|
||||
#include "ruins_generator.hpp"
|
||||
#include "towers_generator.hpp"
|
||||
#include "forests_generator.hpp"
|
||||
#include "caves_generator.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
//-------------------------
|
||||
//public access methods
|
||||
//-------------------------
|
||||
|
||||
RoomData* RoomManager::CreateRoom(MapType mapType) {
|
||||
RoomData* RoomManager::CreateRoom() {
|
||||
//create the room
|
||||
RoomData* newRoom = new RoomData();
|
||||
|
||||
//create the generator, use a lambda because I'm lazy
|
||||
newRoom->generator = [mapType]() -> BaseGenerator* {
|
||||
switch(mapType) {
|
||||
//BUG: Not having a map type results in an overworld generator by default
|
||||
case MapType::NONE:
|
||||
case MapType::OVERWORLD: return new OverworldGenerator();
|
||||
case MapType::RUINS: return new RuinsGenerator();
|
||||
case MapType::TOWERS: return new TowersGenerator();
|
||||
case MapType::FORESTS: return new ForestsGenerator();
|
||||
case MapType::CAVES: return new CavesGenerator();
|
||||
}
|
||||
throw(std::runtime_error("Failed to set the room's generator"));
|
||||
}();
|
||||
|
||||
//set the state
|
||||
if (luaState) {
|
||||
newRoom->pager.SetLuaState(luaState);
|
||||
newRoom->generator->SetLuaState(luaState);
|
||||
}
|
||||
|
||||
//register the room
|
||||
@@ -91,15 +69,13 @@ void RoomManager::UnloadRoom(int uid) {
|
||||
lua_pop(luaState, 1);
|
||||
|
||||
//free the memory
|
||||
delete room->generator;
|
||||
delete room;
|
||||
roomMap.erase(uid);
|
||||
}
|
||||
|
||||
RoomData* RoomManager::GetRoom(int uid) {
|
||||
RoomData* ptr = FindRoom(uid);
|
||||
if (ptr) return ptr;
|
||||
return CreateRoom(MapType::NONE);
|
||||
return FindRoom(uid);
|
||||
//TODO: expand this to auto-create the room
|
||||
}
|
||||
|
||||
RoomData* RoomManager::FindRoom(int uid) {
|
||||
|
||||
@@ -36,7 +36,7 @@ public:
|
||||
~RoomManager() = default;
|
||||
|
||||
//public access methods
|
||||
RoomData* CreateRoom(MapType);
|
||||
RoomData* CreateRoom();
|
||||
void UnloadRoom(int uid);
|
||||
|
||||
RoomData* GetRoom(int uid);
|
||||
|
||||
@@ -46,18 +46,8 @@ static int createRoom(lua_State* L) {
|
||||
lua_gettable(L, LUA_REGISTRYINDEX);
|
||||
RoomManager* roomMgr = reinterpret_cast<RoomManager*>(lua_touserdata(L, -1));
|
||||
|
||||
//determine the specified room type
|
||||
MapType mapType = [L]() -> MapType {
|
||||
if (std::string("overworld") == lua_tostring(L, -2)) return MapType::OVERWORLD;
|
||||
if (std::string("ruins") == lua_tostring(L, -2)) return MapType::RUINS;
|
||||
if (std::string("towers") == lua_tostring(L, -2)) return MapType::TOWERS;
|
||||
if (std::string("forests") == lua_tostring(L, -2)) return MapType::FORESTS;
|
||||
if (std::string("caves") == lua_tostring(L, -2)) return MapType::CAVES;
|
||||
return MapType::NONE;
|
||||
}();
|
||||
|
||||
//create the room
|
||||
RoomData* newRoom = roomMgr->CreateRoom(mapType);
|
||||
RoomData* newRoom = roomMgr->CreateRoom();
|
||||
|
||||
//return the new room
|
||||
lua_pushlightuserdata(L, newRoom);
|
||||
|
||||
@@ -21,8 +21,11 @@
|
||||
*/
|
||||
#include "server_application.hpp"
|
||||
|
||||
#include "sql_utility.hpp"
|
||||
//for PACKET_BUFFER_SIZE
|
||||
#include "serial.hpp"
|
||||
|
||||
//utility functions
|
||||
#include "sql_utility.hpp"
|
||||
#include "utility.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
@@ -35,9 +38,9 @@
|
||||
|
||||
void ServerApplication::Init(int argc, char** argv) {
|
||||
//NOTE: I might need to rearrange the init process so that lua & SQL can interact with the map system as needed.
|
||||
std::cout << "Beginning startup" << std::endl;
|
||||
std::cout << "Beginning " << argv[0] << std::endl;
|
||||
|
||||
//initial setup
|
||||
//load the prerequisites
|
||||
config.Load("rsc\\config.cfg");
|
||||
|
||||
//-------------------------
|
||||
@@ -80,9 +83,7 @@ void ServerApplication::Init(int argc, char** argv) {
|
||||
accountMgr.SetDatabase(database);
|
||||
characterMgr.SetDatabase(database);
|
||||
|
||||
combatMgr.SetLuaState(luaState);
|
||||
roomMgr.SetLuaState(luaState);
|
||||
enemyMgr.SetLuaState(luaState);
|
||||
|
||||
std::cout << "Internal managers set" << std::endl;
|
||||
|
||||
@@ -113,12 +114,22 @@ void ServerApplication::Init(int argc, char** argv) {
|
||||
//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;
|
||||
std::cout << "\tTile Size: " << sizeof(Region::type_t) << std::endl;
|
||||
std::cout << "\tRegion Format: " << REGION_WIDTH << ", " << REGION_HEIGHT << ", " << REGION_DEPTH << std::endl;
|
||||
std::cout << "\tRegion Content Footprint: " << REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) << std::endl;
|
||||
std::cout << "\tPACKET_BUFFER_SIZE: " << PACKET_BUFFER_SIZE << std::endl;
|
||||
std::cout << "\tMAX_PACKET_SIZE: " << MAX_PACKET_SIZE << 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_SOLID_FOOTPRINT);
|
||||
DEBUG_OUTPUT_VAR(REGION_FOOTPRINT);
|
||||
DEBUG_OUTPUT_VAR(PACKET_BUFFER_SIZE);
|
||||
DEBUG_OUTPUT_VAR(MAX_PACKET_SIZE);
|
||||
|
||||
#undef DEBUG_OUTPUT_VAR
|
||||
|
||||
//-------------------------
|
||||
//finalize the startup
|
||||
@@ -141,7 +152,8 @@ void ServerApplication::Proc() {
|
||||
HandlePacket(packetBuffer);
|
||||
}
|
||||
//update the internals
|
||||
//TODO: update the internals i.e. player positions
|
||||
//BUG: #30 Update the internals i.e. player positions
|
||||
|
||||
//give the computer a break
|
||||
SDL_Delay(10);
|
||||
}
|
||||
@@ -166,7 +178,7 @@ void ServerApplication::Quit() {
|
||||
SDLNet_Quit();
|
||||
SDL_Quit();
|
||||
|
||||
std::cout << "Shutdown finished" << std::endl;
|
||||
std::cout << "Clean exit" << std::endl;
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
@@ -269,6 +281,16 @@ void ServerApplication::HandleJoinRequest(ClientPacket* const argPacket) {
|
||||
|
||||
void ServerApplication::HandleDisconnect(ClientPacket* const argPacket) {
|
||||
//TODO: authenticate who is disconnecting/kicking
|
||||
/*Pseudocode:
|
||||
if sender's account index -> client index -> address == sender's address then
|
||||
continue
|
||||
end
|
||||
if sender's account index -> admin == true OR sender's account index -> mod == true then
|
||||
continue
|
||||
end
|
||||
if neither of the above is true, then output a warning to the console, and return
|
||||
*/
|
||||
|
||||
|
||||
//forward to the specified client
|
||||
network.SendTo(
|
||||
@@ -296,6 +318,12 @@ void ServerApplication::HandleDisconnect(ClientPacket* const argPacket) {
|
||||
|
||||
void ServerApplication::HandleShutdown(SerialPacket* const argPacket) {
|
||||
//TODO: authenticate who is shutting the server down
|
||||
/*Pseudocode:
|
||||
if sender's account -> admin is not true then
|
||||
print a warning
|
||||
return
|
||||
end
|
||||
*/
|
||||
|
||||
//end the server
|
||||
running = false;
|
||||
@@ -327,12 +355,6 @@ void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) {
|
||||
network.SendTo(&argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket));
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//combat management
|
||||
//-------------------------
|
||||
|
||||
//TODO: combat management
|
||||
|
||||
//-------------------------
|
||||
//Character Management
|
||||
//-------------------------
|
||||
@@ -399,15 +421,7 @@ void ServerApplication::HandleCharacterUpdate(CharacterPacket* const argPacket)
|
||||
return;
|
||||
}
|
||||
|
||||
/* TODO: rewrite this design flaw, read more
|
||||
* Slaving the client to the server here is a terrible idea, instead there
|
||||
* needs to be a utility function to update and send the server-side character
|
||||
* to the clients.
|
||||
*
|
||||
* Other things to consider include functionality to reequip the character,
|
||||
* apply status effects and to change the stats as well. These should all be
|
||||
* handled server-side.
|
||||
*/
|
||||
//accept client-side logic
|
||||
character->roomIndex = argPacket->roomIndex;
|
||||
character->origin = argPacket->origin;
|
||||
character->motion = argPacket->motion;
|
||||
@@ -419,12 +433,6 @@ void ServerApplication::HandleCharacterUpdate(CharacterPacket* const argPacket)
|
||||
PumpPacket(argPacket);
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//enemy management
|
||||
//-------------------------
|
||||
|
||||
//TODO: enemy management
|
||||
|
||||
//-------------------------
|
||||
//mismanagement
|
||||
//-------------------------
|
||||
|
||||
@@ -22,12 +22,10 @@
|
||||
#ifndef SERVERAPPLICATION_HPP_
|
||||
#define SERVERAPPLICATION_HPP_
|
||||
|
||||
//server specific stuff
|
||||
//server specific stuff, mostly managers
|
||||
#include "client_data.hpp"
|
||||
#include "account_manager.hpp"
|
||||
#include "character_manager.hpp"
|
||||
#include "client_data.hpp"
|
||||
#include "combat_manager.hpp"
|
||||
#include "enemy_manager.hpp"
|
||||
#include "room_manager.hpp"
|
||||
|
||||
//common utilities
|
||||
@@ -67,17 +65,11 @@ private:
|
||||
//map management
|
||||
void HandleRegionRequest(RegionPacket* const);
|
||||
|
||||
//combat management
|
||||
//TODO: combat management
|
||||
|
||||
//character management
|
||||
void HandleCharacterNew(CharacterPacket* const);
|
||||
void HandleCharacterDelete(CharacterPacket* const);
|
||||
void HandleCharacterUpdate(CharacterPacket* const);
|
||||
|
||||
//enemy management
|
||||
//TODO: enemy management
|
||||
|
||||
//mismanagement
|
||||
void HandleSynchronize(ClientPacket* const);
|
||||
|
||||
@@ -99,8 +91,6 @@ private:
|
||||
//managers
|
||||
AccountManager accountMgr;
|
||||
CharacterManager characterMgr;
|
||||
CombatManager combatMgr;
|
||||
EnemyManager enemyMgr;
|
||||
RoomManager roomMgr;
|
||||
|
||||
//misc
|
||||
|
||||
Reference in New Issue
Block a user