summaryrefslogtreecommitdiff
path: root/src/yuzu/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/yuzu/main.cpp')
-rw-r--r--src/yuzu/main.cpp47
1 files changed, 40 insertions, 7 deletions
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 262e33487..56bd3ee2e 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -34,7 +34,9 @@
#include "core/file_sys/content_archive.h"
#include "core/file_sys/registered_cache.h"
#include "core/file_sys/savedata_factory.h"
+#include "core/file_sys/submission_package.h"
#include "core/file_sys/vfs_real.h"
+#include "core/hle/kernel/process.h"
#include "core/hle/service/filesystem/filesystem.h"
#include "core/loader/loader.h"
#include "core/perf_stats.h"
@@ -76,6 +78,7 @@ __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
*/
enum class CalloutFlag : uint32_t {
Telemetry = 0x1,
+ DRDDeprecation = 0x2,
};
static void ShowCalloutMessage(const QString& message, CalloutFlag flag) {
@@ -488,6 +491,23 @@ bool GMainWindow::LoadROM(const QString& filename) {
const Core::System::ResultStatus result{system.Load(*render_window, filename.toStdString())};
+ const auto drd_callout =
+ (UISettings::values.callout_flags & static_cast<u32>(CalloutFlag::DRDDeprecation)) == 0;
+
+ if (result == Core::System::ResultStatus::Success &&
+ system.GetAppLoader().GetFileType() == Loader::FileType::DeconstructedRomDirectory &&
+ drd_callout) {
+ UISettings::values.callout_flags |= static_cast<u32>(CalloutFlag::DRDDeprecation);
+ QMessageBox::warning(
+ 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 "
+ "support.<br><br>For an explanation of the various Switch formats yuzu supports, <a "
+ "href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our "
+ "wiki</a>. This message will not be shown again."));
+ }
+
render_window->DoneCurrent();
if (result != Core::System::ResultStatus::Success) {
@@ -746,7 +766,8 @@ void GMainWindow::OnMenuLoadFolder() {
void GMainWindow::OnMenuInstallToNAND() {
const QString file_filter =
- tr("Installable Switch File (*.nca *.xci);;Nintendo Content Archive (*.nca);;NX Cartridge "
+ tr("Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive "
+ "(*.nca);;Nintendo Submissions Package (*.nsp);;NX Cartridge "
"Image (*.xci)");
QString filename = QFileDialog::getOpenFileName(this, tr("Install File"),
UISettings::values.roms_path, file_filter);
@@ -806,22 +827,34 @@ void GMainWindow::OnMenuInstallToNAND() {
QMessageBox::Yes;
};
- if (filename.endsWith("xci", Qt::CaseInsensitive)) {
- const auto xci = std::make_shared<FileSys::XCI>(
- vfs->OpenFile(filename.toStdString(), FileSys::Mode::Read));
- if (xci->GetStatus() != Loader::ResultStatus::Success) {
+ if (filename.endsWith("xci", Qt::CaseInsensitive) ||
+ filename.endsWith("nsp", Qt::CaseInsensitive)) {
+
+ std::shared_ptr<FileSys::NSP> nsp;
+ if (filename.endsWith("nsp", Qt::CaseInsensitive)) {
+ nsp = std::make_shared<FileSys::NSP>(
+ vfs->OpenFile(filename.toStdString(), FileSys::Mode::Read));
+ if (nsp->IsExtractedType())
+ failed();
+ } else {
+ const auto xci = std::make_shared<FileSys::XCI>(
+ vfs->OpenFile(filename.toStdString(), FileSys::Mode::Read));
+ nsp = xci->GetSecurePartitionNSP();
+ }
+
+ if (nsp->GetStatus() != Loader::ResultStatus::Success) {
failed();
return;
}
const auto res =
- Service::FileSystem::GetUserNANDContents()->InstallEntry(xci, false, qt_raw_copy);
+ Service::FileSystem::GetUserNANDContents()->InstallEntry(nsp, false, qt_raw_copy);
if (res == FileSys::InstallResult::Success) {
success();
} else {
if (res == FileSys::InstallResult::ErrorAlreadyExists) {
if (overwrite()) {
const auto res2 = Service::FileSystem::GetUserNANDContents()->InstallEntry(
- xci, true, qt_raw_copy);
+ nsp, true, qt_raw_copy);
if (res2 == FileSys::InstallResult::Success) {
success();
} else {