summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/RiivolutionParser.cpp
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2021-10-09 03:17:38 +0200
committerAdmiral H. Curtiss <pikachu025@gmail.com>2021-10-24 00:09:07 +0200
commit6394960f5412802f24bf664d1574f9126b1bb799 (patch)
treedcc5f4c9e0f5714c82898e4e3a32825a802b6c8d /Source/Core/DiscIO/RiivolutionParser.cpp
parentfe242f79eeb5c92c39362203cdeb46e9b72707a7 (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.cpp44
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