diff --git a/src/dusk/save_manager.cpp b/src/dusk/save_manager.cpp index f12cd27b96..484af97ced 100644 --- a/src/dusk/save_manager.cpp +++ b/src/dusk/save_manager.cpp @@ -905,18 +905,21 @@ ValueResult parse_gci(const std::vector& bytes) { DiscCompatibility disc_compatibility(const GciHeader& header, const SaveIdentity& identity) { if (header.game.size() != 4 || identity.game.size() != 4 || header.maker.size() != 2 || - header.maker != identity.maker) - { + header.maker != identity.maker) { return DiscCompatibility::Incompatible; } if (header.game == identity.game) { return DiscCompatibility::Exact; } - if (std::string_view{header.game}.substr(0, 3) == std::string_view{identity.game}.substr(0, 3)) - { + if (std::string_view{header.game}.substr(0, 3) == std::string_view{identity.game}.substr(0, 3)) { return DiscCompatibility::RegionChange; } - return DiscCompatibility::Incompatible; + if ((std::string_view{header.game}.substr(0, 3) == "RZD" && + std::string_view{identity.game}.substr(0, 3) == "GZ2") || + std::string_view{header.game}.substr(0, 3) == "GZ2" && + std::string_view{identity.game}.substr(0, 3) == "RZD") { + return DiscCompatibility::PlatformChange; + } } ValueResult read_artifact(std::string_view location) { diff --git a/src/dusk/save_manager.hpp b/src/dusk/save_manager.hpp index f0fb67c48b..2d25260232 100644 --- a/src/dusk/save_manager.hpp +++ b/src/dusk/save_manager.hpp @@ -35,6 +35,7 @@ enum class ModDataAction { enum class DiscCompatibility { Exact, RegionChange, + PlatformChange, Incompatible, }; diff --git a/src/dusk/ui/saves_window.cpp b/src/dusk/ui/saves_window.cpp index be75d8c69b..0f9bff36d5 100644 --- a/src/dusk/ui/saves_window.cpp +++ b/src/dusk/ui/saves_window.cpp @@ -290,7 +290,8 @@ void confirm_import(Artifact artifact) { const auto compatibility = raw ? save_manager::DiscCompatibility::Exact : save_manager::disc_compatibility(artifact.header, context.value.identity); - const bool changingRegion = compatibility == save_manager::DiscCompatibility::RegionChange; + const bool changingVersion = (compatibility == save_manager::DiscCompatibility::RegionChange || + compatibility == save_manager::DiscCompatibility::PlatformChange); if (compatibility == save_manager::DiscCompatibility::Incompatible) { show_message("Import Failed", "This save does not match the configured disc.", true, &finish_import_flow); @@ -344,7 +345,7 @@ void confirm_import(Artifact artifact) { { {.label = "Cancel", .onPressed = cancel}, { - .label = changingRegion ? "Import Anyway" : "Import", + .label = changingVersion ? "Import Anyway" : "Import", .onPressed = [items, keepModData, hasBundledModData](Modal& modal) { const auto action = hasBundledModData ? ModDataAction::Replace : @@ -354,7 +355,7 @@ void confirm_import(Artifact artifact) { }, .isDisabled = [items] { return std::ranges::none_of(*items, &ImportItem::selected); }, - .icon = changingRegion ? "warning" : "", + .icon = changingVersion ? "warning" : "", }, }, .onDismiss = cancel, @@ -374,9 +375,10 @@ void confirm_import(Artifact artifact) { }); } } else { - const auto* regionMessage = changingRegion ? - " This save is from a different region than the " - "configured disc and may not work correctly." : + const auto* regionMessage = changingVersion ? + " This save is from a different region or " + "platform than the configured disc and may " + "not work correctly." : ""; modal->set_body( fmt::format("{} the {} save?{}{}", replacingSave ? "Replace" : "Import",