|
BWAPI
|
#include <TerrainAnaysis.h>

Definition at line 10 of file TerrainAnaysis.h.
Definition at line 15 of file TerrainAnaysis.cpp.
{
}
Definition at line 19 of file TerrainAnaysis.cpp.
References calculateConnectivity(), calculateWalkTileClearance(), createBases(), createRegions(), finaliseConnectivity(), and Singleton< T >::Instance().
{
calculateConnectivity();
calculateWalkTileClearance();
createRegions();
createBases();
BuildingPlacer::Instance().calculateReservations();
finaliseConnectivity();
BuildingPlacer::Instance().finaliseReservations();
}

| void TerrainAnaysisClass::calculateConnectivity | ( | ) | [private] |
Definition at line 237 of file TerrainAnaysis.cpp.
References BWAPI::Broodwar, BWAPI::Game::isWalkable(), BWAPI::Game::mapHeight(), BWAPI::Game::mapWidth(), mSmallObstacles, mTileConnectivity, and RectangleArray< T >::resize().
Referenced by analyseBasesAndTerrain().
{
int mapWidth = BWAPI::Broodwar->mapWidth() * 4;
int mapHeight = BWAPI::Broodwar->mapHeight() * 4;
int currentRegion = 1;
mTileConnectivity.resize(mapWidth, mapHeight, 0);
for(int x = 0; x < mapWidth; ++x)
{
for(int y = 0; y < mapHeight; ++y)
{
if(mTileConnectivity[x][y] != 0)
continue;
bool walkable = BWAPI::Broodwar->isWalkable(x, y);
int tileCount = 0;
std::set<WalkPosition> unvisitedTiles;
unvisitedTiles.insert(WalkPosition(x, y));
while(!unvisitedTiles.empty())
{
const std::set<WalkPosition>::iterator &tile = unvisitedTiles.begin();
++tileCount;
mTileConnectivity[tile->x][tile->y] = currentRegion;
if(tile->x > 0 && BWAPI::Broodwar->isWalkable(tile->x-1, tile->y) == walkable && mTileConnectivity[tile->x-1][tile->y] == 0)
unvisitedTiles.insert(WalkPosition(tile->x-1, tile->y));
if(tile->y > 0 && BWAPI::Broodwar->isWalkable(tile->x, tile->y-1) == walkable && mTileConnectivity[tile->x][tile->y-1] == 0)
unvisitedTiles.insert(WalkPosition(tile->x, tile->y-1));
if(tile->x < mapWidth-1 && BWAPI::Broodwar->isWalkable(tile->x+1, tile->y) == walkable && mTileConnectivity[tile->x+1][tile->y] == 0)
unvisitedTiles.insert(WalkPosition(tile->x+1, tile->y));
if(tile->y < mapHeight-1 && BWAPI::Broodwar->isWalkable(tile->x, tile->y+1) == walkable && mTileConnectivity[tile->x][tile->y+1] == 0)
unvisitedTiles.insert(WalkPosition(tile->x, tile->y+1));
unvisitedTiles.erase(tile);
}
if(!walkable && tileCount < 200)
mSmallObstacles.insert(currentRegion);
++currentRegion;
}
}
}


