|
|
@@ -119,50 +119,6 @@ std::vector<BattleHex> BattleEvaluator::getBrokenWallMoatHexes() const
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
-std::vector<BattleHex> BattleEvaluator::getCastleHexes()
|
|
|
-{
|
|
|
- std::vector<BattleHex> result;
|
|
|
-
|
|
|
- // Loop through all wall parts
|
|
|
-
|
|
|
- std::vector<BattleHex> wallHexes;
|
|
|
- wallHexes.push_back(50);
|
|
|
- wallHexes.push_back(183);
|
|
|
- wallHexes.push_back(182);
|
|
|
- wallHexes.push_back(130);
|
|
|
- wallHexes.push_back(78);
|
|
|
- wallHexes.push_back(29);
|
|
|
- wallHexes.push_back(12);
|
|
|
- wallHexes.push_back(97);
|
|
|
- wallHexes.push_back(45);
|
|
|
- wallHexes.push_back(62);
|
|
|
- wallHexes.push_back(112);
|
|
|
- wallHexes.push_back(147);
|
|
|
- wallHexes.push_back(165);
|
|
|
-
|
|
|
- for (BattleHex wallHex : wallHexes) {
|
|
|
- // Get the starting x-coordinate of the wall hex
|
|
|
- int startX = wallHex.getX();
|
|
|
-
|
|
|
- // Initialize current hex with the wall hex
|
|
|
- BattleHex currentHex = wallHex;
|
|
|
- while (currentHex.isValid()) {
|
|
|
- // Check if the x-coordinate has wrapped (smaller than the starting x)
|
|
|
- if (currentHex.getX() < startX) {
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- // Add the hex to the result
|
|
|
- result.push_back(currentHex);
|
|
|
-
|
|
|
- // Move to the next hex to the right
|
|
|
- currentHex = currentHex.cloneInDirection(BattleHex::RIGHT, false);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
bool BattleEvaluator::hasWorkingTowers() const
|
|
|
{
|
|
|
bool keepIntact = cb->getBattle(battleID)->battleGetWallState(EWallPart::KEEP) != EWallState::NONE && cb->getBattle(battleID)->battleGetWallState(EWallPart::KEEP) != EWallState::DESTROYED;
|
|
|
@@ -221,11 +177,6 @@ BattleAction BattleEvaluator::selectStackAction(const CStack * stack)
|
|
|
&& !stack->canShoot()
|
|
|
&& hasWorkingTowers()
|
|
|
&& !enemyMellee.empty();
|
|
|
- std::vector<BattleHex> castleHexes = getCastleHexes();
|
|
|
- for (auto hex : castleHexes)
|
|
|
- {
|
|
|
- logAi->trace("Castlehex ID: %d Y: %d X: %d", hex, hex.getY(), hex.getX());
|
|
|
- }
|
|
|
|
|
|
if(targets->possibleAttacks.empty() && bestSpellcast.has_value())
|
|
|
{
|
|
|
@@ -292,10 +243,7 @@ BattleAction BattleEvaluator::selectStackAction(const CStack * stack)
|
|
|
return BattleAction::makeDefend(stack);
|
|
|
}
|
|
|
|
|
|
- bool isTargetOutsideFort = std::none_of(castleHexes.begin(), castleHexes.end(),
|
|
|
- [&](const BattleHex& hex) {
|
|
|
- return hex == bestAttack.from;
|
|
|
- });
|
|
|
+ bool isTargetOutsideFort = !hb->battleIsInsideWalls(bestAttack.from);
|
|
|
bool siegeDefense = stack->unitSide() == BattleSide::DEFENDER
|
|
|
&& !bestAttack.attack.shooting
|
|
|
&& hasWorkingTowers()
|
|
|
@@ -424,14 +372,8 @@ BattleAction BattleEvaluator::goTowardsNearest(const CStack * stack, std::vector
|
|
|
if (siegeDefense)
|
|
|
{
|
|
|
vstd::erase_if(avHexes, [&](const BattleHex& hex) {
|
|
|
- std::vector<BattleHex> castleHexes = getCastleHexes();
|
|
|
-
|
|
|
- bool isOutsideWall = std::none_of(castleHexes.begin(), castleHexes.end(),
|
|
|
- [&](const BattleHex& checkhex) {
|
|
|
- return checkhex == hex;
|
|
|
- });
|
|
|
- return isOutsideWall;
|
|
|
- });
|
|
|
+ return !cb->getBattle(battleID)->battleIsInsideWalls(hex);
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
if(!avHexes.size() || !hexes.size()) //we are blocked or dest is blocked
|