Browse Source

Prison from HoTA will be placed on water.

Tomasz Zieliński 2 years ago
parent
commit
7922d8be16
1 changed files with 41 additions and 36 deletions
  1. 41 36
      lib/rmg/modificators/TreasurePlacer.cpp

+ 41 - 36
lib/rmg/modificators/TreasurePlacer.cpp

@@ -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();