| void TerrainAnaysisClass::calculateWalkTileClearance | ( | ) | [private] |
Definition at line 72 of file TerrainAnaysis.cpp.
References BWAPI::Broodwar, Heap< Key, Val >::empty(), BWAPI::Game::mapHeight(), BWAPI::Game::mapWidth(), mSmallObstacles, mTileClearance, mTileClosestObstacle, mTileConnectivity, Heap< Key, Val >::pop(), RectangleArray< T >::resize(), Heap< Key, Val >::set(), Heap< Key, Val >::top(), WalkPosition::x, and WalkPosition::y.
Referenced by analyseBasesAndTerrain().
{
int mapWidth = BWAPI::Broodwar->mapWidth() * 4;
int mapHeight = BWAPI::Broodwar->mapHeight() * 4;
mTileClearance.resize(mapWidth, mapHeight, -1);
mTileClosestObstacle.resize(mapWidth, mapHeight);
Heap<WalkPosition, int> unvisitedTiles(true);
for(int x = 0; x < mapWidth; ++x)
{
for(int y = 0; y < mapHeight; ++y)
{
if(!BWAPI::Broodwar->isWalkable(x, y))
{
mTileClearance[x][y] = 0;
mTileClosestObstacle[x][y] = WalkPosition(x, y);
if(mSmallObstacles.count(mTileConnectivity[x][y]) == 0)
unvisitedTiles.set(WalkPosition(x, y), 0);
}
else if(x == 0 || y == 0 || x == mapWidth-1 || y == mapHeight-1)
{
mTileClearance[x][y] = 10;
mTileClosestObstacle[x][y] = WalkPosition((x == 0 ? -1 : (x == mapWidth-1 ? mapWidth : x)), (y == 0 ? -1 : (y == mapHeight-1 ? mapHeight : y)));
unvisitedTiles.set(WalkPosition(x, y), 10);
}
}
}
while(!unvisitedTiles.empty())
{
WalkPosition tile = unvisitedTiles.top().first;
const int distance = unvisitedTiles.top().second + 10;
const int diagDistance = distance + 4;
unvisitedTiles.pop();
const int west = tile.x - 1;
const int north = tile.y - 1;
const int east = tile.x + 1;
const int south = tile.y + 1;
const bool canGoWest = west >= 0;
const bool canGoNorth = north >= 0;
const bool canGoEast = east < mapWidth;
const bool canGoSouth = south < mapHeight;
const WalkPosition ¤tParent = mTileClosestObstacle[tile.x][tile.y];
if(canGoWest && (mTileClearance[west][tile.y] == -1 || distance < mTileClearance[west][tile.y]))
{
mTileClearance[west][tile.y] = distance;
mTileClosestObstacle[west][tile.y] = currentParent;
unvisitedTiles.set(WalkPosition(west, tile.y), distance);
}
if(canGoNorth && (mTileClearance[tile.x][north] == -1 || distance < mTileClearance[tile.x][north]))
{
mTileClearance[tile.x][north] = distance;
mTileClosestObstacle[tile.x][north] = currentParent;
unvisitedTiles.set(WalkPosition(tile.x, north), distance);
}
if(canGoEast && (mTileClearance[east][tile.y] == -1 || distance < mTileClearance[east][tile.y]))
{
mTileClearance[east][tile.y] = distance;
mTileClosestObstacle[east][tile.y] = currentParent;
unvisitedTiles.set(WalkPosition(east, tile.y), distance);
}
if(canGoSouth && (mTileClearance[tile.x][south] == -1 || distance < mTileClearance[tile.x][south]))
{
mTileClearance[tile.x][south] = distance;
mTileClosestObstacle[tile.x][south] = currentParent;
unvisitedTiles.set(WalkPosition(tile.x, south), distance);
}
if(canGoWest && canGoNorth && (mTileClearance[west][north] == -1 || diagDistance < mTileClearance[west][north]))
{
mTileClearance[west][north] = diagDistance;
mTileClosestObstacle[west][north] = currentParent;
unvisitedTiles.set(WalkPosition(west, north), diagDistance);
}
if(canGoEast && canGoSouth && (mTileClearance[east][south] == -1 || diagDistance < mTileClearance[east][south]))
{
mTileClearance[east][south] = diagDistance;
mTileClosestObstacle[east][south] = currentParent;
unvisitedTiles.set(WalkPosition(east, south), diagDistance);
}
if(canGoEast && canGoNorth && (mTileClearance[east][north] == -1 || diagDistance < mTileClearance[east][north]))
{
mTileClearance[east][north] = diagDistance;
mTileClosestObstacle[east][north] = currentParent;
unvisitedTiles.set(WalkPosition(east, north), diagDistance);
}
if(canGoWest && canGoSouth && (mTileClearance[west][south] == -1 || diagDistance < mTileClearance[west][south]))
{
mTileClearance[west][south] = diagDistance;
mTileClosestObstacle[west][south] = currentParent;
unvisitedTiles.set(WalkPosition(west, south), diagDistance);
}
}
}


