|  | @@ -1191,70 +1191,66 @@ void CRmgTemplateZone::initTownType (CMapGenerator* gen)
 | 
	
		
			
				|  |  |  		logGlobal->infoStream() << "Preparing playing zone";
 | 
	
		
			
				|  |  |  		int player_id = *owner - 1;
 | 
	
		
			
				|  |  |  		auto & playerInfo = gen->map->players[player_id];
 | 
	
		
			
				|  |  | +		PlayerColor player(player_id);
 | 
	
		
			
				|  |  |  		if (playerInfo.canAnyonePlay())
 | 
	
		
			
				|  |  |  		{
 | 
	
		
			
				|  |  | -			PlayerColor player(player_id);
 | 
	
		
			
				|  |  | +			player = PlayerColor(player_id);
 | 
	
		
			
				|  |  |  			townType = gen->mapGenOptions->getPlayersSettings().find(player)->second.getStartingTown();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			if (townType == CMapGenOptions::CPlayerSettings::RANDOM_TOWN)
 | 
	
		
			
				|  |  | -			{
 | 
	
		
			
				|  |  | -				if (townTypes.size())
 | 
	
		
			
				|  |  | -					townType = *RandomGeneratorUtil::nextItem(townTypes, gen->rand);
 | 
	
		
			
				|  |  | -				else
 | 
	
		
			
				|  |  | -					townType = *RandomGeneratorUtil::nextItem(getDefaultTownTypes(), gen->rand); //it is possible to have zone with no towns allowed
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			
 | 
	
		
			
				|  |  | -			auto  town = new CGTownInstance();
 | 
	
		
			
				|  |  | -			town->ID = Obj::TOWN;
 | 
	
		
			
				|  |  | +				randomizeTownType(gen);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		else //no player - randomize town
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			player = PlayerColor::NEUTRAL;
 | 
	
		
			
				|  |  | +			randomizeTownType(gen);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			town->subID = townType;
 | 
	
		
			
				|  |  | -			town->tempOwner = player;
 | 
	
		
			
				|  |  | -			town->builtBuildings.insert(BuildingID::FORT);
 | 
	
		
			
				|  |  | -			town->builtBuildings.insert(BuildingID::DEFAULT);
 | 
	
		
			
				|  |  | +		auto  town = new CGTownInstance();
 | 
	
		
			
				|  |  | +		town->ID = Obj::TOWN;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			for (auto spell : VLC->spellh->objects) //add all regular spells to town
 | 
	
		
			
				|  |  | -			{
 | 
	
		
			
				|  |  | -				if (!spell->isSpecialSpell() && !spell->isCreatureAbility())
 | 
	
		
			
				|  |  | -					town->possibleSpells.push_back(spell->id);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			//towns are big objects and should be centered around visitable position
 | 
	
		
			
				|  |  | -			placeAndGuardObject(gen, town, getPos() + town->getVisitableOffset(), 0); //generate no guards, but free path to entrance
 | 
	
		
			
				|  |  | -			cutPathAroundTown(town);
 | 
	
		
			
				|  |  | +		town->subID = townType;
 | 
	
		
			
				|  |  | +		town->tempOwner = player;
 | 
	
		
			
				|  |  | +		town->builtBuildings.insert(BuildingID::FORT);
 | 
	
		
			
				|  |  | +		town->builtBuildings.insert(BuildingID::DEFAULT);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			totalTowns++;
 | 
	
		
			
				|  |  | -			//register MAIN town of zone only
 | 
	
		
			
				|  |  | -			gen->registerZone (town->subID);
 | 
	
		
			
				|  |  | +		for (auto spell : VLC->spellh->objects) //add all regular spells to town
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			if (!spell->isSpecialSpell() && !spell->isCreatureAbility())
 | 
	
		
			
				|  |  | +				town->possibleSpells.push_back(spell->id);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		//towns are big objects and should be centered around visitable position
 | 
	
		
			
				|  |  | +		placeAndGuardObject(gen, town, getPos() + town->getVisitableOffset(), 0); //generate no guards, but free path to entrance
 | 
	
		
			
				|  |  | +		cutPathAroundTown(town);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		totalTowns++;
 | 
	
		
			
				|  |  | +		//register MAIN town of zone only
 | 
	
		
			
				|  |  | +		gen->registerZone (town->subID);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +		if (playerInfo.canAnyonePlay()) //configure info for owning player
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  |  			logGlobal->traceStream() << "Fill player info " << player_id;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			// Update player info
 | 
	
		
			
				|  |  |  			playerInfo.allowedFactions.clear();
 | 
	
		
			
				|  |  | -			playerInfo.allowedFactions.insert (townType);
 | 
	
		
			
				|  |  | +			playerInfo.allowedFactions.insert(townType);
 | 
	
		
			
				|  |  |  			playerInfo.hasMainTown = true;
 | 
	
		
			
				|  |  |  			playerInfo.posOfMainTown = town->pos - town->getVisitableOffset();
 | 
	
		
			
				|  |  |  			playerInfo.generateHeroAtMainTown = true;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			//now create actual towns
 | 
	
		
			
				|  |  | -			addNewTowns (playerTowns.getCastleCount() - 1, true, player);
 | 
	
		
			
				|  |  | -			addNewTowns (playerTowns.getTownCount(), false, player);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -			//requiredObjects.push_back(town);
 | 
	
		
			
				|  |  | +			addNewTowns(playerTowns.getCastleCount() - 1, true, player);
 | 
	
		
			
				|  |  | +			addNewTowns(playerTowns.getTownCount(), false, player);
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		else
 | 
	
		
			
				|  |  | -		{			
 | 
	
		
			
				|  |  | -			type = ETemplateZoneType::TREASURE;
 | 
	
		
			
				|  |  | -			if (townTypes.size())
 | 
	
		
			
				|  |  | -				townType = *RandomGeneratorUtil::nextItem(townTypes, gen->rand);
 | 
	
		
			
				|  |  | -			else
 | 
	
		
			
				|  |  | -				townType = *RandomGeneratorUtil::nextItem(getDefaultTownTypes(), gen->rand); //it is possible to have zone with no towns allowed
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			addNewTowns(playerTowns.getCastleCount() - 1, true, PlayerColor::NEUTRAL);
 | 
	
		
			
				|  |  | +			addNewTowns(playerTowns.getTownCount(), false, PlayerColor::NEUTRAL);
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	else //no player
 | 
	
		
			
				|  |  | +	else //randomize town types for any other zones as well
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  | -		if (townTypes.size())
 | 
	
		
			
				|  |  | -			townType = *RandomGeneratorUtil::nextItem(townTypes, gen->rand);
 | 
	
		
			
				|  |  | -		else
 | 
	
		
			
				|  |  | -			townType = *RandomGeneratorUtil::nextItem(getDefaultTownTypes(), gen->rand); //it is possible to have zone with no towns allowed
 | 
	
		
			
				|  |  | +		randomizeTownType(gen);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	addNewTowns (neutralTowns.getCastleCount(), true, PlayerColor::NEUTRAL);
 | 
	
	
		
			
				|  | @@ -1273,11 +1269,20 @@ void CRmgTemplateZone::initTownType (CMapGenerator* gen)
 | 
	
		
			
				|  |  |  				townType = *RandomGeneratorUtil::nextItem(townTypes, gen->rand);
 | 
	
		
			
				|  |  |  			else if (monsterTypes.size())
 | 
	
		
			
				|  |  |  				townType = *RandomGeneratorUtil::nextItem(monsterTypes, gen->rand); //this happens in Clash of Dragons in treasure zones, where all towns are banned
 | 
	
		
			
				|  |  | +			else //just in any case
 | 
	
		
			
				|  |  | +				randomizeTownType(gen);
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void CRmgTemplateZone::randomizeTownType (CMapGenerator* gen)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	if (townTypes.size())
 | 
	
		
			
				|  |  | +		townType = *RandomGeneratorUtil::nextItem(townTypes, gen->rand);
 | 
	
		
			
				|  |  | +	else
 | 
	
		
			
				|  |  | +		townType = *RandomGeneratorUtil::nextItem(getDefaultTownTypes(), gen->rand); //it is possible to have zone with no towns allowed, we still need some
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void CRmgTemplateZone::initTerrainType (CMapGenerator* gen)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  
 |