|
|
@@ -398,12 +398,13 @@ void CRmgTemplateZone::createBorder(CMapGenerator* gen)
|
|
|
|
|
|
void CRmgTemplateZone::fractalize(CMapGenerator* gen)
|
|
|
{
|
|
|
- std::vector<int3> clearedTiles;
|
|
|
+ std::vector<int3> clearedTiles (freePaths.begin(), freePaths.end());
|
|
|
std::set<int3> possibleTiles;
|
|
|
std::set<int3> tilesToClear; //will be set clear
|
|
|
std::set<int3> tilesToIgnore; //will be erased in this iteration
|
|
|
|
|
|
- const float minDistance = std::sqrt(totalDensity);
|
|
|
+ //the more treasure density, the greater distance between paths. Scaling is experimental.
|
|
|
+ const float minDistance = std::sqrt(totalDensity * 3);
|
|
|
for (auto tile : tileinfo)
|
|
|
{
|
|
|
if (gen->isFree(tile))
|
|
|
@@ -464,6 +465,34 @@ void CRmgTemplateZone::fractalize(CMapGenerator* gen)
|
|
|
tilesToClear.clear(); //empty this container
|
|
|
tilesToIgnore.clear();
|
|
|
}
|
|
|
+
|
|
|
+ for (auto tile : clearedTiles)
|
|
|
+ {
|
|
|
+ freePaths.insert(tile);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if (0) //enable to debug
|
|
|
+ {
|
|
|
+ std::ofstream out(boost::to_string(boost::format("zone %d") % id));
|
|
|
+ int levels = gen->map->twoLevel ? 2 : 1;
|
|
|
+ int width = gen->map->width;
|
|
|
+ int height = gen->map->height;
|
|
|
+ for (int k = 0; k < levels; k++)
|
|
|
+ {
|
|
|
+ for(int j=0; j<height; j++)
|
|
|
+ {
|
|
|
+ for (int i=0; i<width; i++)
|
|
|
+ {
|
|
|
+ out << (int)vstd::contains(freePaths, int3(i,j,k));
|
|
|
+ }
|
|
|
+ out << std::endl;
|
|
|
+ }
|
|
|
+ out << std::endl;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
logGlobal->infoStream() << boost::format ("Zone %d subdivided fractally") %id;
|
|
|
}
|
|
|
|
|
|
@@ -700,7 +729,7 @@ bool CRmgTemplateZone::createTreasurePile (CMapGenerator* gen, int3 &pos)
|
|
|
}
|
|
|
}
|
|
|
assert (closestTile.valid());
|
|
|
- if (!crunchPath (gen, closestTile, getPos(), id)) //make sure pile is connected to the middle of zone
|
|
|
+ if (!crunchPath (gen, closestTile, findClosestTile(freePaths, closestTile), id)) //make sure pile is connected to the middle of zone
|
|
|
{
|
|
|
for (auto treasure : treasures)
|
|
|
{
|
|
|
@@ -1301,7 +1330,7 @@ bool CRmgTemplateZone::guardObject(CMapGenerator* gen, CGObjectInstance* object,
|
|
|
for (auto tile : tiles)
|
|
|
{
|
|
|
//crunching path may fail if center of teh zone is dirrectly over wide object
|
|
|
- if (crunchPath (gen, tile, getPos(), id)) //make sure object is accessible before surrounding it with blocked tiles
|
|
|
+ if (crunchPath (gen, tile, findClosestTile(freePaths, tile), id)) //make sure object is accessible before surrounding it with blocked tiles
|
|
|
{
|
|
|
guardTile = tile;
|
|
|
break;
|