Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# mini-RTS-server

server for minimalistic RTS game

**server is linux only** will build and run only on linux

# Building with CMake

Configure project:
Expand Down Expand Up @@ -34,9 +37,10 @@ make
* `boardY` - y dimention of the board[default: 256]
* `startResources` - how many resources to spawn at the start of the game [default: 25]
* `unitsToWin` - how many units player has to aquire to win the game [default: 50]
* `resourceHp` - starting hit points of every new resource
* `unitHp` - starting hit points of every new unit
* `unitDamage` - how much damage do units deal on every attack
* `resourceHp` - starting hit points of every new resource [default: 100]
* `unitHp` - starting hit points of every new unit [default: 100]
* `unitDamage` - how much damage do units deal on every attack [default: 10]
* `allowedNameCharacters` - string of characters that can be used in player names [default: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_]

### Example:

Expand Down
39 changes: 23 additions & 16 deletions src/rts/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,36 +8,36 @@
#include <msg/stringBuffer.hpp>
#include <fstream>

std::unordered_map<std::string, std::function<void(rts::game*, std::ifstream&)>> rts::game::configValueHandlers = {
{"millis", [](rts::game* g, std::ifstream& f){ f >> g->millis; }},
{"maxPlayers", [](rts::game* g, std::ifstream& f){ f >> g->maxPlayers; }},
{"boardX", [](rts::game* g, std::ifstream& f){ f >> g->boardX; }},
{"boardY", [](rts::game* g, std::ifstream& f){ f >> g->boardY; }},
{"startResources", [](rts::game* g, std::ifstream& f){ f >> g->startResources; }},
{"resourceHp", [](rts::game* g, std::ifstream& f){ f >> g->resourceHp; }},
{"unitHp", [](rts::game* g, std::ifstream& f){ f >> g->unitHp; }},
{"unitDamage", [](rts::game* g, std::ifstream& f){ f >> g->unitDamage; }},
{"unitsToWin", [](rts::game* g, std::ifstream& f){ f >> g->unitsToWin; }},
{"allowedNameCharacters", [](rts::game* g, std::ifstream& f){ f >> g->allowedNameCharacters; }}
}; // i can only dream of reflection system in c++

rts::game::game(const char *port, const char* configFile) : _server(port) {
_server.onNewClient = std::bind(&rts::game::handleNewClient, this, std::placeholders::_1);

if (configFile != nullptr) {
std::ifstream fin(configFile);
std::string name;
unsigned int val;
if (fin.is_open()) {
while (!fin.eof()) {
fin >> name;
fin >> val;
property(name) = val;
if (configValueHandlers.find(name) != configValueHandlers.end())
configValueHandlers[name](this, fin);
else throw std::logic_error("invalid property name");
}
}
}
}

unsigned int& rts::game::property(const std::string& name) {
if (name == "maxPlayers") return maxPlayers;
if (name == "startResources") return startResources;
if (name == "millis") return millis;
if (name == "boardX") return boardX;
if (name == "boardY") return boardY;
if (name == "resourceHp") return resourceHp;
if (name == "unitHp") return unitHp;
if (name == "unitDamage") return unitDamage;
if (name == "unitsToWin") return unitsToWin;
throw std::logic_error("invalid property name");
}

void rts::game::handleNewClient(client* client_) {
player* pl = new player(this, client_);
allPlayers.insert(pl);
Expand Down Expand Up @@ -202,6 +202,13 @@ unsigned int rts::game::getNextUnitId() {
return nextUnitId++;
}

bool rts::game::nameValid(const std::string& name) const {
for (char c : name){
if (allowedNameCharacters.find(c) == std::string::npos) return false;
}
return true;
}

rts::game::~game() {
for (player* p : allPlayers){
delete p;
Expand Down
4 changes: 3 additions & 1 deletion src/rts/game.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ namespace rts {
unsigned int unitHp = 100;
unsigned int unitDamage = 10;
unsigned int unitsToWin = 50;
std::string allowedNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";

unsigned int nextUnitId = 0;

Expand All @@ -37,7 +38,7 @@ namespace rts {
void addPlayerToQueue(player* pl);
void moveQueuedPlayerToRoom();

unsigned int& property(const std::string& name);
static std::unordered_map<std::string, std::function<void(game*, std::ifstream&)>> configValueHandlers;

public:
board _board;
Expand Down Expand Up @@ -66,6 +67,7 @@ namespace rts {
unsigned int getUnitHp() const;
unsigned int getUnitDamage() const;
unsigned int getNextUnitId();
bool nameValid(const std::string& name) const;

~game();
};
Expand Down
1 change: 1 addition & 0 deletions src/rts/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ void rts::player::handleNewMessage(const message::base* msg) {
if (cmsg->_name != _name && nameTaken(cmsg->_name)) { // other player has that name
_client->sendToClient({'n','\n'}); // name taken
}
else if (!_game->nameValid(cmsg->_name)) _client->sendToClient({'n','\n'}); // invalid name
else if (_name == "") setName(cmsg->_name);
else reName(cmsg->_name);
}
Expand Down