123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /*
- * ModVerificationInfo.cpp, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
- #include "StdInc.h"
- #include "ModVerificationInfo.h"
- #include "CModHandler.h"
- #include "ModDescription.h"
- #include "ModIncompatibility.h"
- #include "../json/JsonNode.h"
- #include "../VCMI_Lib.h"
- VCMI_LIB_NAMESPACE_BEGIN
- JsonNode ModVerificationInfo::jsonSerializeList(const ModCompatibilityInfo & input)
- {
- JsonNode output;
- for(const auto & mod : input)
- {
- JsonNode modWriter;
- modWriter["modId"].String() = mod.first;
- modWriter["name"].String() = mod.second.name;
- if (!mod.second.parent.empty())
- modWriter["parent"].String() = mod.second.parent;
- modWriter["version"].String() = mod.second.version.toString();
- output.Vector().push_back(modWriter);
- }
- return output;
- }
- ModCompatibilityInfo ModVerificationInfo::jsonDeserializeList(const JsonNode & input)
- {
- ModCompatibilityInfo output;
- for(const auto & mod : input.Vector())
- {
- ModVerificationInfo info;
- info.version = CModVersion::fromString(mod["version"].String());
- info.name = mod["name"].String();
- info.parent = mod["parent"].String();
- info.checksum = 0;
- info.impactsGameplay = true;
- if(!mod["modId"].isNull())
- output[mod["modId"].String()] = info;
- else
- output[mod["name"].String()] = info;
- }
- return output;
- }
- ModListVerificationStatus ModVerificationInfo::verifyListAgainstLocalMods(const ModCompatibilityInfo & modList)
- {
- ModListVerificationStatus result;
- for(const auto & m : VLC->modh->getActiveMods())
- {
- if(modList.count(m))
- continue;
- if(VLC->modh->getModInfo(m).affectsGameplay())
- result[m] = ModVerificationStatus::EXCESSIVE;
- }
- for(const auto & infoPair : modList)
- {
- auto & remoteModId = infoPair.first;
- auto & remoteModInfo = infoPair.second;
- bool modAffectsGameplay = remoteModInfo.impactsGameplay;
- //parent mod affects gameplay if child affects too
- for(const auto & subInfoPair : modList)
- modAffectsGameplay |= (subInfoPair.second.impactsGameplay && subInfoPair.second.parent == remoteModId);
- if(!vstd::contains(VLC->modh->getAllMods(), remoteModId))
- {
- result[remoteModId] = ModVerificationStatus::NOT_INSTALLED;
- continue;
- }
- const auto & localVersion = VLC->modh->getModInfo(remoteModId).getVersion();
- modAffectsGameplay |= VLC->modh->getModInfo(remoteModId).affectsGameplay();
- // skip it. Such mods should only be present in old saves or if mod changed and no longer affects gameplay
- if (!modAffectsGameplay)
- continue;
- if (!vstd::contains(VLC->modh->getActiveMods(), remoteModId))
- {
- result[remoteModId] = ModVerificationStatus::DISABLED;
- continue;
- }
- if(remoteModInfo.version != localVersion)
- {
- result[remoteModId] = ModVerificationStatus::VERSION_MISMATCH;
- continue;
- }
- result[remoteModId] = ModVerificationStatus::FULL_MATCH;
- }
- return result;
- }
- VCMI_LIB_NAMESPACE_END
|