diff options
| author | Léo Lam <leo@leolam.fr> | 2021-12-14 11:08:38 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-14 11:08:38 +0100 |
| commit | 185475fe03c758a2346c170bd9395227d78b0f63 (patch) | |
| tree | dc496e8bda35b3a9b1efb1382bdc20e3dac2f62f /Source/Core/DiscIO/GameModDescriptor.cpp | |
| parent | 45fac5137b6cf3da1ee8ccc65eced6d969152a93 (diff) | |
| parent | b928900f6e1097a189cd78491df00ed7890949d6 (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.cpp | 81 |
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 |
