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);