summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/GameModDescriptor.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-12-14 11:08:38 +0100
committerGitHub <noreply@github.com>2021-12-14 11:08:38 +0100
commit185475fe03c758a2346c170bd9395227d78b0f63 (patch)
treedc496e8bda35b3a9b1efb1382bdc20e3dac2f62f /Source/Core/DiscIO/GameModDescriptor.cpp
parent45fac5137b6cf3da1ee8ccc65eced6d969152a93 (diff)
parentb928900f6e1097a189cd78491df00ed7890949d6 (diff)
Merge pull request #10187 from AdmiralCurtiss/json-gamelist
Support for GameModDescriptor files in Game List.
Diffstat (limited to 'Source/Core/DiscIO/GameModDescriptor.cpp')
-rw-r--r--Source/Core/DiscIO/GameModDescriptor.cpp81
1 files changed, 79 insertions, 2 deletions
diff --git a/Source/Core/DiscIO/GameModDescriptor.cpp b/Source/Core/DiscIO/GameModDescriptor.cpp
index 587faafdaf..016df59d3d 100644
--- a/Source/Core/DiscIO/GameModDescriptor.cpp
+++ b/Source/Core/DiscIO/GameModDescriptor.cpp
@@ -115,10 +115,15 @@ std::optional<GameModDescriptor> ParseGameModDescriptorString(std::string_view j
return std::nullopt;
GameModDescriptor descriptor;
+ bool is_game_mod_descriptor = false;
bool is_valid_version = false;
for (const auto& [key, value] : json_root.get<picojson::object>())
{
- if (key == "version" && value.is<double>())
+ if (key == "type" && value.is<std::string>())
+ {
+ is_game_mod_descriptor = value.get<std::string>() == "dolphin-game-mod-descriptor";
+ }
+ else if (key == "version" && value.is<double>())
{
is_valid_version = value.get<double>() == 1.0;
}
@@ -140,8 +145,80 @@ std::optional<GameModDescriptor> ParseGameModDescriptorString(std::string_view j
ParseRiivolutionObject(json_directory, value.get<picojson::object>());
}
}
- if (!is_valid_version)
+ if (!is_game_mod_descriptor || !is_valid_version)
return std::nullopt;
return descriptor;
}
+
+static picojson::object
+WriteGameModDescriptorRiivolution(const GameModDescriptorRiivolution& riivolution)
+{
+ picojson::array json_patches;
+ for (const auto& patch : riivolution.patches)
+ {
+ picojson::object json_patch;
+ if (!patch.xml.empty())
+ json_patch["xml"] = picojson::value(patch.xml);
+ if (!patch.root.empty())
+ json_patch["root"] = picojson::value(patch.root);
+ if (!patch.options.empty())
+ {
+ picojson::array json_options;
+ for (const auto& option : patch.options)
+ {
+ picojson::object json_option;
+ if (!option.section_name.empty())
+ json_option["section-name"] = picojson::value(option.section_name);
+ if (!option.option_id.empty())
+ json_option["option-id"] = picojson::value(option.option_id);
+ if (!option.option_name.empty())
+ json_option["option-name"] = picojson::value(option.option_name);
+ json_option["choice"] = picojson::value(static_cast<double>(option.choice));
+ json_options.emplace_back(std::move(json_option));
+ }
+ json_patch["options"] = picojson::value(std::move(json_options));
+ }
+ json_patches.emplace_back(std::move(json_patch));
+ }
+
+ picojson::object json_riivolution;
+ json_riivolution["patches"] = picojson::value(std::move(json_patches));
+ return json_riivolution;
+}
+
+std::string WriteGameModDescriptorString(const GameModDescriptor& descriptor, bool pretty)
+{
+ picojson::object json_root;
+ json_root["type"] = picojson::value("dolphin-game-mod-descriptor");
+ json_root["version"] = picojson::value(1.0);
+ if (!descriptor.base_file.empty())
+ json_root["base-file"] = picojson::value(descriptor.base_file);
+ if (!descriptor.display_name.empty())
+ json_root["display-name"] = picojson::value(descriptor.display_name);
+ if (!descriptor.banner.empty())
+ json_root["banner"] = picojson::value(descriptor.banner);
+ if (descriptor.riivolution)
+ {
+ json_root["riivolution"] =
+ picojson::value(WriteGameModDescriptorRiivolution(*descriptor.riivolution));
+ }
+ return picojson::value(json_root).serialize(pretty);
+}
+
+bool WriteGameModDescriptorFile(const std::string& filename, const GameModDescriptor& descriptor,
+ bool pretty)
+{
+ auto json = WriteGameModDescriptorString(descriptor, pretty);
+ if (json.empty())
+ return false;
+
+ ::File::IOFile f(filename, "wb");
+ if (!f)
+ return false;
+
+ if (!f.WriteString(json))
+ return false;
+
+ return true;
+}
} // namespace DiscIO