From 734ec4c79cec961db22568834712a998b5a9947b Mon Sep 17 00:00:00 2001 From: Daniel Brooks Date: Thu, 5 Sep 2024 15:37:18 +0000 Subject: [PATCH] rewrite the loading screen to use ImGui (#75998) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * rewrite the loading screen to use ImGui and simplify the usage too. * write a loading screen for when we’re not using ImGui too Fixes #75678 * add a stupid comment to appease clang plus some other small changes to appease a different version of clang --------- Co-authored-by: Daniel Brooks --- gfx/cdda.avif | Bin 0 -> 55359 bytes object_creator/creator_main.cpp | 3 - src/game.cpp | 59 +++++-------- src/game.h | 11 ++- src/init.cpp | 46 ++++------ src/init.h | 7 +- src/loading_ui.cpp | 152 +++++++++++++++++++++----------- src/loading_ui.h | 37 +------- src/main.cpp | 4 +- src/main_menu.cpp | 4 +- src/sdlsound.cpp | 4 +- tests/test_main.cpp | 6 +- 12 files changed, 157 insertions(+), 176 deletions(-) create mode 100644 gfx/cdda.avif diff --git a/gfx/cdda.avif b/gfx/cdda.avif new file mode 100644 index 0000000000000000000000000000000000000000..8447345379db0e89f1d5d830a03a5cb60beb55ae GIT binary patch literal 55359 zcmXuJV{k4?(>8j?wr$(CZQHhO+qSJ0d&RbG+sR6D_Vb?ldaC+D*Hq8H>8cq30Dx)k z>g8zUZeK;X%v_EB=lvH%mZrAO|33u)9IZ@T{~!N<2=8d+YWIHv z=)a6_W$R$_KP3tP0R6ZAmjQrB0ANk-KP0iTvj4wk|L3CpC(MBVv;U`z+!>kvN7bzy zogM!}PAf+fhyM`O%Ei&_e+2*l91#EjvHFj|8o4ux1PKWK&qQ>z^8B9%0D*>v{twWt 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 literal 0 HcmV?d00001 diff --git a/object_creator/creator_main.cpp b/object_creator/creator_main.cpp index 6b6235062a10b..d1f0431b51a3b 100644 --- a/object_creator/creator_main.cpp +++ b/object_creator/creator_main.cpp @@ -7,7 +7,6 @@ #include "game.h" #include "game_ui.h" #include "input.h" -#include "loading_ui.h" #include "mapsharing.h" #include "options.h" #include "output.h" @@ -164,8 +163,6 @@ int main( int argc, char *argv[] ) exit_handler( -999 ); } - loading_ui ui( false ); - get_options().init(); get_options().load(); diff --git a/src/game.cpp b/src/game.cpp index a680828e8cb16..ccfafa25b63aa 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -501,7 +501,7 @@ void game::load_static_data() get_safemode().load_global(); } -bool game::check_mod_data( const std::vector &opts, loading_ui &ui ) +bool game::check_mod_data( const std::vector &opts ) { dependency_tree &tree = world_generator->get_mod_manager().get_tree(); @@ -526,8 +526,8 @@ bool game::check_mod_data( const std::vector &opts, loading_ui &ui ) // if no loadable mods then test core data only try { - load_core_data( ui ); - DynamicDataLoader::get_instance().finalize_loaded_data( ui ); + load_core_data(); + DynamicDataLoader::get_instance().finalize_loaded_data(); } catch( const std::exception &err ) { std::cerr << "Error loading data from json: " << err.what() << std::endl; } @@ -562,18 +562,18 @@ bool game::check_mod_data( const std::vector &opts, loading_ui &ui ) std::cout << "Checking mod " << mod.name() << " [" << mod.ident.str() << "]" << std::endl; try { - load_core_data( ui ); + load_core_data(); // Load any dependencies and de-duplicate them std::vector dep_vector = tree.get_dependencies_of_X_as_strings( mod.ident ); std::set dep_set( dep_vector.begin(), dep_vector.end() ); for( const auto &dep : dep_set ) { - load_data_from_dir( dep->path, dep->ident.str(), ui ); + load_data_from_dir( dep->path, dep->ident.str() ); } // Load mod itself - load_data_from_dir( mod.path, mod.ident.str(), ui ); - DynamicDataLoader::get_instance().finalize_loaded_data( ui ); + load_data_from_dir( mod.path, mod.ident.str() ); + DynamicDataLoader::get_instance().finalize_loaded_data(); } catch( const std::exception &err ) { std::cerr << "Error loading data: " << err.what() << std::endl; } @@ -592,18 +592,18 @@ bool game::is_core_data_loaded() const return DynamicDataLoader::get_instance().is_data_finalized(); } -void game::load_core_data( loading_ui &ui ) +void game::load_core_data() { // core data can be loaded only once and must be first // anyway. DynamicDataLoader::get_instance().unload_data(); - load_data_from_dir( PATH_INFO::jsondir(), "core", ui ); + load_data_from_dir( PATH_INFO::jsondir(), "core" ); } -void game::load_data_from_dir( const cata_path &path, const std::string &src, loading_ui &ui ) +void game::load_data_from_dir( const cata_path &path, const std::string &src ) { - DynamicDataLoader::get_instance().load_data_from_path( path, src, ui ); + DynamicDataLoader::get_instance().load_data_from_path( path, src ); } #if defined(TUI) @@ -778,18 +778,16 @@ void game::reenter_fullscreen() */ void game::setup() { - loading_ui ui( true ); new_game = true; { - background_pane background; static_popup popup; popup.message( "%s", _( "Please wait while the world data loads…\nLoading core data" ) ); ui_manager::redraw(); refresh_display(); - load_core_data( ui ); + load_core_data(); } - load_world_modfiles( ui ); + load_world_modfiles(); // Panel manager needs JSON data to be loaded before init panel_manager::get_manager().init(); @@ -3013,9 +3011,6 @@ bool game::load( const std::string &world ) bool game::load( const save_t &name ) { - loading_ui ui( true ); - ui.new_context( _( "Loading the save…" ) ); - const cata_path worldpath = PATH_INFO::world_base_save_path_path(); const cata_path save_file_path = PATH_INFO::world_base_save_path_path() / ( name.base_path() + SAVE_EXTENSION ); @@ -3162,22 +3157,19 @@ bool game::load( const save_t &name ) }; for( const named_entry &e : entries ) { - ui.add_entry( e.first ); - } - - ui.show(); - for( const named_entry &e : entries ) { + loading_ui::show( _( "Loading the save…" ), e.first ); e.second(); if( abort ) { + loading_ui::done(); return false; } - ui.proceed(); } + loading_ui::done(); return true; } -void game::load_world_modfiles( loading_ui &ui ) +void game::load_world_modfiles() { auto &mods = world_generator->active_world->active_mod_order; @@ -3204,40 +3196,37 @@ void game::load_world_modfiles( loading_ui &ui ) // are resolved during the creation of the world. // That means world->active_mod_order contains a list // of mods in the correct order. - load_packs( _( "Loading files" ), mods, ui ); + load_packs( _( "Loading files" ), mods ); // Load additional mods from that world-specific folder - load_data_from_dir( PATH_INFO::world_base_save_path_path() / "mods", "custom", ui ); + load_data_from_dir( PATH_INFO::world_base_save_path_path() / "mods", "custom" ); - DynamicDataLoader::get_instance().finalize_loaded_data( ui ); + DynamicDataLoader::get_instance().finalize_loaded_data(); } -void game::load_packs( const std::string &msg, const std::vector &packs, loading_ui &ui ) +void game::load_packs( const std::string &msg, const std::vector &packs ) { - ui.new_context( msg ); std::vector missing; std::vector available; for( const mod_id &e : packs ) { if( e.is_valid() ) { available.emplace_back( e ); - ui.add_entry( e->name() ); } else { missing.push_back( e ); } } - ui.show(); for( const auto &e : available ) { + loading_ui::show( msg, e->name() ); const MOD_INFORMATION &mod = *e; restore_on_out_of_scope restore_check_plural( check_plural ); if( mod.ident.str() == "test_data" ) { check_plural = check_plural_t::none; } - load_data_from_dir( mod.path, mod.ident.str(), ui ); - - ui.proceed(); + load_data_from_dir( mod.path, mod.ident.str() ); } + loading_ui::done(); std::unordered_set removed_mods { MOD_INFORMATION_Graphical_Overmap // Removed in 0.I diff --git a/src/game.h b/src/game.h index 9e240418fa405..bf58b0b16800f 100644 --- a/src/game.h +++ b/src/game.h @@ -79,7 +79,6 @@ class field_entry; class item; class kill_tracker; class live_view; -class loading_ui; class map; class map_item_stack; class memorial_logger; @@ -170,7 +169,7 @@ class game void load_static_data(); /** Loads core dynamic data. May throw. */ - void load_core_data( loading_ui &ui ); + void load_core_data(); /** Returns whether the core data is currently loaded. */ bool is_core_data_loaded() const; @@ -180,17 +179,17 @@ class game * @param opts check specific mods (or all if unspecified) * @return whether all mods were successfully loaded */ - bool check_mod_data( const std::vector &opts, loading_ui &ui ); + bool check_mod_data( const std::vector &opts ); /** Loads core data and mods from the active world. May throw. */ - void load_world_modfiles( loading_ui &ui ); + void load_world_modfiles(); /** * Load content packs * @param msg string to display whilst loading prompt * @param packs content packs to load in correct dependent order * @param ui structure for load progress display */ - void load_packs( const std::string &msg, const std::vector &packs, loading_ui &ui ); + void load_packs( const std::string &msg, const std::vector &packs ); /** * @brief Should be invoked whenever options change. @@ -199,7 +198,7 @@ class game protected: /** Loads dynamic data from the given directory. May throw. */ - void load_data_from_dir( const cata_path &path, const std::string &src, loading_ui &ui ); + void load_data_from_dir( const cata_path &path, const std::string &src ); public: void setup(); /** Saving and loading functions. */ diff --git a/src/init.cpp b/src/init.cpp index 5c920c1a4f2f8..a7116e687aa2a 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -499,8 +499,7 @@ void DynamicDataLoader::initialize() #endif } -void DynamicDataLoader::load_data_from_path( const cata_path &path, const std::string &src, - loading_ui &ui ) +void DynamicDataLoader::load_data_from_path( const cata_path &path, const std::string &src ) { cata_assert( !finalized && "Can't load additional data after finalization. Must be unloaded first." ); @@ -523,7 +522,7 @@ void DynamicDataLoader::load_data_from_path( const cata_path &path, const std::s try { // parse it JsonValue jsin = json_loader::from_path( file ); - load_all_from_json( jsin, src, ui, path, file ); + load_all_from_json( jsin, src, path, file ); } catch( const JsonError &err ) { throw std::runtime_error( err.what() ); } @@ -531,7 +530,6 @@ void DynamicDataLoader::load_data_from_path( const cata_path &path, const std::s } void DynamicDataLoader::load_all_from_json( const JsonValue &jsin, const std::string &src, - loading_ui &, const cata_path &base_path, const cata_path &full_path ) { if( jsin.test_object() ) { @@ -674,15 +672,15 @@ void DynamicDataLoader::unload_data() zone_type::reset(); } -void DynamicDataLoader::finalize_loaded_data() -{ - // Create a dummy that will not display anything - // TODO: Make it print to stdout? - loading_ui ui( false ); - finalize_loaded_data( ui ); -} +// void DynamicDataLoader::finalize_loaded_data() +// { +// // Create a dummy that will not display anything +// // TODO: Make it print to stdout? +// background_pane bg; +// finalize_loaded_data( ); +// } -void DynamicDataLoader::finalize_loaded_data( loading_ui &ui ) +void DynamicDataLoader::finalize_loaded_data() { cata_assert( !finalized && "Can't finalize the data twice." ); cata_assert( !stream_cache && "Expected stream cache to be null before finalization" ); @@ -692,8 +690,6 @@ void DynamicDataLoader::finalize_loaded_data( loading_ui &ui ) } ); stream_cache = std::make_unique(); - ui.new_context( _( "Finalizing" ) ); - using named_entry = std::pair>; const std::vector entries = {{ { _( "Flags" ), &json_flag::finalize_all }, @@ -772,25 +768,19 @@ void DynamicDataLoader::finalize_loaded_data( loading_ui &ui ) }; for( const named_entry &e : entries ) { - ui.add_entry( e.first ); - } - - ui.show(); - for( const named_entry &e : entries ) { + loading_ui::show( _( "Finalizing" ), e.first ); e.second(); - ui.proceed(); } if( !get_option( "SKIP_VERIFICATION" ) ) { - check_consistency( ui ); + check_consistency(); } finalized = true; + loading_ui::done(); } -void DynamicDataLoader::check_consistency( loading_ui &ui ) +void DynamicDataLoader::check_consistency() { - ui.new_context( _( "Verifying" ) ); - using named_entry = std::pair>; const std::vector entries = {{ { _( "Flags" ), &json_flag::check_consistency }, @@ -883,12 +873,8 @@ void DynamicDataLoader::check_consistency( loading_ui &ui ) }; for( const named_entry &e : entries ) { - ui.add_entry( e.first ); - } - - ui.show(); - for( const named_entry &e : entries ) { + loading_ui::show( _( "Verifying" ), e.first ); e.second(); - ui.proceed(); } + loading_ui::done(); } diff --git a/src/init.h b/src/init.h index 65ea0d5ba26ef..409a54e4f3b23 100644 --- a/src/init.h +++ b/src/init.h @@ -16,7 +16,6 @@ class JsonObject; class JsonValue; -class loading_ui; struct json_source_location; /** @@ -100,7 +99,6 @@ class DynamicDataLoader * @throws std::exception on all kind of errors. */ void load_all_from_json( const JsonValue &jsin, const std::string &src, - loading_ui &, const cata_path &base_path, const cata_path &full_path ); /** * Load a single object from a json object. @@ -123,7 +121,7 @@ class DynamicDataLoader * May print a debugmsg if something seems wrong. * @param ui Finalization status display. */ - void check_consistency( loading_ui &ui ); + void check_consistency(); public: /** @@ -141,7 +139,7 @@ class DynamicDataLoader * @throws std::exception on all kind of errors. */ /*@{*/ - void load_data_from_path( const cata_path &path, const std::string &src, loading_ui &ui ); + void load_data_from_path( const cata_path &path, const std::string &src ); /*@}*/ /** * Deletes and unloads all the data previously loaded with @@ -159,7 +157,6 @@ class DynamicDataLoader * game should *not* proceed in that case. */ /*@{*/ - void finalize_loaded_data( loading_ui &ui ); void finalize_loaded_data(); /*@}*/ diff --git a/src/loading_ui.cpp b/src/loading_ui.cpp index 75a6093793c95..c2bfa0fc9d581 100644 --- a/src/loading_ui.cpp +++ b/src/loading_ui.cpp @@ -1,84 +1,134 @@ #include "loading_ui.h" -#include -#include - #include "cached_options.h" #include "input.h" -#include "color.h" #include "output.h" -#include "translations.h" -#include "ui.h" #include "ui_manager.h" #if defined(TILES) +#define IMGUI_DEFINE_MATH_OPERATORS +#include "imgui/imgui.h" +#undef IMGUI_DEFINE_MATH_OPERATORS +#include "path_info.h" +#include "sdltiles.h" #include "sdl_wrappers.h" +#else +#include "cursesdef.h" #endif // TILES -#if defined(__clang__) || defined(__GNUC__) -#define UNUSED __attribute__((unused)) +struct ui_state { + ui_adaptor *ui; + background_pane *bg; +#ifdef TILES + ImVec2 window_size; + ImVec2 splash_size; + SDL_Texture_Ptr splash; #else -#define UNUSED + size_t splash_width = 0; + std::vector splash; + std::string blanks; #endif + std::string context; + std::string step; +}; -loading_ui::loading_ui( UNUSED bool display ) -{ - if( !test_mode ) { - menu = std::make_unique(); - menu->settext( _( "Loading" ) ); - } -} - -loading_ui::~loading_ui() = default; +static ui_state *gLUI = nullptr; -void loading_ui::add_entry( const std::string &description ) +static void redraw() { - if( menu != nullptr ) { - menu->addentry( menu->entries.size(), true, 0, description ); +#ifdef TILES + ImVec2 pos = { 0.5f, 0.5f }; + ImGui::SetNextWindowPos( ImGui::GetMainViewport()->Size * pos, ImGuiCond_Always, { 0.5f, 0.5f } ); + ImGui::SetNextWindowSize( gLUI->window_size ); + ImGui::PushStyleVar( ImGuiStyleVar_WindowBorderSize, 0.0f ); + ImGui::PushStyleColor( ImGuiCol_WindowBg, { 0.0f, 0.0f, 0.0f, 1.0f } ); + if( ImGui::Begin( "Loading…", nullptr, + ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | + ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings ) ) { + ImGui::Image( static_cast( gLUI->splash.get() ), gLUI->splash_size ); + ImGui::SetCursorPosX( ( gLUI->splash_size.x / 2.0f ) - 120.0f ); + ImGui::TextUnformatted( gLUI->context.c_str() ); + ImGui::SameLine(); + ImGui::TextUnformatted( gLUI->step.c_str() ); } -} - -void loading_ui::new_context( const std::string &desc ) -{ - if( menu != nullptr ) { - menu->reset(); - menu->settext( desc ); - ui_background = nullptr; + ImGui::End(); + ImGui::PopStyleColor(); + ImGui::PopStyleVar(); +#else + int x = ( TERMX - static_cast( gLUI->splash_width ) ) / 2; + int y = 0; + nc_color white = c_white; + for( const std::string &line : gLUI->splash ) { + if( !line.empty() && line[0] == '#' ) { + continue; + } + print_colored_text( catacurses::stdscr, point( x, y++ ), white, + white, line ); } + mvwprintz( catacurses::stdscr, point( 0, TERMY - 1 ), c_black, gLUI->blanks ); + center_print( catacurses::stdscr, TERMY - 1, c_white, string_format( "%s %s", + gLUI->context.c_str(), gLUI->step.c_str() ) ); +#endif } -void loading_ui::init() +static void resize() { - if( ui_background == nullptr ) { - ui_background = std::make_unique(); - } } -void loading_ui::proceed() +static void update_state( const std::string &context, const std::string &step ) { - init(); + if( gLUI == nullptr ) { + gLUI = new struct ui_state; + gLUI->bg = new background_pane; + gLUI->ui = new ui_adaptor; + gLUI->ui->is_imgui = true; + gLUI->ui->on_redraw( []( ui_adaptor & ) { + redraw(); + } ); + gLUI->ui->on_screen_resize( []( ui_adaptor & ) { + resize(); + } ); - if( menu != nullptr && !menu->entries.empty() ) { - if( menu->selected >= 0 && menu->selected < static_cast( menu->entries.size() ) ) { - // TODO: Color it red if it errored hard, yellow on warnings - menu->entries[menu->selected].text_color = c_green; - } - - if( menu->selected + 1 < static_cast( menu->entries.size() ) ) { - menu->scrollby( 1 ); +#ifdef TILES + cata_path path = PATH_INFO::gfxdir() / "cdda.avif"; + SDL_Surface_Ptr surf = load_image( path.get_unrelative_path().u8string().c_str() ); + gLUI->splash_size = { static_cast( surf->w ), static_cast( surf->h ) }; + gLUI->splash = CreateTextureFromSurface( get_sdl_renderer(), surf ); + gLUI->window_size = gLUI->splash_size + ImVec2{ 0.0f, 2.0f * ImGui::GetTextLineHeightWithSpacing() }; +#else + std::string splash = read_whole_file( PATH_INFO::title( get_holiday_from_time() ) ).value_or( + _( "Cataclysm: Dark Days Ahead" ) ); + gLUI->splash = string_split( splash, '\n' ); + gLUI->blanks = std::string( TERMX, ' ' ); + for( const std::string &line : gLUI->splash ) { + if( !line.empty() && line[0] == '#' ) { + continue; + } + gLUI->splash_width = std::max( gLUI->splash_width, remove_color_tags( line ).length() ); } +#endif } - - show(); + gLUI->context = std::string( context ); + gLUI->step = std::string( step ); } -void loading_ui::show() +void loading_ui::show( const std::string &context, const std::string &step ) { - init(); + if( test_mode ) { + return; + } + update_state( context, step ); + ui_manager::redraw(); + refresh_display(); + inp_mngr.pump_events(); +} - if( menu != nullptr ) { - ui_manager::redraw(); - refresh_display(); - inp_mngr.pump_events(); +void loading_ui::done() +{ + if( gLUI != nullptr ) { + delete gLUI->ui; + delete gLUI->bg; + delete gLUI; + gLUI = nullptr; } } diff --git a/src/loading_ui.h b/src/loading_ui.h index 619ca1171b3b6..886db5678da44 100644 --- a/src/loading_ui.h +++ b/src/loading_ui.h @@ -2,41 +2,12 @@ #ifndef CATA_SRC_LOADING_UI_H #define CATA_SRC_LOADING_UI_H -#include #include -class background_pane; -class ui_adaptor; -class uilist; - -class loading_ui +namespace loading_ui { - private: - std::unique_ptr menu; - std::unique_ptr ui_background; - - void init(); - public: - explicit loading_ui( bool display ); - ~loading_ui(); - - /** - * Sets the description for the menu and clears existing entries. - */ - void new_context( const std::string &desc ); - /** - * Adds a named entry in the current loading context. - */ - void add_entry( const std::string &description ); - /** - * Place the UI onto UI stack, mark current entry as processed, scroll down, - * and redraw. (if display is enabled) - */ - void proceed(); - /** - * Place the UI onto UI stack and redraw it on the screen (if display is enabled). - */ - void show(); -}; +void show( const std::string &context, const std::string &step ); +void done(); +} // namespace loading_ui #endif // CATA_SRC_LOADING_UI_H diff --git a/src/main.cpp b/src/main.cpp index bbbf8c7ad7de2..d2506b6024db2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -47,7 +47,6 @@ #include "get_version.h" #include "help.h" #include "input.h" -#include "loading_ui.h" #include "main_menu.h" #include "mapsharing.h" #include "memory_fast.h" @@ -807,9 +806,8 @@ int main( int argc, const char *argv[] ) } if( cli.check_mods ) { init_colors(); - loading_ui ui( false ); const std::vector mods( cli.opts.begin(), cli.opts.end() ); - exit( g->check_mod_data( mods, ui ) && !debug_has_error_been_observed() ? 0 : 1 ); + exit( g->check_mod_data( mods ) && !debug_has_error_been_observed() ? 0 : 1 ); } } catch( const std::exception &err ) { debugmsg( "%s", err.what() ); diff --git a/src/main_menu.cpp b/src/main_menu.cpp index 137a584ff71e6..445f2938c4d9a 100644 --- a/src/main_menu.cpp +++ b/src/main_menu.cpp @@ -31,7 +31,6 @@ #include "gamemode.h" #include "get_version.h" #include "help.h" -#include "loading_ui.h" #include "localized_comparator.h" #include "mapbuffer.h" #include "mapsharing.h" @@ -578,9 +577,8 @@ void main_menu::init_strings() vSettingsHotkeys.push_back( get_hotkeys( item ) ); } - loading_ui ui( false ); try { - g->load_core_data( ui ); + g->load_core_data(); } catch( const std::exception &err ) { debugmsg( err.what() ); std::exit( 1 ); diff --git a/src/sdlsound.cpp b/src/sdlsound.cpp index 1b2bf8bbdc501..608cdb60c41b8 100644 --- a/src/sdlsound.cpp +++ b/src/sdlsound.cpp @@ -24,7 +24,6 @@ #include "debug.h" #include "init.h" #include "json.h" -#include "loading_ui.h" #include "messages.h" #include "music.h" #include "options.h" @@ -882,8 +881,7 @@ void load_soundset() current_soundpack_path = soundpack_path; try { - loading_ui ui( false ); - DynamicDataLoader::get_instance().load_data_from_path( soundpack_path, "core", ui ); + DynamicDataLoader::get_instance().load_data_from_path( soundpack_path, "core" ); } catch( const std::exception &err ) { debugmsg( "failed to load sounds: %s", err.what() ); } diff --git a/tests/test_main.cpp b/tests/test_main.cpp index 1c34ebd09f3be..107195f3e6f74 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -37,7 +37,6 @@ #include "game.h" #include "help.h" #include "json.h" -#include "loading_ui.h" #include "map.h" #include "messages.h" #include "options.h" @@ -147,9 +146,8 @@ static void init_global_game_state( const std::vector &mods, calendar::set_eternal_season( get_option( "ETERNAL_SEASON" ) ); calendar::set_season_length( get_option( "SEASON_LENGTH" ) ); - loading_ui ui( false ); - g->load_core_data( ui ); - g->load_world_modfiles( ui ); + g->load_core_data(); + g->load_world_modfiles(); get_avatar() = avatar(); get_avatar().create( character_type::NOW );