1
0
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:
Tomasz Zieliński
2025-03-20 17:30:37 +01:00
parent 6327e268f3
commit 237f6ebb1c

View File

@@ -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;
}
}