mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-23 22:37:55 +02:00
+ Remove roads from wide connections BEFORE graph is generated
+ Explain all requirements in a commeny
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user