diff --git a/lib/rmg/RmgArea.cpp b/lib/rmg/RmgArea.cpp index 3131bf188..1b6b6196e 100644 --- a/lib/rmg/RmgArea.cpp +++ b/lib/rmg/RmgArea.cpp @@ -376,6 +376,12 @@ void Area::translate(const int3 & shift) //toAbsolute(dTiles, shift); } +void Area::erase_if(std::function predicate) +{ + invalidate(); + vstd::erase_if(dTiles, predicate); +} + Area operator- (const Area & l, const int3 & r) { Area result(l); diff --git a/lib/rmg/RmgArea.h b/lib/rmg/RmgArea.h index 1755f22d8..f07bcd5e0 100644 --- a/lib/rmg/RmgArea.h +++ b/lib/rmg/RmgArea.h @@ -64,6 +64,7 @@ namespace rmg void intersect(const Area & area); void subtract(const Area & area); void translate(const int3 & shift); + void erase_if(std::function predicate); friend Area operator+ (const Area & l, const int3 & r); //translation friend Area operator- (const Area & l, const int3 & r); //translation diff --git a/lib/rmg/modificators/RoadPlacer.cpp b/lib/rmg/modificators/RoadPlacer.cpp index 498c4fab0..c7e30e0a2 100644 --- a/lib/rmg/modificators/RoadPlacer.cpp +++ b/lib/rmg/modificators/RoadPlacer.cpp @@ -18,9 +18,12 @@ #include "../threadpool/MapProxy.h" #include "../../CModHandler.h" #include "../../mapping/CMapEditManager.h" +#include "../../TerrainHandler.h" VCMI_LIB_NAMESPACE_BEGIN +class TerrainType; + void RoadPlacer::process() { if(generator.getConfig().defaultRoadType.empty() && generator.getConfig().secondaryRoadType.empty()) @@ -114,6 +117,13 @@ void RoadPlacer::drawRoads(bool secondary) //Clean space under roads even if they won't be eventually generated Zone::Lock lock(zone.areaMutex); + //Do not draw roads on underground rock or water + roads.erase_if([this](const int3& pos) -> bool + { + const auto* terrain = map.getTile(pos).terType;; + return !terrain->isPassable() || !terrain->isLand(); + }); + zone.areaPossible().subtract(roads); zone.freePaths().unite(roads); }