mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
Spell configuration: introduce simplifaction mechanism for level conficuration
* also aviable for other handlers
This commit is contained in:
parent
950ca1156a
commit
f2b61f7e69
@ -231,20 +231,25 @@
|
||||
"additionalProperties" : false,
|
||||
"required" : ["none", "basic", "advanced", "expert"],
|
||||
|
||||
"properties":{
|
||||
"none":{
|
||||
"$ref" : "#/definitions/levelInfo"
|
||||
},
|
||||
"basic":{
|
||||
"$ref" : "#/definitions/levelInfo"
|
||||
},
|
||||
"advanced":{
|
||||
"$ref" : "#/definitions/levelInfo"
|
||||
},
|
||||
"expert":{
|
||||
"$ref" : "#/definitions/levelInfo"
|
||||
}
|
||||
}
|
||||
"properties":{
|
||||
"base":{
|
||||
"type": "object",
|
||||
"description": "will be merged with all levels",
|
||||
"additionalProperties": true
|
||||
},
|
||||
"none":{
|
||||
"$ref" : "#/definitions/levelInfo"
|
||||
},
|
||||
"basic":{
|
||||
"$ref" : "#/definitions/levelInfo"
|
||||
},
|
||||
"advanced":{
|
||||
"$ref" : "#/definitions/levelInfo"
|
||||
},
|
||||
"expert":{
|
||||
"$ref" : "#/definitions/levelInfo"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -296,6 +296,12 @@ bool CContentHandler::ContentTypeHandler::loadMod(std::string modName, bool vali
|
||||
{
|
||||
ModInfo & modInfo = modData[modName];
|
||||
bool result = true;
|
||||
|
||||
auto performValidate = [&,this](JsonNode & data, const std::string & name){
|
||||
handler->beforeValidate(data);
|
||||
if (validate)
|
||||
result &= JsonUtils::validate(data, "vcmi:" + objectName, name);
|
||||
};
|
||||
|
||||
// apply patches
|
||||
if (!modInfo.patches.isNull())
|
||||
@ -314,8 +320,8 @@ bool CContentHandler::ContentTypeHandler::loadMod(std::string modName, bool vali
|
||||
if (originalData.size() > index)
|
||||
{
|
||||
JsonUtils::merge(originalData[index], data);
|
||||
if (validate)
|
||||
result &= JsonUtils::validate(originalData[index], "vcmi:" + objectName, name);
|
||||
|
||||
performValidate(originalData[index],name);
|
||||
handler->loadObject(modName, name, originalData[index], index);
|
||||
|
||||
originalData[index].clear(); // do not use same data twice (same ID)
|
||||
@ -324,8 +330,7 @@ bool CContentHandler::ContentTypeHandler::loadMod(std::string modName, bool vali
|
||||
}
|
||||
}
|
||||
// normal new object or one with index bigger that data size
|
||||
if (validate)
|
||||
result &= JsonUtils::validate(data, "vcmi:" + objectName, name);
|
||||
performValidate(data,name);
|
||||
handler->loadObject(modName, name, data);
|
||||
}
|
||||
return result;
|
||||
|
@ -864,6 +864,22 @@ void CSpellHandler::afterLoadFinalization()
|
||||
bonus.sid = spell->id;
|
||||
}
|
||||
|
||||
void CSpellHandler::beforeValidate(JsonNode & object)
|
||||
{
|
||||
//handle "base" level info
|
||||
|
||||
JsonNode levels = object["levels"];
|
||||
|
||||
if(levels["base"].getType() == JsonNode::DATA_STRUCT)
|
||||
{
|
||||
JsonUtils::mergeCopy(levels["none"],levels["base"]);
|
||||
JsonUtils::mergeCopy(levels["basic"],levels["base"]);
|
||||
JsonUtils::mergeCopy(levels["advanced"],levels["base"]);
|
||||
JsonUtils::mergeCopy(levels["expert"],levels["base"]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
CSpellHandler::~CSpellHandler()
|
||||
|
@ -205,6 +205,7 @@ public:
|
||||
|
||||
std::vector<JsonNode> loadLegacyData(size_t dataSize) override;
|
||||
void afterLoadFinalization() override;
|
||||
void beforeValidate(JsonNode & object) override;
|
||||
|
||||
/**
|
||||
* Gets a list of default allowed spells. OH3 spells are all allowed by default.
|
||||
|
@ -32,6 +32,9 @@ public:
|
||||
virtual void loadObject(std::string scope, std::string name, const JsonNode & data) = 0;
|
||||
virtual void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) = 0;
|
||||
|
||||
/// allows handlers to alter object configuration before validation and actual load
|
||||
virtual void beforeValidate(JsonNode & object){};
|
||||
|
||||
/// allows handler to do post-loading step for validation or integration of loaded data
|
||||
virtual void afterLoadFinalization(){};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user