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

Allow "notLikeZone" to be vector

This commit is contained in:
Tomasz Zieliński
2025-03-09 09:21:05 +01:00
parent 6e7dfc6ee4
commit 38a46d4b3f
4 changed files with 38 additions and 9 deletions

View File

@@ -25,7 +25,15 @@
"type": "object", "type": "object",
"properties": { "properties": {
"likeZone": { "type": "number" }, "likeZone": { "type": "number" },
"notLikeZone": { "type": "number" }, "notLikeZone": {
"oneOf": [
{ "type": "number" },
{
"type": "array",
"items": { "type": "number" }
}
]
},
"relatedToZoneTerrain": { "type": "number" } "relatedToZoneTerrain": { "type": "number" }
} }
} }

View File

@@ -109,7 +109,6 @@ void ZoneOptions::CTownInfo::serializeJson(JsonSerializeFormat & handler)
ZoneOptions::CTownHints::CTownHints() ZoneOptions::CTownHints::CTownHints()
: likeZone(NO_ZONE), : likeZone(NO_ZONE),
notLikeZone(NO_ZONE),
relatedToZoneTerrain(NO_ZONE) relatedToZoneTerrain(NO_ZONE)
{ {
@@ -118,7 +117,23 @@ ZoneOptions::CTownHints::CTownHints()
void ZoneOptions::CTownHints::serializeJson(JsonSerializeFormat & handler) void ZoneOptions::CTownHints::serializeJson(JsonSerializeFormat & handler)
{ {
handler.serializeInt("likeZone", likeZone, NO_ZONE); handler.serializeInt("likeZone", likeZone, NO_ZONE);
handler.serializeInt("notLikeZone", notLikeZone, NO_ZONE); auto node = handler.getCurrent();
if (node["notLikeZone"].isVector())
{
// TODO: Utility to serialize vector of ints?
auto notLikeZoneData = handler.enterArray("notLikeZone");
notLikeZone.resize(notLikeZoneData.size());
for (size_t i = 0; i < notLikeZoneData.size(); ++i)
{
notLikeZoneData.serializeInt(i, notLikeZone[i]);
}
}
else
{
int temp;
handler.serializeInt("notLikeZone", temp, NO_ZONE);
notLikeZone.push_back(temp);
}
handler.serializeInt("relatedToZoneTerrain", relatedToZoneTerrain, NO_ZONE); handler.serializeInt("relatedToZoneTerrain", relatedToZoneTerrain, NO_ZONE);
} }

View File

@@ -154,7 +154,7 @@ public:
CTownHints(); CTownHints();
// TODO: Make private // TODO: Make private
TRmgTemplateZoneId likeZone = NO_ZONE; TRmgTemplateZoneId likeZone = NO_ZONE;
TRmgTemplateZoneId notLikeZone = NO_ZONE; std::vector<TRmgTemplateZoneId> notLikeZone;
TRmgTemplateZoneId relatedToZoneTerrain = NO_ZONE; TRmgTemplateZoneId relatedToZoneTerrain = NO_ZONE;
void serializeJson(JsonSerializeFormat & handler); void serializeJson(JsonSerializeFormat & handler);

View File

@@ -54,10 +54,13 @@ void TownPlacer::init()
logGlobal->info("Dependency on town type of zone %d", townHint.likeZone); logGlobal->info("Dependency on town type of zone %d", townHint.likeZone);
dependency(map.getZones().at(townHint.likeZone)->getModificator<TownPlacer>()); dependency(map.getZones().at(townHint.likeZone)->getModificator<TownPlacer>());
} }
else if(townHint.notLikeZone != rmg::ZoneOptions::NO_ZONE) else if(!townHint.notLikeZone.empty())
{ {
logGlobal->info("Dependency on town unlike type of zone %d", townHint.notLikeZone); for(auto zoneId : townHint.notLikeZone)
dependency(map.getZones().at(townHint.notLikeZone)->getModificator<TownPlacer>()); {
logGlobal->info("Dependency on town unlike type of zone %d", zoneId);
dependency(map.getZones().at(zoneId)->getModificator<TownPlacer>());
}
} }
else if(townHint.relatedToZoneTerrain != rmg::ZoneOptions::NO_ZONE) else if(townHint.relatedToZoneTerrain != rmg::ZoneOptions::NO_ZONE)
{ {
@@ -218,11 +221,14 @@ FactionID TownPlacer::getTownTypeFromHint(size_t hintIndex)
// Copy directly from other zone // Copy directly from other zone
subType = map.getZones().at(townHints.likeZone)->getTownType(); subType = map.getZones().at(townHints.likeZone)->getTownType();
} }
else if(townHints.notLikeZone != rmg::ZoneOptions::NO_ZONE) else if(!townHints.notLikeZone.empty())
{ {
// Exclude type rolled for other zone // Exclude type rolled for other zone
auto townTypes = zone.getTownTypes(); auto townTypes = zone.getTownTypes();
townTypes.erase(map.getZones().at(townHints.notLikeZone)->getTownType()); for(auto zoneId : townHints.notLikeZone)
{
townTypes.erase(map.getZones().at(zoneId)->getTownType());
}
zone.setTownTypes(townTypes); zone.setTownTypes(townTypes);
if(!townTypes.empty()) if(!townTypes.empty())