| void TerrainAnaysisClass::createBases | ( | ) | [private] |
Definition at line 594 of file TerrainAnaysis.cpp.
References UnitGroup::begin(), BWAPI::Broodwar, UnitGroup::end(), BWAPI::Position::getApproxDistance(), UnitGroup::getCenter(), UnitHelper::getClusters(), Singleton< T >::Instance(), BWAPI::Game::mapHeight(), BWAPI::Game::mapWidth(), mRegions, mTileToRegion, MapHelper::spiralSearch(), BWAPI::TilePosition::x(), and BWAPI::TilePosition::y().
Referenced by analyseBasesAndTerrain().
{
//Create a set of all Geysers and all mineral patches with more than 200 minerals
UnitGroup resources = UnitTracker::Instance().getGeysers();
for each(Unit mineral in UnitTracker::Instance().getMinerals())
{
if(mineral->getResources() > 200)
resources.insert(mineral);
}
//Group them into clusters
std::vector<UnitGroup> resourceClusters = UnitHelper::getClusters(resources, 260, 3);
//TODO: create the bases on the fly rather then collect information then create
std::set<TilePosition> basesToCreate;
std::map<TilePosition, UnitGroup> baseToCreateToMineral;
std::map<TilePosition, bool> baseIsRegionBase;
std::map<TilePosition, bool> baseToCreateIsStartLocation;
std::map<TilePosition, Region> baseToRegion;
std::map<Region, std::set<TilePosition>> baseToCreateFromRegion;
for each(UnitGroup resourceCluster in resourceClusters)
{
TilePosition baseLocation;
PossibleLocationCompare locationCompare(&resourceCluster, &baseLocation);
MapHelper::spiralSearch(TilePosition(resourceCluster.getCenter()), locationCompare, 18);
bool addedToOther = false;
for(std::map<TilePosition, UnitGroup>::iterator it = baseToCreateToMineral.begin(); it != baseToCreateToMineral.end(); ++it)
{
int dx = abs(baseLocation.x() - it->first.x());
int dy = abs(baseLocation.y() - it->first.y());
if(dx <= 4 && dy <= 3)
{
it->second.insert(resourceCluster.begin(), resourceCluster.end());
addedToOther = true;
break;
}
}
if(!addedToOther)
{
basesToCreate.insert(baseLocation);
baseToCreateToMineral[baseLocation] = resourceCluster;
}
}
for each(TilePosition base in basesToCreate)
{
Region region = mTileToRegion[base.x() * 4][base.y() * 4];
if(region)
{
baseToCreateFromRegion[region].insert(base);
baseToRegion[base] = region;
}
}
RectangleArray<TilePosition> tileToBase(BWAPI::Broodwar->mapWidth(), BWAPI::Broodwar->mapHeight());
std::map<TilePosition, std::set<TilePosition>> baseToTiles;
for(int x = 0; x < BWAPI::Broodwar->mapWidth(); ++x)
{
for(int y = 0; y < BWAPI::Broodwar->mapHeight(); ++y)
{
Region region = mTileToRegion[x*4][y*4];
//This isn't a region, so find the closest Region
if(!region || region->getClearance() < 80)
{
int distance = std::numeric_limits<int>::max();
for each(Region reg in mRegions)
{
if(reg->getClearance() < 80)
continue;
int thisDistance = reg->getCenter().getApproxDistance(Position(x*32, y*32));
if(thisDistance < distance)
{
distance = thisDistance;
region = reg;
}
}
}
// Still hasn't got a region? something must be wrong with the analysis
if(!region)
return;
// Dont already have a base for this region
if(baseToCreateFromRegion.count(region) == 0)
{
TilePosition newBase = TilePosition(region->getCenter());
basesToCreate.insert(newBase);
baseToCreateFromRegion[region].insert(newBase);
baseToRegion[newBase] = region;
tileToBase[x][y] = newBase;
baseToTiles[newBase].insert(TilePosition(x, y));
baseIsRegionBase[newBase] = true;
}
// Have 1 base exactly, use it
else if(baseToCreateFromRegion[region].size() == 1)
{
TilePosition base = *baseToCreateFromRegion[region].begin();
tileToBase[x][y] = base;
baseToTiles[base].insert(TilePosition(x, y));
}
// Find the closest from the possibilities
else
{
TilePosition baseToUse;
int distance = std::numeric_limits<int>::max();
for each(TilePosition base in baseToCreateFromRegion[region])
{
int thisDistance = Position(base).getApproxDistance(Position(x*32, y*32));
if(thisDistance < distance)
{
distance = thisDistance;
baseToUse = base;
}
}
tileToBase[x][y] = baseToUse;
baseToTiles[baseToUse].insert(TilePosition(x, y));
}
}
}
for each(TilePosition startLocation in BWAPI::Broodwar->getStartLocations())
{
baseToCreateIsStartLocation[tileToBase[startLocation.x()][startLocation.y()]] = true;
}
for each(TilePosition base in basesToCreate)
{
Base newBase;
if(baseIsRegionBase[base])
newBase = BaseTracker::Instance().createBase(baseToTiles[base], baseToRegion[base], baseToCreateIsStartLocation[base]);
else
newBase = BaseTracker::Instance().createBase(baseToTiles[base], baseToRegion[base], baseToCreateIsStartLocation[base], base, baseToCreateToMineral[base]);
newBase->getRegion()->addBase(newBase);
}
}


