diff options
| author | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2025-02-12 21:57:46 +1100 |
|---|---|---|
| committer | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2025-02-12 21:57:46 +1100 |
| commit | e4483eca01b48b943cd0461e24a74ae1a3139ed4 (patch) | |
| tree | ed58c3c246e3af1af337697695d780aa31f6ad9a /src/client/main.cc | |
| parent | 1cc08c51eb4b0f95c30c0a98ad1fc5ad3459b2df (diff) | |
Update to most recent version (old initial commit)
Diffstat (limited to 'src/client/main.cc')
| -rw-r--r-- | src/client/main.cc | 90 |
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; +} |
