1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-03 14:52:11 +02:00

Hopefully fixed zone guards misplaced due to paths connecting at acute angles.

This commit is contained in:
DjWarmonger 2016-07-24 18:15:23 +02:00
parent 40f28778c2
commit d9556332e1

View File

@ -470,7 +470,6 @@ void CMapGenerator::createConnections()
//rearrange tiles in random order
auto tilesCopy = zoneA->getTileInfo();
std::vector<int3> tiles(tilesCopy.begin(), tilesCopy.end());
RandomGeneratorUtil::randomShuffle(tiles, rand);
int3 guardPos(-1,-1,-1);
@ -481,20 +480,36 @@ void CMapGenerator::createConnections()
if (posA.z == posB.z)
{
for (auto tile : tiles)
std::vector<int3> middleTiles;
for (auto tile : tilesCopy)
{
if (isBlocked(tile)) //tiles may be occupied by subterranean gates already placed
continue;
foreachDirectNeighbour (tile, [&guardPos, tile, &otherZoneTiles, this](int3 &pos) //must be direct since paths also also generated between direct neighbours
foreachDirectNeighbour (tile, [&guardPos, tile, &otherZoneTiles, &middleTiles, this](int3 &pos) //must be direct since paths also also generated between direct neighbours
{
//if (vstd::contains(otherZoneTiles, pos) && !this->isBlocked(pos))
if (vstd::contains(otherZoneTiles, pos))
guardPos = tile;
middleTiles.push_back(tile);
});
}
boost::sort(middleTiles, [](int3 &lhs, int3 &rhs) -> bool
{
//choose tiles with both corrdinates in the middle
return lhs.x + lhs.y < rhs.x + rhs.y;
});
//remove 1/4 tiles from each side - path shoudl cross zone borders at smooth angle
size_t removedCount = middleTiles.size() / 4; //rounded down
middleTiles.erase(middleTiles.end() - removedCount, middleTiles.end());
middleTiles.erase(middleTiles.begin(), middleTiles.begin() + removedCount);
RandomGeneratorUtil::randomShuffle(middleTiles, rand);
for (auto tile : middleTiles)
{
guardPos = tile;
if (guardPos.valid())
{
setOccupied (guardPos, ETileType::FREE); //just in case monster is too weak to spawn
zoneA->addMonster (this, guardPos, connection.getGuardStrength(), false, true);
setOccupied(guardPos, ETileType::FREE); //just in case monster is too weak to spawn
zoneA->addMonster(this, guardPos, connection.getGuardStrength(), false, true);
//zones can make paths only in their own area
zoneA->crunchPath(this, guardPos, posA, true, zoneA->getFreePaths()); //make connection towards our zone center
zoneB->crunchPath(this, guardPos, posB, true, zoneB->getFreePaths()); //make connection towards other zone center