| void TerrainAnaysisClass::createRegions | ( | ) | [private] |
Definition at line 285 of file TerrainAnaysis.cpp.
References BWAPI::Broodwar, Heap< Key, Val >::empty(), Heap< Key, Val >::erase(), findChokePoint(), WalkPosition::getCenterPosition(), getRegions(), Singleton< T >::Instance(), LOGMESSAGEWARNING, BWAPI::CoordinateType::Map, BWAPI::Game::mapHeight(), BWAPI::Game::mapWidth(), mChokepoints, mRegions, mTileClearance, mTileToRegion, Heap< Key, Val >::pop(), BWAPI::Colors::Red, removeChokepoint(), RectangleArray< T >::resize(), Heap< Key, Val >::set(), Heap< Key, Val >::top(), WalkPosition::x, and WalkPosition::y.
Referenced by analyseBasesAndTerrain().
{
int mapWidth = BWAPI::Broodwar->mapWidth() * 4;
int mapHeight = BWAPI::Broodwar->mapHeight() * 4;
// This comment is self explanatory.
mTileToRegion.resize(mapWidth, mapHeight);
std::map<WalkPosition, Chokepoint> chokeTiles;
for(;;)
{
int currentRegionClearance = 0;
WalkPosition currentRegionTile;
for(int x = 0; x < mapWidth; ++x)
{
for(int y = 0; y < mapHeight; ++y)
{
if(mTileToRegion[x][y])
continue;
if(chokeTiles.count(WalkPosition(x, y)) != 0)
continue;
const int localMaximaValue = mTileClearance[x][y];
if(localMaximaValue > currentRegionClearance)
{
currentRegionClearance = localMaximaValue;
currentRegionTile.x = x;
currentRegionTile.y = y;
}
}
}
if(currentRegionClearance == 0)
break;
Region currentRegion(new RegionClass(currentRegionTile.getCenterPosition(), currentRegionClearance));
mRegions.insert(currentRegion);
std::map<WalkPosition, WalkPosition> tileToLastMinima;
std::map<WalkPosition, std::vector<WalkPosition>> tileToChildren;
Heap<WalkPosition, int> unvisitedTiles(false);
unvisitedTiles.set(currentRegionTile, currentRegionClearance);
tileToLastMinima[currentRegionTile] = currentRegionTile;
while(!unvisitedTiles.empty())
{
WalkPosition currentTile = unvisitedTiles.top().first;
int currentTileClearance = unvisitedTiles.top().second;
unvisitedTiles.pop();
if(chokeTiles.count(currentTile) != 0)
{
if(chokeTiles[currentTile]->getRegions().second && chokeTiles[currentTile]->getRegions().second != currentRegion)
{
DrawBuffer::Instance().drawBufferedBox(BWAPI::CoordinateType::Map, currentTile.x * 8, currentTile.y * 8, currentTile.x * 8 + 8, currentTile.y * 8 + 8, 999999, BWAPI::Colors::Red);
LOGMESSAGEWARNING("Touched a choke saved to anouther region");
}
else if(chokeTiles[currentTile]->getRegions().first != currentRegion)
{
currentRegion->addChokepoint(chokeTiles[currentTile]);
chokeTiles[currentTile]->setRegion2(currentRegion);
}
continue;
}
if(mTileToRegion[currentTile.x][currentTile.y])
{
LOGMESSAGEWARNING("2 regions possibly connected without a choke");
continue;
}
WalkPosition lastMinima = tileToLastMinima[currentTile];
const int chokeSize = mTileClearance[lastMinima.x][lastMinima.y];
bool foundChokepoint = false;
if(chokeSize < int(float(currentRegionClearance)*0.90f) && chokeSize < int(float(currentTileClearance)*0.80f))
foundChokepoint = true;
if(foundChokepoint)
{
const int minDistance = 32;
if((abs(currentRegionTile.x - lastMinima.x) + abs(currentRegionTile.y - lastMinima.y)) < minDistance)
foundChokepoint = false;
else if((abs(currentTile.x - lastMinima.x) + abs(currentTile.y - lastMinima.y)) < minDistance)
foundChokepoint = false;
else if(currentTileClearance < 120)
foundChokepoint = false;
}
if(foundChokepoint)
{
const std::pair<WalkPosition, WalkPosition> &chokeSides = findChokePoint(lastMinima);
Chokepoint currentChokepoint(new ChokepointClass(chokeSides.first.getCenterPosition(), chokeSides.second.getCenterPosition(), chokeSize));
mChokepoints.insert(currentChokepoint);
currentChokepoint->setRegion1(currentRegion);
currentRegion->addChokepoint(currentChokepoint);
int x0 = chokeSides.second.x;
int y0 = chokeSides.second.y;
int x1 = chokeSides.first.x;
int y1 = chokeSides.first.y;
int dx = abs(x1 - x0);
int dy = abs(y1 - y0);
int sx = x0 < x1 ? 1 : -1;
int sy = y0 < y1 ? 1 : -1;
int error = dx - dy;
std::set<WalkPosition> chokeChildren;
for(;;)
{
if(x0 >= 0 && y0 >= 0 && x0 < mapWidth && y0 < mapHeight && mTileClearance[x0][y0] != 0 && !mTileToRegion[x0][y0])
{
const WalkPosition thisChokeTile(x0, y0);
tileToChildren[currentRegionTile].push_back(thisChokeTile);
chokeTiles[thisChokeTile] = currentChokepoint;
chokeChildren.insert(thisChokeTile);
}
if(x0 == x1 && y0 == y1)
break;
int e2 = error*2;
if(e2 > -dy)
{
error -= dy;
x0 += sx;
}
if(e2 < dx)
{
error += dx;
y0 += sy;
}
}
while(!chokeChildren.empty())
{
std::set<WalkPosition>::iterator currentTile = chokeChildren.begin();
tileToLastMinima.erase(*currentTile);
unvisitedTiles.erase(*currentTile);
for each(WalkPosition nextTile in tileToChildren[*currentTile])
{
chokeChildren.insert(nextTile);
}
tileToChildren.erase(*currentTile);
chokeChildren.erase(currentTile);
}
}
else
{
if(mTileClearance[currentTile.x][currentTile.y] < chokeSize)
lastMinima = currentTile;
for(int i = 0; i < 4; ++i)
{
int x = (i == 0 ? currentTile.x-1 : (i == 1 ? currentTile.x+1 : currentTile.x));
int y = (i == 2 ? currentTile.y-1 : (i == 3 ? currentTile.y+1 : currentTile.y));
if(x < 0 || y < 0 || x >= mapWidth || y >= mapHeight)
continue;
if(mTileClearance[x][y] == 0)
continue;
const WalkPosition nextTile(x, y);
if(tileToLastMinima.count(nextTile) == 0)
{
tileToLastMinima[nextTile] = lastMinima;
tileToChildren[currentTile].push_back(nextTile);
unvisitedTiles.set(nextTile, mTileClearance[x][y]);
}
}
}
}
std::set<WalkPosition> tileSteps;
tileSteps.insert(currentRegionTile);
int regionSize = 1;
while(!tileSteps.empty())
{
std::set<WalkPosition>::iterator currentTile = tileSteps.begin();
++regionSize;
for each(WalkPosition nextTile in tileToChildren[*currentTile])
{
tileSteps.insert(nextTile);
}
mTileToRegion[currentTile->x][currentTile->y] = currentRegion;
tileSteps.erase(currentTile);
}
currentRegion->setSize(regionSize);
}
for(std::set<Chokepoint>::iterator it = mChokepoints.begin(); it != mChokepoints.end();)
{
if(!(*it)->getRegions().first || !(*it)->getRegions().second || (*it)->getRegions().first == (*it)->getRegions().second)
removeChokepoint(*(it++));
else
++it;
}
}


