12 ARG_CLIENT = 'c', |
13 ARG_CLIENT = 'c', |
13 ARG_GRAPHICS = 'g', |
14 ARG_GRAPHICS = 'g', |
14 ARG_FULLSCREEN = 'F', |
15 ARG_FULLSCREEN = 'F', |
15 ARG_RESOLUTION = 'R', |
16 ARG_RESOLUTION = 'R', |
16 |
17 |
17 ARG_LIST_MODES = 0xff01, |
18 ARG_LIST_MODES = 0xff01, |
18 ARG_VERSION = 0xff02, |
19 ARG_VERSION = 0xff02, |
|
20 ARG_TERRAIN_SEED = 0xff03, |
|
21 ARG_TERRAIN_SIZE = 0xff04, |
|
22 |
19 }; |
23 }; |
20 |
24 |
|
25 |
|
26 Main::Main (void) : |
|
27 graphics_enabled(false), |
|
28 net_port(NETWORK_PORT_STR), |
|
29 net_server(false), |
|
30 net_connect("") |
|
31 { |
|
32 |
|
33 } |
21 |
34 |
22 /** |
35 /** |
23 * Set the arg_* members |
36 * Set the arg_* members |
24 */ |
37 */ |
25 bool Main::parse_args (int argc, char **argv) { |
38 bool Main::parse_args (int argc, char **argv) { |
46 "set graphics resolution"); |
59 "set graphics resolution"); |
47 |
60 |
48 args.add_option(ARG_LIST_MODES, "list-modes", "", |
61 args.add_option(ARG_LIST_MODES, "list-modes", "", |
49 "output a list of available display modes and exit"); |
62 "output a list of available display modes and exit"); |
50 |
63 |
|
64 args.add_option(ARG_TERRAIN_SEED, "terrain-seed", "SEED", |
|
65 "set seed for terrain random generator"); |
|
66 |
|
67 args.add_option(ARG_TERRAIN_SIZE, "terrain-size", "WIDTHxHEIGHT", |
|
68 "set terrain size for random generator"); |
|
69 |
51 args.add_option(ARG_VERSION, "version", "", |
70 args.add_option(ARG_VERSION, "version", "", |
52 "output application version and exit"); |
71 "output application version and exit"); |
53 |
|
54 // set defaults |
|
55 arg_graphics = false; |
|
56 arg_port = NETWORK_PORT_STR; |
|
57 arg_server = false; |
|
58 arg_connect = ""; |
|
59 graphics.fullscreen = GRAPHICS_FULLSCREEN; |
|
60 graphics.resolution = PixelCoordinate(GRAPHICS_RESOLUTION_WIDTH, GRAPHICS_RESOLUTION_HEIGHT); |
|
61 |
72 |
62 // extra state |
73 // extra state |
63 bool resolution_default = true; |
74 bool resolution_default = true; |
64 |
75 |
65 try { |
76 try { |
116 |
127 |
117 case ARG_VERSION: |
128 case ARG_VERSION: |
118 dump_version(); |
129 dump_version(); |
119 return false; |
130 return false; |
120 |
131 |
|
132 case ARG_TERRAIN_SEED: |
|
133 terrain.random_seed = parse_arg_int(args.get_argument(), "--terrain-seed"); |
|
134 break; |
|
135 |
|
136 case ARG_TERRAIN_SIZE: |
|
137 terrain.dimensions = parse_arg_dimensions(args.get_argument(), "--terrain-size"); |
|
138 break; |
|
139 |
121 case CL_CommandLine::REST_ARG: |
140 case CL_CommandLine::REST_ARG: |
122 throw ArgumentError(args.get_argument()); |
141 throw ArgumentError("Trailing arguments: " + args.get_argument()); |
123 |
142 |
124 default: |
143 default: |
125 throw ArgumentError(std::string(1, (char) args.get_key())); |
144 throw ArgumentError(std::string() + "Unknown argument key: " + (char) args.get_key()); |
126 |
145 |
127 } |
146 } |
128 } |
147 } |
129 |
148 |
130 // check for invalid combinations of arugments |
149 // check for invalid combinations of arugments |
131 if (arg_server and !arg_connect.empty()) |
150 if (net_server and !net_connect.empty()) |
132 throw ArgumentError("cannot be both server and client"); |
151 throw ArgumentError("cannot be both server and client"); |
133 |
152 |
134 // enable graphics by default unless server |
153 // enable graphics by default unless server |
135 if (!arg_server) |
154 if (!net_server) |
136 arg_graphics = true; |
155 graphics_enabled = true; |
137 |
156 |
138 // continue |
157 // continue |
139 return true; |
158 return true; |
140 } |
159 } |
141 |
160 |
142 void Main::parse_arg_resolution (const std::string &val) { |
161 int Main::parse_arg_int (const std::string &arg_val, const char *arg_name) { |
|
162 int int_val; |
|
163 |
|
164 // read using istringstream |
|
165 std::istringstream ss(arg_val); |
|
166 |
|
167 if (!(ss >> int_val)) |
|
168 throw ArgumentError(std::string() + "invalid integer arugment for " + arg_name + ": " + arg_val); |
|
169 |
|
170 return int_val; |
|
171 } |
|
172 |
|
173 PixelCoordinate Main::parse_arg_dimensions (const std::string &arg_val, const char *arg_name) { |
143 unsigned int w, h; |
174 unsigned int w, h; |
144 |
175 |
145 // sccanf as unsigned |
176 // sccanf as unsigned |
146 if (sscanf(val.c_str(), "%ux%u", &w, &h) != 2) |
177 if (sscanf(arg_val.c_str(), "%ux%u", &w, &h) != 2) |
147 throw ArgumentError("invalid format for --resolution"); |
178 throw ArgumentError(std::string() + "invalid format for " + arg_name + ": " + arg_val); |
148 |
179 |
149 // store as PixelCoordinate |
180 return PixelCoordinate(w, h); |
150 graphics.resolution = PixelCoordinate(w, h); |
|
151 } |
181 } |
152 |
182 |
153 void Main::dump_display_modes (void) { |
183 void Main::dump_display_modes (void) { |
154 const std::vector<CL_DisplayMode> &modes = Graphics::getDisplayModes(); |
184 const std::vector<CL_DisplayMode> &modes = Graphics::getDisplayModes(); |
155 |
185 |
178 if (parse_args(argc, argv) == false) |
208 if (parse_args(argc, argv) == false) |
179 return 0; |
209 return 0; |
180 |
210 |
181 // our engine |
211 // our engine |
182 Engine engine; |
212 Engine engine; |
|
213 |
|
214 // setup game unless client |
|
215 if (net_connect.empty()) |
|
216 engine.setupGame(terrain); |
183 |
217 |
184 // setup graphics |
218 // setup graphics |
185 if (arg_graphics) |
219 if (graphics_enabled) |
186 engine.setupGraphics(graphics); |
220 engine.setupGraphics(graphics); |
187 |
221 |
188 // setup either network server, client or singleplayer |
222 // setup either network server, client or singleplayer |
189 if (arg_server) { |
223 if (net_server) { |
190 engine.setupNetworkServer(arg_port); |
224 engine.setupNetworkServer(net_port); |
191 |
225 |
192 } else if (!arg_connect.empty()) { |
226 } else if (!net_connect.empty()) { |
193 engine.setupNetworkClient(arg_connect, arg_port); |
227 engine.setupNetworkClient(net_connect, net_port); |
194 |
228 |
195 } else { |
229 } else { |
196 engine.setupSinglePlayer(); |
230 engine.setupSinglePlayer(); |
197 } |
231 } |
198 |
232 |