1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-01 00:45:26 +02:00

- Handle new configurable banks

- Handle "all" object banned option
This commit is contained in:
Tomasz Zieliński
2024-09-21 13:36:28 +02:00
parent 54e47c20b0
commit ec603f46ae
4 changed files with 46 additions and 29 deletions

View File

@ -49,7 +49,10 @@ public:
virtual bool givesBonuses() const { return false; } virtual bool givesBonuses() const { return false; }
virtual bool hasGuards() const { return false; }
virtual ~IObjectInfo() = default; virtual ~IObjectInfo() = default;
}; };
VCMI_LIB_NAMESPACE_END VCMI_LIB_NAMESPACE_END

View File

@ -525,6 +525,11 @@ bool Rewardable::Info::givesBonuses() const
return testForKey(parameters, "bonuses"); return testForKey(parameters, "bonuses");
} }
bool Rewardable::Info::hasGuards() const
{
return testForKey(parameters, "guards");
}
const JsonNode & Rewardable::Info::getParameters() const const JsonNode & Rewardable::Info::getParameters() const
{ {
return parameters; return parameters;

View File

@ -68,6 +68,8 @@ public:
bool givesBonuses() const override; bool givesBonuses() const override;
bool hasGuards() const override;
void configureObject(Rewardable::Configuration & object, vstd::RNG & rng, IGameCallback * cb) const; void configureObject(Rewardable::Configuration & object, vstd::RNG & rng, IGameCallback * cb) const;
void init(const JsonNode & objectConfig, const std::string & objectTextID); void init(const JsonNode & objectConfig, const std::string & objectTextID);

View File

@ -1138,17 +1138,19 @@ void TreasurePlacer::ObjectPool::patchWithZoneConfig(const Zone & zone, Treasure
auto bannedObjectCategories = zone.getBannedObjectCategories(); auto bannedObjectCategories = zone.getBannedObjectCategories();
auto categoriesSet = std::unordered_set<ObjectConfig::EObjectCategory>(bannedObjectCategories.begin(), bannedObjectCategories.end()); auto categoriesSet = std::unordered_set<ObjectConfig::EObjectCategory>(bannedObjectCategories.begin(), bannedObjectCategories.end());
if (categoriesSet.count(ObjectConfig::EObjectCategory::ALL))
{
possibleObjects.clear();
}
else
{
vstd::erase_if(possibleObjects, [this, &categoriesSet](const ObjectInfo & oi) -> bool vstd::erase_if(possibleObjects, [this, &categoriesSet](const ObjectInfo & oi) -> bool
{ {
auto category = getObjectCategory(oi.getCompoundID()); auto category = getObjectCategory(oi.getCompoundID());
if (categoriesSet.count(category)) if (categoriesSet.count(category))
{ {
logGlobal->info("Removing object %s from possible objects", oi.templates.front()->stringID); logGlobal->info("Removing object %s from possible objects", oi.templates.front()->stringID);
/* FIXME:
Removing object normal from possible objects
Removing object base from possible objects
Removing object default from possible objects
*/
return true; return true;
} }
return false; return false;
@ -1170,6 +1172,7 @@ void TreasurePlacer::ObjectPool::patchWithZoneConfig(const Zone & zone, Treasure
} }
return false; return false;
}); });
}
auto configuredObjects = zone.getConfiguredObjects(); auto configuredObjects = zone.getConfiguredObjects();
@ -1219,16 +1222,20 @@ ObjectConfig::EObjectCategory TreasurePlacer::ObjectPool::getObjectCategory(Comp
if (name == "configurable") if (name == "configurable")
{ {
// TODO: Access Rewardable::Info by ID
auto handler = VLC->objtypeh->getHandlerFor(id.primaryID, id.secondaryID); auto handler = VLC->objtypeh->getHandlerFor(id.primaryID, id.secondaryID);
if (!handler) if (!handler)
{ {
return ObjectConfig::EObjectCategory::NONE; return ObjectConfig::EObjectCategory::NONE;
} }
auto temp = handler->getTemplates().front(); auto temp = handler->getTemplates().front();
auto info = handler->getObjectInfo(temp); auto info = handler->getObjectInfo(temp);
if (info->givesResources())
if (info->hasGuards())
{
return ObjectConfig::EObjectCategory::CREATURE_BANK;
}
else if (info->givesResources())
{ {
return ObjectConfig::EObjectCategory::RESOURCE; return ObjectConfig::EObjectCategory::RESOURCE;
} }