#include #include #include #include #include #include #include #include #include void App::Restart(std::vector restartArgs) { os::process::StartProcess(os::process::GetExecutablePath(), restartArgs, os::process::GetWorkingDirectory()); Exit(); } void App::Exit() { Config::Save(); #ifdef _WIN32 timeEndPeriod(1); #endif std::_Exit(0); } // SWA::CApplication PPC_FUNC_IMPL(__imp__sub_824EB490); PPC_FUNC(sub_824EB490) { App::s_isInit = true; App::s_isMissingDLC = !Installer::checkAllDLC(GetGamePath()); App::s_language = Config::Language; __imp__sub_824EB490(ctx, base); } static std::thread::id g_mainThreadId = std::this_thread::get_id(); // SWA::CApplication::Update PPC_FUNC_IMPL(__imp__sub_822C1130); PPC_FUNC(sub_822C1130) { Video::WaitOnSwapChain(); // Correct small delta time errors. if (Config::FPS >= FPS_MIN && Config::FPS < FPS_MAX) { double targetDeltaTime = 1.0 / Config::FPS; if (abs(ctx.f1.f64 - targetDeltaTime) < 0.00001) ctx.f1.f64 = targetDeltaTime; } App::s_deltaTime = ctx.f1.f64; // This function can also be called by the loading thread, // which SDL does not like. To prevent the OS from thinking // the process is unresponsive, we will flush while waiting // for the pipelines to finish compiling in video.cpp. if (std::this_thread::get_id() == g_mainThreadId) { SDL_PumpEvents(); SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT); } GameWindow::Update(); AudioPatches::Update(App::s_deltaTime); InspirePatches::Update(); __imp__sub_822C1130(ctx, base); }