1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-27 22:49:25 +02:00

updated json loading and schema to fit new specialty format

This commit is contained in:
Henning Koehler
2017-09-14 10:45:54 +12:00
parent 038cb4bf19
commit a002df399e
4 changed files with 93 additions and 70 deletions

View File

@@ -533,6 +533,21 @@ std::vector<std::shared_ptr<Bonus>> SpecialtyInfoToBonuses(const SSpecialtyInfo
return result;
}
void CHeroHandler::beforeValidate(JsonNode & object)
{
//handle "base" specialty info
const JsonNode & specialtyNode = object["specialty"];
if(specialtyNode.getType() == JsonNode::DATA_STRUCT)
{
const JsonNode & base = specialtyNode["base"];
if(!base.isNull())
{
for(auto keyValue : specialtyNode["bonuses"].Struct())
JsonUtils::inherit(keyValue.second, base);
}
}
}
void CHeroHandler::loadHeroSpecialty(CHero * hero, const JsonNode & node)
{
int sid = hero->ID.getNum();
@@ -545,11 +560,11 @@ void CHeroHandler::loadHeroSpecialty(CHero * hero, const JsonNode & node)
};
//deprecated, used only for original specialties
const JsonNode & specialties = node["specialties"];
if (!specialties.isNull())
const JsonNode & specialtiesNode = node["specialties"];
if (!specialtiesNode.isNull())
{
logMod->warn("Hero %s has deprecated specialties format.", hero->identifier);
for(const JsonNode &specialty : node["specialties"].Vector())
for(const JsonNode &specialty : specialtiesNode.Vector())
{
SSpecialtyInfo spec;
spec.type = specialty["type"].Float();
@@ -560,19 +575,22 @@ void CHeroHandler::loadHeroSpecialty(CHero * hero, const JsonNode & node)
hero->specDeprecated.push_back(spec);
}
}
//new format, using bonus system
for(const JsonNode & specialty : node["specialty"].Vector())
//new(er) format, using bonus system
const JsonNode & specialtyNode = node["specialty"];
if(specialtyNode.getType() == JsonNode::DATA_VECTOR)
{
//deprecated new format
if(!specialty["bonuses"].isNull())
//deprecated middle-aged format
for(const JsonNode & specialty : node["specialty"].Vector())
{
for (const JsonNode & bonus : specialty["bonuses"].Vector())
hero->specialty.push_back(prepSpec(JsonUtils::parseBonus(bonus)));
}
else //proper new format
{
hero->specialty.push_back(prepSpec(JsonUtils::parseBonus(specialty)));
}
}
else if(specialtyNode.getType() == JsonNode::DATA_STRUCT)
{
//proper new format
for(auto keyValue : specialtyNode["bonuses"].Struct())
hero->specialty.push_back(prepSpec(JsonUtils::parseBonus(keyValue.second)));
}
}