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

Add support for custom icons & descriptions for bonuses

This commit is contained in:
Ivan Savenko
2025-05-19 23:30:41 +03:00
parent b806775f3a
commit 25655184d3
14 changed files with 86 additions and 43 deletions

View File

@@ -615,10 +615,10 @@ std::shared_ptr<ILimiter> JsonUtils::parseLimiter(const JsonNode & limiter)
return nullptr;
}
std::shared_ptr<Bonus> JsonUtils::parseBonus(const JsonNode &ability)
std::shared_ptr<Bonus> JsonUtils::parseBonus(const JsonNode &ability, const TextIdentifier & descriptionID)
{
auto b = std::make_shared<Bonus>();
if (!parseBonus(ability, b.get()))
if (!parseBonus(ability, b.get(), descriptionID))
{
// caller code can not handle this case and presumes that returned bonus is always valid
logGlobal->error("Failed to parse bonus! Json config was %S ", ability.toString());
@@ -628,7 +628,7 @@ std::shared_ptr<Bonus> JsonUtils::parseBonus(const JsonNode &ability)
return b;
}
bool JsonUtils::parseBonus(const JsonNode &ability, Bonus *b)
bool JsonUtils::parseBonus(const JsonNode &ability, Bonus *b, const TextIdentifier & descriptionID)
{
const JsonNode * value = nullptr;
@@ -671,12 +671,23 @@ bool JsonUtils::parseBonus(const JsonNode &ability, Bonus *b)
if(!ability["description"].isNull())
{
if (ability["description"].isString())
b->description.appendTextID(ability["description"].String());
if (ability["description"].isString() && !ability["description"].String().empty())
{
if (ability["description"].String()[0] == '@')
b->description.appendTextID(ability["description"].String());
else if (!descriptionID.get().empty())
{
LIBRARY->generaltexth->registerString(ability.getModScope(), descriptionID, ability["description"]);
b->description.appendTextID(descriptionID.get());
}
}
if (ability["description"].isNumber())
b->description.appendTextID("core.arraytxt." + std::to_string(ability["description"].Integer()));
}
if(!ability["icon"].isNull())
b->customIconPath = ImagePath::fromJson(ability["icon"]);
value = &ability["effectRange"];
if (!value->isNull())
b->effectRange = static_cast<BonusLimitEffect>(parseByMapN(bonusLimitEffect, value, "effect range "));

View File

@@ -11,6 +11,7 @@
#include "JsonNode.h"
#include "../GameConstants.h"
#include "../texts/TextIdentifier.h"
VCMI_LIB_NAMESPACE_BEGIN
@@ -18,12 +19,11 @@ struct Bonus;
class ILimiter;
class CSelector;
class CAddInfo;
namespace JsonUtils
{
std::shared_ptr<Bonus> parseBonus(const JsonVector & ability_vec);
std::shared_ptr<Bonus> parseBonus(const JsonNode & ability);
bool parseBonus(const JsonNode & ability, Bonus * placement);
std::shared_ptr<Bonus> parseBonus(const JsonNode & ability, const TextIdentifier & descriptionID = "");
bool parseBonus(const JsonNode & ability, Bonus * placement, const TextIdentifier & descriptionID = "");
std::shared_ptr<ILimiter> parseLimiter(const JsonNode & limiter);
CSelector parseSelector(const JsonNode &ability);
void resolveAddInfo(CAddInfo & var, const JsonNode & node);