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->placeZones(rand.get());
|
||||||
placer->assignZones(rand.get());
|
placer->assignZones(rand.get());
|
||||||
|
placer->RemoveRoadsForWideConnections();
|
||||||
placer->dropRandomRoads(rand.get());
|
placer->dropRandomRoads(rand.get());
|
||||||
|
|
||||||
logGlobal->info("Zones generated successfully");
|
logGlobal->info("Zones generated successfully");
|
||||||
|
|||||||
@@ -1005,6 +1005,22 @@ void CZonePlacer::assignZones(vstd::RNG * rand)
|
|||||||
logGlobal->info("Finished zone colouring");
|
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)
|
TRmgTemplateZoneId findSet(std::map<TRmgTemplateZoneId, TRmgTemplateZoneId> & parent, TRmgTemplateZoneId x)
|
||||||
{
|
{
|
||||||
if(parent[x] != x)
|
if(parent[x] != x)
|
||||||
@@ -1020,6 +1036,15 @@ void unionSets(std::map<TRmgTemplateZoneId, TRmgTemplateZoneId> & parent, TRmgTe
|
|||||||
parent[rx] = ry;
|
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)
|
void CZonePlacer::dropRandomRoads(vstd::RNG * rand)
|
||||||
{
|
{
|
||||||
logGlobal->info("Starting road randomization");
|
logGlobal->info("Starting road randomization");
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ public:
|
|||||||
void placeOnGrid(vstd::RNG* rand);
|
void placeOnGrid(vstd::RNG* rand);
|
||||||
float scaleForceBetweenZones(const std::shared_ptr<Zone> zoneA, const std::shared_ptr<Zone> zoneB) const;
|
float scaleForceBetweenZones(const std::shared_ptr<Zone> zoneA, const std::shared_ptr<Zone> zoneB) const;
|
||||||
void assignZones(vstd::RNG * rand);
|
void assignZones(vstd::RNG * rand);
|
||||||
|
void RemoveRoadsForWideConnections();
|
||||||
void dropRandomRoads(vstd::RNG * rand);
|
void dropRandomRoads(vstd::RNG * rand);
|
||||||
|
|
||||||
const TDistanceMap & getDistanceMap();
|
const TDistanceMap & getDistanceMap();
|
||||||
|
|||||||
Reference in New Issue
Block a user