Explorar o código

+ Remove roads from wide connections BEFORE graph is generated
+ Explain all requirements in a commeny

Tomasz Zieliński hai 7 meses
pai
achega
863e469b4d
Modificáronse 3 ficheiros con 27 adicións e 0 borrados
  1. 1 0
      lib/rmg/CMapGenerator.cpp
  2. 25 0
      lib/rmg/CZonePlacer.cpp
  3. 1 0
      lib/rmg/CZonePlacer.h

+ 1 - 0
lib/rmg/CMapGenerator.cpp

@@ -328,6 +328,7 @@ void CMapGenerator::genZones()
 {
 	placer->placeZones(rand.get());
 	placer->assignZones(rand.get());
+	placer->RemoveRoadsForWideConnections();
 	placer->dropRandomRoads(rand.get());
 
 	logGlobal->info("Zones generated successfully");

+ 25 - 0
lib/rmg/CZonePlacer.cpp

@@ -1005,6 +1005,22 @@ void CZonePlacer::assignZones(vstd::RNG * rand)
 	logGlobal->info("Finished zone colouring");
 }
 
+void CZonePlacer::RemoveRoadsForWideConnections()
+{
+	auto zones = map.getZones();
+	
+	for(auto & zonePtr : zones)
+	{
+		for(auto & connection : zonePtr.second->getConnections())
+		{
+			if(connection.getConnectionType() == rmg::EConnectionType::WIDE)
+			{
+				zonePtr.second->setRoadOption(connection.getId(), rmg::ERoadOption::ROAD_FALSE);
+			}
+		}
+	}
+}
+
 TRmgTemplateZoneId findSet(std::map<TRmgTemplateZoneId, TRmgTemplateZoneId> & parent, TRmgTemplateZoneId x)
 {
 	if(parent[x] != x)
@@ -1020,6 +1036,15 @@ void unionSets(std::map<TRmgTemplateZoneId, TRmgTemplateZoneId> & parent, TRmgTe
 		parent[rx] = ry;
 }
 
+/*
+Random road generation requirements:
+- Every town should be connected via road
+- There should be exactly one road betwen any two towns (connected MST)
+	- This excludes cases when there are multiple road connetions betwween two zones
+- Road cannot end in a zone without town
+- Wide connections should have no road
+*/
+
 void CZonePlacer::dropRandomRoads(vstd::RNG * rand)
 {
 	logGlobal->info("Starting road randomization");

+ 1 - 0
lib/rmg/CZonePlacer.h

@@ -46,6 +46,7 @@ public:
 	void placeOnGrid(vstd::RNG* rand);
 	float scaleForceBetweenZones(const std::shared_ptr<Zone> zoneA, const std::shared_ptr<Zone> zoneB) const;
 	void assignZones(vstd::RNG * rand);
+	void RemoveRoadsForWideConnections();
 	void dropRandomRoads(vstd::RNG * rand);
 
 	const TDistanceMap & getDistanceMap();