Merge branch 'develop'

This commit is contained in:
Kayne Ruse
2014-09-28 20:23:33 +10:00
20 changed files with 230 additions and 126 deletions
+2 -2
View File
@@ -45,12 +45,12 @@
//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; std::cout << "Beginning " << argv[0] << std::endl;
//load the prerequisites //load the prerequisites
ConfigUtility& config = ConfigUtility::GetSingleton(); ConfigUtility& config = ConfigUtility::GetSingleton();
config.Load("rsc\\config.cfg"); config.Load("rsc\\config.cfg", argc, argv);
//------------------------- //-------------------------
//Initialize the APIs //Initialize the APIs
+1 -1
View File
@@ -35,7 +35,7 @@
class ClientApplication: public Singleton<ClientApplication> { class ClientApplication: public Singleton<ClientApplication> {
public: public:
//public methods //public methods
void Init(int argc, char** argv); void Init(int argc, char* argv[]);
void Proc(); void Proc();
void Quit(); void Quit();
+37
View File
@@ -0,0 +1,37 @@
#config
INCLUDES+=.
LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
#source
CXXSRC=$(wildcard *.cpp)
#objects
OBJDIR=obj
OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o))
#output
OUTDIR=..
OUT=$(addprefix $(OUTDIR)/,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 -1
View File
@@ -30,7 +30,7 @@
using namespace std; using namespace std;
int main(int argc, char** argv) { int main(int argc, char* argv[]) {
try { try {
//create the singletons //create the singletons
ConfigUtility::Create(); ConfigUtility::Create();
+2 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. scenes ../common/debugging ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet_types ../common/ui ../common/utilities INCLUDES+=. client_utilities scenes ../common/debugging ../common/gameplay ../common/graphics ../common/map ../common/network ../common/network/packet_types ../common/ui ../common/utilities
LIBS+=client.a ../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)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
@@ -16,6 +16,7 @@ OUT=$(addprefix $(OUTDIR)/,client)
#targets #targets
all: $(OBJ) $(OUT) all: $(OBJ) $(OUT)
$(MAKE) -C client_utilities
$(MAKE) -C scenes $(MAKE) -C scenes
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS) $(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)
+2 -4
View File
@@ -25,7 +25,6 @@
#include "utility.hpp" #include "utility.hpp"
#include <stdexcept> #include <stdexcept>
#include <iostream>
//------------------------- //-------------------------
//Public access members //Public access members
@@ -113,7 +112,7 @@ void LobbyMenu::Render(SDL_Surface* const screen) {
(Uint16)listBox.w, (Uint16)listBox.h (Uint16)listBox.w, (Uint16)listBox.h
}; };
r.y += i * listBox.h; r.y += i * listBox.h;
SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 255, 127, 39)); SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 49, 150, 5));
} }
//draw the server name //draw the server name
@@ -226,8 +225,7 @@ void LobbyMenu::HandleJoinResponse(ClientPacket* const argPacket) {
} }
void LobbyMenu::HandleJoinRejection(TextPacket* const argPacket) { void LobbyMenu::HandleJoinRejection(TextPacket* const argPacket) {
//TODO: Better output //TODO: Better output for join rejection
std::cerr << "Error: " << argPacket->text << std::endl;
} }
//------------------------- //-------------------------
+68 -14
View File
@@ -22,14 +22,61 @@
#include "config_utility.hpp" #include "config_utility.hpp"
#include <cstdlib> #include <cstdlib>
#include <cstring>
#include <fstream> #include <fstream>
#include <sstream>
#include <stdexcept> #include <stdexcept>
void ConfigUtility::Load(std::string fname) { void ConfigUtility::Load(std::string fname, int argc, char* argv[]) {
//clear the stored configuration //clear the stored configuration
configMap.clear(); configMap.clear();
//pass to the recursive method
configMap = Read(fname); //use the default file
if (argc < 2) {
configMap = Read(fname);
return;
}
//some variables to use
table_t redirectedFile;
table_t cmdLineParams;
char key[256], val[256];
bool redirectUsed = false;
//reading from the command line
for (int i = 1; i < argc; ++i) {
//read from a specified config file
if (!strncmp(argv[i], "-config=", 8)) {
redirectedFile = Read(argv[i] + 8);
redirectUsed = true;
continue;
}
//set some specific values
if (!strncmp(argv[i], "-C", 2)) {
//wipe the variables
memset(key, 0, 256);
memset(key, 0, 256);
//read the key-value pair
if (sscanf(argv[i], "-C%[^=]=%[^\0]", key, val) != 2) {
std::ostringstream os;
os << "Failed to read a command line config argument (expected -C%s=%s):" << std::endl;
os << "\targv[" << i << "]: " << argv[i] << std::endl;
os << "\tkey: " << key << std::endl;
os << "\tval: " << val << std::endl;
throw(std::runtime_error( os.str() ));
}
cmdLineParams[key] = val;
}
}
//finally, construct the final config table
if (!redirectUsed) {
redirectedFile = Read(fname);
}
configMap.insert(cmdLineParams.begin(), cmdLineParams.end());
configMap.insert(redirectedFile.begin(), redirectedFile.end());
} }
ConfigUtility::table_t ConfigUtility::Read(std::string fname) { ConfigUtility::table_t ConfigUtility::Read(std::string fname) {
@@ -38,10 +85,9 @@ ConfigUtility::table_t ConfigUtility::Read(std::string fname) {
std::ifstream is(fname); std::ifstream is(fname);
if (!is.is_open()) { if (!is.is_open()) {
std::string msg; std::ostringstream os;
msg += "Failed to open a config file: "; os << "Failed to open a config file: " << fname;
msg += fname; throw(std::runtime_error( os.str() ));
throw(std::runtime_error(msg));
} }
std::string key, val; std::string key, val;
@@ -69,15 +115,23 @@ ConfigUtility::table_t ConfigUtility::Read(std::string fname) {
getline(is, key,'='); getline(is, key,'=');
getline(is, val); getline(is, val);
//trim the strings at the start & end //eat the whitespace at the start & end
while(key.size() && isspace(*key.begin())) key.erase(0, 1); while(key.size() && isspace( *key.begin() )) {
while(val.size() && isspace(*val.begin())) val.erase(0, 1); key.erase(0, 1);
}
while(val.size() && isspace( *val.begin() )) {
val.erase(0, 1);
}
while(key.size() && isspace(*(key.end()-1))) key.erase(key.end() - 1); while(key.size() && isspace( *(key.end()-1) )) {
while(val.size() && isspace(*(val.end()-1))) val.erase(val.end() - 1); key.erase(key.end() - 1);
}
while(val.size() && isspace( *(val.end()-1) )) {
val.erase(val.end() - 1);
}
//disallow empty/wiped values //disallow empty/wiped pairs
if (key.size() == 0) { if (key.size() == 0 || val.size() == 0) {
continue; continue;
} }
+1 -1
View File
@@ -29,7 +29,7 @@
class ConfigUtility : public Singleton<ConfigUtility> { class ConfigUtility : public Singleton<ConfigUtility> {
public: public:
void Load(std::string fname); void Load(std::string fname, int argc = 0, char* argv[] = nullptr);
//convert to a type //convert to a type
std::string& String(std::string); std::string& String(std::string);
+1 -1
View File
@@ -34,7 +34,7 @@ function islandGenerator(region)
end end
--Get some regions --Get some regions
--BUG: The server fails without at least one room --BUG: #35 The server fails without at least one room
--TODO: Create rooms with names? --TODO: Create rooms with names?
newRoom = RoomManager.CreateRoom() newRoom = RoomManager.CreateRoom()
pager = Room.GetPager(newRoom) pager = Room.GetPager(newRoom)
+67 -32
View File
@@ -1,33 +1,51 @@
--TODO: why is the database setup script scripted, while accessing, etc. hardcoded?
--there should be a way to control the database more directly
--TODO: move this script into a hardocded Init() method?
CREATE TABLE IF NOT EXISTS Accounts ( CREATE TABLE IF NOT EXISTS Accounts (
uid INTEGER PRIMARY KEY AUTOINCREMENT, uid INTEGER PRIMARY KEY AUTOINCREMENT,
username varchar(100) UNIQUE, username varchar(100) UNIQUE,
--TODO: server-client security --TODO: server-client security
-- password varchar(100), -- passhash varchar(100),
blacklisted BIT DEFAULT 0, -- passsalt varchar(100),
whitelisted BIT DEFAULT 1,
mod BIT DEFAULT 0, --server controls
admin BIT DEFAULT 0 blacklisted BIT DEFAULT 0,
whitelisted BIT DEFAULT 1,
mod BIT DEFAULT 0,
admin BIT DEFAULT 0
); );
CREATE TABLE IF NOT EXISTS Characters ( CREATE TABLE IF NOT EXISTS Characters (
uid INTEGER PRIMARY KEY AUTOINCREMENT, uid INTEGER PRIMARY KEY AUTOINCREMENT,
--metadata --metadata
owner INTEGER REFERENCES Accounts(uid), owner INTEGER REFERENCES Accounts(uid),
handle varchar(100) UNIQUE, handle varchar(100) UNIQUE,
avatar varchar(100), avatar varchar(100),
birth timestamp NOT NULL DEFAULT (datetime()), birth timestamp NOT NULL DEFAULT (datetime()),
--position --position in the world
roomIndex INTEGER DEFAULT 0, roomIndex INTEGER DEFAULT 0,
originX INTEGER DEFAULT 0, originX INTEGER DEFAULT 0,
originY INTEGER DEFAULT 0, originY INTEGER DEFAULT 0,
--statistics --statistics
baseStats INTEGER REFERENCES StatisticSets(uid),
--equipment
weapon INTEGER REFERENCES WornEquipment(uid),
helmet INTEGER REFERENCES WornEquipment(uid),
armour INTEGER REFERENCES WornEquipment(uid)
--etc.
);
-------------------------
--Utility tables
-------------------------
CREATE TABLE IF NOT EXISTS StatisticSets (
--metadata
uid INTEGER PRIMARY KEY AUTOINCREMENT,
--general use statistics
level INTEGER DEFAULT 0, level INTEGER DEFAULT 0,
exp INTEGER DEFAULT 0, exp INTEGER DEFAULT 0,
maxHP INTEGER DEFAULT 0, maxHP INTEGER DEFAULT 0,
@@ -41,28 +59,45 @@ CREATE TABLE IF NOT EXISTS Characters (
speed INTEGER DEFAULT 0, speed INTEGER DEFAULT 0,
accuracy REAL DEFAULT 0.0, accuracy REAL DEFAULT 0.0,
evasion REAL DEFAULT 0.0, evasion REAL DEFAULT 0.0,
luck REAL DEFAULT 0.0, luck REAL DEFAULT 0.0
);
--equipment CREATE TABLE IF NOT EXISTS InWorldItems (
weapon INTEGER REFERENCES WornEquipment(uid), --metadata
helmet INTEGER REFERENCES WornEquipment(uid), uid INTEGER PRIMARY KEY AUTOINCREMENT,
armour INTEGER REFERENCES WornEquipment(uid) itemType INTEGER,
--etc.
--position in the world
roomIndex INTEGER DEFAULT 0,
originX INTEGER DEFAULT 0,
originY INTEGER DEFAULT 0,
--unique information
stackSize INTEGER DEFAULT 0,
durability INTEGER DEFAULT 0,
stats INTEGER REFERENCES StatisticSets(uid)
); );
CREATE TABLE IF NOT EXISTS InventoryItems ( CREATE TABLE IF NOT EXISTS InventoryItems (
--metadata --metadata
uid INTEGER PRIMARY KEY AUTOINCREMENT, uid INTEGER PRIMARY KEY AUTOINCREMENT,
itemID INTEGER, --type owner INTEGER REFERENCES Characters(uid),
stackSize INTEGER DEFAULT 0, itemType INTEGER,
owner INTEGER REFERENCES Characters(uid)
--unique information
stackSize INTEGER DEFAULT 0,
durability INTEGER DEFAULT 0,
stats INTEGER REFERENCES StatisticSets(uid)
); );
CREATE TABLE IF NOT EXISTS WornEquipment ( CREATE TABLE IF NOT EXISTS WornEquipment (
--metadata --metadata
uid INTEGER PRIMARY KEY AUTOINCREMENT, uid INTEGER PRIMARY KEY AUTOINCREMENT,
itemID INTEGER, --type owner INTEGER REFERENCES Characters(uid),
owner INTEGER REFERENCES Characters(uid) itemType INTEGER,
--hold all equipment info
--stat mods, special effects, etc. --unique information
durability INTEGER DEFAULT 0,
stats INTEGER REFERENCES StatisticSets(uid)
--TODO: attached script?
); );
+1 -53
View File
@@ -31,27 +31,7 @@
static const char* CREATE_CHARACTER = "INSERT INTO Characters (owner, handle, avatar) VALUES (?, ?, ?);"; static const char* CREATE_CHARACTER = "INSERT INTO Characters (owner, handle, avatar) VALUES (?, ?, ?);";
static const char* LOAD_CHARACTER = "SELECT * FROM Characters WHERE handle = ?;"; static const char* LOAD_CHARACTER = "SELECT * FROM Characters WHERE handle = ?;";
static const char* SAVE_CHARACTER = "UPDATE OR FAIL Characters SET roomIndex = ?2, originX = ?3, originY = ?4 WHERE uid = ?1;";
static const char* SAVE_CHARACTER = "UPDATE OR FAIL Characters SET "
"roomIndex = ?2,"
"originX = ?3,"
"originY = ?4,"
"level = ?5,"
"exp = ?6,"
"maxHP = ?7,"
"health = ?8,"
"maxMP = ?9,"
"mana = ?10,"
"attack = ?11,"
"defence = ?12,"
"intelligence = ?13,"
"resistance = ?14,"
"speed = ?15,"
"accuracy = ?16,"
"evasion = ?17,"
"luck = ?18"
" WHERE uid = ?1;";
static const char* DELETE_CHARACTER = "DELETE FROM Characters WHERE uid = ?;"; static const char* DELETE_CHARACTER = "DELETE FROM Characters WHERE uid = ?;";
//------------------------- //-------------------------
@@ -141,22 +121,6 @@ int CharacterManager::LoadCharacter(int owner, std::string handle, std::string a
newChar.origin.x = (double)sqlite3_column_int(statement, 6); newChar.origin.x = (double)sqlite3_column_int(statement, 6);
newChar.origin.y = (double)sqlite3_column_int(statement, 7); newChar.origin.y = (double)sqlite3_column_int(statement, 7);
//statistics
newChar.baseStats.level = sqlite3_column_int(statement, 8);
newChar.baseStats.exp = sqlite3_column_int(statement, 9);
newChar.baseStats.maxHP = sqlite3_column_int(statement, 10);
newChar.baseStats.health = sqlite3_column_int(statement, 11);
newChar.baseStats.maxMP = sqlite3_column_int(statement, 12);
newChar.baseStats.mana = sqlite3_column_int(statement, 13);
newChar.baseStats.attack = sqlite3_column_int(statement, 14);
newChar.baseStats.defence = sqlite3_column_int(statement, 15);
newChar.baseStats.intelligence = sqlite3_column_int(statement, 16);
newChar.baseStats.resistance = sqlite3_column_int(statement, 17);
newChar.baseStats.speed = sqlite3_column_int(statement, 18);
newChar.baseStats.accuracy = sqlite3_column_double(statement, 19);
newChar.baseStats.evasion = sqlite3_column_double(statement, 20);
newChar.baseStats.luck = sqlite3_column_double(statement, 21);
//gameplay components: equipment, items, buffs, debuffs... //gameplay components: equipment, items, buffs, debuffs...
//finish the routine //finish the routine
@@ -198,22 +162,6 @@ int CharacterManager::SaveCharacter(int uid) {
ret |= sqlite3_bind_int(statement, 3, (int)character.origin.x) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 3, (int)character.origin.x) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 4, (int)character.origin.y) != SQLITE_OK; ret |= sqlite3_bind_int(statement, 4, (int)character.origin.y) != SQLITE_OK;
//statistics
ret |= sqlite3_bind_int(statement, 5, character.baseStats.level) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 6, character.baseStats.exp) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 7, character.baseStats.maxHP) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 8, character.baseStats.health) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 9, character.baseStats.maxMP) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 10, character.baseStats.mana) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 11, character.baseStats.attack) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 12, character.baseStats.defence) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 13, character.baseStats.intelligence) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 14, character.baseStats.resistance) != SQLITE_OK;
ret |= sqlite3_bind_int(statement, 15, character.baseStats.speed) != SQLITE_OK;
ret |= sqlite3_bind_double(statement, 16, character.baseStats.accuracy) != SQLITE_OK;
ret |= sqlite3_bind_double(statement, 17, character.baseStats.evasion) != SQLITE_OK;
ret |= sqlite3_bind_double(statement, 18, character.baseStats.luck) != SQLITE_OK;
//gameplay components: equipment, items, buffs, debuffs... //gameplay components: equipment, items, buffs, debuffs...
//check for binding errors //check for binding errors
+1 -1
View File
@@ -30,7 +30,7 @@
using namespace std; using namespace std;
int main(int argc, char** argv) { int main(int argc, char* argv[]) {
try { try {
//create the singletons //create the singletons
AccountManager::Create(); AccountManager::Create();
+2 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. accounts characters rooms ../common/debugging ../common/gameplay ../common/map ../common/network ../common/network/packet_types ../common/utilities INCLUDES+=. accounts characters rooms server_utilities ../common/debugging ../common/gameplay ../common/map ../common/network ../common/network/packet_types ../common/utilities
LIBS+=server.a ../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua -lsqlite3 LIBS+=server.a ../libcommon.a -lSDL_net -lwsock32 -liphlpapi -lmingw32 -lSDLmain -lSDL -llua -lsqlite3
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
@@ -19,6 +19,7 @@ all: $(OBJ) $(OUT)
$(MAKE) -C accounts $(MAKE) -C accounts
$(MAKE) -C characters $(MAKE) -C characters
$(MAKE) -C rooms $(MAKE) -C rooms
$(MAKE) -C server_utilities
$(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS) $(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS)
$(OBJ): | $(OBJDIR) $(OBJ): | $(OBJDIR)
+1 -1
View File
@@ -47,7 +47,7 @@
class ServerApplication: public Singleton<ServerApplication> { class ServerApplication: public Singleton<ServerApplication> {
public: public:
//public methods //public methods
void Init(int argc, char** argv); void Init(int argc, char* argv[]);
void Proc(); void Proc();
void Quit(); void Quit();
+3 -3
View File
@@ -34,12 +34,12 @@
//public methods //public methods
//------------------------- //-------------------------
void ServerApplication::Init(int argc, char** argv) { 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. //NOTE: I might need to rearrange the init process so that lua & SQL can interact with the map system as needed.
std::cout << "Beginning " << argv[0] << std::endl; std::cout << "Beginning " << argv[0] << std::endl;
//load the prerequisites //load the prerequisites
config.Load("rsc\\config.cfg"); config.Load("rsc\\config.cfg", argc, argv);
//------------------------- //-------------------------
//Initialize the APIs //Initialize the APIs
@@ -146,7 +146,7 @@ void ServerApplication::Proc() {
HandlePacket(packetBuffer); HandlePacket(packetBuffer);
} }
//update the internals //update the internals
//BUG: #30 Update the internals i.e. player positions //...
//TODO: This could be checked only every few seconds //TODO: This could be checked only every few seconds
//Check connections //Check connections
+2 -4
View File
@@ -170,9 +170,6 @@ void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) {
//------------------------- //-------------------------
void ServerApplication::HandleCharacterNew(CharacterPacket* const argPacket) { void ServerApplication::HandleCharacterNew(CharacterPacket* const argPacket) {
//BUG: #27 Characters can be created with an invalid account index
//TODO: Make sure that a character's owner's account is loaded before continuing
//NOTE: misnomer, try to load the character first //NOTE: misnomer, try to load the character first
int characterIndex = characterMgr.LoadCharacter(argPacket->accountIndex, argPacket->handle, argPacket->avatar); int characterIndex = characterMgr.LoadCharacter(argPacket->accountIndex, argPacket->handle, argPacket->avatar);
@@ -285,6 +282,7 @@ void ServerApplication::HandleSynchronize(ClientPacket* const argPacket) {
void ServerApplication::CleanupLostConnection(int clientIndex) { void ServerApplication::CleanupLostConnection(int clientIndex) {
//NOTE: This assumes each player has only one account and character at a time //NOTE: This assumes each player has only one account and character at a time
//TODO: handle multiple characters (bots, etc.)
//find the account //find the account
int accountIndex = -1; int accountIndex = -1;
@@ -304,7 +302,7 @@ void ServerApplication::CleanupLostConnection(int clientIndex) {
} }
} }
//send a dissconnection message just in case //send a disconnection message just in case
ClientPacket newPacket; ClientPacket newPacket;
newPacket.type = SerialPacketType::DISCONNECT; newPacket.type = SerialPacketType::DISCONNECT;
network.SendTo(clientMap[clientIndex].GetAddress(), &newPacket); network.SendTo(clientMap[clientIndex].GetAddress(), &newPacket);
+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
-5
View File
@@ -1,9 +1,5 @@
TODO: Config switch for the debug output
TODO: A better way of handling the disconnection message
TODO: LobbyMenu::HandleJoinRejection()
TODO: Get the rooms working, even if only via hotkeys TODO: Get the rooms working, even if only via hotkeys
TODO: Fix shoddy movement TODO: Fix shoddy movement
TODO: Move the statistics into their own SQL table, instead of duplicating the structure a dozen times
TODO: Remove the big "Shut Down" button TODO: Remove the big "Shut Down" button
TODO: Make a way for the server owner to control the server directly TODO: Make a way for the server owner to control the server directly
@@ -13,5 +9,4 @@ TODO: make the whole thing more fault tolerant
TODO: Authentication TODO: Authentication
TODO: Time delay for requesting region packets TODO: Time delay for requesting region packets
TODO: command line parameters overriding config.cfg settings
TODO: A proper logging system TODO: A proper logging system