aboutsummaryrefslogtreecommitdiff
path: root/src/yuzu/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/yuzu/main.cpp')
-rw-r--r--src/yuzu/main.cpp198
1 files changed, 72 insertions, 126 deletions
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 4ff59291e5..081f08cf52 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -10,6 +10,7 @@
#include "core/hle/service/am/applet_manager.h"
#include "core/loader/nca.h"
#include "core/tools/renderdoc.h"
+#include "frontend_common/firmware_manager.h"
#ifdef __APPLE__
#include <unistd.h> // for chdir
@@ -211,7 +212,7 @@ enum class CalloutFlag : uint32_t {
* 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<u64> bad_update_games{
+constexpr std::array<u64, 1> bad_update_games{
0x0100F2C0115B6000 // Tears of the Kingdom
};
@@ -1889,46 +1890,61 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa
QSettings settings;
QStringList currentIgnored = settings.value("ignoredBadUpdates", {}).toStringList();
- for (const u64 id : bad_update_games) {
- const bool ignored = currentIgnored.contains(QString::number(id));
+ if (std::find(bad_update_games.begin(), bad_update_games.end(), params.program_id) != bad_update_games.end()
+ && !currentIgnored.contains(QString::number(params.program_id))) {
+ 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. Please try increasing the memory layout to "
+ "6GB or 8GB if any issues occur.<br><br>Press \"OK\" to continue launching, or "
+ "\"Cancel\" to cancel the launch."));
- 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. Please try increasing the memory layout to "
- "6GB or 8GB if any issues occur.<br><br>Press \"OK\" to continue launching, or "
- "\"Cancel\" to cancel the launch."));
+ msg->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
- // TODO: TMP: Recommends more memory for TotK.
+ QCheckBox *dontShowAgain = new QCheckBox(msg);
+ dontShowAgain->setText(tr("Don't show again for this game"));
+ msg->setCheckBox(dontShowAgain);
- msg->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
+ int result = msg->exec();
- QCheckBox *dontShowAgain = new QCheckBox(msg);
- dontShowAgain->setText(tr("Don't show again for this game"));
- msg->setCheckBox(dontShowAgain);
+ // wtf
+ QMessageBox::ButtonRole role = msg->buttonRole(msg->button((QMessageBox::StandardButton) result));
- int result = msg->exec();
+ 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;
+ }
+ }
- // wtf
- QMessageBox::ButtonRole role = msg->buttonRole(msg->button((QMessageBox::StandardButton) result));
+ if (FirmwareManager::GameRequiresFirmware(params.program_id) && !FirmwareManager::CheckFirmwarePresence(*system)) {
+ QMessageBox *msg = new QMessageBox(this);
+ msg->setWindowTitle(tr("Game Requires Firmware"));
+ msg->setIcon(QMessageBox::Warning);
+ msg->setText(tr("The game you are trying to launch requires firmware to boot or to get past the "
+ "opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>"
+ "dump and install firmware</a>, or press \"OK\" to launch anyways."));
- switch (role) {
+ msg->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
- case QMessageBox::RejectRole:
- return false;
+ int exec_result = msg->exec();
- case QMessageBox::AcceptRole:
- default:
- if (dontShowAgain->isChecked()) {
- currentIgnored << QString::number(params.program_id);
+ QMessageBox::ButtonRole role = msg->buttonRole(msg->button((QMessageBox::StandardButton) exec_result));
- settings.setValue("ignoredBadUpdates", currentIgnored);
- settings.sync();
- }
- break;
- }
+ switch (role) {
+ case QMessageBox::RejectRole:
+ return false;
+ case QMessageBox::AcceptRole:
+ default:
+ break;
}
}
@@ -1945,7 +1961,7 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa
UISettings::values.callout_flags = UISettings::values.callout_flags.GetValue() |
static_cast<u32>(CalloutFlag::DRDDeprecation);
QMessageBox::warning(
- this, tr("Warning Outdated Game Format"),
+ this, tr("Warning: Outdated Game Format"),
tr("You are using the deconstructed ROM directory format for this game, which is an "
"outdated format that has been superseded by others such as NCA, NAX, XCI, or "
"NSP. Deconstructed ROM directories lack icons, metadata, and update "
@@ -1968,7 +1984,7 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa
"This is usually caused by outdated GPU drivers, including integrated ones. "
"Please see the log for more details. "
"For more information on accessing the log, please see the following page: "
- "<a href='https://eden-emulator.github.io/help/reference/log-files/'>"
+ "<a href='https://yuzu-mirror.github.io/help/reference/log-files/'>"
"How to Upload the Log File</a>. "));
break;
default:
@@ -4322,8 +4338,8 @@ void GMainWindow::OnInstallFirmware() {
progress.close();
QMessageBox::warning(
this, tr("Firmware install failed"),
- tr("Firmware installation cancelled, firmware may be in bad state, "
- "restart eden or re-install firmware."));
+ tr("Firmware installation cancelled, firmware may be in a bad state or corrupted. "
+ "Restart Eden or re-install firmware."));
return;
}
}
@@ -4368,72 +4384,27 @@ void GMainWindow::OnInstallDecryptionKeys() {
}
const QString key_source_location = QFileDialog::getOpenFileName(
- this, tr("Select Dumped Keys Location"), {}, QStringLiteral("prod.keys (prod.keys)"), {},
+ this, tr("Select Dumped Keys Location"), {}, QStringLiteral("Decryption Keys (*.keys)"), {},
QFileDialog::ReadOnly);
if (key_source_location.isEmpty()) {
return;
}
- // Verify that it contains prod.keys, title.keys and optionally, key_retail.bin
- LOG_INFO(Frontend, "Installing key files from {}", key_source_location.toStdString());
-
- const std::filesystem::path prod_key_path = key_source_location.toStdString();
- const std::filesystem::path key_source_path = prod_key_path.parent_path();
- if (!Common::FS::IsDir(key_source_path)) {
- return;
- }
-
- bool prod_keys_found = false;
- std::vector<std::filesystem::path> source_key_files;
-
- if (Common::FS::Exists(prod_key_path)) {
- prod_keys_found = true;
- source_key_files.emplace_back(prod_key_path);
- }
-
- if (Common::FS::Exists(key_source_path / "title.keys")) {
- source_key_files.emplace_back(key_source_path / "title.keys");
- }
-
- if (Common::FS::Exists(key_source_path / "key_retail.bin")) {
- source_key_files.emplace_back(key_source_path / "key_retail.bin");
- }
+ FirmwareManager::KeyInstallResult result = FirmwareManager::InstallKeys(key_source_location.toStdString(), "keys");
- // There should be at least prod.keys.
- if (source_key_files.empty() || !prod_keys_found) {
- QMessageBox::warning(this, tr("Decryption Keys install failed"),
- tr("prod.keys is a required decryption key file."));
- return;
- }
-
- const auto yuzu_keys_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::KeysDir);
- for (auto key_file : source_key_files) {
- std::filesystem::path destination_key_file = yuzu_keys_dir / key_file.filename();
- if (!std::filesystem::copy_file(key_file, destination_key_file,
- std::filesystem::copy_options::overwrite_existing)) {
- LOG_ERROR(Frontend, "Failed to copy file {} to {}", key_file.string(),
- destination_key_file.string());
- QMessageBox::critical(this, tr("Decryption Keys install failed"),
- tr("One or more keys failed to copy."));
- return;
- }
- }
-
- // Reinitialize the key manager, re-read the vfs (for update/dlc files),
- // and re-populate the game list in the UI if the user has already added
- // game folders.
- Core::Crypto::KeyManager::Instance().ReloadKeys();
system->GetFileSystemController().CreateFactories(*vfs);
game_list->PopulateAsync(UISettings::values.game_dirs);
- if (ContentManager::AreKeysPresent()) {
+ switch (result) {
+ case FirmwareManager::KeyInstallResult::Success:
QMessageBox::information(this, tr("Decryption Keys install succeeded"),
tr("Decryption Keys were successfully installed"));
- } else {
+ break;
+ default:
QMessageBox::critical(
this, tr("Decryption Keys install failed"),
- tr("Decryption Keys failed to initialize. Check that your dumping tools are "
- "up to date and re-dump keys."));
+ tr(FirmwareManager::GetKeyInstallResultString(result)));
+ break;
}
OnCheckFirmwareDecryption();
@@ -5103,52 +5074,27 @@ void GMainWindow::OnCheckFirmwareDecryption() {
void GMainWindow::OnCheckFirmware()
{
- if (!CheckFirmwarePresence()) {
- QMessageBox::warning(
- this, tr("Firmware Missing"),
- tr("Firmware missing. Firmware is required to run certain games and use the Home Menu.\n"
- "Eden only works with firmware 19.0.1 and earlier."));
- } else {
- Service::Set::FirmwareVersionFormat firmware_data{};
- const auto result = Service::Set::GetFirmwareVersionImpl(
- firmware_data, *system, Service::Set::GetFirmwareVersionType::Version2);
+ auto result = FirmwareManager::VerifyFirmware(*system.get());
- if (result.IsError()) {
- LOG_INFO(Frontend, "Unable to read firmware");
- QMessageBox::warning(
- this, tr("Firmware Corrupted"),
- tr("Firmware reported as present, but was unable to be read. Check for decryption keys and redump firmware if necessary."));
- return;
- }
-
- if (firmware_data.major > 19) {
- QMessageBox::warning(
- this, tr("Firmware Too New"),
- tr("Firmware is too new. Eden only works with firmware 19.0.1 and earlier."));
- }
+ switch (result) {
+ case FirmwareManager::FirmwareGood:
+ break;
+ default:
+ QMessageBox::warning(
+ this, tr("Firmware Read Error"),
+ tr(FirmwareManager::GetFirmwareCheckString(result)));
+ break;
}
}
bool GMainWindow::CheckFirmwarePresence() {
- constexpr u64 MiiEditId = static_cast<u64>(Service::AM::AppletProgramId::MiiEdit);
-
- auto bis_system = system->GetFileSystemController().GetSystemNANDContents();
- if (!bis_system) {
- return false;
- }
-
- auto mii_applet_nca = bis_system->GetEntry(MiiEditId, FileSys::ContentRecordType::Program);
- if (!mii_applet_nca) {
- return false;
- }
-
- return true;
+ return FirmwareManager::CheckFirmwarePresence(*system.get());
}
void GMainWindow::SetFirmwareVersion() {
- Service::Set::FirmwareVersionFormat firmware_data{};
- const auto result = Service::Set::GetFirmwareVersionImpl(
- firmware_data, *system, Service::Set::GetFirmwareVersionType::Version2);
+ const auto pair = FirmwareManager::GetFirmwareVersion(*system.get());
+ const auto firmware_data = pair.first;
+ const auto result = pair.second;
if (result.IsError() || !CheckFirmwarePresence()) {
LOG_INFO(Frontend, "Installed firmware: No firmware available");