From 7f85c6e2823d34bfa32cae6d52a44846f8553731 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 12 Jul 2026 09:32:11 +0200 Subject: [PATCH] [qt] nuke game compat list (again) (#4201) we have no use for it it's dead code most of the time users just complain about how the list isn't updated ok so what if we update it? great now its more noise added to the git, awesome even if we constantly update it, we introduce new breakage that makes keeping track of things extremely difficult either we integrate with emuready (would violate self containment principles) or we integrate with emuready in a similar fashion to eden news outlet (where we cache the list with some TTL of like 60 mins or whatever) that would be better respecting of "self containment" but would probably require having a quick way to update the list additively, probably filtered to the user's device instead of a global thing, and i dont think emuready has that granularity nor we have the "connect this to that" for the api stuffs another (which is what i propose here) is throw everything out of the window until someone can come up with something better Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4201 Reviewed-by: Maufeat Reviewed-by: CamilleLaVey --- .reuse/dep5 | 5 - CMakeLists.txt | 19 - .../compatibility_list.json | 354 ---------------- .../compatibility_list/compatibility_list.qrc | 5 - src/qt_common/game_list/model.cpp | 50 +-- src/qt_common/game_list/model.h | 6 - src/qt_common/game_list/worker.cpp | 15 +- src/qt_common/game_list/worker.h | 3 - src/yuzu/CMakeLists.txt | 13 - src/yuzu/compatdb.cpp | 206 --------- src/yuzu/compatdb.h | 40 -- src/yuzu/compatdb.ui | 398 ------------------ src/yuzu/compatibility_list.cpp | 17 - src/yuzu/compatibility_list.h | 19 - src/yuzu/game/game_list.cpp | 12 - src/yuzu/game/game_list.h | 4 - src/yuzu/main.ui | 11 - src/yuzu/main_window.cpp | 23 - src/yuzu/main_window.h | 3 - 19 files changed, 4 insertions(+), 1199 deletions(-) delete mode 100644 dist/compatibility_list/compatibility_list.json delete mode 100644 dist/compatibility_list/compatibility_list.qrc delete mode 100644 src/yuzu/compatdb.cpp delete mode 100644 src/yuzu/compatdb.h delete mode 100644 src/yuzu/compatdb.ui delete mode 100644 src/yuzu/compatibility_list.cpp delete mode 100644 src/yuzu/compatibility_list.h diff --git a/.reuse/dep5 b/.reuse/dep5 index 081c21e583..5d6fd4379e 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -112,11 +112,6 @@ Files: src/yuzu/*.ui Copyright: 2018-2022 yuzu Emulator Project License: GPL-2.0-or-later -Files: src/yuzu/compatdb.ui - src/yuzu/main.ui -Copyright: 2014-2017 Citra Emulator Project -License: GPL-2.0-or-later - Files: src/yuzu/loading_screen.ui Copyright: 2019 James Rowe License: GPL-2.0-or-later diff --git a/CMakeLists.txt b/CMakeLists.txt index d26063b8b9..1039ddfed4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -281,25 +281,6 @@ if(EXISTS ${PROJECT_SOURCE_DIR}/hooks/pre-commit AND NOT EXISTS ${PROJECT_SOURCE endif() endif() -set(compat_base dist/compatibility_list/compatibility_list) -set(compat_qrc ${compat_base}.qrc) -set(compat_json ${compat_base}.json) - -configure_file(${PROJECT_SOURCE_DIR}/${compat_qrc} - ${PROJECT_BINARY_DIR}/${compat_qrc} - COPYONLY) - -if (EXISTS ${PROJECT_SOURCE_DIR}/${compat_json}) - configure_file("${PROJECT_SOURCE_DIR}/${compat_json}" - "${PROJECT_BINARY_DIR}/${compat_json}" - COPYONLY) -endif() - -# TODO: Compat list download -if (NOT EXISTS ${PROJECT_BINARY_DIR}/${compat_json}) - file(WRITE ${PROJECT_BINARY_DIR}/${compat_json} "") -endif() - if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX)) set(HAS_NCE 1) add_compile_definitions(HAS_NCE=1) diff --git a/dist/compatibility_list/compatibility_list.json b/dist/compatibility_list/compatibility_list.json deleted file mode 100644 index b8d74e8945..0000000000 --- a/dist/compatibility_list/compatibility_list.json +++ /dev/null @@ -1,354 +0,0 @@ -[ - { - "compatibility": 0, - "directory": "the-legend-of-zelda-breath-of-the-wild", - "releases": [ - {"id": "01007EF00011E000"} - ], - "title": "The Legend of Zelda: Breath of the Wild" - }, - { - "compatibility": 1, - "directory": "super-mario-odyssey", - "releases": [ - {"id": "0100000000010000"} - ], - "title": "Super Mario Odyssey" - }, - { - "compatibility": 0, - "directory": "animal-crossing-new-horizons", - "releases": [ - {"id": "01006F8002326000"} - ], - "title": "Animal Crossing: New Horizons" - }, - { - "compatibility": 1, - "directory": "pokemon-legends-z-a", - "releases": [ - {"id": "0100F43008C44000"} - ], - "title": "Pokémon Legends: Z-A" - }, - { - "compatibility": 1, - "directory": "the-legend-of-zelda-tears-of-the-kingdom", - "releases": [ - {"id": "0100F2C0115B6000"} - ], - "title": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "compatibility": 0, - "directory": "super-mario-galaxy", - "releases": [ - {"id": "010099C022B96000"} - ], - "title": "Super Mario Galaxy" - }, - { - "compatibility": 3, - "directory": "star-wars-republic-commando", - "releases": [ - {"id": "0100FA10115F8000"} - ], - "title": "Star Wars: Republic Commando" - }, - { - "compatibility": 0, - "directory": "doki-doki-literature-club-plus", - "releases": [ - {"id": "010086901543E000"} - ], - "title": "Doki Doki Literature Club Plus" - }, - { - "compatibility": 1, - "directory": "pokemon-scarlet", - "releases": [ - {"id": "0100A3D008C5C000"} - ], - "title": "Pokémon Scarlet" - }, - { - "compatibility": 1, - "directory": "pokemon-violet", - "releases": [ - {"id": "01008F6008C5E000"} - ], - "title": "Pokémon Violet" - }, - { - "compatibility": 2, - "directory": "pokemon-legends-arceus", - "releases": [ - {"id": "01001E300D162000"} - ], - "title": "Pokémon Legends: Arceus" - }, - { - "compatibility": 0, - "directory": "splatoon-2", - "releases": [ - {"id": "01003BC0000A0000"} - ], - "title": "Splatoon 2" - }, - { - "compatibility": 1, - "directory": "super-smash-bros-ultimate", - "releases": [ - {"id": "01006A800016E000"} - ], - "title": "Super Smash Bros. Ultimate" - }, - { - "compatibility": 0, - "directory": "mario-kart-8-deluxe", - "releases": [ - {"id": "0100152000022000"} - ], - "title": "Mario Kart 8 Deluxe" - }, - { - "compatibility": 0, - "directory": "splatoon-3", - "releases": [ - {"id": "0100C2500FC20000"} - ], - "title": "Splatoon 3" - }, - { - "compatibility": 0, - "directory": "new-super-mario-bros-u-deluxe", - "releases": [ - {"id": "0100EA80032EA000"} - ], - "title": "New Super Mario Bros. U Deluxe" - }, - { - "compatibility": 0, - "directory": "hyrule-warriors-age-of-calamity", - "releases": [ - {"id": "01002B00111A2000"} - ], - "title": "Hyrule Warriors: Age of Calamity" - }, - { - "compatibility": 2, - "directory": "luigis-mansion-3", - "releases": [ - {"id": "0100DCA0064A6000"} - ], - "title": "Luigi's Mansion 3" - }, - { - "compatibility": 2, - "directory": "pokemon-brilliant-diamond", - "releases": [ - {"id": "0100000011D90000"} - ], - "title": "Pokémon Brilliant Diamond" - }, - { - "compatibility": 2, - "directory": "pokemon-shining-pearl", - "releases": [ - {"id": "010018E011D92000"} - ], - "title": "Pokémon Shining Pearl" - }, - { - "compatibility": 1, - "directory": "super-mario-3d-world-bowsers-fury", - "releases": [ - {"id": "010028600EBDA000"} - ], - "title": "Super Mario 3D World + Bowser's Fury" - }, - { - "compatibility": 0, - "directory": "the-legend-of-zelda-links-awakening", - "releases": [ - {"id": "01006BB00C6F0000"} - ], - "title": "The Legend of Zelda: Link's Awakening" - }, - { - "compatibility": 1, - "directory": "fire-emblem-three-houses", - "releases": [ - {"id": "010055D009F78000"} - ], - "title": "Fire Emblem: Three Houses" - }, - { - "compatibility": 2, - "directory": "metroid-dread", - "releases": [ - {"id": "010093801237C000"} - ], - "title": "Metroid Dread" - }, - { - "compatibility": 0, - "directory": "paper-mario-the-origami-king", - "releases": [ - {"id": "0100A3900C3E2000"} - ], - "title": "Paper Mario: The Origami King" - }, - { - "compatibility": 1, - "directory": "xenoblade-chronicles-definitive-edition", - "releases": [ - {"id": "0100FF500E34A000"} - ], - "title": "Xenoblade Chronicles: Definitive Edition" - }, - { - "compatibility": 2, - "directory": "xenoblade-chronicles-3", - "releases": [ - {"id": "010074F013262000"} - ], - "title": "Xenoblade Chronicles 3" - }, - { - "compatibility": 1, - "directory": "pikmin-3-deluxe", - "releases": [ - {"id": "0100F8600D4B0000"} - ], - "title": "Pikmin 3 Deluxe" - }, - { - "compatibility": 0, - "directory": "donkey-kong-country-tropical-freeze", - "releases": [ - {"id": "0100C1F0054B6000"} - ], - "title": "Donkey Kong Country: Tropical Freeze" - }, - { - "compatibility": 1, - "directory": "kirby-and-the-forgotten-land", - "releases": [ - {"id": "01004D300C5AE000"} - ], - "title": "Kirby and the Forgotten Land" - }, - { - "compatibility": 2, - "directory": "mario-party-superstars", - "releases": [ - {"id": "01006B400D8B2000"} - ], - "title": "Mario Party Superstars" - }, - { - "compatibility": 0, - "directory": "clubhouse-games-51-worldwide-classics", - "releases": [ - {"id": "0100F8600D4B0000"} - ], - "title": "Clubhouse Games: 51 Worldwide Classics" - }, - { - "compatibility": 1, - "directory": "ring-fit-adventure", - "releases": [ - {"id": "01006B300BAF8000"} - ], - "title": "Ring Fit Adventure" - }, - { - "compatibility": 2, - "directory": "arms", - "releases": [ - {"id": "01009B500007C000"} - ], - "title": "ARMS" - }, - { - "compatibility": 0, - "directory": "super-mario-maker-2", - "releases": [ - {"id": "01009B90006DC000"} - ], - "title": "Super Mario Maker 2" - }, - { - "compatibility": 0, - "directory": "pokemon-lets-go-pikachu", - "releases": [ - {"id": "010003F003A34000"} - ], - "title": "Pokémon: Let's Go, Pikachu!" - }, - { - "compatibility": 1, - "directory": "pokemon-lets-go-eevee", - "releases": [ - {"id": "0100187003A36000"} - ], - "title": "Pokémon: Let's Go, Eevee!" - }, - { - "compatibility": 2, - "directory": "pokemon-sword", - "releases": [ - {"id": "0100ABF008968000"} - ], - "title": "Pokémon Sword" - }, - { - "compatibility": 2, - "directory": "pokemon-shield", - "releases": [ - {"id": "01008DB008C2C000"} - ], - "title": "Pokémon Shield" - }, - { - "compatibility": 1, - "directory": "new-pokemon-snap", - "releases": [ - {"id": "0100F4300C182000"} - ], - "title": "New Pokémon Snap" - }, - { - "compatibility": 0, - "directory": "mario-golf-super-rush", - "releases": [ - {"id": "0100C9C00E25C000"} - ], - "title": "Mario Golf: Super Rush" - }, - { - "compatibility": 1, - "directory": "mario-tennis-aces", - "releases": [ - {"id": "0100BDE00862A000"} - ], - "title": "Mario Tennis Aces" - }, - { - "compatibility": 2, - "directory": "wario-ware-get-it-together", - "releases": [ - {"id": "0100563010F22000"} - ], - "title": "WarioWare: Get It Together!" - }, - { - "compatibility": 0, - "directory": "big-brain-academy-brain-vs-brain", - "releases": [ - {"id": "0100190010F24000"} - ], - "title": "Big Brain Academy: Brain vs. Brain" - } -] diff --git a/dist/compatibility_list/compatibility_list.qrc b/dist/compatibility_list/compatibility_list.qrc deleted file mode 100644 index a29b735981..0000000000 --- a/dist/compatibility_list/compatibility_list.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - compatibility_list.json - - diff --git a/src/qt_common/game_list/model.cpp b/src/qt_common/game_list/model.cpp index 5c1042b002..c333644011 100644 --- a/src/qt_common/game_list/model.cpp +++ b/src/qt_common/game_list/model.cpp @@ -52,7 +52,7 @@ void GameListModel::PopulateAsync(QVector& game_dirs) { current_worker.reset(); removeRows(0, rowCount()); - current_worker = std::make_unique(vfs, provider, game_dirs, compatibility_list, + current_worker = std::make_unique(vfs, provider, game_dirs, play_time_manager, system); connect(current_worker.get(), &GameListWorker::DataAvailable, this, &GameListModel::WorkerEvent, @@ -157,50 +157,6 @@ void GameListModel::RemoveFavorite(u64 program_id) { } } -void GameListModel::LoadCompatibilityList() { - QFile compat_list{QStringLiteral(":compatibility_list/compatibility_list.json")}; - - if (!compat_list.open(QFile::ReadOnly | QFile::Text)) { - LOG_ERROR(Frontend, "Unable to open game compatibility list"); - return; - } - - if (compat_list.size() == 0) { - LOG_WARNING(Frontend, "Game compatibility list is empty"); - return; - } - - const QByteArray content = compat_list.readAll(); - if (content.isEmpty()) { - LOG_ERROR(Frontend, "Unable to completely read game compatibility list"); - return; - } - - const QJsonDocument json = QJsonDocument::fromJson(content); - const QJsonArray arr = json.array(); - - for (const QJsonValue& value : arr) { - const QJsonObject game = value.toObject(); - const QString compatibility_key = QStringLiteral("compatibility"); - - if (!game.contains(compatibility_key) || !game[compatibility_key].isDouble()) { - continue; - } - - const int compatibility = game[compatibility_key].toInt(); - const QString directory = game[QStringLiteral("directory")].toString(); - const QJsonArray ids = game[QStringLiteral("releases")].toArray(); - - for (const QJsonValue& id_ref : ids) { - const QJsonObject id_object = id_ref.toObject(); - const QString id = id_object[QStringLiteral("id")].toString(); - - compatibility_list.emplace(id.toUpper().toStdString(), - std::make_pair(QString::number(compatibility), directory)); - } - } -} - void GameListModel::Repopulate() { current_worker.reset(); QtCommon::system->GetFileSystemController().CreateFactories(*QtCommon::vfs); @@ -247,10 +203,6 @@ QFileSystemWatcher* GameListModel::GetWatcher() const { return watcher; } -const CompatibilityList& GameListModel::GetCompatibilityList() const { - return compatibility_list; -} - void GameListModel::SetFlat(bool flat) { m_flat = flat; } diff --git a/src/qt_common/game_list/model.h b/src/qt_common/game_list/model.h index c8661e2fd1..68f42848e8 100644 --- a/src/qt_common/game_list/model.h +++ b/src/qt_common/game_list/model.h @@ -12,7 +12,6 @@ #include "common/common_types.h" #include "frontend_common/play_time_manager.h" #include "qt_common/config/uisettings.h" -#include "yuzu/compatibility_list.h" namespace Core { class System; @@ -62,14 +61,10 @@ public: void RefreshExternalContent(); void ResetExternalWatcher(); - void LoadCompatibilityList(); - void RetranslateUI(); QFileSystemWatcher* GetWatcher() const; - const CompatibilityList& GetCompatibilityList() const; - void SetFlat(bool flat); signals: @@ -89,7 +84,6 @@ private: std::shared_ptr vfs; FileSys::ManualContentProvider* provider; - CompatibilityList compatibility_list; const PlayTime::PlayTimeManager& play_time_manager; Core::System& system; diff --git a/src/qt_common/game_list/worker.cpp b/src/qt_common/game_list/worker.cpp index 5cd68996c5..586a26e8b9 100644 --- a/src/qt_common/game_list/worker.cpp +++ b/src/qt_common/game_list/worker.cpp @@ -33,7 +33,6 @@ #include "qt_common/qt_common.h" #include "qt_common/game_list/game_list_p.h" -#include "yuzu/compatibility_list.h" #include "qt_common/game_list/model.h" #include "qt_common/game_list/worker.h" @@ -203,14 +202,8 @@ QString FormatPatchNameVersions(const FileSys::PatchManager& patch_manager, QList MakeGameListEntry(const std::string& path, const std::string& name, const std::size_t size, const std::vector& icon, Loader::AppLoader& loader, u64 program_id, - const CompatibilityList& compatibility_list, const PlayTime::PlayTimeManager& play_time_manager, const FileSys::PatchManager& patch) { - auto const it = FindMatchingCompatibilityEntry(compatibility_list, program_id); - // The game list uses 99 as compatibility number for untested games - QString compatibility = - it != compatibility_list.end() ? it->second.first : QStringLiteral("99"); - auto const file_type = loader.GetFileType(); auto const file_type_string = QString::fromStdString(Loader::GetFileTypeString(file_type)); @@ -227,7 +220,6 @@ QList MakeGameListEntry(const std::string& path, const std::stri new GameListItemSize(size), new GameListItemPlayTime(play_time), new GameListItem(patch_versions), - new GameListItemCompat(compatibility), }; } } // Anonymous namespace @@ -235,11 +227,10 @@ QList MakeGameListEntry(const std::string& path, const std::stri GameListWorker::GameListWorker(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvider* provider_, QVector& game_dirs_, - const CompatibilityList& compatibility_list_, const PlayTime::PlayTimeManager& play_time_manager_, Core::System& system_) : vfs{std::move(vfs_)}, provider{provider_}, game_dirs{game_dirs_}, - compatibility_list{compatibility_list_}, play_time_manager{play_time_manager_}, + play_time_manager{play_time_manager_}, system{system_} { // We want the game list to manage our lifetime. setAutoDelete(false); @@ -335,7 +326,7 @@ void GameListWorker::AddTitlesToGameList(GameListDir* parent_dir) { } auto entry = MakeGameListEntry(file->GetFullPath(), name, file->GetSize(), icon, *loader, - program_id, compatibility_list, play_time_manager, patch); + program_id, play_time_manager, patch); RecordEvent([=](GameListModel* model) { model->AddEntry(entry, parent_dir); }); } } @@ -405,7 +396,7 @@ void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_pa auto entry = MakeGameListEntry( physical_name, name, Common::FS::GetSize(physical_name), icon, *app_loader, - id, compatibility_list, play_time_manager, patch); + id, play_time_manager, patch); RecordEvent([=](GameListModel* model) { model->AddEntry(entry, parent_dir); }); }; diff --git a/src/qt_common/game_list/worker.h b/src/qt_common/game_list/worker.h index c11741c5f5..c007498d4b 100644 --- a/src/qt_common/game_list/worker.h +++ b/src/qt_common/game_list/worker.h @@ -20,7 +20,6 @@ #include "core/file_sys/registered_cache.h" #include "frontend_common/play_time_manager.h" #include "qt_common/config/uisettings.h" -#include "yuzu/compatibility_list.h" namespace Core { class System; @@ -46,7 +45,6 @@ public: explicit GameListWorker(std::shared_ptr vfs_, FileSys::ManualContentProvider* provider_, QVector& game_dirs_, - const CompatibilityList& compatibility_list_, const PlayTime::PlayTimeManager& play_time_manager_, Core::System& system_); ~GameListWorker() override; @@ -85,7 +83,6 @@ private: std::shared_ptr vfs; FileSys::ManualContentProvider* provider; QVector& game_dirs; - const CompatibilityList& compatibility_list; const PlayTime::PlayTimeManager& play_time_manager; QStringList watch_list; diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index f806ebf515..9fa3f3c85d 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -37,9 +37,6 @@ add_executable(yuzu applets/qt_web_browser_scripts.h bootmanager.cpp bootmanager.h - compatdb.ui - compatibility_list.cpp - compatibility_list.h configuration/configuration_shared.cpp configuration/configuration_shared.h configuration/configure.ui @@ -216,8 +213,6 @@ add_executable(yuzu util/url_request_interceptor.h util/util.cpp util/util.h - compatdb.cpp - compatdb.h user_data_migration.h user_data_migration.cpp @@ -260,9 +255,6 @@ if (CXX_CLANG) $<$,15>:CANNOT_EXPLICITLY_INSTANTIATE>) endif() -file(GLOB COMPAT_LIST - ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc - ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) file(GLOB_RECURSE ICONS ${PROJECT_SOURCE_DIR}/dist/icons/*) file(GLOB_RECURSE THEMES ${PROJECT_SOURCE_DIR}/dist/qt_themes/*) @@ -354,7 +346,6 @@ endif() target_sources(yuzu PRIVATE - ${COMPAT_LIST} ${ICONS} ${LANGUAGES} ${THEMES}) @@ -416,10 +407,6 @@ if (UNIX AND NOT APPLE) target_link_libraries(yuzu PRIVATE Qt6::DBus) endif() -if (YUZU_ENABLE_COMPATIBILITY_REPORTING) - target_compile_definitions(yuzu PRIVATE YUZU_ENABLE_COMPATIBILITY_REPORTING) -endif() - if (ENABLE_WEB_SERVICE) target_compile_definitions(yuzu PRIVATE ENABLE_WEB_SERVICE) endif() diff --git a/src/yuzu/compatdb.cpp b/src/yuzu/compatdb.cpp deleted file mode 100644 index b47cdd2116..0000000000 --- a/src/yuzu/compatdb.cpp +++ /dev/null @@ -1,206 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: 2017 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include -#include -#include -#include "common/logging.h" -#include "ui_compatdb.h" -#include "yuzu/compatdb.h" - -CompatDB::CompatDB(QWidget* parent) - : QWizard(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), - ui{std::make_unique()} { - ui->setupUi(this); - - connect(ui->radioButton_GameBoot_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_GameBoot_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_Gameplay_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_Gameplay_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_NoFreeze_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_NoFreeze_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_Complete_Yes, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_Complete_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_Graphical_Major, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_Graphical_Minor, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_Graphical_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_Audio_Major, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_Audio_Minor, &QRadioButton::clicked, this, &CompatDB::EnableNext); - connect(ui->radioButton_Audio_No, &QRadioButton::clicked, this, &CompatDB::EnableNext); - - connect(button(NextButton), &QPushButton::clicked, this, &CompatDB::Submit); - connect(&testcase_watcher, &QFutureWatcher::finished, this, - &CompatDB::OnTestcaseSubmitted); -} - -CompatDB::~CompatDB() = default; - -enum class CompatDBPage { - Intro = 0, - GameBoot = 1, - GamePlay = 2, - Freeze = 3, - Completion = 4, - Graphical = 5, - Audio = 6, - Final = 7, -}; - -void CompatDB::Submit() { - QButtonGroup* compatibility_GameBoot = new QButtonGroup(this); - compatibility_GameBoot->addButton(ui->radioButton_GameBoot_Yes, 0); - compatibility_GameBoot->addButton(ui->radioButton_GameBoot_No, 1); - - QButtonGroup* compatibility_Gameplay = new QButtonGroup(this); - compatibility_Gameplay->addButton(ui->radioButton_Gameplay_Yes, 0); - compatibility_Gameplay->addButton(ui->radioButton_Gameplay_No, 1); - - QButtonGroup* compatibility_NoFreeze = new QButtonGroup(this); - compatibility_NoFreeze->addButton(ui->radioButton_NoFreeze_Yes, 0); - compatibility_NoFreeze->addButton(ui->radioButton_NoFreeze_No, 1); - - QButtonGroup* compatibility_Complete = new QButtonGroup(this); - compatibility_Complete->addButton(ui->radioButton_Complete_Yes, 0); - compatibility_Complete->addButton(ui->radioButton_Complete_No, 1); - - QButtonGroup* compatibility_Graphical = new QButtonGroup(this); - compatibility_Graphical->addButton(ui->radioButton_Graphical_Major, 0); - compatibility_Graphical->addButton(ui->radioButton_Graphical_Minor, 1); - compatibility_Graphical->addButton(ui->radioButton_Graphical_No, 2); - - QButtonGroup* compatibility_Audio = new QButtonGroup(this); - compatibility_Audio->addButton(ui->radioButton_Audio_Major, 0); - compatibility_Graphical->addButton(ui->radioButton_Audio_Minor, 1); - compatibility_Audio->addButton(ui->radioButton_Audio_No, 2); - - const int compatibility = static_cast(CalculateCompatibility()); - - switch ((static_cast(currentId()))) { - case CompatDBPage::Intro: - break; - case CompatDBPage::GameBoot: - if (compatibility_GameBoot->checkedId() == -1) { - button(NextButton)->setEnabled(false); - } - break; - case CompatDBPage::GamePlay: - if (compatibility_Gameplay->checkedId() == -1) { - button(NextButton)->setEnabled(false); - } - break; - case CompatDBPage::Freeze: - if (compatibility_NoFreeze->checkedId() == -1) { - button(NextButton)->setEnabled(false); - } - break; - case CompatDBPage::Completion: - if (compatibility_Complete->checkedId() == -1) { - button(NextButton)->setEnabled(false); - } - break; - case CompatDBPage::Graphical: - if (compatibility_Graphical->checkedId() == -1) { - button(NextButton)->setEnabled(false); - } - break; - case CompatDBPage::Audio: - if (compatibility_Audio->checkedId() == -1) { - button(NextButton)->setEnabled(false); - } - break; - case CompatDBPage::Final: - back(); - LOG_INFO(Frontend, "Compatibility Rating: {}", compatibility); - - button(NextButton)->setEnabled(false); - button(NextButton)->setText(tr("Submitting")); - button(CancelButton)->setVisible(false); - break; - default: - LOG_ERROR(Frontend, "Unexpected page: {}", currentId()); - break; - } -} - -int CompatDB::nextId() const { - switch ((static_cast(currentId()))) { - case CompatDBPage::Intro: - return static_cast(CompatDBPage::GameBoot); - case CompatDBPage::GameBoot: - if (ui->radioButton_GameBoot_No->isChecked()) { - return static_cast(CompatDBPage::Final); - } - return static_cast(CompatDBPage::GamePlay); - case CompatDBPage::GamePlay: - if (ui->radioButton_Gameplay_No->isChecked()) { - return static_cast(CompatDBPage::Final); - } - return static_cast(CompatDBPage::Freeze); - case CompatDBPage::Freeze: - if (ui->radioButton_NoFreeze_No->isChecked()) { - return static_cast(CompatDBPage::Final); - } - return static_cast(CompatDBPage::Completion); - case CompatDBPage::Completion: - if (ui->radioButton_Complete_No->isChecked()) { - return static_cast(CompatDBPage::Final); - } - return static_cast(CompatDBPage::Graphical); - case CompatDBPage::Graphical: - return static_cast(CompatDBPage::Audio); - case CompatDBPage::Audio: - return static_cast(CompatDBPage::Final); - case CompatDBPage::Final: - return -1; - default: - LOG_ERROR(Frontend, "Unexpected page: {}", currentId()); - return static_cast(CompatDBPage::Intro); - } -} - -CompatibilityStatus CompatDB::CalculateCompatibility() const { - if (ui->radioButton_GameBoot_No->isChecked()) { - return CompatibilityStatus::WontBoot; - } - - if (ui->radioButton_Gameplay_No->isChecked()) { - return CompatibilityStatus::IntroMenu; - } - - if (ui->radioButton_NoFreeze_No->isChecked() || ui->radioButton_Complete_No->isChecked()) { - return CompatibilityStatus::Ingame; - } - - if (ui->radioButton_Graphical_Major->isChecked() || ui->radioButton_Audio_Major->isChecked()) { - return CompatibilityStatus::Ingame; - } - - if (ui->radioButton_Graphical_Minor->isChecked() || ui->radioButton_Audio_Minor->isChecked()) { - return CompatibilityStatus::Playable; - } - - return CompatibilityStatus::Perfect; -} - -void CompatDB::OnTestcaseSubmitted() { - if (!testcase_watcher.result()) { - QMessageBox::critical(this, tr("Communication error"), - tr("An error occurred while sending the Testcase")); - button(NextButton)->setEnabled(true); - button(NextButton)->setText(tr("Next")); - button(CancelButton)->setVisible(true); - } else { - next(); - // older versions of QT don't support the "NoCancelButtonOnLastPage" option, this is a - // workaround - button(CancelButton)->setVisible(false); - } -} - -void CompatDB::EnableNext() { - button(NextButton)->setEnabled(true); -} diff --git a/src/yuzu/compatdb.h b/src/yuzu/compatdb.h deleted file mode 100644 index 4e788d09c4..0000000000 --- a/src/yuzu/compatdb.h +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-FileCopyrightText: 2017 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include - -namespace Ui { -class CompatDB; -} - -enum class CompatibilityStatus { - Perfect = 0, - Playable = 1, - // Unused: Okay = 2, - Ingame = 3, - IntroMenu = 4, - WontBoot = 5, -}; - -class CompatDB : public QWizard { - Q_OBJECT - -public: - explicit CompatDB(QWidget* parent = nullptr); - ~CompatDB(); - int nextId() const override; - -private: - QFutureWatcher testcase_watcher; - - std::unique_ptr ui; - - void Submit(); - CompatibilityStatus CalculateCompatibility() const; - void OnTestcaseSubmitted(); - void EnableNext(); -}; diff --git a/src/yuzu/compatdb.ui b/src/yuzu/compatdb.ui deleted file mode 100644 index 6a2632a1ce..0000000000 --- a/src/yuzu/compatdb.ui +++ /dev/null @@ -1,398 +0,0 @@ - - - CompatDB - - - - 0 - 0 - 600 - 482 - - - - - 500 - 410 - - - - Report Compatibility - - - QWizard::WizardOption::DisabledBackButtonOnLastPage|QWizard::WizardOption::HelpButtonOnRight|QWizard::WizardOption::NoBackButtonOnStartPage - - - - Report Game Compatibility - - - 0 - - - - - - <html><head/><body><p><span style=" font-size:10pt;">Should you choose to submit a test case to the </span><a href="https://eden-emulator.github.io/game/"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">eden Compatibility List</span></a><span style=" font-size:10pt;">, The following information will be collected and displayed on the site:</span></p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hardware Information (CPU / GPU / Operating System)</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Which version of eden you are running</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The connected eden account</li></ul></body></html> - - - true - - - true - - - - - - - Qt::Orientation::Vertical - - - - 20 - 0 - - - - - - - - - Report Game Compatibility - - - 1 - - - - - - - 10 - - - - <html><head/><body><p>Does the game boot?</p></body></html> - - - true - - - - - - - Qt::Orientation::Vertical - - - - 20 - 0 - - - - - - - - Yes The game starts to output video or audio - - - - - - - No The game doesn't get past the "Launching..." screen - - - - - - - - Report Game Compatibility - - - 2 - - - - - - Yes The game gets past the intro/menu and into gameplay - - - - - - - No The game crashes or freezes while loading or using the menu - - - - - - - - 10 - - - - <html><head/><body><p>Does the game reach gameplay?</p></body></html> - - - true - - - - - - - Qt::Orientation::Vertical - - - - 20 - 0 - - - - - - - - - Report Game Compatibility - - - 3 - - - - - - Yes The game works without crashes - - - - - - - No The game crashes or freezes during gameplay - - - - - - - - 10 - - - - <html><head/><body><p>Does the game work without crashing, freezing or locking up during gameplay?</p></body></html> - - - true - - - - - - - Qt::Orientation::Vertical - - - - 20 - 0 - - - - - - - - - Report Game Compatibility - - - 4 - - - - - - Yes The game can be finished without any workarounds - - - - - - - No The game can't progress past a certain area - - - - - - - - 10 - - - - <html><head/><body><p>Is the game completely playable from start to finish?</p></body></html> - - - true - - - - - - - Qt::Orientation::Vertical - - - - 20 - 0 - - - - - - - - - Report Game Compatibility - - - 5 - - - - - - Major The game has major graphical errors - - - - - - - Minor The game has minor graphical errors - - - - - - - None Everything is rendered as it looks on the Nintendo Switch - - - - - - - - 10 - - - - <html><head/><body><p>Does the game have any graphical glitches?</p></body></html> - - - true - - - - - - - Qt::Orientation::Vertical - - - - 20 - 0 - - - - - - - - - Report Game Compatibility - - - 6 - - - - - - Major The game has major audio errors - - - - - - - Minor The game has minor audio errors - - - - - - - None Audio is played perfectly - - - - - - - - 10 - - - - <html><head/><body><p>Does the game have any audio glitches / missing effects?</p></body></html> - - - true - - - - - - - Qt::Orientation::Vertical - - - - 20 - 0 - - - - - - - - - Thank you for your submission! - - - 7 - - - - - - diff --git a/src/yuzu/compatibility_list.cpp b/src/yuzu/compatibility_list.cpp deleted file mode 100644 index d08c542eff..0000000000 --- a/src/yuzu/compatibility_list.cpp +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include - -#include - -#include "yuzu/compatibility_list.h" - -CompatibilityList::const_iterator FindMatchingCompatibilityEntry( - const CompatibilityList& compatibility_list, u64 program_id) { - return std::find_if(compatibility_list.begin(), compatibility_list.end(), - [program_id](const auto& element) { - std::string pid = fmt::format("{:016X}", program_id); - return element.first == pid; - }); -} diff --git a/src/yuzu/compatibility_list.h b/src/yuzu/compatibility_list.h deleted file mode 100644 index bb1e4b6205..0000000000 --- a/src/yuzu/compatibility_list.h +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include - -#include - -#include "common/common_types.h" - -using CompatibilityList = ankerl::unordered_dense::map>; - -CompatibilityList::const_iterator FindMatchingCompatibilityEntry( - const CompatibilityList& compatibility_list, u64 program_id); diff --git a/src/yuzu/game/game_list.cpp b/src/yuzu/game/game_list.cpp index 86fd3c1b4f..6b89e59253 100644 --- a/src/yuzu/game/game_list.cpp +++ b/src/yuzu/game/game_list.cpp @@ -31,7 +31,6 @@ #include "qt_common/game_list/model.h" #include "qt_common/qt_common.h" #include "qt_common/util/game.h" -#include "yuzu/compatibility_list.h" #include "yuzu/game/carousel.h" #include "yuzu/game/game_grid.h" #include "yuzu/game/game_list.h" @@ -136,10 +135,6 @@ bool GameList::IsEmpty() const { return item_model->IsEmpty(); } -void GameList::LoadCompatibilityList() { - item_model->LoadCompatibilityList(); -} - void GameList::OnPopulate() { m_currentView->setEnabled(false); @@ -483,7 +478,6 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri QAction* dump_romfs_sdmc = dump_romfs_menu->addAction(tr("Dump RomFS to SDMC")); QAction* verify_integrity = context_menu.addAction(tr("Verify Integrity")); QAction* copy_tid = context_menu.addAction(tr("Copy Title ID to Clipboard")); - QAction* navigate_to_gamedb_entry = context_menu.addAction(tr("Navigate to GameDB entry")); #if !defined(__APPLE__) QMenu* shortcut_menu = context_menu.addMenu(tr("Create Shortcut")); QAction* create_desktop_shortcut = shortcut_menu->addAction(tr("Add to Desktop")); @@ -505,9 +499,6 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri remove_vk_shader_cache->setVisible(program_id != 0); remove_shader_cache->setVisible(program_id != 0); remove_all_content->setVisible(program_id != 0); - auto& compat_list = item_model->GetCompatibilityList(); - auto it = FindMatchingCompatibilityEntry(compat_list, program_id); - navigate_to_gamedb_entry->setVisible(it != compat_list.end() && program_id != 0); connect(favorite, &QAction::triggered, this, [this, program_id]() { ToggleFavorite(program_id); }); @@ -567,9 +558,6 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri [this, path]() { emit VerifyIntegrityRequested(path); }); connect(copy_tid, &QAction::triggered, this, [this, program_id]() { emit CopyTIDRequested(program_id); }); - connect(navigate_to_gamedb_entry, &QAction::triggered, this, [this, program_id]() { - emit NavigateToGamedbEntryRequested(program_id, item_model->GetCompatibilityList()); - }); #if !defined(__APPLE__) connect(create_desktop_shortcut, &QAction::triggered, this, [this, program_id, path]() { emit CreateShortcut(program_id, path, QtCommon::Game::ShortcutTarget::Desktop); diff --git a/src/yuzu/game/game_list.h b/src/yuzu/game/game_list.h index 027e58df3a..1540dd9cf0 100644 --- a/src/yuzu/game/game_list.h +++ b/src/yuzu/game/game_list.h @@ -22,7 +22,6 @@ #include "qt_common/config/uisettings.h" #include "qt_common/game_list/model.h" #include "qt_common/util/game.h" -#include "yuzu/compatibility_list.h" class QVariantAnimation; @@ -76,7 +75,6 @@ public: void SetFilterVisible(bool visibility); bool IsEmpty() const; - void LoadCompatibilityList(); void PopulateAsync(QVector& game_dirs); void SaveInterfaceLayout(); @@ -111,8 +109,6 @@ signals: void CopyTIDRequested(u64 program_id); void CreateShortcut(u64 program_id, const std::string& game_path, const QtCommon::Game::ShortcutTarget target); - void NavigateToGamedbEntryRequested(u64 program_id, - const CompatibilityList& compatibility_list); void OpenPerGameGeneralRequested(const std::string& file); void LinkToRyujinxRequested(const u64& program_id); void OpenDirectory(const QString& directory); diff --git a/src/yuzu/main.ui b/src/yuzu/main.ui index deb7774d25..c858be3cb3 100644 --- a/src/yuzu/main.ui +++ b/src/yuzu/main.ui @@ -402,17 +402,6 @@ Load/Remove &Amiibo... - - - false - - - &Report Compatibility - - - false - - Open &Mods Page diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 88de185c6a..9b6b0a8b6a 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -447,7 +447,6 @@ MainWindow::MainWindow(bool has_broken_vulkan) if (Settings::values.use_dev_keys.GetValue()) { Core::Crypto::KeyManager::Instance().ReloadKeys(); } - game_list->LoadCompatibilityList(); game_list->PopulateAsync(UISettings::values.game_dirs); // Set up game list mode checkboxes. @@ -957,9 +956,6 @@ void MainWindow::WebBrowserRequestExit() { } void MainWindow::InitializeWidgets() { -#ifdef YUZU_ENABLE_COMPATIBILITY_REPORTING - ui->action_Report_Compatibility->setVisible(true); -#endif render_window = new GRenderWindow(this, input_subsystem); render_window->hide(); @@ -1459,8 +1455,6 @@ void MainWindow::ConnectWidgetEvents() { connect(game_list, &GameList::VerifyIntegrityRequested, this, &MainWindow::OnGameListVerifyIntegrity); connect(game_list, &GameList::CopyTIDRequested, this, &MainWindow::OnGameListCopyTID); - connect(game_list, &GameList::NavigateToGamedbEntryRequested, this, - &MainWindow::OnGameListNavigateToGamedbEntry); connect(game_list, &GameList::CreateShortcut, this, &MainWindow::OnGameListCreateShortcut); connect(game_list, &GameList::AddDirectory, this, &MainWindow::OnGameListAddDirectory); connect(game_list_placeholder, &GameListPlaceholder::AddDirectory, this, @@ -1505,7 +1499,6 @@ void MainWindow::ConnectMenuEvents() { // Emulation connect_menu(ui->action_Pause, &MainWindow::OnPauseContinueGame); connect_menu(ui->action_Stop, &MainWindow::OnStopGame); - connect_menu(ui->action_Report_Compatibility, &MainWindow::OnMenuReportCompatibility); connect_menu(ui->action_Open_Mods_Page, &MainWindow::OnOpenModsPage); connect_menu(ui->action_Open_Quickstart_Guide, &MainWindow::OnOpenQuickstartGuide); connect_menu(ui->action_Open_FAQ, &MainWindow::OnOpenFAQ); @@ -1639,7 +1632,6 @@ void MainWindow::UpdateMenuState() { ui->action_Stop, ui->action_Restart, ui->action_Configure_Current_Game, - ui->action_Report_Compatibility, ui->action_Load_Amiibo, ui->action_Pause, }; @@ -2616,21 +2608,6 @@ void MainWindow::OnGameListCopyTID(u64 program_id) { clipboard->setText(QString::fromStdString(fmt::format("{:016X}", program_id))); } -void MainWindow::OnGameListNavigateToGamedbEntry(u64 program_id, - const CompatibilityList& compatibility_list) { - const auto it = FindMatchingCompatibilityEntry(compatibility_list, program_id); - - QString directory; - if (it != compatibility_list.end()) { - directory = it->second.second; - } - - QDesktopServices::openUrl(QUrl( - QStringLiteral( - "https://www.emuready.com/listings?emulatorIds=43bfc023-ec22-422d-8324-048a8ec9f28f") + - directory)); -} - void MainWindow::OnGameListCreateShortcut(u64 program_id, const std::string& game_path, const QtCommon::Game::ShortcutTarget target) { // Create shortcu diff --git a/src/yuzu/main_window.h b/src/yuzu/main_window.h index 40253aa52f..2b50e3af91 100644 --- a/src/yuzu/main_window.h +++ b/src/yuzu/main_window.h @@ -24,7 +24,6 @@ #include "qt_common/config/qt_config.h" #include "qt_common/qt_common.h" #include "qt_common/util/game.h" -#include "yuzu/compatibility_list.h" #include "yuzu/hotkeys.h" #include "yuzu/user_data_migration.h" @@ -352,8 +351,6 @@ private slots: void OnGameListDumpRomFS(u64 program_id, const std::string& game_path, DumpRomFSTarget target); void OnGameListVerifyIntegrity(const std::string& game_path); void OnGameListCopyTID(u64 program_id); - void OnGameListNavigateToGamedbEntry(u64 program_id, - const CompatibilityList& compatibility_list); void OnGameListCreateShortcut(u64 program_id, const std::string& game_path, const QtCommon::Game::ShortcutTarget target); void OnGameListOpenDirectory(const QString& directory);