mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-13 19:54:17 +02:00
Allow routing road behind objects not visitable from top if that's absolutely neccessary.
This commit is contained in:
@@ -54,22 +54,52 @@ const rmg::Area & RoadPlacer::getRoads() const
|
||||
|
||||
bool RoadPlacer::createRoad(const int3 & dst)
|
||||
{
|
||||
auto searchArea = zone.areaPossible() + areaRoads + zone.freePaths() - isolated + roads;
|
||||
|
||||
auto searchArea = zone.areaPossible() + zone.freePaths() + areaRoads + roads;
|
||||
|
||||
rmg::Path path(searchArea);
|
||||
path.connect(roads);
|
||||
|
||||
auto simpleRoutig = [this](const int3& src, const int3& dst)
|
||||
{
|
||||
if(areaIsolated().contains(dst))
|
||||
{
|
||||
return 1000.0f; //Do not route road behind objects that are not visitable from top
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1.0f;
|
||||
}
|
||||
};
|
||||
|
||||
auto res = path.search(dst, true);
|
||||
auto res = path.search(dst, true, simpleRoutig);
|
||||
if(!res.valid())
|
||||
{
|
||||
res = path.search(dst, false, [](const int3 & src, const int3 & dst)
|
||||
auto desperateRoutig = [this](const int3& src, const int3& dst) -> float
|
||||
{
|
||||
//Do not allow connections straight up through object not visitable from top
|
||||
if(std::abs((src - dst).y) == 1)
|
||||
{
|
||||
if(areaIsolated().contains(dst) || areaIsolated().contains(src))
|
||||
{
|
||||
return 1e30;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(areaIsolated().contains(dst))
|
||||
{
|
||||
return 1e6;
|
||||
}
|
||||
}
|
||||
|
||||
float weight = dst.dist2dSQ(src);
|
||||
return weight * weight;
|
||||
});
|
||||
};
|
||||
res = path.search(dst, false, desperateRoutig);
|
||||
|
||||
if(!res.valid())
|
||||
{
|
||||
logGlobal->warn("Failed to create road");
|
||||
logGlobal->warn("Failed to create road to node %s", dst.toString());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -149,7 +179,19 @@ void RoadPlacer::connectRoads()
|
||||
|
||||
for(const auto & node : roadNodes)
|
||||
{
|
||||
createRoad(node);
|
||||
try
|
||||
{
|
||||
createRoad(node);
|
||||
}
|
||||
catch (const rmgException& e)
|
||||
{
|
||||
logGlobal->warn("Handled exception while drawing road to node %s: %s", node.toString(), e.what());
|
||||
}
|
||||
catch (const std::exception & e)
|
||||
{
|
||||
logGlobal->error("Unhandled exception while drawing road to node %s: %s", node.toString(), e.what());
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
//Draw dirt roads if there are only mines
|
||||
|
Reference in New Issue
Block a user