Переглянути джерело

Merge pull request #4069 from vcmi/fix-exploration

[1.5.3] - fix exploration
Ivan Savenko 1 рік тому
батько
коміт
908a45f844

+ 2 - 2
AI/Nullkiller/Engine/Nullkiller.cpp

@@ -403,7 +403,7 @@ void Nullkiller::makeTurn()
 
 		if(selectedTasks.empty())
 		{
-			return;
+			selectedTasks.push_back(taskptr(Goals::Invalid()));
 		}
 
 		bool hasAnySuccess = false;
@@ -456,7 +456,7 @@ void Nullkiller::makeTurn()
 					scanDepth = ScanDepth::ALL_FULL;
 					useHeroChain = false;
 					hasAnySuccess = true;
-					break;;
+					break;
 				}
 
 				logAi->trace("Goal %s has too low priority. It is not worth doing it.", taskDescription);

+ 10 - 3
AI/Nullkiller/Goals/ExploreNeighbourTile.cpp

@@ -26,9 +26,9 @@ bool ExploreNeighbourTile::operator==(const ExploreNeighbourTile & other) const
 
 void ExploreNeighbourTile::accept(AIGateway * ai)
 {
-	ExplorationHelper h(hero, ai->nullkiller.get());
+	ExplorationHelper h(hero, ai->nullkiller.get(), true);
 
-	for(int i = 0; i < tilesToExplore && hero->movementPointsRemaining() > 0; i++)
+	for(int i = 0; i < tilesToExplore && ai->myCb->getObj(hero->id, false) && hero->movementPointsRemaining() > 0; i++)
 	{
 		int3 pos = hero->visitablePos();
 		float value = 0;
@@ -54,7 +54,14 @@ void ExploreNeighbourTile::accept(AIGateway * ai)
 				}
 			});
 
-		if(!target.valid() || !ai->moveHeroToTile(target, hero))
+		if(!target.valid())
+		{
+			return;
+		}
+
+		auto danger = ai->nullkiller->pathfinder->getStorage()->evaluateDanger(target, hero, true);
+
+		if(danger > 0 || !ai->moveHeroToTile(target, hero))
 		{
 			return;
 		}

+ 6 - 4
AI/Nullkiller/Helpers/ExplorationHelper.cpp

@@ -24,8 +24,8 @@ namespace NKAI
 
 using namespace Goals;
 
-ExplorationHelper::ExplorationHelper(const CGHeroInstance * hero, const Nullkiller * ai)
-	:ai(ai), cbp(ai->cb.get()), hero(hero)
+ExplorationHelper::ExplorationHelper(const CGHeroInstance * hero, const Nullkiller * ai, bool useCPathfinderAccessibility)
+	:ai(ai), cbp(ai->cb.get()), hero(hero), useCPathfinderAccessibility(useCPathfinderAccessibility)
 {
 	ts = cbp->getPlayerTeam(ai->playerID);
 	sightRadius = hero->getSightRadius();
@@ -104,7 +104,7 @@ bool ExplorationHelper::scanMap()
 
 	if(!bestGoal->invalid())
 	{
-		return false;
+		return true;
 	}
 
 	allowDeadEndCancellation = false;
@@ -222,7 +222,9 @@ bool ExplorationHelper::hasReachableNeighbor(const int3 & pos) const
 		int3 tile = pos + dir;
 		if(cbp->isInTheMap(tile))
 		{
-			auto isAccessible = ai->pathfinder->isTileAccessible(hero, tile);
+			auto isAccessible = useCPathfinderAccessibility
+				? ai->cb->getPathsInfo(hero)->getPathInfo(tile)->reachable()
+				: ai->pathfinder->isTileAccessible(hero, tile);
 
 			if(isAccessible)
 				return true;

+ 2 - 1
AI/Nullkiller/Helpers/ExplorationHelper.h

@@ -34,9 +34,10 @@ private:
 	const TeamState * ts;
 	int3 ourPos;
 	bool allowDeadEndCancellation;
+	bool useCPathfinderAccessibility;
 
 public:
-	ExplorationHelper(const CGHeroInstance * hero, const Nullkiller * ai);
+	ExplorationHelper(const CGHeroInstance * hero, const Nullkiller * ai, bool useCPathfinderAccessibility = false);
 	Goals::TSubgoal makeComposition() const;
 	bool scanSector(int scanRadius);
 	bool scanMap();