Definition at line 56 of file TerrainAnaysis.cpp.
References mChokepoints, mRegions, and MapHelper::spiralSearch().
Referenced by analyseBasesAndTerrain().
{
for each(Region region in mRegions)
{
WalkInRegionComp goCompare(region);
for each(Chokepoint chokepoint in mChokepoints)
{
TilePosition pos = MapHelper::spiralSearch(TilePosition(chokepoint->getCenter()), goCompare, 24);
region->addChokepointTile(chokepoint, pos);
chokepoint->addChokepointTile(region, pos);
}
}
}


| std::pair< WalkPosition, WalkPosition > TerrainAnaysisClass::findChokePoint | ( | WalkPosition | center | ) | [private] |
Definition at line 178 of file TerrainAnaysis.cpp.
References BWAPI::Broodwar, Vector::dotProduct(), BWAPI::Game::mapHeight(), BWAPI::Game::mapWidth(), mTileClosestObstacle, Vector::normalise(), WalkPosition::x, and WalkPosition::y.
Referenced by createRegions().
{
WalkPosition side1 = mTileClosestObstacle[center.x][center.y];
if(side1 == center)
return std::make_pair(side1, side1);
Vector side1Direction(side1.x - center.x, side1.y - center.y);
side1Direction.normalise();
int mapWidth = BWAPI::Broodwar->mapWidth() * 4;
int mapHeight = BWAPI::Broodwar->mapHeight() * 4;
int x0 = side1.x;
int y0 = side1.y;
int x1 = center.x;
int y1 = center.y;
int dx = abs(x1 - x0);
int dy = abs(y1 - y0);
int sx = x0 < x1 ? 1 : -1;
int sy = y0 < y1 ? 1 : -1;
x0 = x1;
y0 = y1;
int error = dx - dy;
for(;;)
{
if(x0 < 0 || y0 < 0 || x0 >= mapWidth || y0 >= mapHeight || !BWAPI::Broodwar->isWalkable(x0, y0))
return std::make_pair(side1, WalkPosition(x0, y0));
WalkPosition side2 = mTileClosestObstacle[x0][y0];
Vector side2Direction(side2.x - center.x, side2.y - center.y);
side2Direction.normalise();
float dot = side2Direction.dotProduct(side1Direction);
float angle = acos(dot);
if(angle > 2.0f)
return std::make_pair(side1, side2);
int e2 = error*2;
if(e2 > -dy)
{
error -= dy;
x0 += sx;
}
if(e2 < dx)
{
error += dx;
y0 += sy;
}
}
}


