The Battle for Wesnoth  1.13.4+dev
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
commandline_options.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2011 - 2016 by Lukasz Dobrogowski <[email protected]>
3  Part of the Battle for Wesnoth Project http://www.wesnoth.org/
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any lfooater version.
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY.
11 
12  See the COPYING file for more details.
13 */
14 
15 #include "commandline_options.hpp"
16 #include "global.hpp"
17 
18 #include "config.hpp"
19 #include "formatter.hpp"
20 #include "log.hpp" // for logger, set_strict_severity, etc
21 #include "serialization/string_utils.hpp" // for split
22 #include "util.hpp" // for lexical_cast
23 
24 #include <boost/any.hpp> // for any
25 #include <boost/program_options/cmdline.hpp>
26 #include <boost/program_options/errors.hpp> // for validation_error, etc
27 #include <boost/program_options/parsers.hpp>
28 #include <boost/program_options/positional_options.hpp>
29 #include <boost/program_options/value_semantic.hpp> // for value, etc
30 #include <boost/program_options/variables_map.hpp> // for variables_map, etc
31 #include <boost/version.hpp> // for BOOST_VERSION
32 #include <iostream> // for operator<<, basic_ostream, etc
33 
34 namespace po = boost::program_options;
35 
36 // this class is needed since boost has some templated operators>> declared internally for tuples and we don't want them to interfere. Existence of such operator>> apparently causes program_options to cause the custom class somehow specially... well, the boost::tuple default operator>> format doesn't suit our needs anyway.
37 class two_strings : public boost::tuple<std::string,std::string> {};
38 
39 static void validate(boost::any& v, const std::vector<std::string>& values,
40  two_strings*, int)
41 {
42  two_strings ret_val;
43  if (values.size() != 2)
44 #if BOOST_VERSION >= 104200
45  throw po::validation_error(po::validation_error::invalid_option_value);
46 #else
47  throw po::validation_error("Invalid number of strings provided to option requiring exactly two of them.");
48 #endif
49  ret_val.get<0>() = values.at(0);
50  ret_val.get<1>() = values.at(1);
51  v = ret_val;
52 }
53 
55  : error((formatter() << "Invalid resolution \"" << resolution
56  << "\" (WIDTHxHEIGHT expected)").str())
57 {
58 }
59 
61  const std::string& expected_format)
62  : error((formatter() << "Invalid value set \"" << str
63  << "\" (" << expected_format << " expected)").str())
64 {
65 }
66 
67 commandline_options::commandline_options (const std::vector<std::string>& args) :
68  bunzip2(),
69  bzip2(),
70  campaign(),
71  campaign_difficulty(),
72  campaign_scenario(),
73  clock(false),
74  data_path(false),
75  data_dir(),
76  debug(false),
77  debug_lua(false),
78 #ifdef DEBUG_WINDOW_LAYOUT_GRAPHS
79  debug_dot_domain(),
80  debug_dot_level(),
81 #endif
82  editor(),
83  fps(false),
84  fullscreen(false),
85  gunzip(),
86  gzip(),
87  help(),
88  language(),
89  log(),
90  load(),
91  logdomains(),
92  log_precise_timestamps(false),
93  multiplayer(false),
94  multiplayer_ai_config(),
95  multiplayer_algorithm(),
96  multiplayer_controller(),
97  multiplayer_era(),
98  multiplayer_exit_at_end(),
99  multiplayer_ignore_map_settings(),
100  multiplayer_label(),
101  multiplayer_parm(),
102  multiplayer_repeat(),
103  multiplayer_scenario(),
104  multiplayer_side(),
105  multiplayer_turns(),
106  max_fps(),
107  noaddons(false),
108  nocache(false),
109  nodelay(false),
110  nogui(false),
111  nomusic(false),
112  nosound(false),
113  new_widgets(false),
114  path(false),
115  preprocess(false),
116  preprocess_defines(),
117  preprocess_input_macros(),
118  preprocess_output_macros(),
119  preprocess_path(),
120  preprocess_target(),
121  resolution(),
122  rng_seed(),
123  server(),
124  username(),
125  password(),
126  screenshot(false),
127  screenshot_map_file(),
128  screenshot_output_file(),
129  script_unsafe_mode(false),
130  strict_validation(false),
131  test(),
132  unit_test(),
133  headless_unit_test(false),
134  noreplaycheck(false),
135  mptest(false),
136  userconfig_path(false),
137  userconfig_dir(),
138  userdata_path(false),
139  userdata_dir(),
140  validcache(false),
141  version(false),
142  windowed(false),
143  with_replay(false),
144  args_(args.begin() + 1 , args.end()),
145  args0_(*args.begin()),
146  all_(),
147  visible_(),
148  hidden_()
149 {
150  // When adding items don't forget to update doc/man/wesnoth.6
151  // Options are sorted alphabetically by --long-option.
152  po::options_description general_opts("General options");
153  general_opts.add_options()
154  ("bunzip2", po::value<std::string>(), "decompresses a file (<arg>.bz2) in bzip2 format and stores it without the .bz2 suffix. <arg>.bz2 will be removed.")
155  ("bzip2", po::value<std::string>(), "compresses a file (<arg>) in bzip2 format, stores it as <arg>.bz2 and removes <arg>.")
156  ("clock", "Adds the option to show a clock for testing the drawing timer.")
157  ("config-dir", po::value<std::string>(), "sets the path of the userdata directory to $HOME/<arg> or My Documents\\My Games\\<arg> for Windows. You can specify also an absolute path outside the $HOME or My Documents\\My Games directory. DEPRECATED: use userdata-path and userconfig-path instead.")
158  ("config-path", "prints the path of the userdata directory and exits. DEPRECATED: use userdata-path and userconfig-path instead.")
159  ("core", po::value<std::string>(), "overrides the loaded core with the one whose id is specified.")
160  ("data-dir", po::value<std::string>(), "overrides the data directory with the one specified.")
161  ("data-path", "prints the path of the data directory and exits.")
162  ("debug,d", "enables additional command mode options in-game.")
163  ("debug-lua", "enables some Lua debugging mechanisms")
164 #ifdef DEBUG_WINDOW_LAYOUT_GRAPHS
165  ("debug-dot-level", po::value<std::string>(), "sets the level of the debug dot files. <arg> should be a comma separated list of levels. These files are used for debugging the widgets especially the for the layout engine. When enabled the engine will produce dot files which can be converted to images with the dot tool. Available levels: size (generate the size info of the widget), state (generate the state info of the widget).")
166  ("debug-dot-domain", po::value<std::string>(), "sets the domain of the debug dot files. <arg> should be a comma separated list of domains. See --debug-dot-level for more info. Available domains: show (generate the data when the dialog is about to be shown), layout (generate the data during the layout phase - might result in multiple files). The data can also be generated when the F12 is pressed in a dialog.")
167 #endif
168  ("editor,e", po::value<std::string>()->implicit_value(std::string()), "starts the in-game map editor directly. If file <arg> is specified, equivalent to -e --load <arg>.")
169  ("gunzip", po::value<std::string>(), "decompresses a file (<arg>.gz) in gzip format and stores it without the .gz suffix. <arg>.gz will be removed.")
170  ("gzip", po::value<std::string>(), "compresses a file (<arg>) in gzip format, stores it as <arg>.gz and removes <arg>.")
171  ("help,h", "prints this message and exits.")
172  ("language,L", po::value<std::string>(), "uses language <arg> (symbol) this session. Example: --language ang_GB@latin")
173  ("load,l", po::value<std::string>(), "loads the save <arg> from the standard save game directory. When launching the map editor via -e, the map <arg> is loaded, relative to the current directory. If it is a directory, the editor will start with a load map dialog opened there.")
174  ("noaddons", "disables the loading of all add-ons.")
175  ("nocache", "disables caching of game data.")
176  ("nodelay", "runs the game without any delays.")
177  ("nomusic", "runs the game without music.")
178  ("nosound", "runs the game without sounds and music.")
179  ("path", "prints the path to the data directory and exits.")
180  ("plugin", po::value<std::string>(), "(experimental) load a script which defines a wesnoth plugin. similar to --script below, but lua file should return a function which will be run as a coroutine and periodically woken up with updates.")
181  ("render-image", po::value<two_strings>()->multitoken(), "takes two arguments: <image> <output>. Like screenshot, but instead of a map, takes a valid wesnoth 'image path string' with image path functions, and outputs to a windows .bmp file."
182 #ifdef _WIN32
183  " Implies --wconsole."
184 #endif // _WIN32
185  )
186  ("rng-seed", po::value<unsigned int>(), "seeds the random number generator with number <arg>. Example: --rng-seed 0")
187  ("screenshot", po::value<two_strings>()->multitoken(), "takes two arguments: <map> <output>. Saves a screenshot of <map> to <output> without initializing a screen. Editor must be compiled in for this to work."
188 #ifdef _WIN32
189  " Implies --wconsole."
190 #endif // _WIN32
191  )
192  ("script", po::value<std::string>(), "(experimental) file containing a lua script to control the client")
193  ("unsafe-scripts", "makes the \'package\' package available to lua scripts, so that they can load arbitrary packages. Do not do this with untrusted scripts! This action gives lua the same permissions as the wesnoth executable.")
194  ("server,s", po::value<std::string>()->implicit_value(std::string()), "connects to the host <arg> if specified or to the first host in your preferences.")
195  ("username", po::value<std::string>(), "uses <username> when connecting to a server, ignoring other preferences.")
196  ("password", po::value<std::string>(), "uses <password> when connecting to a server, ignoring other preferences.")
197  ("strict-validation", "makes validation errors fatal")
198  ("userconfig-dir", po::value<std::string>(), "sets the path of the user config directory to $HOME/<arg> or My Documents\\My Games\\<arg> for Windows. You can specify also an absolute path outside the $HOME or My Documents\\My Games directory. Defaults to $HOME/.config/wesnoth on X11 and to the userdata-dir on other systems.")
199  ("userconfig-path", "prints the path of the user config directory and exits.")
200  ("userdata-dir", po::value<std::string>(), "sets the path of the userdata directory to $HOME/<arg> or My Documents\\My Games\\<arg> for Windows. You can specify also an absolute path outside the $HOME or My Documents\\My Games directory.")
201  ("userdata-path", "prints the path of the userdata directory and exits.")
202  ("validcache", "assumes that the cache is valid. (dangerous)")
203  ("version,v", "prints the game's version number and exits.")
204  ("with-replay", "replays the file loaded with the --load option.")
205 #ifdef _WIN32
206  ("wconsole", "attaches a console window on startup (Windows only). Implied by any option that prints something and exits.")
207 #endif // _WIN32
208  ;
209 
210  po::options_description campaign_opts("Campaign options");
211  campaign_opts.add_options()
212  ("campaign,c", po::value<std::string>()->implicit_value(std::string()), "goes directly to the campaign with id <arg>. A selection menu will appear if no id was specified.")
213  ("campaign-difficulty", po::value<int>(), "The difficulty of the specified campaign (1 to max). If none specified, the campaign difficulty selection widget will appear.")
214  ("campaign-scenario", po::value<std::string>(),"The id of the scenario from the specified campaign. The default is the first scenario.")
215  ;
216 
217  po::options_description display_opts("Display options");
218  display_opts.add_options()
219  ("fps", "displays the number of frames per second the game is currently running at, in a corner of the screen.")
220  ("fullscreen,f", "runs the game in full screen mode.")
221  ("max-fps", po::value<int>(), "the maximum fps the game tries to run at. Values should be between 1 and 1000, the default is 50.")
222  ("new-widgets", "there is a new WIP widget toolkit this switch enables the new toolkit (VERY EXPERIMENTAL don't file bug reports since most are known). Parts of the library are deemed stable and will work without this switch.")
223  ("resolution,r", po::value<std::string>(), "sets the screen resolution. <arg> should have format XxY. Example: --resolution 800x600")
224  ("windowed,w", "runs the game in windowed mode.")
225  ;
226 
227  po::options_description logging_opts("Logging options");
228  logging_opts.add_options()
229  ("logdomains", po::value<std::string>()->implicit_value(std::string()), "lists defined log domains (only the ones containing <arg> filter if such is provided) and exits.")
230  ("log-error", po::value<std::string>(), "sets the severity level of the specified log domain(s) to 'error'. <arg> should be given as comma separated list of domains, wildcards are allowed. Example: --log-error=network,gui/*,engine/enemies")
231  ("log-warning", po::value<std::string>(), "sets the severity level of the specified log domain(s) to 'warning'. Similar to --log-error.")
232  ("log-info", po::value<std::string>(), "sets the severity level of the specified log domain(s) to 'info'. Similar to --log-error.")
233  ("log-debug", po::value<std::string>(), "sets the severity level of the specified log domain(s) to 'debug'. Similar to --log-error.")
234  ("log-precise", "shows the timestamps in the logfile with more precision.")
235  ;
236 
237  po::options_description multiplayer_opts("Multiplayer options");
238  multiplayer_opts.add_options()
239  ("multiplayer,m", "Starts a multiplayer game. There are additional options that can be used as explained below:")
240  ("ai-config", po::value<std::vector<std::string> >()->composing(), "selects a configuration file to load for this side. <arg> should have format side:value")
241  ("algorithm", po::value<std::vector<std::string> >()->composing(), "selects a non-standard algorithm to be used by the AI controller for this side. <arg> should have format side:value")
242  ("controller", po::value<std::vector<std::string> >()->composing(), "selects the controller for this side. <arg> should have format side:value")
243  ("era", po::value<std::string>(), "selects the era to be played in by its id.")
244  ("exit-at-end", "exit Wesnoth at the end of the scenario.")
245  ("ignore-map-settings", "do not use map settings.")
246  ("label", po::value<std::string>(), "sets the label for AIs.") //TODO is the description precise? this option was undocumented before.
247  ("multiplayer-repeat", po::value<unsigned int>(), "repeats a multiplayer game after it is finished <arg> times.")
248  ("nogui", "runs the game without the GUI.")
249  ("parm", po::value<std::vector<std::string> >()->composing(), "sets additional parameters for this side. <arg> should have format side:name:value.")
250  ("scenario", po::value<std::string>(), "selects a multiplayer scenario. The default scenario is \"multiplayer_The_Freelands\".")
251  ("side", po::value<std::vector<std::string> >()->composing(), "selects a faction of the current era for this side by id. <arg> should have format side:value.")
252  ("turns", po::value<std::string>(), "sets the number of turns. The default is \"50\".")
253  ;
254 
255  po::options_description testing_opts("Testing options");
256  testing_opts.add_options()
257  ("test,t", po::value<std::string>()->implicit_value(std::string()), "runs the game in a small test scenario. If specified, scenario <arg> will be used instead.")
258  ("unit,u", po::value<std::string>()->implicit_value(std::string()), "runs a unit test scenario. Works like test, except that the exit code of the program reflects the victory / defeat conditions of the scenario.\n\t0 - PASS\n\t1 - FAIL\n\t2 - FAIL (TIMEOUT)\n\t3 - FAIL (INVALID REPLAY)\n\t4 - FAIL (ERRORED REPLAY)")
259  ("showgui", "don't run headlessly (for debugging a failing test)")
260  ("timeout", po::value<unsigned int>(), "sets a timeout (milliseconds) for the unit test. (DEPRECATED)")
261  ("log-strict", po::value<std::string>(), "sets the strict level of the logger. any messages sent to log domains of this level or more severe will cause the unit test to fail regardless of the victory result.")
262  ("noreplaycheck", "don't try to validate replay of unit test.")
263  ("mp-test", "load the test mp scenarios.")
264  ;
265 
266  po::options_description preprocessor_opts("Preprocessor mode options");
267  preprocessor_opts.add_options()
268  ("preprocess,p", po::value<two_strings>()->multitoken(), "requires two arguments: <file/folder> <target directory>. Preprocesses a specified file/folder. The preprocessed file(s) will be written in the specified target directory: a plain cfg file and a processed cfg file.")
269  ("preprocess-defines", po::value<std::string>(), "comma separated list of defines to be used by '--preprocess' command. If 'SKIP_CORE' is in the define list the data/core won't be preprocessed. Example: --preprocess-defines=FOO,BAR")
270  ("preprocess-input-macros", po::value<std::string>(), "used only by the '--preprocess' command. Specifies source file <arg> that contains [preproc_define]s to be included before preprocessing.")
271  ("preprocess-output-macros", po::value<std::string>()->implicit_value(std::string()), "used only by the '--preprocess' command. Will output all preprocessed macros in the target file <arg>. If the file is not specified the output will be file '_MACROS_.cfg' in the target directory of preprocess's command.")
272  ;
273 
274  po::options_description proxy_opts("Proxy options");
275  proxy_opts.add_options()
276  ("proxy", "enables usage of proxy for network connections.")
277  ("proxy-address", po::value<std::string>(), "specifies address of the proxy.")
278  ("proxy-port", po::value<std::string>(), "specifies port of the proxy.")
279  ("proxy-user", po::value<std::string>(), "specifies username to log in to the proxy.")
280  ("proxy-password", po::value<std::string>(), "specifies password to log in to the proxy.")
281  ;
282 
283  //hidden_.add_options()
284  // ("example-hidden-option", "")
285  // ;
286  visible_.add(general_opts).add(campaign_opts).add(display_opts).add(logging_opts).add(multiplayer_opts).add(testing_opts).add(preprocessor_opts).add(proxy_opts);
287 
288  all_.add(visible_).add(hidden_);
289 
290  po::positional_options_description positional;
291  positional.add("data-dir",1);
292 
293  po::variables_map vm;
294  const int parsing_style = po::command_line_style::default_style ^ po::command_line_style::allow_guessing;
295  po::store(po::command_line_parser(args_).options(all_).positional(positional).style(parsing_style).run(),vm);
296 
297  if (vm.count("ai-config"))
298  multiplayer_ai_config = parse_to_uint_string_tuples_(vm["ai-config"].as<std::vector<std::string> >());
299  if (vm.count("algorithm"))
300  multiplayer_algorithm = parse_to_uint_string_tuples_(vm["algorithm"].as<std::vector<std::string> >());
301  if (vm.count("bunzip2"))
302  bunzip2 = vm["bunzip2"].as<std::string>();
303  if (vm.count("bzip2"))
304  bzip2 = vm["bzip2"].as<std::string>();
305  if (vm.count("campaign"))
306  campaign = vm["campaign"].as<std::string>();
307  if (vm.count("campaign-difficulty"))
308  campaign_difficulty = vm["campaign-difficulty"].as<int>();
309  if (vm.count("campaign-scenario"))
310  campaign_scenario = vm["campaign-scenario"].as<std::string>();
311  if (vm.count("clock"))
312  clock = true;
313  if (vm.count("core"))
314  core_id = vm["core"].as<std::string>();
315  if (vm.count("config-dir"))
316  userdata_dir = vm["config-dir"].as<std::string>(); //TODO: complain and remove
317  if (vm.count("config-path"))
318  userdata_path = true; //TODO: complain and remove
319  if (vm.count("controller"))
320  multiplayer_controller = parse_to_uint_string_tuples_(vm["controller"].as<std::vector<std::string> >());
321  if (vm.count("data-dir"))
322  data_dir = vm["data-dir"].as<std::string>();
323  if (vm.count("data-path"))
324  data_path = true;
325  if (vm.count("debug"))
326  debug = true;
327  if (vm.count("debug-lua"))
328  debug_lua = true;
329 #ifdef DEBUG_WINDOW_LAYOUT_GRAPHS
330  if (vm.count("debug-dot-domain")) {
331  debug_dot_domain = vm["debug-dot-domain"].as<std::string>();
332  }
333  if (vm.count("debug-dot-level")) {
334  debug_dot_level = vm["debug-dot-level"].as<std::string>();
335  }
336 #endif
337  if (vm.count("editor"))
338  editor = vm["editor"].as<std::string>();
339  if (vm.count("era"))
340  multiplayer_era = vm["era"].as<std::string>();
341  if (vm.count("exit-at-end"))
343  if (vm.count("fps"))
344  fps = true;
345  if (vm.count("fullscreen"))
346  fullscreen = true;
347  if (vm.count("gunzip"))
348  gunzip = vm["gunzip"].as<std::string>();
349  if (vm.count("gzip"))
350  gzip = vm["gzip"].as<std::string>();
351  if (vm.count("help"))
352  help = true;
353  if (vm.count("ignore-map-settings"))
355  if (vm.count("label"))
356  multiplayer_label = vm["label"].as<std::string>();
357  if (vm.count("language"))
358  language = vm["language"].as<std::string>();
359  if (vm.count("load"))
360  load = vm["load"].as<std::string>();
361  if (vm.count("log-error"))
362  parse_log_domains_(vm["log-error"].as<std::string>(),lg::err().get_severity());
363  if (vm.count("log-warning"))
364  parse_log_domains_(vm["log-warning"].as<std::string>(),lg::warn().get_severity());
365  if (vm.count("log-info"))
366  parse_log_domains_(vm["log-info"].as<std::string>(),lg::info().get_severity());
367  if (vm.count("log-debug"))
368  parse_log_domains_(vm["log-debug"].as<std::string>(),lg::debug().get_severity());
369  if (vm.count("logdomains"))
370  logdomains = vm["logdomains"].as<std::string>();
371  if (vm.count("log-precise"))
372  log_precise_timestamps = true;
373  if (vm.count("log-strict"))
374  parse_log_strictness(vm["log-strict"].as<std::string>());
375  if (vm.count("max-fps"))
376  max_fps = vm["max-fps"].as<int>();
377  if (vm.count("mp-test"))
378  mptest = true;
379  if (vm.count("multiplayer"))
380  multiplayer = true;
381  if (vm.count("multiplayer-repeat"))
382  multiplayer_repeat = vm["multiplayer-repeat"].as<unsigned int>();
383  if (vm.count("new-widgets"))
384  new_widgets = true;
385  if (vm.count("noaddons"))
386  noaddons = true;
387  if (vm.count("nocache"))
388  nocache = true;
389  if (vm.count("nodelay"))
390  nodelay = true;
391  if (vm.count("nomusic"))
392  nomusic = true;
393  if (vm.count("noreplaycheck"))
394  noreplaycheck = true;
395  if (vm.count("nosound"))
396  nosound = true;
397  if (vm.count("nogui"))
398  nogui = true;
399  if (vm.count("parm"))
400  multiplayer_parm = parse_to_uint_string_string_tuples_(vm["parm"].as<std::vector<std::string> >());
401  if (vm.count("path"))
402  path = true;
403  if (vm.count("preprocess"))
404  {
405  preprocess = true;
406  preprocess_path = vm["preprocess"].as<two_strings>().get<0>();
407  preprocess_target = vm["preprocess"].as<two_strings>().get<1>();
408  }
409  if (vm.count("preprocess-defines"))
410  preprocess_defines = utils::split(vm["preprocess-defines"].as<std::string>(), ',');
411  if (vm.count("preprocess-input-macros"))
412  preprocess_input_macros = vm["preprocess-input-macros"].as<std::string>();
413  if (vm.count("preprocess-output-macros"))
414  preprocess_output_macros = vm["preprocess-output-macros"].as<std::string>();
415  if (vm.count("resolution"))
416  parse_resolution_(vm["resolution"].as<std::string>());
417  if (vm.count("rng-seed"))
418  rng_seed = vm["rng-seed"].as<unsigned int>();
419  if (vm.count("scenario"))
420  multiplayer_scenario = vm["scenario"].as<std::string>();
421  if (vm.count("render-image"))
422  {
423  render_image = vm["render-image"].as<two_strings>().get<0>();
424  render_image_dst = vm["render-image"].as<two_strings>().get<1>();
425  }
426  if (vm.count("screenshot"))
427  {
428  screenshot = true;
429  screenshot_map_file = vm["screenshot"].as<two_strings>().get<0>();
430  screenshot_output_file = vm["screenshot"].as<two_strings>().get<1>();
431  }
432  if (vm.count("script"))
433  script_file = vm["script"].as<std::string>();
434  if (vm.count("unsafe-scripts"))
435  script_unsafe_mode = true;
436  if (vm.count("plugin"))
437  plugin_file = vm["plugin"].as<std::string>();
438  if (vm.count("server"))
439  server = vm["server"].as<std::string>();
440  if (vm.count("username"))
441  username = vm["username"].as<std::string>();
442  if (vm.count("password"))
443  password = vm["password"].as<std::string>();
444  if (vm.count("side"))
445  multiplayer_side = parse_to_uint_string_tuples_(vm["side"].as<std::vector<std::string> >());
446  if (vm.count("test"))
447  test = vm["test"].as<std::string>();
448  if (vm.count("unit"))
449  {
450  unit_test = vm["unit"].as<std::string>();
451  headless_unit_test = true;
452  }
453  if (vm.count("showgui"))
454  headless_unit_test = false;
455  if (vm.count("timeout"))
456  timeout = vm["timeout"].as<unsigned int>();
457  if (vm.count("noreplaycheck"))
458  noreplaycheck = true;
459  if (vm.count("turns"))
460  multiplayer_turns = vm["turns"].as<std::string>();
461  if (vm.count("strict-validation"))
462  strict_validation = true;
463  if (vm.count("userconfig-dir"))
464  userconfig_dir = vm["userconfig-dir"].as<std::string>();
465  if (vm.count("userconfig-path"))
466  userconfig_path = true;
467  if (vm.count("userdata-dir"))
468  userdata_dir = vm["userdata-dir"].as<std::string>();
469  if (vm.count("userdata-path"))
470  userdata_path = true;
471  if (vm.count("validcache"))
472  validcache = true;
473  if (vm.count("version"))
474  version = true;
475  if (vm.count("windowed"))
476  windowed = true;
477  if (vm.count("with-replay"))
478  with_replay = true;
479 }
480 
481 void commandline_options::parse_log_domains_(const std::string &domains_string, const int severity)
482 {
483  const std::vector<std::string> domains = utils::split(domains_string, ',');
484  for (const std::string& domain : domains)
485  {
486  if (!log)
487  log = std::vector<boost::tuple<int, std::string> >();
488  log->push_back(boost::tuple<int, std::string>(severity,domain));
489  }
490 }
491 
493  static lg::logger const *loggers[] = { &lg::err(), &lg::warn(), &lg::info(), &lg::debug() };
494  for (const lg::logger * l : loggers ) {
495  if (severity == l->get_name()) {
497  return ;
498  }
499  }
500  std::cerr << "Unrecognized argument to --log-strict : " << severity << " . \nDisabling strict mode logging." << std::endl;
502 }
503 
504 void commandline_options::parse_resolution_ ( const std::string& resolution_string )
505 {
506  const std::vector<std::string> tokens = utils::split(resolution_string, 'x');
507  if (tokens.size() != 2) {
508  throw bad_commandline_resolution(resolution_string);
509  }
510 
511  int xres, yres;
512 
513  try {
514  xres = lexical_cast<int>(tokens[0]);
515  yres = lexical_cast<int>(tokens[1]);
516  } catch(bad_lexical_cast &) {
517  throw bad_commandline_resolution(resolution_string);
518  }
519 
520  resolution = boost::tuple<int,int>(xres,yres);
521 }
522 
523 std::vector<boost::tuple<unsigned int,std::string> > commandline_options::parse_to_uint_string_tuples_(const std::vector<std::string> &strings, char separator)
524 {
525  std::vector<boost::tuple<unsigned int,std::string> > vec;
526  boost::tuple<unsigned int,std::string> elem;
527  const std::string& expected_format
528  = std::string() + "UINT" + separator + "STRING";
529 
530  for (const std::string &s : strings)
531  {
532  const std::vector<std::string> tokens = utils::split(s, separator);
533  if(tokens.size() != 2) {
534  throw bad_commandline_tuple(s, expected_format);
535  }
536 
537  unsigned int temp;
538  try {
539  temp = lexical_cast<unsigned int>(tokens[0]);
540  } catch (bad_lexical_cast &) {
541  throw bad_commandline_tuple(s, expected_format);
542  }
543 
544  elem.get<0>() = temp;
545  elem.get<1>() = tokens[1];
546  vec.push_back(elem);
547  }
548  return vec;
549 }
550 
551 std::vector<boost::tuple<unsigned int,std::string,std::string> > commandline_options::parse_to_uint_string_string_tuples_(const std::vector<std::string> &strings, char separator)
552 {
553  std::vector<boost::tuple<unsigned int,std::string,std::string> > vec;
554  boost::tuple<unsigned int,std::string,std::string> elem;
555  const std::string& expected_format
556  = std::string() + "UINT" + separator + "STRING" + separator + "STRING";
557 
558  for (const std::string &s : strings)
559  {
560  const std::vector<std::string> tokens = utils::split(s, separator);
561  if(tokens.size() != 3) {
562  throw bad_commandline_tuple(s, expected_format);
563  }
564 
565  unsigned int temp;
566  try {
567  temp = lexical_cast<unsigned int>(tokens[0]);
568  } catch (bad_lexical_cast &) {
569  throw bad_commandline_tuple(s, expected_format);
570  }
571  elem.get<0>() = temp;
572  elem.get<1>() = tokens[1];
573  elem.get<2>() = tokens[2];
574  vec.push_back(elem);
575  }
576  return vec;
577 }
578 
579 std::ostream& operator<<(std::ostream &os, const commandline_options& cmdline_opts)
580 {
581  os << "Usage: " << cmdline_opts.args0_ << " [<options>] [<data-directory>]\n";
582  os << cmdline_opts.visible_;
583  return os;
584 }
585 
587  config ret;
588  if (server) {
589  ret["server"] = *server;
590  }
591  if (username) {
592  ret["username"] = *username;
593  }
594  if (password) {
595  ret["password"] = *password;
596  }
597  return ret;
598 }
boost::optional< std::string > core_id
Non-empty if –core was given on the command line. Chooses the core to be loaded. ...
bool log_precise_timestamps
True if –log-precise was given on the command line. Shows timestamps in log with more precision...
boost::optional< std::string > script_file
File to load lua script from.
bool new_widgets
Do we wish to use the new library or not.
Definition: settings.cpp:40
std::vector< std::string > args_
bool mptest
True if –mp-test was given on the command line.
static domain_map * domains
Definition: log.cpp:74
boost::program_options::options_description all_
boost::optional< std::vector< boost::tuple< unsigned int, std::string, std::string > > > multiplayer_parm
Non-empty if –parm was given on the command line. Vector of pairs (side number, parm name...
bool nogui
True if –nogui was given on the command line. Disables GUI.
boost::optional< std::string > multiplayer_turns
Non-empty if –turns was given on the command line. Dependent on –multiplayer.
bool script_unsafe_mode
Whether to load the "package" package for the scripting environment. (This allows to load arbitrary l...
boost::optional< std::vector< boost::tuple< unsigned int, std::string > > > multiplayer_algorithm
Non-empty if –algorithm was given on the command line. Vector of pairs (side number, value). Dependent on –multiplayer.
boost::optional< std::string > bzip2
Non-empty if –bzip2 was given on the command line. Compresses a file to .bz2 and exits...
commandline_options(const std::vector< std::string > &args)
boost::program_options::options_description hidden_
static l_noret error(LoadState *S, const char *why)
Definition: lundump.cpp:29
bool noaddons
True if –noaddons was given on the command line. Disables the loading of all add-ons.
logger & info()
Definition: log.cpp:91
void parse_log_domains_(const std::string &domains_string, const int severity)
bool userdata_path
True if –userdata-path was given on the command line. Prints path to user data directory and exits...
boost::optional< std::string > multiplayer_scenario
Non-empty if –scenario was given on the command line. Dependent on –multiplayer.
bool multiplayer_ignore_map_settings
True if –ignore-map-settings was given at the command line. Do not use map settings.
boost::optional< std::string > username
Non-empty if –username was given on the command line. Forces Wesnoth to use this network username...
boost::optional< std::string > gunzip
Non-empty if –gunzip was given on the command line. Uncompresses a .gz file and exits.
boost::optional< std::string > campaign_scenario
Non-empty if –campaign-scenario was given on the command line. Chooses starting scenario in the camp...
boost::optional< int > max_fps
Max FPS specified by –max-fps option.
boost::optional< unsigned int > rng_seed
RNG seed specified by –rng-seed option. Initializes RNG with given seed.
bool fps
True if –fps was given on the command line. Shows number of fps.
boost::optional< std::string > data_dir
Non-empty if –data-dir was given on the command line. Sets the config dir to the specified one...
boost::optional< std::vector< boost::tuple< int, std::string > > > log
Contains parsed arguments of –log-* (e.g.
bool noreplaycheck
True if –noreplaycheck was given on the comand line. Dependent on –unit.
std::vector< boost::tuple< unsigned int, std::string > > parse_to_uint_string_tuples_(const std::vector< std::string > &strings, char separator= ':')
A helper function splitting vector of strings of format unsigned int:string to vector of tuples (unsi...
int get_severity() const
Definition: log.hpp:127
boost::optional< std::string > multiplayer_era
Non-empty if –era was given on the command line. Dependent on –multiplayer.
void parse_resolution_(const std::string &resolution_string)
To lexical_cast(From value)
Lexical cast converts one type to another.
Definitions for the interface to Wesnoth Markup Language (WML).
bad_commandline_tuple(const std::string &str, const std::string &expected_format)
boost::optional< std::string > plugin_file
File to load a lua plugin (similar to a script) from. Experimental / may replace script.
boost::optional< std::string > multiplayer_label
Non-empty if –label was given on the command line. Dependent on –multiplayer.
boost::optional< std::string > load
Non-empty if –load was given on the command line. Savegame specified to load after start...
GLboolean GLenum GLenum GLvoid * values
Definition: glew.h:3799
bool preprocess
True if –preprocess was given on the command line. Starts Wesnoth in preprocessor-only mode...
GLdouble l
Definition: glew.h:6966
bool with_replay
True if –with-replay was given on the command line. Shows replay of the loaded file.
bool headless_unit_test
True if –unit is used and –showgui is not present.
const config & options()
GLsizei const char ** path
Definition: glew.h:4654
GLuint GLuint end
Definition: glew.h:1221
boost::optional< std::string > userconfig_dir
Non-empty if –userconfig-dir was given on the command line. Sets the user config dir to the specifie...
boost::optional< std::vector< boost::tuple< unsigned int, std::string > > > multiplayer_controller
Non-empty if –controller was given on the command line. Vector of pairs (side number, controller). Dependent on –multiplayer.
std::ostream & operator<<(std::ostream &os, const commandline_options &cmdline_opts)
std::ostringstream wrapper.
Definition: formatter.hpp:32
bool nodelay
True if –nodelay was given on the command line.
const GLdouble * v
Definition: glew.h:1359
GLsizei const GLfloat * value
Definition: glew.h:1817
boost::optional< std::string > logdomains
Non-empty if –logdomains was given on the command line. Prints possible logdomains filtered by given...
bool windowed
True if –windowed was given on the command line. Starts Wesnoth in windowed mode.
boost::optional< std::string > userdata_dir
Non-empty if –userdata-dir was given on the command line. Sets the user data dir to the specified on...
boost::optional< std::string > gzip
Non-empty if –gzip was given on the command line. Compresses a file to .gz and exits.
std::pair< int, int > resolution()
boost::optional< std::string > preprocess_output_macros
Non-empty if –preprocess-output-macros was given on the command line. Outputs all preprocessed macro...
boost::optional< std::string > test
Non-empty if –test was given on the command line. Goes directly into test mode, into a scenario...
bool multiplayer
True if –multiplayer was given on the command line. Goes directly into multiplayer mode...
Manage the empty-palette in the editor.
Definition: action.cpp:28
logger & debug()
Definition: log.cpp:97
bool clock
True if –clock was given on the command line. Enables.
Templates and utility-routines for strings and numbers.
bool userconfig_path
True if –userconfig-path was given on the command line. Prints path to user config directory and exi...
GLenum severity
Definition: glew.h:2497
boost::optional< std::string > render_image
Image path to render. First parameter after –render-image.
boost::optional< int > campaign_difficulty
Non-empty if –campaign-difficulty was given on the command line. Numerical difficulty of the campaig...
bool nomusic
True if –nomusic was given on the command line. Disables music.
GLsizei const GLchar ** strings
Definition: glew.h:1812
boost::optional< std::string > password
Non-empty if –password was given on the command line. Forces Wesnoth to use this network password...
boost::optional< std::string > preprocess_target
Target (output) path that was given to the –preprocess option.
bool debug
True if –debug was given on the command line. Enables debug mode.
bool debug_lua
True if –debug-lua was given in the commandline. Enables some Lua debugging mechanisms.
bool nocache
True if –nocache was given on the command line. Disables cache usage.
static bool fullscreen(CVideo &video)
Definition: lobby.cpp:400
logger & err()
Definition: log.cpp:79
boost::optional< std::string > screenshot_map_file
Map file to make a screenshot of. First parameter given after –screenshot.
GLbitfield GLuint64 timeout
Definition: glew.h:4717
boost::optional< std::string > preprocess_path
Path to parse that was given to the –preprocess option.
void set_strict_severity(int severity)
Definition: log.cpp:160
bool new_widgets
True if –new-widgets was given on the command line. Hidden option to enable the new widget toolkit...
boost::optional< std::string > bunzip2
Non-empty if –bunzip2 was given on the command line. Uncompresses a .bz2 file and exits...
boost::optional< std::vector< boost::tuple< unsigned int, std::string > > > multiplayer_ai_config
Non-empty if –ai-config was given on the command line. Vector of pairs (side number, value). Dependent on –multiplayer.
boost::optional< std::vector< boost::tuple< unsigned int, std::string > > > multiplayer_side
Non-empty if –side was given on the command line. Vector of pairs (side number, faction id)...
std::string language()
bad_commandline_resolution(const std::string &resolution)
std::vector< boost::tuple< unsigned int, std::string, std::string > > parse_to_uint_string_string_tuples_(const std::vector< std::string > &strings, char separator= ':')
A helper function splitting vector of strings of format unsigned int:string:string to vector of tuple...
static void validate(boost::any &v, const std::vector< std::string > &values, two_strings *, int)
#define debug(x)
boost::optional< std::string > render_image_dst
Output file to put rendered image path in. Optional second parameter after –render-image.
void parse_log_strictness(const std::string &severity)
bool data_path
True if –data-path was given on the command line. Prints path to data directory and exits...
bool screenshot
True if –screenshot was given on the command line. Starts Wesnoth in screenshot mode.
boost::optional< std::string > unit_test
Non-empty if –unit was given on the command line. Goes directly into unit test mode, into a scenario, if specified.
logger & warn()
Definition: log.cpp:85
boost::optional< unsigned int > multiplayer_repeat
Repeats specified by –multiplayer-repeat option. Repeats a multiplayer game after it is finished...
bool version
True if –version was given on the command line. Prints version and exits.
Standard logging facilities (interface).
boost::optional< std::string > screenshot_output_file
Output file to put screenshot in. Second parameter given after –screenshot.
bool fullscreen
True if –fullscreen was given on the command line. Starts Wesnoth in fullscreen mode.
bool validcache
True if –validcache was given on the command line. Makes Wesnoth assume the cache is valid...
bool strict_validation
True if –strict-validation was given on the command line. Makes Wesnoth trust validation errors as f...
boost::optional< std::vector< std::string > > preprocess_defines
Defines that were given to the –preprocess option.
boost::optional< std::string > language
Non-empty if –language was given on the command line. Sets the language for this session...
std::vector< std::string > split(std::string const &val, const char c, const int flags)
Splits a (comma-)separated string into a vector of pieces.
Definition: help.cpp:57
bool nosound
True if –nosound was given on the command line. Disables sound.
boost::optional< std::string > preprocess_input_macros
Non-empty if –preprocess-input-macros was given on the command line. Specifies a file that contains ...
boost::program_options::options_description visible_
bool multiplayer_exit_at_end
True if –exit-at-and was given on the command line. Dependent on –multiplayer.
boost::optional< std::string > campaign
Non-empty if –campaign was given on the command line. ID of the campaign we want to start...
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:83
GLdouble s
Definition: glew.h:1358
Thrown when a lexical_cast fails.
const std::string version
Definition: game_config.cpp:48
GLsizei const GLcharARB ** string
Definition: glew.h:4503
boost::optional< std::string > server
Non-empty if –server was given on the command line. Connects Wesnoth to specified server...
static void test()
boost::optional< boost::tuple< int, int > > resolution
Pair of AxB values specified after –resolution. Changes Wesnoth resolution.