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:
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user