1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-09-16 09:26:28 +02:00

Implement async requests for bonus types

This commit is contained in:
Ivan Savenko
2025-06-13 13:29:31 +03:00
parent 54de24c687
commit bc48337445
8 changed files with 58 additions and 58 deletions

View File

@@ -193,7 +193,7 @@ static void loadBonusSubtype(BonusSubtypeID & subtype, BonusType type, const Jso
}
}
static void loadBonusAddInfo(CAddInfo & var, BonusType type, const JsonNode & node)
static void loadBonusAddInfo(CAddInfo & var, BonusType type, const JsonNode & value)
{
const auto & getFirstValue = [](const JsonNode & jsonNode) -> const JsonNode &
{
@@ -203,7 +203,6 @@ static void loadBonusAddInfo(CAddInfo & var, BonusType type, const JsonNode & no
return jsonNode;
};
const JsonNode & value = node["addInfo"];
if (value.isNull())
return;
@@ -432,11 +431,16 @@ VCMI_LIB_NAMESPACE_BEGIN
std::shared_ptr<Bonus> JsonUtils::parseBonus(const JsonVector & ability_vec)
{
auto b = std::make_shared<Bonus>();
std::string type = ability_vec[0].String();
b->type = LIBRARY->bth->stringToBonus(type);
const JsonNode & typeNode = ability_vec[0];
const JsonNode & subtypeNode = ability_vec[2];
LIBRARY->identifiers()->requestIdentifier("bonus", typeNode, [b, subtypeNode](si32 bonusID)
{
b->type = BonusType(bonusID);
loadBonusSubtype(b->subtype, b->type, subtypeNode);
});
b->val = static_cast<si32>(ability_vec[1].Float());
loadBonusSubtype(b->subtype, b->type, ability_vec[2]);
b->additionalInfo = static_cast<si32>(ability_vec[3].Float());
b->duration = BonusDuration::PERMANENT; //TODO: handle flags (as integer)
b->turnsRemain = 0;
@@ -517,8 +521,10 @@ std::shared_ptr<const ILimiter> JsonUtils::parseLimiter(const JsonNode & limiter
if (!parameters[0].isNull())
{
std::string anotherBonusType = parameters[0].String();
bonusLimiter->type = LIBRARY->bth->stringToBonus(anotherBonusType);
LIBRARY->identifiers()->requestIdentifier("bonus", parameters[0], [bonusLimiter](si32 bonusID)
{
bonusLimiter->type = BonusType(bonusID);
});
}
auto findSource = [&](const JsonNode & parameter)
@@ -631,10 +637,15 @@ std::shared_ptr<Bonus> JsonUtils::parseBonus(const JsonNode &ability, const Text
bool JsonUtils::parseBonus(const JsonNode &ability, Bonus *b, const TextIdentifier & descriptionID)
{
const JsonNode * value = nullptr;
const JsonNode & subtypeNode = ability["subtype"];
const JsonNode & addinfoNode = ability["addInfo"];
b->type = LIBRARY->bth->stringToBonus(ability["type"].String());
loadBonusSubtype(b->subtype, b->type, ability["subtype"]);
LIBRARY->identifiers()->requestIdentifier("bonus", ability["type"], [b, subtypeNode, addinfoNode](si32 bonusID)
{
b->type = BonusType(bonusID);
loadBonusSubtype(b->subtype, b->type, subtypeNode);
loadBonusAddInfo(b->additionalInfo, b->type, addinfoNode);
});
b->val = static_cast<si32>(ability["val"].Float());
@@ -643,9 +654,6 @@ bool JsonUtils::parseBonus(const JsonNode &ability, Bonus *b, const TextIdentifi
b->valType = static_cast<BonusValueType>(parseByMapN(bonusValueMap, value, "value type "));
b->stacking = ability["stacking"].String();
loadBonusAddInfo(b->additionalInfo, b->type, ability);
b->turnsRemain = static_cast<si32>(ability["turns"].Float());
if(!ability["description"].isNull())
@@ -768,7 +776,7 @@ CSelector JsonUtils::parseSelector(const JsonNode & ability)
value = &ability["type"];
if(value->isString())
{
ret = ret.And(Selector::type()(LIBRARY->bth->stringToBonus(value->String())));
ret = ret.And(Selector::type()(static_cast<BonusType>(*LIBRARY->identifiers()->getIdentifier("bonus", value->String()))));
}
value = &ability["subtype"];
if(!value->isNull() && type != BonusType::NONE)