21 |
21 |
22 class Main : public CL_ClanApplication { |
22 class Main : public CL_ClanApplication { |
23 private: |
23 private: |
24 // arguments |
24 // arguments |
25 CL_CommandLine args; |
25 CL_CommandLine args; |
26 |
26 |
|
27 bool arg_graphics; |
27 std::string arg_port; |
28 std::string arg_port; |
28 bool arg_dedicated; |
29 bool arg_server; |
29 std::string arg_connect; |
30 std::string arg_connect; |
30 |
31 |
31 void parse_args (int argc, char **argv) { |
32 void parse_args (int argc, char **argv) { |
32 // set up the options |
33 // set up the options |
33 args.add_option('p', "port", "PORT", "set network port used", true); |
34 args.add_option('p', "port", "PORT", "set network port used", true); |
34 args.add_option('D', "dedicated", "", "act as a network server", true); |
35 args.add_option('s', "server", "", "act as a network server", true); |
35 args.add_option('c', "connect", "SERVERHOST", "act as a network client", true); |
36 args.add_option('c', "client", "SERVERHOST", "act as a network client", true); |
|
37 args.add_option('g', "graphics", "", "run graphics/local input. Implied with --connect", true); |
36 |
38 |
37 // set defaults |
39 // set defaults |
|
40 arg_graphics = false; |
38 arg_port = NETWORK_PORT_STR; |
41 arg_port = NETWORK_PORT_STR; |
39 arg_dedicated = false; |
42 arg_server = false; |
40 arg_connect = ""; |
43 arg_connect = ""; |
41 |
44 |
42 try { |
45 try { |
43 // parse args |
46 // parse args |
44 args.parse_args(argc, argv); |
47 args.parse_args(argc, argv); |
|
48 |
45 } catch (CL_Error &e) { |
49 } catch (CL_Error &e) { |
46 throw ArgumentError(e.message); |
50 throw ArgumentError(e.message); |
47 } |
51 } |
48 |
52 |
49 while (args.next()) { |
53 while (args.next()) { |
50 switch (args.get_key()) { |
54 switch (args.get_key()) { |
51 case 'p': |
55 case 'p': |
52 arg_port = args.get_argument(); |
56 arg_port = args.get_argument(); |
53 break; |
57 break; |
54 |
58 |
55 case 'D': |
59 case 's': |
56 arg_dedicated = true; |
60 arg_server = true; |
57 break; |
61 break; |
58 |
62 |
59 case 'c': |
63 case 'c': |
60 arg_connect = args.get_argument(); |
64 arg_connect = args.get_argument(); |
|
65 arg_graphics = true; |
|
66 break; |
|
67 |
|
68 case 'g': |
|
69 arg_graphics = true; |
61 break; |
70 break; |
62 |
71 |
63 case CL_CommandLine::REST_ARG: |
72 case CL_CommandLine::REST_ARG: |
64 throw ArgumentError(args.get_argument()); |
73 throw ArgumentError(args.get_argument()); |
65 |
74 |
68 |
77 |
69 } |
78 } |
70 } |
79 } |
71 |
80 |
72 // check for valid combinations of arugments |
81 // check for valid combinations of arugments |
73 if (arg_dedicated && !arg_connect.empty()) |
82 if (!(arg_server xor !arg_connect.empty())) |
74 throw ArgumentError("-D and -c are mutually exclusive"); |
83 throw ArgumentError("must supply *exactly* one of --server/--client"); |
75 |
|
76 if (!arg_dedicated && arg_connect.empty()) |
|
77 throw ArgumentError("nothing to do"); |
|
78 } |
84 } |
79 |
85 |
80 public: |
86 public: |
81 virtual int main (int argc, char **argv) { |
87 virtual int main (int argc, char **argv) { |
82 // initialize core |
88 // initialize the ClanLib components that we use |
83 CL_SetupCore setup_core; |
89 CL_SetupCore setup_core; |
84 |
90 CL_SetupNetwork setup_network; |
|
91 CL_SetupDisplay setup_disp; |
|
92 CL_SetupGL setup_gl; |
|
93 |
85 try { |
94 try { |
86 // parse arugments |
95 // parse arugments |
87 parse_args(argc, argv); |
96 parse_args(argc, argv); |
|
97 |
|
98 // our engine |
|
99 Engine engine; |
88 |
100 |
89 // run engine based on args |
101 // setup graphics |
90 if (arg_dedicated) { |
102 if (arg_graphics) |
91 Engine::runNetworkServer(arg_port); |
103 engine.setupGraphics(); |
|
104 |
|
105 // setup either network server or client |
|
106 if (arg_server) { |
|
107 engine.setupNetworkServer(arg_port); |
92 |
108 |
93 } else if (!arg_connect.empty()) { |
109 } else if (!arg_connect.empty()) { |
94 Engine::runNetworkClient(arg_connect, arg_port); |
110 engine.setupNetworkClient(arg_connect, arg_port); |
95 |
111 |
96 } else |
112 } else |
97 assert(false); |
113 assert(false); |
|
114 |
|
115 // run the main loop |
|
116 engine.run(); |
98 |
117 |
99 // succesful return |
118 // succesful return |
100 return 0; |
119 return 0; |
101 |
120 |
102 } catch (ArgumentError &e) { |
121 } catch (ArgumentError &e) { |