1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-17 01:32:21 +02:00

Place large obstacles first.

This commit is contained in:
DjWarmonger
2014-07-25 17:55:48 +02:00
parent 67d8a24f0b
commit a9ddeb665b
2 changed files with 27 additions and 6 deletions

View File

@ -1132,6 +1132,12 @@ void CRmgTemplateZone::createObstacles(CMapGenerator* gen)
// }); // });
//} //}
} }
typedef std::vector<ObjectTemplate> obstacleVector;
//obstacleVector possibleObstacles;
std::map <ui8, obstacleVector> obstaclesBySize;
typedef std::pair <ui8, obstacleVector> obstaclePair;
std::vector<obstaclePair> possibleObstacles;
//get all possible obstacles for this terrain //get all possible obstacles for this terrain
for (auto primaryID : VLC->objtypeh->knownObjects()) for (auto primaryID : VLC->objtypeh->knownObjects())
@ -1144,18 +1150,26 @@ void CRmgTemplateZone::createObstacles(CMapGenerator* gen)
for (auto temp : handler->getTemplates()) for (auto temp : handler->getTemplates())
{ {
if (temp.canBePlacedAt(terrainType) && temp.getBlockMapOffset().valid()) if (temp.canBePlacedAt(terrainType) && temp.getBlockMapOffset().valid())
possibleObstacles.push_back(temp); obstaclesBySize[temp.getBlockedOffsets().size()].push_back(temp);
} }
} }
} }
} }
for (auto o : obstaclesBySize)
{
possibleObstacles.push_back (std::make_pair(o.first, o.second));
}
boost::sort (possibleObstacles, [](obstaclePair &p1, obstaclePair &p2) -> bool
{
return p1.first > p2.first; //bigger obstacles first
});
auto sel = gen->editManager->getTerrainSelection(); auto sel = gen->editManager->getTerrainSelection();
sel.clearSelection(); sel.clearSelection();
auto tryToPlaceObstacleHere = [this, gen](int3& tile)-> bool auto tryToPlaceObstacleHere = [this, gen, &possibleObstacles](int3& tile, int index)-> bool
{ {
auto temp = *RandomGeneratorUtil::nextItem(possibleObstacles, gen->rand); auto temp = *RandomGeneratorUtil::nextItem(possibleObstacles[index].second, gen->rand);
int3 obstaclePos = tile - temp.getBlockMapOffset(); int3 obstaclePos = tile - temp.getBlockMapOffset();
if (canObstacleBePlacedHere(gen, temp, obstaclePos)) //can be placed here if (canObstacleBePlacedHere(gen, temp, obstaclePos)) //can be placed here
{ {
@ -1170,12 +1184,20 @@ void CRmgTemplateZone::createObstacles(CMapGenerator* gen)
{ {
if (gen->shouldBeBlocked(tile)) //fill tiles that should be blocked with obstacles if (gen->shouldBeBlocked(tile)) //fill tiles that should be blocked with obstacles
{ {
while (!tryToPlaceObstacleHere(tile)); //start from biggets obstacles
for (int i = 0; i < possibleObstacles.size(); i++)
{
if (tryToPlaceObstacleHere(tile, i))
break;
}
} }
else if (gen->isPossible(tile)) else if (gen->isPossible(tile))
{ {
//try to place random obstacle once - if not possible, leave it clear //try to place random obstacle once - if not possible, leave it clear
tryToPlaceObstacleHere(tile); tryToPlaceObstacleHere(tile, gen->rand.nextInt(0, possibleObstacles.size()-1));
//for (int i = 0; i < possibleObstacles.size(); i++)
// tryToPlaceObstacleHere(tile, i);
} }
} }
} }

View File

@ -197,7 +197,6 @@ private:
ui16 totalDensity; ui16 totalDensity;
std::vector<CTreasureInfo> treasureInfo; std::vector<CTreasureInfo> treasureInfo;
std::vector<ObjectInfo> possibleObjects; std::vector<ObjectInfo> possibleObjects;
std::vector<ObjectTemplate> possibleObstacles;
//content info //content info
std::vector<std::pair<CGObjectInstance*, ui32>> requiredObjects; std::vector<std::pair<CGObjectInstance*, ui32>> requiredObjects;