16 #include "addon/manager.hpp"
55 #include "widgets/button.hpp"
71 #include <boost/program_options/errors.hpp>
72 #include <boost/algorithm/string/predicate.hpp>
93 #ifdef INADDR_BROADCAST
94 #undef INADDR_BROADCAST
105 #ifdef DEBUG_WINDOW_LAYOUT_GRAPHS
110 #define LOG_CONFIG LOG_STREAM(info, log_config)
112 #define LOG_GENERAL LOG_STREAM(info, lg::general())
115 #define LOG_PREPROC LOG_STREAM(info, log_preprocessor)
133 PLAIN_LOG <<
"please specify an existing file. File " << file <<
" doesn't exist.";
137 PLAIN_LOG <<
"Reading cached defines from: " << file;
145 PLAIN_LOG <<
"Caught a config error while parsing file '" << file <<
"':\n" <<
e.message;
153 input_macros[def.first] = def.second;
164 [](
const auto& timer) {
PLAIN_LOG <<
"preprocessing finished. Took " << timer <<
" ticks."; });
167 bool skipCore =
false;
168 bool skipTerrainGFX =
false;
184 if(define ==
"SKIP_CORE") {
187 }
else if(define ==
"NO_TERRAIN_GFX") {
188 PLAIN_LOG <<
"'NO_TERRAIN_GFX' defined.";
189 skipTerrainGFX =
true;
197 PLAIN_LOG <<
"added " << defines_map.size() <<
" defines.";
200 if(skipCore ==
false) {
201 PLAIN_LOG <<
"preprocessing common macros from 'data/core' ...";
206 if(skipTerrainGFX ==
false) {
210 PLAIN_LOG <<
"acquired " << (defines_map.size() - input_macros.size()) <<
" 'data/core' defines.";
216 PLAIN_LOG <<
"preprocessing specified resource: " << resourceToProcess <<
" ...";
219 PLAIN_LOG <<
"acquired " << (defines_map.size() - input_macros.size()) <<
" total defines.";
222 std::string outputFileName =
"_MACROS_.cfg";
227 std::string outputPath = targetDir +
"/" + outputFileName;
229 PLAIN_LOG <<
"writing '" << outputPath <<
"' with " << defines_map.size() <<
" defines.";
235 for(
auto& define_pair : defines_map) {
236 define_pair.second.write(writer, define_pair.first);
249 for(
const std::string& define : defines) {
264 std::cout <<
"validation failed\n";
266 std::cout <<
"validation succeeded\n";
298 && !getenv(
"WESNOTH_NO_LOG_FILE")
306 && !cmdline_opts.
help
313 && !cmdline_opts.
nogui
326 else if(!cmdline_opts.no_console) {
331 if(cmdline_opts.
log) {
332 for(
const auto& log_pair : *cmdline_opts.
log) {
333 const std::string log_domain = log_pair.second;
336 PLAIN_LOG <<
"unknown log domain: " << log_domain;
344 const std::time_t
t = std::time(
nullptr);
370 PLAIN_LOG <<
"Automatically found a possible data directory at: " << auto_dir;
375 PLAIN_LOG <<
"Cannot find game data directory. Specify one with --data-dir";
403 if(cmdline_opts.
help) {
404 std::cout << cmdline_opts;
422 SDL_setenv(
"SDL_VIDEODRIVER",
"dummy", 1);
456 std::ifstream in_left(cmdline_opts.
diff_left);
457 std::ifstream in_right(cmdline_opts.
diff_right);
459 read(right, in_right);
460 std::ostream* os = &std::cout;
466 if(os != &std::cout)
delete os;
472 std::ifstream in_base(cmdline_opts.
diff_left);
473 std::ifstream in_diff(cmdline_opts.
diff_right);
477 std::ostream* os = &std::cout;
483 if(os != &std::cout)
delete os;
501 std::string schema_path;
506 schema_path = check.value();
508 PLAIN_LOG <<
"Could not find schema file: " << schema_path;
525 PLAIN_LOG <<
"That --preprocess-* option is only supported when using --preprocess or --validate.";
541 #if defined _WIN32 || defined __APPLE__
542 setlocale(LC_ALL,
"English");
544 std::setlocale(LC_ALL,
"C");
567 <<
"An error at this point during initialization usually indicates that the data\n"
568 <<
"directory above was not correctly set or detected. Try passing the correct path\n"
569 <<
"in the command line with the --data-dir switch or as the only argument.";
578 static bool first_time =
true;
586 if(!
game->init_lua_script()) {
597 if(_controlfp_s(&f_control, 0, 0) == 0) {
599 uint32_t rounding_mode = f_control & _MCW_RC;
601 if(rounding_mode != _RC_NEAR) {
602 PLAIN_LOG <<
"Floating point rounding mode is currently '"
603 << ((rounding_mode == _RC_CHOP)
605 : (rounding_mode == _RC_UP)
607 : (rounding_mode == _RC_DOWN)
609 : (rounding_mode == _RC_NEAR) ?
"near" :
"unknown")
610 <<
"' setting to 'near'";
612 if(_controlfp_s(&unused, _RC_NEAR, _MCW_RC)) {
613 PLAIN_LOG <<
"failed to set floating point rounding type to 'near'";
618 uint32_t precision_mode = f_control & _MCW_PC;
619 if(precision_mode != _PC_53) {
620 PLAIN_LOG <<
"Floating point precision mode is currently '"
621 << ((precision_mode == _PC_53)
623 : (precision_mode == _PC_24)
625 : (precision_mode == _PC_64) ?
"double extended" :
"unknown")
626 <<
"' setting to 'double'";
628 if(_controlfp_s(&unused, _PC_53, _MCW_PC)) {
629 PLAIN_LOG <<
"failed to set floating point precision type to 'double'";
641 switch(fegetround()) {
645 STREAMING_LOG <<
"Floating point precision mode is currently 'downward'";
648 STREAMING_LOG <<
"Floating point precision mode is currently 'toward-zero'";
651 STREAMING_LOG <<
"Floating point precision mode is currently 'upward'";
654 STREAMING_LOG <<
"Floating point precision mode is currently 'unknown'";
658 fesetround(FE_TONEAREST);
670 srand(std::time(
nullptr));
672 const auto game = std::make_unique<game_launcher>(cmdline_opts);
683 PLAIN_LOG <<
"could not initialize fonts";
689 res =
game->init_language();
691 PLAIN_LOG <<
"could not initialize the language";
695 res =
game->init_video();
697 PLAIN_LOG <<
"could not initialize display";
705 #if(defined(_X11) && !defined(__APPLE__)) || defined(_WIN32)
706 SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
719 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);
735 PLAIN_LOG <<
"could not initialize game config";
743 PLAIN_LOG <<
"could not re-initialize fonts for the current language";
773 if(!
game->has_load_data()) {
780 config title_music_config;
782 title_music_config[
"append"] =
true;
783 title_music_config[
"immediate"] =
true;
797 return static_cast<int>(
game->unit_test());
800 if(
game->play_test() ==
false) {
804 if(
game->play_screenshot_mode() ==
false) {
808 if(
game->play_render_image_mode() ==
false) {
813 if(
game->goto_campaign() ==
false) {
814 if(
game->jump_to_campaign_id().empty())
822 if(
game->goto_multiplayer() ==
false) {
827 if(
game->play_multiplayer_commandline() ==
false) {
831 if(
game->goto_editor() ==
false) {
840 if(
game->has_load_data() &&
game->load_game()) {
882 game->start_editor();
897 #define error_exit(res) \
899 if(lg::using_own_console()) { \
900 std::cerr << "Press enter to continue..." << std::endl; \
906 #define error_exit(res) return res
913 int main(
int argc,
char** argv)
917 assert(!args.empty());
920 _putenv(
"PANGOCAIRO_BACKEND=fontconfig");
921 _putenv(
"FONTCONFIG_PATH=fonts");
931 std::cerr <<
"Press enter to continue..." << std::endl;
938 SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS,
"1");
940 if(SDL_Init(SDL_INIT_TIMER) < 0) {
941 PLAIN_LOG <<
"Couldn't initialize SDL: " << SDL_GetError();
948 #if defined(__APPLE__) && !defined(__IPHONEOS__)
949 SDL_EventState(SDL_FINGERMOTION, SDL_DISABLE);
950 SDL_EventState(SDL_FINGERDOWN, SDL_DISABLE);
951 SDL_EventState(SDL_FINGERUP, SDL_DISABLE);
957 SDL_StartTextInput();
961 }
catch(
const boost::program_options::error&
e) {
963 std::cerr <<
"Error in command line: " <<
e.what() << std::endl;
964 std::string error =
"Error parsing command line arguments: ";
966 SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
"Error", error.c_str(),
nullptr);
969 PLAIN_LOG <<
"Video system error: " <<
e.what();
972 PLAIN_LOG <<
"Could not initialize fonts.\n\n" <<
e.what() <<
"\n\nExiting.";
980 PLAIN_LOG <<
"caught return_to_play_side_exception, please report this bug (quitting)";
982 PLAIN_LOG <<
"caught quit_game_exception (quitting)";
984 PLAIN_LOG <<
"WML exception:\nUser message: " <<
e.user_message <<
"\nDev message: " <<
e.dev_message;
987 PLAIN_LOG <<
e.what() <<
"\n\nGame will be aborted.";
995 }
catch(
const std::bad_alloc&) {
996 PLAIN_LOG <<
"Ran out of memory. Aborted.";
998 #if !defined(NO_CATCH_AT_GAME_END)
999 }
catch(
const std::exception&
e) {
1001 PLAIN_LOG <<
"Caught general '" <<
typeid(
e).name() <<
"' exception:\n" <<
e.what();
1003 }
catch(
const std::string&
e) {
1004 PLAIN_LOG <<
"Caught a string thrown as an exception:\n" <<
e;
1006 }
catch(
const char*
e) {
1007 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.
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(std::function< void()> f)
@ ok_button
Shows an ok button.
bool show(const unsigned auto_close_time=0)
Shows the window.
int get_retval() const
Returns the cached window exit code.
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 set_debug(bool new_debug)
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="")
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 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...