diff --git a/lib/rmg/CMapGenerator.cpp b/lib/rmg/CMapGenerator.cpp index fcfe4b697..a18d0a056 100644 --- a/lib/rmg/CMapGenerator.cpp +++ b/lib/rmg/CMapGenerator.cpp @@ -518,6 +518,8 @@ void CMapGenerator::createConnections() int3 tile = posA; int3 otherTile = tile; + auto sgt = VLC->objtypeh->getHandlerFor(Obj::SUBTERRANEAN_GATE, 0)->getTemplates().front(); + bool stop = false; while (!stop) { @@ -551,11 +553,15 @@ void CMapGenerator::createConnections() withinZone = false; }); - if (withinZone) + //make sure both gates has some free tiles below them + if (zoneA->getAccessibleOffset(this, sgt, tile).valid() && zoneB->getAccessibleOffset(this, sgt, otherTile).valid()) { - zoneA->placeSubterraneanGate(this, tile, connection.getGuardStrength()); - zoneB->placeSubterraneanGate(this, otherTile, connection.getGuardStrength()); - stop = true; //we are done, go to next connection + if (withinZone) + { + zoneA->placeSubterraneanGate(this, tile, connection.getGuardStrength()); + zoneB->placeSubterraneanGate(this, otherTile, connection.getGuardStrength()); + stop = true; //we are done, go to next connection + } } } } diff --git a/lib/rmg/CRmgTemplateZone.h b/lib/rmg/CRmgTemplateZone.h index d71e2acc9..6fe06486e 100644 --- a/lib/rmg/CRmgTemplateZone.h +++ b/lib/rmg/CRmgTemplateZone.h @@ -147,6 +147,8 @@ public: void setCenter(const float3 &f); int3 getPos() const; void setPos(const int3 &pos); + bool isAccessibleFromAnywhere(CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile) const; + int3 getAccessibleOffset(CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile) const; void addTile (const int3 &pos); void initFreeTiles (CMapGenerator* gen); @@ -239,8 +241,6 @@ private: bool pointIsIn(int x, int y); void addAllPossibleObjects (CMapGenerator* gen); //add objects, including zone-specific, to possibleObjects - bool isAccessibleFromAnywhere (CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile) const; - int3 getAccessibleOffset(CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile) const; bool findPlaceForObject(CMapGenerator* gen, CGObjectInstance* obj, si32 min_dist, int3 &pos); bool findPlaceForTreasurePile(CMapGenerator* gen, float min_dist, int3 &pos, int value); bool canObstacleBePlacedHere(CMapGenerator* gen, ObjectTemplate &temp, int3 &pos);