Browse Source

Fix StupidAI trying to attack through obstacle

Andrii Danylchenko 4 years ago
parent
commit
36854742e4
2 changed files with 22 additions and 16 deletions
  1. 21 15
      AI/StupidAI/StupidAI.cpp
  2. 1 1
      AI/StupidAI/StupidAI.h

+ 21 - 15
AI/StupidAI/StupidAI.cpp

@@ -161,7 +161,7 @@ BattleAction CStupidAI::activeStack( const CStack * stack )
 
 
 		if(dists.distToNearestNeighbour(stack, closestEnemy->s) < GameConstants::BFIELD_SIZE)
 		if(dists.distToNearestNeighbour(stack, closestEnemy->s) < GameConstants::BFIELD_SIZE)
 		{
 		{
-			return goTowards(stack, closestEnemy->s);
+			return goTowards(stack, closestEnemy->s->getAttackableHexes(stack));
 		}
 		}
 	}
 	}
 
 
@@ -229,31 +229,37 @@ void CStupidAI::print(const std::string &text) const
 	logAi->trace("CStupidAI  [%p]: %s", this, text);
 	logAi->trace("CStupidAI  [%p]: %s", this, text);
 }
 }
 
 
-BattleAction CStupidAI::goTowards(const CStack * stack, const CStack * enemy) const
+BattleAction CStupidAI::goTowards(const CStack * stack, std::vector<BattleHex> hexes) const
 {
 {
-	auto destination = enemy->getPosition();
-	assert(destination.isValid());
 	auto reachability = cb->getReachability(stack);
 	auto reachability = cb->getReachability(stack);
 	auto avHexes = cb->battleGetAvailableHexes(reachability, stack);
 	auto avHexes = cb->battleGetAvailableHexes(reachability, stack);
 
 
-	if(vstd::contains(avHexes, destination))
-		return BattleAction::makeMove(stack, destination);
-
-	auto destNeighbours = destination.neighbouringTiles();
-	if(vstd::contains_if(destNeighbours, [&](BattleHex n) { return stack->coversPos(destination); }))
+	if(!avHexes.size() || !hexes.size()) //we are blocked or dest is blocked
 	{
 	{
-		logAi->warn("Warning: already standing on neighbouring tile!");
-		//We shouldn't even be here...
 		return BattleAction::makeDefend(stack);
 		return BattleAction::makeDefend(stack);
 	}
 	}
 
 
-	if(!avHexes.size()) //we are blocked or dest is blocked
+	std::sort(hexes.begin(), hexes.end(), [&](BattleHex h1, BattleHex h2) -> bool
 	{
 	{
-		return BattleAction::makeDefend(stack);
+		return reachability.distances[h1] < reachability.distances[h2];
+	});
+
+	for(auto hex : hexes)
+	{
+		if(vstd::contains(avHexes, hex))
+			return BattleAction::makeMove(stack, hex);
+
+		if(stack->coversPos(hex))
+		{
+			logAi->warn("Warning: already standing on neighbouring tile!");
+			//We shouldn't even be here...
+			return BattleAction::makeDefend(stack);
+		}
 	}
 	}
 
 
-	BattleHex bestNeighbor = destination;
-	if(reachability.distToNearestNeighbour(stack, enemy, &bestNeighbor) > GameConstants::BFIELD_SIZE)
+	BattleHex bestNeighbor = hexes.front();
+
+	if(reachability.distances[bestNeighbor] > GameConstants::BFIELD_SIZE)
 	{
 	{
 		return BattleAction::makeDefend(stack);
 		return BattleAction::makeDefend(stack);
 	}
 	}

+ 1 - 1
AI/StupidAI/StupidAI.h

@@ -46,6 +46,6 @@ public:
 	virtual void loadGame(BinaryDeserializer & h, const int version) override;
 	virtual void loadGame(BinaryDeserializer & h, const int version) override;
 
 
 private:
 private:
-	BattleAction goTowards(const CStack * stack, const CStack * enemy) const;
+	BattleAction goTowards(const CStack * stack, std::vector<BattleHex> hexes) const;
 };
 };