+void
+Main::launch_game()
+{
+ SDLSubsystem sdl_subsystem;
+ ConsoleBuffer console_buffer;
+
+ timelog("audio");
+ SoundManager sound_manager;
+ sound_manager.enable_sound(g_config->sound_enabled);
+ sound_manager.enable_music(g_config->music_enabled);
+
+ timelog("controller");
+ InputManager input_manager(g_config->keyboard_config, g_config->joystick_config);
+
+ timelog("commandline");
+
+ timelog("video");
+ std::unique_ptr<VideoSystem> video_system = VideoSystem::create(g_config->video);
+ DrawingContext context(*video_system);
+ init_video();
+
+ Console console(console_buffer);
+
+ timelog("scripting");
+ scripting::Scripting scripting(g_config->enable_script_debugger);
+
+ timelog("resources");
+ TileManager tile_manager;
+ SpriteManager sprite_manager;
+ Resources resources;
+
+ timelog("addons");
+ AddonManager addon_manager("addons", g_config->addons);
+
+ timelog(0);
+
+ const std::unique_ptr<Savegame> default_savegame(new Savegame(std::string()));
+
+ GameManager game_manager;
+ ScreenManager screen_manager;
+
+ if(g_config->start_level != "") {
+ // we have a normal path specified at commandline, not a physfs path.
+ // So we simply mount that path here...
+ std::string dir = FileSystem::dirname(g_config->start_level);
+ std::string fileProtocol = "file://";
+ std::string::size_type position = dir.find(fileProtocol);
+ if(position != std::string::npos) {
+ dir = dir.replace(position, fileProtocol.length(), "");
+ }
+ log_debug << "Adding dir: " << dir << std::endl;
+ PHYSFS_addToSearchPath(dir.c_str(), true);
+
+ if(g_config->start_level.size() > 4 &&
+ g_config->start_level.compare(g_config->start_level.size() - 5, 5, ".stwm") == 0)
+ {
+ screen_manager.push_screen(std::unique_ptr<Screen>(
+ new worldmap::WorldMap(
+ FileSystem::basename(g_config->start_level), *default_savegame)));
+ } else {
+ std::unique_ptr<GameSession> session (
+ new GameSession(FileSystem::basename(g_config->start_level), *default_savegame));
+
+ g_config->random_seed = session->get_demo_random_seed(g_config->start_demo);
+ g_config->random_seed = gameRandom.srand(g_config->random_seed);
+ graphicsRandom.srand(0);
+
+ if(g_config->start_demo != "")
+ session->play_demo(g_config->start_demo);
+
+ if(g_config->record_demo != "")
+ session->record_demo(g_config->record_demo);
+ screen_manager.push_screen(std::move(session));
+ }
+ } else {
+ screen_manager.push_screen(std::unique_ptr<Screen>(new TitleScreen(*default_savegame)));
+ }
+
+ screen_manager.run(context);
+}
+