diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 6b18276a6b..48fbfd6b8e 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -88,6 +88,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #include #ifdef HAVE_SDL2 +#include #include // For SDL ScreenSaver functions #endif @@ -199,6 +200,14 @@ enum class CalloutFlag : uint32_t { DRDDeprecation = 0x2, }; +/** + * Some games perform worse or straight-up don't work with updates, + * so this tracks which games are bad in this regard. + */ +static const QList bad_update_games{ + 0x0100F2C0115B6000 // Tears of the Kingdom +}; + const int GMainWindow::max_recent_files_item; static void RemoveCachedContents() { @@ -1778,6 +1787,56 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa std::make_unique(*this), // Web Browser }); + /** Game Updates check */ + + // yuzu's configuration doesn't actually support lists so this is a bit hacky + QSettings settings; + QStringList currentIgnored = settings.value("ignoredBadUpdates", {}).toStringList(); + + for (const u64 id : bad_update_games) { + const bool ignored = currentIgnored.contains(QString::number(id)); + + if (params.program_id == id && !ignored) { + QMessageBox *msg = new QMessageBox(this); + msg->setWindowTitle(tr("Game Updates Warning")); + msg->setIcon(QMessageBox::Warning); + msg->setText(tr("The game you are trying to launch is known to have performance or booting " + "issues when updates are applied. It's recommended to disable any updates " + "to this game before attempting to launch, or switch to an earlier update. " + "If you don't have any updates installed or enabled, you can safely ignore " + "this message.

Press \"OK\" to continue launching, or \"Cancel\" to " + "cancel the launch.")); + + msg->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); + + QCheckBox *dontShowAgain = new QCheckBox(msg); + dontShowAgain->setText(tr("Don't show again for this game")); + msg->setCheckBox(dontShowAgain); + + int result = msg->exec(); + + // wtf + QMessageBox::ButtonRole role = msg->buttonRole(msg->button((QMessageBox::StandardButton) result)); + + switch (role) { + + case QMessageBox::RejectRole: + return false; + + case QMessageBox::AcceptRole: + default: + if (dontShowAgain->isChecked()) { + currentIgnored << QString::number(params.program_id); + + settings.setValue("ignoredBadUpdates", currentIgnored); + settings.sync(); + } + break; + } + } + } + + /** Exec */ const Core::SystemResultStatus result{ system->Load(*render_window, filename.toStdString(), params)}; @@ -4649,6 +4708,7 @@ void GMainWindow::UpdateStatusBar() { } else { emu_speed_label->setText(tr("Speed: %1%").arg(results.emulation_speed * 100.0, 0, 'f', 0)); } + game_fps_label->setText( tr("Game: %1 FPS").arg(std::round(results.average_game_fps), 0, 'f', 0) + tr(Settings::values.use_speed_limit ? " (Unlocked)" : "")); @@ -5255,7 +5315,7 @@ int main(int argc, char* argv[]) { Common::ConfigureNvidiaEnvironmentFlags(); // Init settings params - QCoreApplication::setOrganizationName(QStringLiteral("yuzu team")); + QCoreApplication::setOrganizationName(QStringLiteral("yuzu")); QCoreApplication::setApplicationName(QStringLiteral("eden")); #ifdef _WIN32 diff --git a/src/yuzu/uisettings.h b/src/yuzu/uisettings.h index 4bbdb1e11c..0cd68feffe 100644 --- a/src/yuzu/uisettings.h +++ b/src/yuzu/uisettings.h @@ -277,4 +277,4 @@ Q_DECLARE_METATYPE(Settings::RendererBackend); Q_DECLARE_METATYPE(Settings::ShaderBackend); Q_DECLARE_METATYPE(Settings::AstcRecompression); Q_DECLARE_METATYPE(Settings::AstcDecodeMode); -Q_DECLARE_METATYPE(Settings::SpirvOptimizeMode); \ No newline at end of file +Q_DECLARE_METATYPE(Settings::SpirvOptimizeMode);