mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-25 22:42:04 +02:00
Make sure that connection road is set to same value for both zones
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user