diff options
| author | Admiral H. Curtiss <pikachu025@gmail.com> | 2021-10-09 03:17:38 +0200 |
|---|---|---|
| committer | Admiral H. Curtiss <pikachu025@gmail.com> | 2021-10-24 00:09:07 +0200 |
| commit | 6394960f5412802f24bf664d1574f9126b1bb799 (patch) | |
| tree | dcc5f4c9e0f5714c82898e4e3a32825a802b6c8d /Source/Core/DiscIO/RiivolutionParser.cpp | |
| parent | fe242f79eeb5c92c39362203cdeb46e9b72707a7 (diff) | |
Core: Add ability to specify and launch a riivolution-modded game via a .json file.
Diffstat (limited to 'Source/Core/DiscIO/RiivolutionParser.cpp')
| -rw-r--r-- | Source/Core/DiscIO/RiivolutionParser.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/Source/Core/DiscIO/RiivolutionParser.cpp b/Source/Core/DiscIO/RiivolutionParser.cpp index 63a830d1c5..e8a284e07b 100644 --- a/Source/Core/DiscIO/RiivolutionParser.cpp +++ b/Source/Core/DiscIO/RiivolutionParser.cpp @@ -13,6 +13,7 @@ #include "Common/FileUtil.h" #include "Common/IOFile.h" #include "Common/StringUtil.h" +#include "DiscIO/GameModDescriptor.h" #include "DiscIO/RiivolutionPatcher.h" namespace DiscIO::Riivolution @@ -336,4 +337,47 @@ std::vector<Patch> Disc::GeneratePatches(const std::string& game_id) const return active_patches; } + +std::vector<Patch> GenerateRiivolutionPatchesFromGameModDescriptor( + const GameModDescriptorRiivolution& descriptor, const std::string& game_id, + std::optional<u16> revision, std::optional<u8> disc_number) +{ + std::vector<Patch> result; + for (const auto& patch_info : descriptor.patches) + { + auto parsed = ParseFile(patch_info.xml); + if (!parsed || !parsed->IsValidForGame(game_id, revision, disc_number)) + continue; + + for (auto& section : parsed->m_sections) + { + for (auto& option : section.m_options) + { + const auto* info = [&]() -> const DiscIO::GameModDescriptorRiivolutionPatchOption* { + for (const auto& o : patch_info.options) + { + if (o.section_name == section.m_name) + { + if (!o.option_id.empty() && o.option_id == option.m_id) + return &o; + if (!o.option_name.empty() && o.option_name == option.m_name) + return &o; + } + } + return nullptr; + }(); + if (info && info->choice <= option.m_choices.size()) + option.m_selected_choice = info->choice; + } + } + + for (auto& p : parsed->GeneratePatches(game_id)) + { + p.m_file_data_loader = std::make_shared<DiscIO::Riivolution::FileDataLoaderHostFS>( + patch_info.root, parsed->m_xml_path, p.m_root); + result.emplace_back(std::move(p)); + } + } + return result; +} } // namespace DiscIO::Riivolution |
