terom@185: terom@185: #include "Engine.hh" terom@185: #include "Error.hh" terom@185: terom@185: #include terom@185: #include terom@185: terom@185: #include terom@185: #include terom@185: terom@185: class ArgumentError : public Error { terom@185: public: terom@185: ArgumentError (const std::string &message) : Error(message) { } terom@185: }; terom@185: terom@185: class Main : public CL_ClanApplication { terom@185: private: terom@185: // arguments terom@185: CL_CommandLine args; terom@185: terom@185: bool arg_graphics; terom@185: std::string arg_port; terom@185: bool arg_server; terom@185: std::string arg_connect; terom@185: terom@185: void parse_args (int argc, char **argv) { terom@185: // set up the options terom@185: args.add_option('p', "port", "PORT", "set network port used", true); terom@185: args.add_option('s', "server", "", "act as a network server", true); terom@185: args.add_option('c', "client", "SERVERHOST", "act as a network client", true); terom@185: args.add_option('g', "graphics", "", "run graphics/local input. Implied with --connect", true); terom@185: terom@185: // set defaults terom@185: arg_graphics = false; terom@185: arg_port = NETWORK_PORT_STR; terom@185: arg_server = false; terom@185: arg_connect = ""; terom@267: terom@267: // extra state terom@267: bool graphics_default = true; terom@185: terom@185: try { terom@185: // parse args terom@185: args.parse_args(argc, argv); terom@185: terom@185: } catch (CL_Error &e) { terom@185: throw ArgumentError(e.message); terom@185: } terom@185: terom@185: while (args.next()) { terom@185: switch (args.get_key()) { terom@185: case 'p': terom@185: arg_port = args.get_argument(); terom@185: break; terom@185: terom@185: case 's': terom@185: arg_server = true; terom@185: break; terom@185: terom@185: case 'c': terom@185: arg_connect = args.get_argument(); terom@185: break; terom@185: terom@185: case 'g': terom@185: arg_graphics = true; terom@185: break; terom@185: terom@185: case CL_CommandLine::REST_ARG: terom@185: throw ArgumentError(args.get_argument()); terom@185: terom@185: default: terom@185: throw ArgumentError(std::string(1, (char) args.get_key())); terom@185: terom@185: } terom@185: } terom@267: terom@185: // check for invalid combinations of arugments terom@185: if (arg_server and !arg_connect.empty()) terom@185: throw ArgumentError("cannot be both server and client"); terom@267: terom@267: // enable graphics by default unless server terom@267: if (!arg_server && graphics_default) terom@267: arg_graphics = true; terom@185: } terom@185: terom@185: public: terom@185: virtual int main (int argc, char **argv) { terom@185: // initialize the ClanLib components that we use terom@185: CL_SetupCore setup_core; terom@185: CL_SetupNetwork setup_network; terom@185: CL_SetupDisplay setup_disp; terom@185: CL_SetupGL setup_gl; terom@185: terom@185: try { terom@185: // parse arugments terom@185: parse_args(argc, argv); terom@185: terom@185: // our engine terom@185: Engine engine; terom@185: terom@185: // setup graphics terom@185: if (arg_graphics) terom@185: engine.setupGraphics(); terom@185: terom@185: // setup either network server, client or singleplayer terom@185: if (arg_server) { terom@185: engine.setupNetworkServer(arg_port); terom@185: terom@185: } else if (!arg_connect.empty()) { terom@185: engine.setupNetworkClient(arg_connect, arg_port); terom@185: terom@185: } else { terom@185: engine.setupSinglePlayer(); terom@185: } terom@185: terom@185: // run the main loop terom@185: engine.run(); terom@185: terom@185: // succesful return terom@185: return 0; terom@185: terom@185: } catch (ArgumentError &e) { terom@185: std::cerr << e.what() << std::endl; terom@185: args.print_help(); terom@185: terom@185: // XXX: handle --help terom@185: return 1; terom@185: } catch (CL_Error &e) { terom@185: std::cerr << "main: CL_Error:" << e.message << std::endl; terom@185: terom@185: return 1; terom@185: terom@185: } catch (std::exception &e) { terom@185: std::cerr << "FATAL [uncaught_exception] " << e.what() << std::endl; terom@185: terom@185: return 1; terom@185: } terom@185: } terom@185: } app; terom@185: