From bda2691346b82bd201e0a3367716d8eb615f0e4d Mon Sep 17 00:00:00 2001 From: Luke Street Date: Thu, 17 Sep 2026 11:46:21 -0600 Subject: [PATCH] Fixes & support Wii discs --- res/rml/saves.rcss | 1 + src/dusk/iso_validate.cpp | 9 ++++++--- src/dusk/iso_validate.hpp | 4 +++- src/dusk/save_manager.cpp | 22 ++++++---------------- src/dusk/ui/saves_window.cpp | 17 ++++++++--------- 5 files changed, 24 insertions(+), 29 deletions(-) diff --git a/res/rml/saves.rcss b/res/rml/saves.rcss index d03527d245..ed1d45a405 100644 --- a/res/rml/saves.rcss +++ b/res/rml/saves.rcss @@ -6,6 +6,7 @@ window.saves pane.list > header { display: flex; align-items: center; gap: var(--space-sm); + focus: none; } window.saves pane.list > header section-heading { diff --git a/src/dusk/iso_validate.cpp b/src/dusk/iso_validate.cpp index 26fdef11e9..bd8e293805 100644 --- a/src/dusk/iso_validate.cpp +++ b/src/dusk/iso_validate.cpp @@ -41,11 +41,13 @@ constexpr auto AcceptedDiscs = std::to_array({ .expectedHash = borealis::disc::parse_xxh3_128("9ef597588b0035ca9e91b333fa9a8a7e"), }, { - .gameId = "RZDE01", .revision = 0, + .gameId = "RZDE01", + .revision = 0, .expectedHash = borealis::disc::parse_xxh3_128("b3d91fbea59e5c66934d04c01566728e"), }, { - .gameId = "RZDE01", .revision = 2, + .gameId = "RZDE01", + .revision = 2, .expectedHash = borealis::disc::parse_xxh3_128("c3ec420921a1b36d6ae43f576491d25c"), }, { @@ -103,11 +105,12 @@ Region region_from_game_id(std::string_view gameId) noexcept { return Region::NorthAmerica; } -void update_info(const borealis::disc::Result& result, DiscInfo& info) noexcept { +void update_info(const borealis::disc::Result& result, DiscInfo& info) { if (!result.metadata.gameId.empty()) { info.platform = result.metadata.platform; info.region = region_from_game_id(result.metadata.gameId); info.revision = result.metadata.revision; + info.gameId = result.metadata.gameId; } } diff --git a/src/dusk/iso_validate.hpp b/src/dusk/iso_validate.hpp index b7740b636f..1975d30c4c 100644 --- a/src/dusk/iso_validate.hpp +++ b/src/dusk/iso_validate.hpp @@ -1,10 +1,11 @@ #ifndef DUSK_ISO_VALIDATE_HPP #define DUSK_ISO_VALIDATE_HPP -#include "dusk/settings.h" #include +#include "dusk/settings.h" #include +#include #include namespace dusk { @@ -39,6 +40,7 @@ struct DiscInfo { Platform platform = Platform::Unknown; Region region = Region::NorthAmerica; uint8_t revision = 0; + std::string gameId; }; ValidationError inspect(const char* path, DiscInfo& info); diff --git a/src/dusk/save_manager.cpp b/src/dusk/save_manager.cpp index eeedfc18cd..b9311c66da 100644 --- a/src/dusk/save_manager.cpp +++ b/src/dusk/save_manager.cpp @@ -766,24 +766,14 @@ Result apply_artifact(const Storage& storage, const SaveIdentity& identity, } // namespace std::optional identity_for_disc(const iso::DiscInfo& info, std::string saveName) { - if (info.platform != iso::Platform::GameCube || !utils::is_valid_save_name(saveName)) { + if (info.gameId.size() != 6 || !utils::is_valid_save_name(saveName)) { return std::nullopt; } - std::string game; - switch (info.region) { - case iso::Region::NorthAmerica: - game = "GZ2E"; - break; - case iso::Region::Europe: - game = "GZ2P"; - break; - case iso::Region::Japan: - game = "GZ2J"; - break; - case iso::Region::Korea: - return std::nullopt; - } - return SaveIdentity{.maker = "01", .game = std::move(game), .saveName = std::move(saveName)}; + return SaveIdentity{ + .maker = info.gameId.substr(4), + .game = info.gameId.substr(0, 4), + .saveName = std::move(saveName), + }; } std::string card_file_stem( diff --git a/src/dusk/ui/saves_window.cpp b/src/dusk/ui/saves_window.cpp index b80c627da9..2800b22f4c 100644 --- a/src/dusk/ui/saves_window.cpp +++ b/src/dusk/ui/saves_window.cpp @@ -177,14 +177,14 @@ bool installed_mod(std::string_view id) { } void export_artifact(save_manager::ExportArtifact artifact, std::string pattern) { + borealis::file_select::ExportOptions options{ + .parentWindow = aurora::window::get_sdl_window(), + .sourceLocation = borealis::io::fs_path_to_string(artifact.path), + .suggestedName = artifact.suggestedName, + .filters = {{"Save file", std::move(pattern)}}, + }; borealis::file_select::export_file( - { - .parentWindow = aurora::window::get_sdl_window(), - .sourceLocation = borealis::io::fs_path_to_string(artifact.path), - .suggestedName = artifact.suggestedName, - .filters = {{"Save file", std::move(pattern)}}, - }, - [artifact = std::move(artifact)](borealis::file_select::Result result) { + std::move(options), [artifact = std::move(artifact)](borealis::file_select::Result result) { save_manager::remove_temporary_export(artifact); if (result.status != borealis::file_select::Status::Selected && result.status != borealis::file_select::Status::Canceled) @@ -936,8 +936,7 @@ void add_save_files_control(Pane& leftPane, Pane& rightPane) { const auto& state = prelaunch_state(); return !state.configuredDiscCanLaunch || data::is_data_path_restart_pending() || (!state.activeDiscPath.empty() && - state.configuredDiscPath != state.activeDiscPath) || - state.configuredDiscInfo.platform != iso::Platform::GameCube; + state.configuredDiscPath != state.activeDiscPath); }, }); leftPane.register_control(button.on_pressed([] {