aboutsummaryrefslogtreecommitdiff
path: root/src/client/main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/main.cc')
-rw-r--r--src/client/main.cc90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/client/main.cc b/src/client/main.cc
new file mode 100644
index 0000000..858c6df
--- /dev/null
+++ b/src/client/main.cc
@@ -0,0 +1,90 @@
+#include "client/main.hh"
+
+static bool& get_has_address() noexcept {
+ static bool ret = false;
+ return ret;
+}
+
+static bool& get_has_port() noexcept {
+ static bool ret = false;
+ return ret;
+}
+
+static std::string& get_address() noexcept {
+ static std::string address{shared::DEFAULT_ADDRESS};
+ return address;
+}
+
+static std::string& get_port() noexcept {
+ static std::string port{shared::DEFAULT_PORT};
+ return port;
+}
+
+static bool& get_is_headless() noexcept {
+ static bool is_headless = false;
+ return is_headless;
+}
+
+static bool parse_arg(const int& c, const char* const arg) {
+ switch (c) {
+ case 'a':
+ get_address() = boost::lexical_cast<std::string>(arg);
+ get_has_address() = true;
+ break;
+ case 'p':
+ get_port() = boost::lexical_cast<std::string>(arg);
+ get_has_port() = true;
+ break;
+ case 'H':
+ get_is_headless() = true;
+ break;
+ case 's':
+ get_address() = "localhost";
+ break;
+ default:
+ return false;
+ }
+ return true;
+}
+
+static const shared::args_t& get_options() {
+ static shared::args_t ret = []() -> shared::args_t {
+ shared::args_t ret{
+ {.name = "address", .desc = "connect elsewhere", .val = "a:"},
+ {.name = "port", .desc = "override the default port", .val = "p:"},
+ {.name = "headless", .desc = "run without a client ", .val = "H"},
+ {.name = "singleplayer",
+ .desc = "avoid hosting a lan server",
+ .val = "s"}};
+ std::ranges::copy(shared::get_options(), std::back_inserter(ret));
+ std::ranges::copy(server::get_options(), std::back_inserter(ret));
+ return ret;
+ }();
+
+ return ret;
+}
+
+int main(const int argc, char* const* argv) {
+ shared::init();
+
+ shared::parse_args(argc, argv, get_options(),
+ {&parse_arg, &shared::parse_arg, &server::parse_arg});
+
+ if (get_has_address()) {
+ shared::try_main(client::main, get_address(), get_port());
+ return EXIT_SUCCESS;
+ }
+
+ if (get_is_headless()) {
+ shared::try_main(server::main, get_address(), get_port());
+ return EXIT_SUCCESS;
+ }
+
+ const std::jthread server_thread{shared::try_main, server::main,
+ get_address(), get_port()};
+ while (!server::has_initialised) {
+ continue;
+ }
+ shared::try_main(client::main, get_address(), get_port());
+ return EXIT_SUCCESS;
+}