| const std::set<Chokepoint>& TerrainAnaysisClass::getChokepoints | ( | ) | const [inline] |
| const Region& TerrainAnaysisClass::getRegion | ( | TilePosition | tile | ) | const [inline] |
Definition at line 21 of file TerrainAnaysis.h.
References mTileToRegion, BWAPI::TilePosition::x(), and BWAPI::TilePosition::y().
{ return mTileToRegion[tile.x()*4][tile.y()*4]; }

| const Region& TerrainAnaysisClass::getRegion | ( | Position | pos | ) | const [inline] |
Definition at line 22 of file TerrainAnaysis.h.
References mTileToRegion, BWAPI::Position::x(), and BWAPI::Position::y().
{ return mTileToRegion[pos.x()/8][pos.y()/8]; }

| const Region& TerrainAnaysisClass::getRegion | ( | WalkPosition | tile | ) | const [inline] |
Definition at line 23 of file TerrainAnaysis.h.
References mTileToRegion, WalkPosition::x, and WalkPosition::y.
{ return mTileToRegion[tile.x][tile.y]; }
| const Region& TerrainAnaysisClass::getRegion | ( | int | x, |
| int | y | ||
| ) | const [inline] |
Definition at line 24 of file TerrainAnaysis.h.
References mTileToRegion.
{ return mTileToRegion[x][y]; }
| const std::set<Region>& TerrainAnaysisClass::getRegions | ( | ) | const [inline] |
Definition at line 18 of file TerrainAnaysis.h.
References mRegions.
Referenced by createRegions().
{ return mRegions; }

