16 #include "addon/manager.hpp"
55 #include "widgets/button.hpp"
71 #include <boost/program_options/errors.hpp>
72 #include <boost/algorithm/string/predicate.hpp>
92 #ifdef INADDR_BROADCAST
93 #undef INADDR_BROADCAST
104 #ifdef DEBUG_WINDOW_LAYOUT_GRAPHS
113 #define LOG_CONFIG LOG_STREAM(info, log_config)
115 #define LOG_GENERAL LOG_STREAM(info, lg::general())
118 #define LOG_PREPROC LOG_STREAM(info, log_preprocessor)
136 PLAIN_LOG <<
"please specify an existing file. File " << file <<
" doesn't exist.";
140 PLAIN_LOG <<
"Reading cached defines from: " << file;
148 PLAIN_LOG <<
"Caught a config error while parsing file '" << file <<
"':\n" <<
e.message;
156 defines_map[def.first] = def.second;
182 [](
const auto& timer) {
PLAIN_LOG <<
"preprocessing finished. Took " << timer <<
" ticks."; });
184 PLAIN_LOG <<
"added " << defines_map.size() <<
" defines.";
194 PLAIN_LOG <<
"please specify an existing file. File " << file <<
" doesn't exist.";
198 PLAIN_LOG <<
"Reading cached defines from: " << file;
206 PLAIN_LOG <<
"Caught a config error while parsing file '" << file <<
"':\n" <<
e.message;
214 input_macros[def.first] = def.second;
225 [](
const auto& timer) {
PLAIN_LOG <<
"preprocessing finished. Took " << timer <<
" ticks."; });
228 bool skipCore =
false;
229 bool skipTerrainGFX =
false;
245 if(define ==
"SKIP_CORE") {
248 }
else if(define ==
"NO_TERRAIN_GFX") {
249 PLAIN_LOG <<
"'NO_TERRAIN_GFX' defined.";
250 skipTerrainGFX =
true;
258 PLAIN_LOG <<
"added " << defines_map.size() <<
" defines.";
261 if(skipCore ==
false) {
262 PLAIN_LOG <<
"preprocessing common macros from 'data/core' ...";
267 if(skipTerrainGFX ==
false) {
271 PLAIN_LOG <<
"acquired " << (defines_map.size() - input_macros.size()) <<
" 'data/core' defines.";
277 PLAIN_LOG <<
"preprocessing specified resource: " << resourceToProcess <<
" ...";
280 PLAIN_LOG <<
"acquired " << (defines_map.size() - input_macros.size()) <<
" total defines.";
283 std::string outputFileName =
"_MACROS_.cfg";
288 std::string outputPath = targetDir +
"/" + outputFileName;
290 PLAIN_LOG <<
"writing '" << outputPath <<
"' with " << defines_map.size() <<
" defines.";
296 for(
auto& define_pair : defines_map) {
297 define_pair.second.write(writer, define_pair.first);
310 for(
const std::string& define : defines) {
325 std::cout <<
"validation failed\n";
327 std::cout <<
"validation succeeded\n";
359 && !getenv(
"WESNOTH_NO_LOG_FILE")
367 && !cmdline_opts.
help
374 && !cmdline_opts.
nogui
387 else if(!cmdline_opts.no_console) {
392 if(cmdline_opts.
log) {
393 for(
const auto& log_pair : *cmdline_opts.
log) {
394 const std::string log_domain = log_pair.second;
397 PLAIN_LOG <<
"unknown log domain: " << log_domain;
405 const std::time_t
t = std::time(
nullptr);
431 PLAIN_LOG <<
"Automatically found a possible data directory at: " << auto_dir;
436 PLAIN_LOG <<
"Cannot find game data directory. Specify one with --data-dir";
468 if(cmdline_opts.
help) {
469 std::cout << cmdline_opts;
487 SDL_setenv(
"SDL_VIDEODRIVER",
"dummy", 1);
521 std::ifstream in_left(cmdline_opts.
diff_left);
522 std::ifstream in_right(cmdline_opts.
diff_right);
524 read(right, in_right);
525 std::ostream* os = &std::cout;
531 if(os != &std::cout)
delete os;
537 std::ifstream in_base(cmdline_opts.
diff_left);
538 std::ifstream in_diff(cmdline_opts.
diff_right);
542 std::ostream* os = &std::cout;
548 if(os != &std::cout)
delete os;
571 std::string schema_path;
576 schema_path = check.value();
578 PLAIN_LOG <<
"Could not find schema file: " << schema_path;
595 PLAIN_LOG <<
"That --preprocess-* option is only supported when using --preprocess or --validate.";
611 #if defined _WIN32 || defined __APPLE__
612 setlocale(LC_ALL,
"English");
614 std::setlocale(LC_ALL,
"C");
637 <<
"An error at this point during initialization usually indicates that the data\n"
638 <<
"directory above was not correctly set or detected. Try passing the correct path\n"
639 <<
"in the command line with the --data-dir switch or as the only argument.";
648 static bool first_time =
true;
656 if(!
game->init_lua_script()) {
667 if(_controlfp_s(&f_control, 0, 0) == 0) {
669 uint32_t rounding_mode = f_control & _MCW_RC;
671 if(rounding_mode != _RC_NEAR) {
672 PLAIN_LOG <<
"Floating point rounding mode is currently '"
673 << ((rounding_mode == _RC_CHOP)
675 : (rounding_mode == _RC_UP)
677 : (rounding_mode == _RC_DOWN)
679 : (rounding_mode == _RC_NEAR) ?
"near" :
"unknown")
680 <<
"' setting to 'near'";
682 if(_controlfp_s(&unused, _RC_NEAR, _MCW_RC)) {
683 PLAIN_LOG <<
"failed to set floating point rounding type to 'near'";
688 uint32_t precision_mode = f_control & _MCW_PC;
689 if(precision_mode != _PC_53) {
690 PLAIN_LOG <<
"Floating point precision mode is currently '"
691 << ((precision_mode == _PC_53)
693 : (precision_mode == _PC_24)
695 : (precision_mode == _PC_64) ?
"double extended" :
"unknown")
696 <<
"' setting to 'double'";
698 if(_controlfp_s(&unused, _PC_53, _MCW_PC)) {
699 PLAIN_LOG <<
"failed to set floating point precision type to 'double'";
711 switch(fegetround()) {
715 STREAMING_LOG <<
"Floating point precision mode is currently 'downward'";
718 STREAMING_LOG <<
"Floating point precision mode is currently 'toward-zero'";
721 STREAMING_LOG <<
"Floating point precision mode is currently 'upward'";
724 STREAMING_LOG <<
"Floating point precision mode is currently 'unknown'";
728 fesetround(FE_TONEAREST);
740 srand(std::time(
nullptr));
742 const auto game = std::make_unique<game_launcher>(cmdline_opts);
753 PLAIN_LOG <<
"could not initialize fonts";
759 res =
game->init_language();
761 PLAIN_LOG <<
"could not initialize the language";
765 res =
game->init_video();
767 PLAIN_LOG <<
"could not initialize display";
775 #if(defined(_X11) && !defined(__APPLE__)) || defined(_WIN32)
776 SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
789 std::string
msg =
VGETTEXT(
"Unable to create log files in directory $logdir. This is often caused by incorrect folder permissions, anti-virus software restricting folder access, or using OneDrive to manage your My Documents folder.", symbols);
805 PLAIN_LOG <<
"could not initialize game config";
813 PLAIN_LOG <<
"could not re-initialize fonts for the current language";
845 if(!
game->has_load_data()) {
852 config title_music_config;
854 title_music_config[
"append"] =
true;
855 title_music_config[
"immediate"] =
true;
869 return static_cast<int>(
game->unit_test());
872 if(
game->play_test() ==
false) {
876 if(
game->play_screenshot_mode() ==
false) {
880 if(
game->play_render_image_mode() ==
false) {
885 if(
game->goto_campaign() ==
false) {
886 if(
game->jump_to_campaign_id().empty())
894 if(
game->goto_multiplayer() ==
false) {
899 if(
game->play_multiplayer_commandline() ==
false) {
903 if(
game->goto_editor() ==
false) {
912 if(
game->has_load_data() &&
game->load_game()) {
951 game->start_editor();
966 #define error_exit(res) \
968 if(lg::using_own_console()) { \
969 std::cerr << "Press enter to continue..." << std::endl; \
975 #define error_exit(res) return res
982 int main(
int argc,
char** argv)
986 assert(!args.empty());
989 _putenv(
"PANGOCAIRO_BACKEND=fontconfig");
990 _putenv(
"FONTCONFIG_PATH=fonts");
995 setenv(
"PANGOCAIRO_BACKEND",
"fontconfig", 0);
1002 if(finished != -1) {
1005 std::cerr <<
"Press enter to continue..." << std::endl;
1012 SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS,
"1");
1014 if(SDL_Init(SDL_INIT_TIMER) < 0) {
1015 PLAIN_LOG <<
"Couldn't initialize SDL: " << SDL_GetError();
1022 #if defined(__APPLE__) && !defined(__IPHONEOS__)
1023 SDL_EventState(SDL_FINGERMOTION, SDL_DISABLE);
1024 SDL_EventState(SDL_FINGERDOWN, SDL_DISABLE);
1025 SDL_EventState(SDL_FINGERUP, SDL_DISABLE);
1031 SDL_StartTextInput();
1035 }
catch(
const boost::program_options::error&
e) {
1037 std::cerr <<
"Error in command line: " <<
e.what() << std::endl;
1038 std::string error =
"Error parsing command line arguments: ";
1040 SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
"Error", error.c_str(),
nullptr);
1043 PLAIN_LOG <<
"Video system error: " <<
e.what();
1046 PLAIN_LOG <<
"Could not initialize fonts.\n\n" <<
e.what() <<
"\n\nExiting.";
1054 PLAIN_LOG <<
"caught return_to_play_side_exception, please report this bug (quitting)";
1056 PLAIN_LOG <<
"caught quit_game_exception (quitting)";
1058 PLAIN_LOG <<
"WML exception:\nUser message: " <<
e.user_message <<
"\nDev message: " <<
e.dev_message;
1061 PLAIN_LOG <<
e.what() <<
"\n\nGame will be aborted.";
1069 }
catch(
const std::bad_alloc&) {
1070 PLAIN_LOG <<
"Ran out of memory. Aborted.";
1072 #if !defined(NO_CATCH_AT_GAME_END)
1073 }
catch(
const std::exception&
e) {
1075 PLAIN_LOG <<
"Caught general '" <<
typeid(
e).name() <<
"' exception:\n" <<
e.what();
1077 }
catch(
const std::string&
e) {
1078 PLAIN_LOG <<
"Caught a string thrown as an exception:\n" <<
e;
1080 }
catch(
const char*
e) {
1081 PLAIN_LOG <<
"Caught a string thrown as an exception:\n" <<
e;
int wesnoth_main(int argc, char **argv)
void refresh_addon_version_info_cache()
Refreshes the per-session cache of add-on's version information structs.
Used in parsing config file.
bool nogui
True if –nogui was given on the command line.
utils::optional< std::string > validate_wml
Non-empty if –validate was given on the command line.
bool simple_version
True if –simple-version was given on the command line.
bool report
True if –report was given on the command line.
bool headless_unit_test
True if –unit is used and –showgui is not present.
bool no_log_sanitize
True if –no-log-sanitize was given on the command line.
bool strict_lua
True if –strict-lua was given in the commandline.
utils::optional< std::vector< std::string > > preprocess_defines
Defines that were given to the –preprocess option.
utils::optional< std::string > usercache_dir
Non-empty if –usercache-dir was given on the command line.
utils::optional< std::string > validate_schema
Non-empty if –validate-schema was given on the command line.
utils::optional< std::string > userdata_dir
Non-empty if –userdata-dir was given on the command line.
bool nobanner
True if –nobanner was given on the command line.
utils::optional< std::vector< std::pair< lg::severity, std::string > > > log
Contains parsed arguments of –log-* (e.g.
utils::optional< std::string > generate_spritesheet
Path of which to generate a spritesheet.
utils::optional< std::string > render_image
Image path to render.
utils::optional< std::string > logdomains
Non-empty if –logdomains was given on the command line.
utils::optional< std::string > preprocess_input_macros
Non-empty if –preprocess-input-macros was given on the command line.
bool preprocess
True if –preprocess was given on the command line.
utils::optional< unsigned int > rng_seed
RNG seed specified by –rng-seed option.
std::string diff_left
Files for diffing or patching.
bool data_path
True if –data-path was given on the command line.
bool version
True if –version was given on the command line.
bool allow_insecure
True if –allow-insecure was given in the commandline.
utils::optional< std::string > validate_with
Non-empty if –use-schema was given on the command line.
bool noaddons
True if –noaddons was given on the command line.
utils::optional< std::string > output_file
Output filename for WML diff or preprocessing.
utils::optional< std::string > data_dir
Non-empty if –data-dir was given on the command line.
utils::optional< std::string > preprocess_target
Target (output) path that was given to the –preprocess option.
bool screenshot
True if –screenshot was given on the command line.
bool log_to_file
True if –log-to-file was given on the command line.
bool debug_lua
True if –debug-lua was given in the commandline.
std::vector< std::string > unit_test
Non-empty if –unit was given on the command line.
bool userdata_path
True if –userdata-path was given on the command line.
bool log_precise_timestamps
True if –log-precise was given on the command line.
utils::optional< std::string > preprocess_source_string
String to preprocess.
bool no_log_to_file
True if –no-log-to-file was given on the command line.
utils::optional< std::string > preprocess_output_macros
Non-empty if –preprocess-output-macros was given on the command line.
bool strict_validation
True if –strict-validation was given on the command line.
utils::optional< std::string > preprocess_path
Path to parse that was given to the –preprocess option.
bool help
True if –help was given on the command line.
bool usercache_path
True if –usercache-path was given on the command line.
Class for writing a config out to a file in pieces.
void write(const config &cfg)
A config object defines a single node in a WML file, with access to child nodes.
auto all_children_view() const
In-order iteration over all children.
child_itors child_range(config_key_type key)
void apply_diff(const config &diff, bool track=false)
A function to apply a diff config onto this config object.
config get_diff(const config &c) const
A function to get the differences between this object, and 'c', as another config object.
@ NO_FORCE_RELOAD
Don't reload if the previous defines equal the new defines.
bool init_game_config(FORCE_RELOAD_CONFIG force_reload)
void reload_changed_game_config()
const game_config_view & game_config() const
optional_const_config optional_child(config_key_type key) const
bool play_multiplayer(mp_mode mode)
static void progress(loading_stage stage=loading_stage::none)
Report what is being loaded to the loading screen.
static void display(const std::function< void()> &f)
@ ok_button
Shows an ok button.
bool show(const unsigned auto_close_time=0)
Shows the window.
This class implements the title screen.
std::vector< Reg > reg_vec
std::vector< aReg > areg_vec
void set_callback(const std::string &name, callback_function)
Exception used to escape form the ai or ui code to playsingle_controller::play_side.
Realization of serialization/validator.hpp abstract validator.
std::string str() const
Serializes the version number into string form.
Type that can be thrown as an exception to quit to desktop.
std::vector< std::string > read_argv([[maybe_unused]] int argc, [[maybe_unused]] char **argv)
Definitions for the interface to Wesnoth Markup Language (WML).
Declarations for File-IO.
Contains the exception interfaces used to signal completion of a scenario, campaign or turn.
Interfaces for manipulating version numbers of engine, add-ons, etc.
static std::string _(const char *str)
Standard logging facilities (interface).
void set(CURSOR_TYPE type)
Use the default parameter to reset cursors.
std::string get_cache_dir()
filesystem::scoped_istream istream_file(const std::string &fname, bool treat_failure_as_error)
std::string get_user_data_dir()
static bool file_exists(const bfs::path &fpath)
std::string get_exe_dir()
bool is_directory(const std::string &fname)
Returns true if the given file is a directory.
utils::optional< std::string > get_wml_location(const std::string &path, const utils::optional< std::string > ¤t_dir)
Returns a translated path to the actual file or directory, if it exists.
filesystem::scoped_ostream ostream_file(const std::string &fname, std::ios_base::openmode mode, bool create_directory)
std::string autodetect_game_data_dir(std::string exe_dir)
Try to autodetect the location of the game data dir.
void set_cache_dir(const std::string &newcachedir)
std::unique_ptr< std::istream > scoped_istream
std::string get_logs_dir()
std::unique_ptr< std::ostream > scoped_ostream
bool is_userdata_initialized()
std::string get_intl_dir()
std::string normalize_path(const std::string &fpath, bool normalize_separators, bool resolve_dot_entries)
Returns the absolute path of a file.
void set_user_data_dir(std::string newprefdir)
std::string full_build_report()
Produce a bug report-style info dump.
std::string library_versions_report()
Produce a plain-text report of library versions suitable for stdout/stderr.
const version_info wesnoth_version(VERSION)
std::string build_arch()
Obtain the processor architecture for this build.
std::string optional_features_report()
Produce a plain-text report of features suitable for stdout/stderr.
const std::string revision
void init()
Initializes the GUI subsystems.
void switch_theme(const std::string ¤t_theme)
Set and activate the given gui2 theme.
void show_message(const std::string &title, const std::string &msg, const std::string &button_caption, const bool auto_close, const bool message_use_markup, const bool title_use_markup)
Shows a message to the user.
retval
Default window/dialog return values.
void build_spritesheet_from(const std::string &entry_point)
bool using_own_console()
Returns true if a console was allocated by the Wesnoth process.
std::string list_log_domains(const std::string &filter)
void set_log_to_file()
Do the initial redirection to a log file if the logs directory is writable.
void set_log_sanitize(bool sanitize)
toggle log sanitization
utils::optional< bool > log_dir_writable()
Returns the result set by check_log_dir_writable().
void do_console_redirect()
Allocates a console if needed and redirects output to CONOUT.
void precise_timestamps(bool pt)
bool set_log_domain_severity(const std::string &name, severity severity)
void set_strict_severity(severity severity)
void play_music_config(const config &music_node, bool allow_interrupt_current_track, int i)
void bind_textdomain(const char *domain, const char *directory, const char *)
void set_default_textdomain(const char *domain)
std::string get_unknown_exception_type()
Utility function for finding the type of thing caught with catch(...).
std::map< std::string, t_string > string_map
static void msg(const char *act, debug_info &i, const char *to="", const char *result="")
std::string preprocess_string(const std::string &contents, preproc_map *defines, const std::string &textdomain)
Function to use the WML preprocessor on a string.
void preprocess_resource(const std::string &res_name, preproc_map *defines_map, bool write_cfg, bool write_plain_cfg, const std::string &parent_directory)
filesystem::scoped_istream preprocess_file(const std::string &fname, preproc_map *defines)
Function to use the WML preprocessor on a file.
std::map< std::string, struct preproc_define > preproc_map
One of the realizations of serialization/validator.hpp abstract validator.
Contains a basic exception class for SDL operations.
void read(config &cfg, std::istream &in, abstract_validator *validator)
structure which will hide all current floating labels, and cause floating labels instantiated after i...
Base class for all the errors encountered by the engine.
static preproc_map::value_type read_pair(const config &)
Reports time elapsed at the end of an object scope.
An error specifically indicating video subsystem problems.
Helper class, don't construct this directly.
bool strict_validation_enabled
Some defines: VERSION, PACKAGE, MIN_SAVEGAME_VERSION.
static lg::log_domain log_preprocessor("preprocessor")
static void handle_preprocess_string(const commandline_options &cmdline_opts)
static void safe_exit(int res)
static int do_gameloop(commandline_options &cmdline_opts)
Setups the game environment and enters the titlescreen or game loops.
static int handle_validate_command(const std::string &file, abstract_validator &validator, const std::vector< std::string > &defines)
int main(int argc, char **argv)
static int process_command_args(commandline_options &cmdline_opts)
Process commandline-arguments.
static void handle_preprocess_command(const commandline_options &cmdline_opts)
static void init_locale()
I would prefer to setup locale first so that early error messages can get localized,...
static void handle_lua_script_args(game_launcher *game, commandline_options &)
Handles the lua script command line arguments if present.
static void warn_early_init_failure()
Print an alert and instructions to stderr about early initialization errors.
static lg::log_domain log_config("config")
Add a special kind of assert to validate whether the input from WML doesn't contain any problems that...