1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-25 00:37:24 +02:00

Merge pull request #5108 from IvanSavenko/preset_import

[1.6.1?] Mod preset import/export
This commit is contained in:
Ivan Savenko
2024-12-21 15:57:33 +02:00
committed by GitHub
8 changed files with 165 additions and 15 deletions

View File

@ -207,7 +207,12 @@ const JsonNode & ModsPresetState::getActivePresetConfig() const
TModList ModsPresetState::getActiveRootMods() const
{
const JsonNode & modsToActivateJson = getActivePresetConfig()["mods"];
return getRootMods(getActivePreset());
}
TModList ModsPresetState::getRootMods(const std::string & presetName) const
{
const JsonNode & modsToActivateJson = modConfig["presets"][presetName]["mods"];
auto modsToActivate = modsToActivateJson.convertTo<std::vector<TModID>>();
if (!vstd::contains(modsToActivate, ModScope::scopeBuiltin()))
modsToActivate.push_back(ModScope::scopeBuiltin());
@ -385,6 +390,33 @@ std::string ModsPresetState::getActivePreset() const
return modConfig["activePreset"].String();
}
JsonNode ModsPresetState::exportCurrentPreset() const
{
JsonNode data = getActivePresetConfig();
std::string presetName = getActivePreset();
data["name"] = JsonNode(presetName);
vstd::erase_if(data["settings"].Struct(), [&](const auto & pair){
return !vstd::contains(data["mods"].Vector(), JsonNode(pair.first));
});
return data;
}
std::string ModsPresetState::importPreset(const JsonNode & newConfig)
{
std::string importedPresetName = newConfig["name"].String();
if (importedPresetName.empty())
throw std::runtime_error("Attempt to import invalid preset");
modConfig["presets"][importedPresetName] = newConfig;
modConfig["presets"][importedPresetName].Struct().erase("name");
return importedPresetName;
}
ModsStorage::ModsStorage(const std::vector<TModID> & modsToLoad, const JsonNode & repositoryList)
{
JsonNode coreModConfig(JsonPath::builtin("config/gameConfig.json"));
@ -796,4 +828,28 @@ std::string ModManager::getActivePreset() const
return modsPreset->getActivePreset();
}
JsonNode ModManager::exportCurrentPreset() const
{
return modsPreset->exportCurrentPreset();
}
std::tuple<std::string, TModList> ModManager::importPreset(const JsonNode & data)
{
std::string presetName = modsPreset->importPreset(data);
TModList requiredMods = modsPreset->getRootMods(presetName);
TModList installedMods = modsState->getInstalledMods();
TModList missingMods;
for (const auto & modID : requiredMods)
{
if (!vstd::contains(installedMods, modID))
missingMods.push_back(modID);
}
modsPreset->saveConfigurationState();
return {presetName, missingMods};
}
VCMI_LIB_NAMESPACE_END