1
0
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:
AlexVinS 2014-05-18 18:47:18 +04:00
parent 950ca1156a
commit f2b61f7e69
5 changed files with 48 additions and 18 deletions

View File

@ -231,20 +231,25 @@
"additionalProperties" : false, "additionalProperties" : false,
"required" : ["none", "basic", "advanced", "expert"], "required" : ["none", "basic", "advanced", "expert"],
"properties":{ "properties":{
"none":{ "base":{
"$ref" : "#/definitions/levelInfo" "type": "object",
}, "description": "will be merged with all levels",
"basic":{ "additionalProperties": true
"$ref" : "#/definitions/levelInfo" },
}, "none":{
"advanced":{ "$ref" : "#/definitions/levelInfo"
"$ref" : "#/definitions/levelInfo" },
}, "basic":{
"expert":{ "$ref" : "#/definitions/levelInfo"
"$ref" : "#/definitions/levelInfo" },
} "advanced":{
} "$ref" : "#/definitions/levelInfo"
},
"expert":{
"$ref" : "#/definitions/levelInfo"
}
}
} }
} }
} }

View File

@ -296,6 +296,12 @@ bool CContentHandler::ContentTypeHandler::loadMod(std::string modName, bool vali
{ {
ModInfo & modInfo = modData[modName]; ModInfo & modInfo = modData[modName];
bool result = true; 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 // apply patches
if (!modInfo.patches.isNull()) if (!modInfo.patches.isNull())
@ -314,8 +320,8 @@ bool CContentHandler::ContentTypeHandler::loadMod(std::string modName, bool vali
if (originalData.size() > index) if (originalData.size() > index)
{ {
JsonUtils::merge(originalData[index], data); 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); handler->loadObject(modName, name, originalData[index], index);
originalData[index].clear(); // do not use same data twice (same ID) 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 // normal new object or one with index bigger that data size
if (validate) performValidate(data,name);
result &= JsonUtils::validate(data, "vcmi:" + objectName, name);
handler->loadObject(modName, name, data); handler->loadObject(modName, name, data);
} }
return result; return result;

View File

@ -864,6 +864,22 @@ void CSpellHandler::afterLoadFinalization()
bonus.sid = spell->id; 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() CSpellHandler::~CSpellHandler()

View File

@ -205,6 +205,7 @@ public:
std::vector<JsonNode> loadLegacyData(size_t dataSize) override; std::vector<JsonNode> loadLegacyData(size_t dataSize) override;
void afterLoadFinalization() override; void afterLoadFinalization() override;
void beforeValidate(JsonNode & object) override;
/** /**
* Gets a list of default allowed spells. OH3 spells are all allowed by default. * Gets a list of default allowed spells. OH3 spells are all allowed by default.

View File

@ -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) = 0;
virtual void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) = 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 /// allows handler to do post-loading step for validation or integration of loaded data
virtual void afterLoadFinalization(){}; virtual void afterLoadFinalization(){};