Browse Source

Use existing callback method instead of custom one in AI

Ivan Savenko 11 months ago
parent
commit
bb7cf3ffbf

+ 3 - 61
AI/BattleAI/BattleEvaluator.cpp

@@ -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

+ 0 - 1
AI/BattleAI/BattleEvaluator.h

@@ -53,7 +53,6 @@ public:
 	std::optional<PossibleSpellcast> findBestCreatureSpell(const CStack * stack);
 	BattleAction goTowardsNearest(const CStack * stack, std::vector<BattleHex> hexes, const PotentialTargets & targets);
 	std::vector<BattleHex> getBrokenWallMoatHexes() const;
-	static std::vector<BattleHex> getCastleHexes();
 	bool hasWorkingTowers() const;
 	void evaluateCreatureSpellcast(const CStack * stack, PossibleSpellcast & ps); //for offensive damaging spells only
 	void print(const std::string & text) const;

+ 2 - 3
AI/BattleAI/BattleExchangeVariant.cpp

@@ -218,7 +218,6 @@ EvaluationResult BattleExchangeEvaluator::findBestTarget(
 	bool siegeDefense)
 {
 	EvaluationResult result(targets.bestAction());
-	std::vector<BattleHex> castleHexes = BattleEvaluator::getCastleHexes();
 
 	if(!activeStack->waited() && !activeStack->acquireState()->hadMorale)
 	{
@@ -234,7 +233,7 @@ EvaluationResult BattleExchangeEvaluator::findBestTarget(
 
 		for(auto & ap : targets.possibleAttacks)
 		{
-			if (siegeDefense && std::find(castleHexes.begin(), castleHexes.end(), ap.from) == castleHexes.end())
+			if (siegeDefense && !hb->battleIsInsideWalls(ap.from))
 				continue;
 
 			float score = evaluateExchange(ap, 0, targets, damageCache, hbWaited);
@@ -269,7 +268,7 @@ EvaluationResult BattleExchangeEvaluator::findBestTarget(
 
 	for(auto & ap : targets.possibleAttacks)
 	{
-		if (siegeDefense && std::find(castleHexes.begin(), castleHexes.end(), ap.from) == castleHexes.end())
+		if (siegeDefense && !hb->battleIsInsideWalls(ap.from))
 			continue;
 
 		float score = evaluateExchange(ap, 0, targets, damageCache, hb);