|
|
@@ -93,48 +93,53 @@ void TreasurePlacer::addAllPossibleObjects()
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- if(zone.getType() == ETemplateZoneType::WATER)
|
|
|
- return;
|
|
|
-
|
|
|
- //prisons
|
|
|
- //levels 1, 5, 10, 20, 30
|
|
|
- static int prisonsLevels = std::min(generator.getConfig().prisonExperience.size(), generator.getConfig().prisonValues.size());
|
|
|
-
|
|
|
- size_t prisonsLeft = getMaxPrisons();
|
|
|
- for(int i = prisonsLevels - 1; i >= 0 ;i--)
|
|
|
+
|
|
|
+ //Generate Prison on water only if it has a template
|
|
|
+ auto prisonTemplates = VLC->objtypeh->getHandlerFor(Obj::PRISON, 0)->getTemplates(zone.getTerrainType());
|
|
|
+ if (!prisonTemplates.empty())
|
|
|
{
|
|
|
- oi.value = generator.getConfig().prisonValues[i];
|
|
|
- if (oi.value > zone.getMaxTreasureValue())
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
+ //prisons
|
|
|
+ //levels 1, 5, 10, 20, 30
|
|
|
+ static int prisonsLevels = std::min(generator.getConfig().prisonExperience.size(), generator.getConfig().prisonValues.size());
|
|
|
|
|
|
- oi.generateObject = [i, this]() -> CGObjectInstance *
|
|
|
+ size_t prisonsLeft = getMaxPrisons();
|
|
|
+ for (int i = prisonsLevels - 1; i >= 0; i--)
|
|
|
{
|
|
|
- auto possibleHeroes = generator.getAllPossibleHeroes();
|
|
|
- HeroTypeID hid = *RandomGeneratorUtil::nextItem(possibleHeroes, zone.getRand());
|
|
|
+ oi.value = generator.getConfig().prisonValues[i];
|
|
|
+ if (oi.value > zone.getMaxTreasureValue())
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- auto factory = VLC->objtypeh->getHandlerFor(Obj::PRISON, 0);
|
|
|
- auto * obj = dynamic_cast<CGHeroInstance *>(factory->create());
|
|
|
+ oi.generateObject = [i, this]() -> CGObjectInstance*
|
|
|
+ {
|
|
|
+ auto possibleHeroes = generator.getAllPossibleHeroes();
|
|
|
+ HeroTypeID hid = *RandomGeneratorUtil::nextItem(possibleHeroes, zone.getRand());
|
|
|
|
|
|
- obj->subID = hid; //will be initialized later
|
|
|
- obj->exp = generator.getConfig().prisonExperience[i];
|
|
|
- obj->setOwner(PlayerColor::NEUTRAL);
|
|
|
- generator.banHero(hid);
|
|
|
- obj->appearance = VLC->objtypeh->getHandlerFor(Obj::PRISON, 0)->getTemplates(zone.getTerrainType()).front(); //can't init template with hero subID
|
|
|
-
|
|
|
- return obj;
|
|
|
- };
|
|
|
- oi.setTemplate(Obj::PRISON, 0, zone.getTerrainType());
|
|
|
- oi.value = generator.getConfig().prisonValues[i];
|
|
|
- oi.probability = 30;
|
|
|
-
|
|
|
- //Distribute all allowed prisons, starting from the most valuable
|
|
|
- oi.maxPerZone = (std::ceil((float)prisonsLeft / (i + 1)));
|
|
|
- prisonsLeft -= oi.maxPerZone;
|
|
|
- addObjectToRandomPool(oi);
|
|
|
+ auto factory = VLC->objtypeh->getHandlerFor(Obj::PRISON, 0);
|
|
|
+ auto* obj = dynamic_cast<CGHeroInstance*>(factory->create());
|
|
|
+
|
|
|
+ obj->subID = hid; //will be initialized later
|
|
|
+ obj->exp = generator.getConfig().prisonExperience[i];
|
|
|
+ obj->setOwner(PlayerColor::NEUTRAL);
|
|
|
+ generator.banHero(hid);
|
|
|
+ obj->appearance = VLC->objtypeh->getHandlerFor(Obj::PRISON, 0)->getTemplates(zone.getTerrainType()).front(); //can't init template with hero subID
|
|
|
+
|
|
|
+ return obj;
|
|
|
+ };
|
|
|
+ oi.setTemplate(Obj::PRISON, 0, zone.getTerrainType());
|
|
|
+ oi.value = generator.getConfig().prisonValues[i];
|
|
|
+ oi.probability = 30;
|
|
|
+
|
|
|
+ //Distribute all allowed prisons, starting from the most valuable
|
|
|
+ oi.maxPerZone = (std::ceil((float)prisonsLeft / (i + 1)));
|
|
|
+ prisonsLeft -= oi.maxPerZone;
|
|
|
+ addObjectToRandomPool(oi);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ if(zone.getType() == ETemplateZoneType::WATER)
|
|
|
+ return;
|
|
|
|
|
|
//all following objects are unlimited
|
|
|
oi.maxPerZone = std::numeric_limits<ui32>::max();
|