| int TerrainAnaysisClass::getWalkClearance | ( | WalkPosition | currentTile | ) | [inline] |
Definition at line 26 of file TerrainAnaysis.h.
References mTileClearance, WalkPosition::x, and WalkPosition::y.
{ return mTileClearance[currentTile.x][currentTile.y]; }
| int TerrainAnaysisClass::getWalkClearance | ( | int | x, |
| int | y | ||
| ) | [inline] |
Definition at line 27 of file TerrainAnaysis.h.
References mTileClearance.
{ return mTileClearance[x][y]; }
| int TerrainAnaysisClass::getWalkConnectivity | ( | WalkPosition | currentTile | ) | [inline] |
Definition at line 29 of file TerrainAnaysis.h.
References mTileConnectivity, WalkPosition::x, and WalkPosition::y.
{ return mTileConnectivity[currentTile.x][currentTile.y]; }
| int TerrainAnaysisClass::getWalkConnectivity | ( | int | x, |
| int | y | ||
| ) | [inline] |
Definition at line 30 of file TerrainAnaysis.h.
References mTileConnectivity.
{ return mTileConnectivity[x][y]; }
| void TerrainAnaysisClass::removeChokepoint | ( | Chokepoint | chokeToRemove | ) | [private] |
Definition at line 742 of file TerrainAnaysis.cpp.
References LOGMESSAGEWARNING.
Referenced by createRegions().
{
//Removes a chokepoint and if its a real one will merge the 2 regions
Region reg1 = chokeToRemove->getRegions().first;
Region reg2 = chokeToRemove->getRegions().second;
if(reg1)
reg1->removeChokepoint(chokeToRemove);
if(reg2 && reg2 != reg1)
reg2->removeChokepoint(chokeToRemove);
// choke is real, need to merge the regions
if(reg1 && reg2 && reg1 != reg2)
{
LOGMESSAGEWARNING("Tries to Merge 2 regions but is not implemented");
}
}
std::set<Chokepoint> TerrainAnaysisClass::mChokepoints [private] |
Definition at line 33 of file TerrainAnaysis.h.
Referenced by createRegions(), finaliseConnectivity(), and getChokepoints().
std::set<Region> TerrainAnaysisClass::mRegions [private] |
Definition at line 34 of file TerrainAnaysis.h.
Referenced by createBases(), createRegions(), finaliseConnectivity(), and getRegions().
std::set<int> TerrainAnaysisClass::mSmallObstacles [private] |
Definition at line 38 of file TerrainAnaysis.h.
Referenced by calculateConnectivity(), and calculateWalkTileClearance().
RectangleArray<int> TerrainAnaysisClass::mTileClearance [private] |
Definition at line 40 of file TerrainAnaysis.h.
Referenced by calculateWalkTileClearance(), createRegions(), and getWalkClearance().
Definition at line 41 of file TerrainAnaysis.h.
Referenced by calculateWalkTileClearance(), and findChokePoint().
RectangleArray<int> TerrainAnaysisClass::mTileConnectivity [private] |
Definition at line 37 of file TerrainAnaysis.h.
Referenced by calculateConnectivity(), calculateWalkTileClearance(), and getWalkConnectivity().
Definition at line 35 of file TerrainAnaysis.h.
Referenced by createBases(), createRegions(), and getRegion().
1.7.6.1