mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-10 22:31:40 +02:00
GetClosestTile refactor
This commit is contained in:
@@ -24,36 +24,68 @@ BattleHexArray::BattleHexArray(std::initializer_list<BattleHex> initList) noexce
|
|||||||
|
|
||||||
BattleHex BattleHexArray::getClosestTile(BattleSide side, BattleHex initialPos) const
|
BattleHex BattleHexArray::getClosestTile(BattleSide side, BattleHex initialPos) const
|
||||||
{
|
{
|
||||||
|
if(this->empty())
|
||||||
|
return BattleHex();
|
||||||
|
|
||||||
BattleHex initialHex = BattleHex(initialPos);
|
BattleHex initialHex = BattleHex(initialPos);
|
||||||
auto compareDistance = [initialHex](const BattleHex left, const BattleHex right) -> bool
|
int closestDistance = std::numeric_limits<int>::max();
|
||||||
|
BattleHexArray closestTiles;
|
||||||
|
|
||||||
|
for(auto hex : internalStorage)
|
||||||
{
|
{
|
||||||
return initialHex.getDistance(initialHex, left) < initialHex.getDistance(initialHex, right);
|
int distance = initialHex.getDistance(initialHex, hex);
|
||||||
};
|
if(distance < closestDistance)
|
||||||
BattleHexArray sortedTiles(*this);
|
{
|
||||||
boost::sort(sortedTiles, compareDistance); //closest tiles at front
|
closestDistance = distance;
|
||||||
int closestDistance = initialHex.getDistance(initialPos, sortedTiles.front()); //sometimes closest tiles can be many hexes away
|
closestTiles.clear();
|
||||||
auto notClosest = [closestDistance, initialPos](const BattleHex here) -> bool
|
closestTiles.insert(hex);
|
||||||
{
|
}
|
||||||
return closestDistance < here.getDistance(initialPos, here);
|
else if(distance == closestDistance)
|
||||||
};
|
closestTiles.insert(hex);
|
||||||
vstd::erase_if(sortedTiles, notClosest); //only closest tiles are interesting
|
}
|
||||||
auto compareHorizontal = [side, initialPos](const BattleHex left, const BattleHex right) -> bool
|
|
||||||
|
auto compareHorizontal = [side, initialPos](const BattleHex & left, const BattleHex & right)
|
||||||
{
|
{
|
||||||
if(left.getX() != right.getX())
|
if(left.getX() != right.getX())
|
||||||
{
|
{
|
||||||
if(side == BattleSide::ATTACKER)
|
return (side == BattleSide::ATTACKER) ? (left.getX() > right.getX()) : (left.getX() < right.getX());
|
||||||
return left.getX() > right.getX(); //find furthest right
|
|
||||||
else
|
|
||||||
return left.getX() < right.getX(); //find furthest left
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Prefer tiles in the same row.
|
|
||||||
return std::abs(left.getY() - initialPos.getY()) < std::abs(right.getY() - initialPos.getY());
|
|
||||||
}
|
}
|
||||||
|
return std::abs(left.getY() - initialPos.getY()) < std::abs(right.getY() - initialPos.getY());
|
||||||
};
|
};
|
||||||
boost::sort(sortedTiles, compareHorizontal);
|
|
||||||
return sortedTiles.front();
|
auto bestTile = std::min_element(closestTiles.begin(), closestTiles.end(), compareHorizontal);
|
||||||
|
return (bestTile != closestTiles.end()) ? *bestTile : BattleHex();
|
||||||
|
|
||||||
|
//BattleHex initialHex = BattleHex(initialPos);
|
||||||
|
//auto compareDistance = [initialHex](const BattleHex left, const BattleHex right) -> bool
|
||||||
|
//{
|
||||||
|
// return initialHex.getDistance(initialHex, left) < initialHex.getDistance(initialHex, right);
|
||||||
|
//};
|
||||||
|
//BattleHexArray sortedTiles(*this);
|
||||||
|
//boost::sort(sortedTiles, compareDistance); //closest tiles at front
|
||||||
|
//int closestDistance = initialHex.getDistance(initialPos, sortedTiles.front()); //sometimes closest tiles can be many hexes away
|
||||||
|
//auto notClosest = [closestDistance, initialPos](const BattleHex here) -> bool
|
||||||
|
//{
|
||||||
|
// return closestDistance < here.getDistance(initialPos, here);
|
||||||
|
//};
|
||||||
|
//vstd::erase_if(sortedTiles, notClosest); //only closest tiles are interesting
|
||||||
|
//auto compareHorizontal = [side, initialPos](const BattleHex left, const BattleHex right) -> bool
|
||||||
|
//{
|
||||||
|
// if(left.getX() != right.getX())
|
||||||
|
// {
|
||||||
|
// if(side == BattleSide::ATTACKER)
|
||||||
|
// return left.getX() > right.getX(); //find furthest right
|
||||||
|
// else
|
||||||
|
// return left.getX() < right.getX(); //find furthest left
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// //Prefer tiles in the same row.
|
||||||
|
// return std::abs(left.getY() - initialPos.getY()) < std::abs(right.getY() - initialPos.getY());
|
||||||
|
// }
|
||||||
|
//};
|
||||||
|
//boost::sort(sortedTiles, compareHorizontal);
|
||||||
|
//return sortedTiles.front();
|
||||||
}
|
}
|
||||||
|
|
||||||
BattleHexArray::NeighbouringTilesCache BattleHexArray::calculateNeighbouringTiles()
|
BattleHexArray::NeighbouringTilesCache BattleHexArray::calculateNeighbouringTiles()
|
||||||
|
@@ -60,6 +60,9 @@ BattleHexArray Unit::getSurroundingHexes(BattleHex assumedPosition) const
|
|||||||
|
|
||||||
BattleHexArray Unit::getSurroundingHexes(BattleHex position, bool twoHex, BattleSide side)
|
BattleHexArray Unit::getSurroundingHexes(BattleHex position, bool twoHex, BattleSide side)
|
||||||
{
|
{
|
||||||
|
if(!position.isValid())
|
||||||
|
return { };
|
||||||
|
|
||||||
BattleHexArray hexes;
|
BattleHexArray hexes;
|
||||||
if(twoHex)
|
if(twoHex)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user