2019-08-24 17:29:31 -07:00
|
|
|
//
|
|
|
|
// Created by aurailus on 22/08/19.
|
|
|
|
//
|
|
|
|
|
2019-08-24 17:39:35 -07:00
|
|
|
#pragma once
|
2019-08-24 17:29:31 -07:00
|
|
|
|
2020-07-06 18:34:59 -07:00
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
#include "util/Log.h"
|
|
|
|
#include "util/Util.h"
|
2020-08-13 00:55:18 -07:00
|
|
|
#include "client/Client.h"
|
|
|
|
#include "server/Server.h"
|
2019-08-24 17:29:31 -07:00
|
|
|
|
2019-12-10 15:14:59 -08:00
|
|
|
enum class Mode { INVALID, CLIENT, SERVER };
|
|
|
|
|
|
|
|
std::map<std::string, std::string> parseArgs(int argc, char* argv[]) {
|
2019-08-24 17:29:31 -07:00
|
|
|
//Collect arguments into `args` map
|
|
|
|
std::map<std::string, std::string> args;
|
|
|
|
for (int i = 1; i < argc; i++) {
|
|
|
|
|
|
|
|
std::string arg(argv[i]);
|
|
|
|
size_t equals = arg.find('=');
|
|
|
|
std::string first = (equals == -1) ? arg : arg.substr(0, equals);
|
|
|
|
|
2020-07-26 18:21:33 -07:00
|
|
|
if (args.count(first)) throw std::invalid_argument("Duplicate argument " + first + ".");
|
|
|
|
|
2019-08-24 17:29:31 -07:00
|
|
|
if (equals == -1) args.emplace(first, "");
|
2020-07-26 18:21:33 -07:00
|
|
|
else if (equals == arg.length() - 1) throw std::invalid_argument("Empty argument " + first + ".");
|
|
|
|
else args.emplace(first, arg.substr(equals + 1, arg.length()));
|
2019-08-24 17:29:31 -07:00
|
|
|
}
|
|
|
|
|
2019-12-10 15:14:59 -08:00
|
|
|
return args;
|
|
|
|
}
|
|
|
|
|
|
|
|
int StartGame(int argc, char* argv[]) {
|
|
|
|
std::string path = argv[0];
|
|
|
|
|
|
|
|
Address addr {"127.0.0.1", 32000};
|
2019-08-24 17:29:31 -07:00
|
|
|
Mode mode = Mode::CLIENT;
|
2019-12-10 15:14:59 -08:00
|
|
|
std::string subgame = "";
|
2019-12-10 23:12:29 -08:00
|
|
|
bool ascii = true;
|
2019-08-24 17:29:31 -07:00
|
|
|
|
|
|
|
//Parse the arguments map
|
2019-12-10 15:14:59 -08:00
|
|
|
for (auto arg : parseArgs(argc, argv)) {
|
2020-02-20 16:31:37 -08:00
|
|
|
switch (Util::hash(arg.first.c_str())) {
|
2019-08-24 17:29:31 -07:00
|
|
|
default: {
|
|
|
|
std::cout << Log::err << "Invalid argument " << arg.first << "." << Log::endl;
|
|
|
|
return -1;
|
|
|
|
}
|
2020-02-20 16:31:37 -08:00
|
|
|
case Util::hash("--mode"): {
|
2019-08-24 17:29:31 -07:00
|
|
|
if (arg.second == "client") mode = Mode::CLIENT;
|
|
|
|
else if (arg.second == "server") mode = Mode::SERVER;
|
|
|
|
else std::cout << Log::err << "Invalid mode argument." << Log::endl;
|
|
|
|
break;
|
|
|
|
}
|
2020-02-20 16:31:37 -08:00
|
|
|
case Util::hash("--port"): {
|
2019-08-24 17:29:31 -07:00
|
|
|
addr.port = static_cast<unsigned short>(stoi(arg.second));
|
2019-12-10 23:12:29 -08:00
|
|
|
break;
|
2019-08-24 17:29:31 -07:00
|
|
|
}
|
2020-02-20 16:31:37 -08:00
|
|
|
case Util::hash("--address"): {
|
2019-08-24 17:29:31 -07:00
|
|
|
addr.host = arg.second;
|
2019-12-10 23:12:29 -08:00
|
|
|
break;
|
2019-08-24 17:29:31 -07:00
|
|
|
}
|
2020-02-20 16:31:37 -08:00
|
|
|
case Util::hash("--subgame"): {
|
2019-12-10 15:14:59 -08:00
|
|
|
subgame = arg.second;
|
2019-12-10 23:12:29 -08:00
|
|
|
break;
|
|
|
|
}
|
2020-02-20 16:31:37 -08:00
|
|
|
case Util::hash("--noascii"): {
|
2019-12-10 23:12:29 -08:00
|
|
|
ascii = false;
|
|
|
|
break;
|
2019-12-10 15:14:59 -08:00
|
|
|
}
|
2019-08-24 17:29:31 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-10 15:44:58 -08:00
|
|
|
// Obligatory ASCII Art is obligatory.
|
2019-12-10 23:12:29 -08:00
|
|
|
if (ascii) {
|
|
|
|
Log::clear();
|
|
|
|
std::cout << "\n"
|
|
|
|
"\t\t▒███████▒▓█████ ██▓███ ██░ ██ ▄▄▄ \n"
|
|
|
|
"\t\t▒ ▒ ▒ ▄▀░▓█ ▀ ▓██░ ██▒▓██░ ██▒▒████▄ \n"
|
|
|
|
"\t\t░ ▒ ▄▀▒░ ▒███ ▓██░ ██▓▒▒██▀▀██░▒██ ▀█▄ \n"
|
|
|
|
"\t\t ▄▀▒ ░▒▓█ ▄ ▒██▄█▓▒ ▒░▓█ ░██ ░██▄▄▄▄██ \n"
|
|
|
|
"\t\t▒███████▒░▒████▒▒██▒ ░ ░░▓█▒░██▓ ▓█ ▓██▒\n"
|
|
|
|
"\t\t░▒▒ ▓░▒░▒░░ ▒░ ░▒▓▒░ ░ ░ ▒ ░░▒░▒ ▒▒ ▓▒█░\n"
|
|
|
|
"\t\t░ ▒ ▒ ░ ▒ ░ ░ ░░▒ ░ ▒ ░▒░ ░ ▒ ▒▒ ░\n"
|
|
|
|
"\t\t ░ ░ ░ ░ ░░ ░ ░ ░ ▒ \n" << std::endl;
|
|
|
|
}
|
2019-12-10 15:44:58 -08:00
|
|
|
|
2019-08-24 17:29:31 -07:00
|
|
|
//Start the game
|
|
|
|
switch (mode) {
|
|
|
|
default: {
|
2019-10-31 14:07:53 -07:00
|
|
|
std::cout << Log::err << "Mode not set." << Log::endl;
|
2019-08-24 17:29:31 -07:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
case Mode::CLIENT: {
|
2019-12-11 21:38:20 -08:00
|
|
|
Client c(path, addr, {1366, 768});
|
2019-08-24 17:29:31 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case Mode::SERVER: {
|
2020-02-26 13:42:15 -08:00
|
|
|
Server s(addr.port, subgame);
|
2019-08-24 17:29:31 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
};
|
|
|
|
|