Просмотр исходного кода

Make sure that connection road is set to same value for both zones

Tomasz Zieliński 7 месяцев назад
Родитель
Сommit
237f6ebb1c
1 измененных файлов с 26 добавлено и 20 удалено
  1. 26 20
      lib/rmg/CZonePlacer.cpp

+ 26 - 20
lib/rmg/CZonePlacer.cpp

@@ -1026,6 +1026,22 @@ void CZonePlacer::dropRandomRoads(vstd::RNG * rand)
 
 	auto zones = map.getZones();
 	
+	// Helper lambda to set road option for all instances of a connection
+	auto setRoadOptionForConnection = [&zones](int connectionId, rmg::ERoadOption roadOption)
+	{
+		// Update all instances of this connection (A→B and B→A) to have the same road option
+		for(auto & zonePtr : zones)
+		{
+			for(auto & connection : zonePtr.second->getConnections())
+			{
+				if(connection.getId() == connectionId)
+				{
+					zonePtr.second->setRoadOption(connectionId, roadOption);
+				}
+			}
+		}
+	};
+	
 	// Identify zones with towns
 	std::set<TRmgTemplateZoneId> zonesWithTowns;
 	for(const auto & zone : zones)
@@ -1050,7 +1066,7 @@ void CZonePlacer::dropRandomRoads(vstd::RNG * rand)
 			{
 				if(connection.getRoadOption() == rmg::ERoadOption::ROAD_RANDOM)
 				{
-					zonePtr.second->setRoadOption(connection.getId(), rmg::ERoadOption::ROAD_FALSE);
+					setRoadOptionForConnection(connection.getId(), rmg::ERoadOption::ROAD_FALSE);
 				}
 			}
 		}
@@ -1158,7 +1174,7 @@ void CZonePlacer::dropRandomRoads(vstd::RNG * rand)
 						continue;
 						
 					// Upgrade to TRUE
-					zonePtr.second->setRoadOption(connection.getId(), rmg::ERoadOption::ROAD_TRUE);
+					setRoadOptionForConnection(connection.getId(), rmg::ERoadOption::ROAD_TRUE);
 					directConnections[zoneA][zoneB] = true;
 					directConnections[zoneB][zoneA] = true;
 					
@@ -1179,7 +1195,6 @@ void CZonePlacer::dropRandomRoads(vstd::RNG * rand)
 	// Process remaining RANDOM roads - prioritize town connectivity
 	// First collect all RANDOM roads
 	std::vector<std::pair<int, std::pair<TRmgTemplateZoneId, TRmgTemplateZoneId>>> randomRoads;
-	RandomGeneratorUtil::randomShuffle(randomRoads, *rand);
 	
 	for(auto & zonePtr : zones)
 	{
@@ -1194,7 +1209,7 @@ void CZonePlacer::dropRandomRoads(vstd::RNG * rand)
 				// Skip if these zones are already directly connected by a TRUE road
 				if(vstd::contains(directConnections[zoneA], zoneB) && directConnections[zoneA][zoneB])
 				{
-					zonePtr.second->setRoadOption(id, rmg::ERoadOption::ROAD_FALSE);
+					setRoadOptionForConnection(id, rmg::ERoadOption::ROAD_FALSE);
 					logGlobal->info("Setting RANDOM road to FALSE for connection %d - duplicate of TRUE road between zones %d and %d", 
 									id, zoneA, zoneB);
 					continue;
@@ -1205,6 +1220,8 @@ void CZonePlacer::dropRandomRoads(vstd::RNG * rand)
 		}
 	}
 	
+	RandomGeneratorUtil::randomShuffle(randomRoads, *rand);
+	
 	// Process random roads - first connect town zones
 	for(auto& road : randomRoads)
 	{
@@ -1241,23 +1258,12 @@ void CZonePlacer::dropRandomRoads(vstd::RNG * rand)
 		}
 		
 		// Update all zones with this connection
-		for(auto & zonePtr : zones)
+		setRoadOptionForConnection(id, setToTrue ? rmg::ERoadOption::ROAD_TRUE : rmg::ERoadOption::ROAD_FALSE);
+		
+		if(setToTrue)
 		{
-			for(auto & connection : zonePtr.second->getConnections())
-			{
-				if(connection.getId() == id)
-				{
-					zonePtr.second->setRoadOption(id, setToTrue ? rmg::ERoadOption::ROAD_TRUE : rmg::ERoadOption::ROAD_FALSE);
-					
-					if(setToTrue)
-					{
-						directConnections[zoneA][zoneB] = true;
-						directConnections[zoneB][zoneA] = true;
-					}
-					
-					break;
-				}
-			}
+			directConnections[zoneA][zoneB] = true;
+			directConnections[zoneB][zoneA] = true;
 		}
 	}