// moved into a helper function to ensure args is destroyed before // exit(), which may result in a memory leak. static void RunGameOrAtlas(int argc, const char* argv[]) { CmdLineArgs args(argc, argv); g_args = args; if (args.Has("version") || args.Has("-version")) { debug_printf("Pyrogenesis %s\n", engine_version); return; } const bool isVisualReplay = args.Has("replay-visual"); const bool isNonVisualReplay = args.Has("replay"); const CStr replayFile = isVisualReplay ? args.Get("replay-visual") : isNonVisualReplay ? args.Get("replay") : ""; if (isVisualReplay || isNonVisualReplay) { if (!FileExists(OsPath(replayFile))) { debug_printf("ERROR: The requested replay file '%s' does not exist!\n", replayFile.c_str()); return; } if (DirectoryExists(OsPath(replayFile))) { debug_printf("ERROR: The requested replay file '%s' is a directory!\n", replayFile.c_str()); return; } } // We need to initialize SpiderMonkey and libxml2 in the main thread before // any thread uses them. So initialize them here before we might run Atlas. ScriptEngine scriptEngine; CXeromyces::Startup(); if (ATLAS_RunIfOnCmdLine(args, false)) { CXeromyces::Terminate(); return; } if (isNonVisualReplay) { if (!args.Has("mod")) { LOGERROR("At least one mod should be specified! Did you mean to add the argument '-mod=public'?"); CXeromyces::Terminate(); return; } Paths paths(args); g_VFS = CreateVfs(20 * MiB); g_VFS->Mount(L"cache/", paths.Cache(), VFS_MOUNT_ARCHIVABLE); MountMods(paths, GetMods(args, INIT_MODS)); { CReplayPlayer replay; replay.Load(replayFile); replay.Replay( args.Has("serializationtest"), args.Has("rejointest") ? args.Get("rejointest").ToInt() : -1, args.Has("ooslog")); } g_VFS.reset(); CXeromyces::Terminate(); return; } // run in archive-building mode if requested if (args.Has("archivebuild")) { Paths paths(args); OsPath mod(args.Get("archivebuild")); OsPath zip; if (args.Has("archivebuild-output")) zip = args.Get("archivebuild-output"); else zip = mod.Filename().ChangeExtension(L".zip"); CArchiveBuilder builder(mod, paths.Cache()); // Add mods provided on the command line // NOTE: We do not handle mods in the user mod path here std::vector<CStr> mods = args.GetMultiple("mod"); for (size_t i = 0; i < mods.size(); ++i) builder.AddBaseMod(paths.RData()/"mods"/mods[i]); builder.Build(zip, args.Has("archivebuild-compress")); CXeromyces::Terminate(); return; } const double res = timer_Resolution(); g_frequencyFilter = CreateFrequencyFilter(res, 30.0); // run the game int flags = INIT_MODS; do { restart = false; quit = false; if (!Init(args, flags)) { flags &= ~INIT_MODS; Shutdown(SHUTDOWN_FROM_CONFIG); continue; } InitGraphics(args, 0); MainControllerInit(); while (!quit) Frame(); Shutdown(0); MainControllerShutdown(); flags &= ~INIT_MODS; } while (restart); if (restart_in_atlas) ATLAS_RunIfOnCmdLine(args, true); CXeromyces::Terminate(); }
// moved into a helper function to ensure args is destroyed before // exit(), which may result in a memory leak. static void RunGameOrAtlas(int argc, const char* argv[]) { CmdLineArgs args(argc, argv); // We need to initialise libxml2 in the main thread before // any thread uses it. So initialise it here before we // might run Atlas. CXeromyces::Startup(); // run Atlas (if requested via args) bool ran_atlas = ATLAS_RunIfOnCmdLine(args, false); // Atlas handles the whole init/shutdown/etc sequence by itself; // when we get here, it has exited and we're done. if(ran_atlas) return; // run non-visual simulation replay if requested if (args.Has("replay")) { // TODO: Support mods Paths paths(args); g_VFS = CreateVfs(20 * MiB); g_VFS->Mount(L"cache/", paths.Cache(), VFS_MOUNT_ARCHIVABLE); g_VFS->Mount(L"", paths.RData()/"mods"/"public", VFS_MOUNT_MUST_EXIST); { CReplayPlayer replay; replay.Load(args.Get("replay")); replay.Replay(); } g_VFS.reset(); CXeromyces::Terminate(); return; } // run in archive-building mode if requested if (args.Has("archivebuild")) { Paths paths(args); OsPath mod(args.Get("archivebuild")); OsPath zip; if (args.Has("archivebuild-output")) zip = args.Get("archivebuild-output"); else zip = mod.Filename().ChangeExtension(L".zip"); CArchiveBuilder builder(mod, paths.Cache()); builder.Build(zip, args.Has("archivebuild-compress")); CXeromyces::Terminate(); return; } const double res = timer_Resolution(); g_frequencyFilter = CreateFrequencyFilter(res, 30.0); // run the game Init(args, 0); InitGraphics(args, 0); MainControllerInit(); while(!quit) Frame(); Shutdown(0); MainControllerShutdown(); if (restart_in_atlas) { ATLAS_RunIfOnCmdLine(args, true); return; } // Shut down libxml2 (done here to match the Startup call) CXeromyces::Terminate(); }
// moved into a helper function to ensure args is destroyed before // exit(), which may result in a memory leak. static void RunGameOrAtlas(int argc, const char* argv[]) { CmdLineArgs args(argc, argv); g_args = args; // We need to initialise libxml2 in the main thread before // any thread uses it. So initialise it here before we // might run Atlas. CXeromyces::Startup(); // run Atlas (if requested via args) bool ran_atlas = ATLAS_RunIfOnCmdLine(args, false); // Atlas handles the whole init/shutdown/etc sequence by itself; // when we get here, it has exited and we're done. if(ran_atlas) return; // run non-visual simulation replay if requested if (args.Has("replay")) { std::string replayFile = args.Get("replay"); if (!FileExists(OsPath(replayFile))) { debug_printf("ERROR: The requested replay file '%s' does not exist!\n", replayFile.c_str()); return; } Paths paths(args); g_VFS = CreateVfs(20 * MiB); g_VFS->Mount(L"cache/", paths.Cache(), VFS_MOUNT_ARCHIVABLE); MountMods(paths, GetMods(args, INIT_MODS)); { CReplayPlayer replay; replay.Load(replayFile); replay.Replay(args.Has("serializationtest"), args.Has("ooslog")); } g_VFS.reset(); CXeromyces::Terminate(); return; } // If visual replay file does not exist, quit before starting the renderer if (args.Has("replay-visual")) { std::string replayFile = args.Get("replay-visual"); if (!FileExists(OsPath(replayFile))) { debug_printf("ERROR: The requested replay file '%s' does not exist!\n", replayFile.c_str()); return; } } // run in archive-building mode if requested if (args.Has("archivebuild")) { Paths paths(args); OsPath mod(args.Get("archivebuild")); OsPath zip; if (args.Has("archivebuild-output")) zip = args.Get("archivebuild-output"); else zip = mod.Filename().ChangeExtension(L".zip"); CArchiveBuilder builder(mod, paths.Cache()); // Add mods provided on the command line // NOTE: We do not handle mods in the user mod path here std::vector<CStr> mods = args.GetMultiple("mod"); for (size_t i = 0; i < mods.size(); ++i) builder.AddBaseMod(paths.RData()/"mods"/mods[i]); builder.Build(zip, args.Has("archivebuild-compress")); CXeromyces::Terminate(); return; } const double res = timer_Resolution(); g_frequencyFilter = CreateFrequencyFilter(res, 30.0); // run the game int flags = INIT_MODS; do { restart = false; quit = false; if (!Init(args, flags)) { flags &= ~INIT_MODS; Shutdown(SHUTDOWN_FROM_CONFIG); continue; } InitGraphics(args, 0); MainControllerInit(); while (!quit) Frame(); Shutdown(0); MainControllerShutdown(); flags &= ~INIT_MODS; } while (restart); if (restart_in_atlas) { ATLAS_RunIfOnCmdLine(args, true); return; } // Shut down libxml2 (done here to match the Startup call) CXeromyces::Terminate(); }