Mircea TheHonestCTO 4 месяцев назад
Родитель
Сommit
010cd920e3
2 измененных файлов с 38 добавлено и 32 удалено
  1. 37 31
      AI/Nullkiller2/Engine/Nullkiller.cpp
  2. 1 1
      AI/Nullkiller2/Engine/Nullkiller.h

+ 37 - 31
AI/Nullkiller2/Engine/Nullkiller.cpp

@@ -234,7 +234,7 @@ void Nullkiller::decompose(Goals::TGoalVec & result, Goals::TSubgoal behavior, i
 		timeElapsed(start));
 }
 
-void Nullkiller::resetAiState()
+void Nullkiller::resetState()
 {
 	std::unique_lock lockGuard(aiStateMutex);
 
@@ -375,26 +375,24 @@ HeroLockedReason Nullkiller::getHeroLockedReason(const CGHeroInstance * hero) co
 void Nullkiller::makeTurn()
 {
 	std::lock_guard<std::mutex> sharedStorageLock(AISharedStorage::locker);
-
 	const int MAX_DEPTH = 10;
-
-	resetAiState();
-
+	resetState();
 	Goals::TGoalVec bestTasks;
 
 #if NKAI_TRACE_LEVEL >= 1
-	float totalHeroStrength = 0;
-	int totalTownLevel = 0;
-	for (auto heroInfo : cb->getHeroesInfo())
+	float totalHeroesStrength = 0;
+	int totalTownsLevel = 0;
+	for (const auto *heroInfo : cb->getHeroesInfo())
 	{
-		totalHeroStrength += heroInfo->getTotalStrength();
+		totalHeroesStrength += heroInfo->getTotalStrength();
 	}
-	for (auto townInfo : cb->getTownsInfo())
+	for (const auto *townInfo : cb->getTownsInfo())
 	{
-		totalTownLevel += townInfo->getTownLevel();
+		totalTownsLevel += townInfo->getTownLevel();
 	}
-	logAi->info("Beginning: Strength: %f Townlevel: %d Resources: %s", totalHeroStrength, totalTownLevel, cb->getResourceAmount().toString());
+	logAi->info("Beginning: totalHeroesStrength: %f, totalTownsLevel: %d, resources: %s", totalHeroesStrength, totalTownsLevel, cb->getResourceAmount().toString());
 #endif
+
 	for(int i = 1; i <= settings->getMaxPass() && cb->getPlayerStatus(playerID) == EPlayerStatus::INGAME; i++)
 	{
 		auto start = std::chrono::high_resolution_clock::now();
@@ -417,6 +415,7 @@ void Nullkiller::makeTurn()
 #if NKAI_TRACE_LEVEL >= 1
 				logAi->info("Pass %d: Performing prio 0 task %s with prio: %d", i, bestTask->toString(), bestTask->priority);
 #endif
+
 				if(!executeTask(bestTask))
 					return;
 
@@ -443,14 +442,17 @@ void Nullkiller::makeTurn()
 			decompose(bestTasks, sptr(ExplorationBehavior()), MAX_DEPTH);
 
 		TTaskVec selectedTasks;
+
 #if NKAI_TRACE_LEVEL >= 1
 		int prioOfTask = 0;
 #endif
+
 		for (int prio = PriorityEvaluator::PriorityTier::INSTAKILL; prio <= PriorityEvaluator::PriorityTier::MAX_PRIORITY_TIER; ++prio)
 		{
 #if NKAI_TRACE_LEVEL >= 1
 			prioOfTask = prio;
 #endif
+
 			selectedTasks = buildPlan(bestTasks, prio);
 			if (!selectedTasks.empty() || settings->isUseFuzzy())
 				break;
@@ -470,25 +472,25 @@ void Nullkiller::makeTurn()
 
 		bool hasAnySuccess = false;
 
-		for(auto bestTask : selectedTasks)
+		for(const auto& selectedTask : selectedTasks)
 		{
 			if(cb->getPlayerStatus(playerID) != EPlayerStatus::INGAME)
 				return;
 
-			if(!areAffectedObjectsPresent(bestTask))
+			if(!areAffectedObjectsPresent(selectedTask))
 			{
 				logAi->debug("Affected object not found. Canceling task.");
 				continue;
 			}
 
-			std::string taskDescription = bestTask->toString();
-			HeroRole heroRole = getTaskRole(bestTask);
+			std::string taskDescription = selectedTask->toString();
+			HeroRole heroRole = getTaskRole(selectedTask);
 
-			if(heroRole != HeroRole::MAIN || bestTask->getHeroExchangeCount() <= 1)
+			if(heroRole != HeroRole::MAIN || selectedTask->getHeroExchangeCount() <= 1)
 				useHeroChain = false;
 
 			// TODO: better to check turn distance here instead of priority
-			if((heroRole != HeroRole::MAIN || bestTask->priority < SMALL_SCAN_MIN_PRIORITY)
+			if((heroRole != HeroRole::MAIN || selectedTask->priority < SMALL_SCAN_MIN_PRIORITY)
 				&& scanDepth == ScanDepth::MAIN_FULL)
 			{
 				useHeroChain = false;
@@ -497,10 +499,10 @@ void Nullkiller::makeTurn()
 				logAi->trace(
 					"Goal %s has low priority %f so decreasing  scan depth to gain performance.",
 					taskDescription,
-					bestTask->priority);
+					selectedTask->priority);
 			}
 
-			if((settings->isUseFuzzy() && bestTask->priority < MIN_PRIORITY) || (!settings->isUseFuzzy() && bestTask->priority <= 0))
+			if((settings->isUseFuzzy() && selectedTask->priority < MIN_PRIORITY) || (!settings->isUseFuzzy() && selectedTask->priority <= 0))
 			{
 				auto heroes = cb->getHeroesInfo();
 				auto hasMp = vstd::contains_if(heroes, [](const CGHeroInstance * h) -> bool
@@ -513,7 +515,7 @@ void Nullkiller::makeTurn()
 					logAi->trace(
 						"Goal %s has too low priority %f so increasing scan depth to full.",
 						taskDescription,
-						bestTask->priority);
+						selectedTask->priority);
 
 					scanDepth = ScanDepth::ALL_FULL;
 					useHeroChain = false;
@@ -525,10 +527,12 @@ void Nullkiller::makeTurn()
 
 				continue;
 			}
+
 #if NKAI_TRACE_LEVEL >= 1
-			logAi->info("Pass %d: Performing prio %d task %s with prio: %d", i, prioOfTask, bestTask->toString(), bestTask->priority);
+			logAi->info("Pass %d: Performing prio %d task %s with prio: %d", i, prioOfTask, selectedTask->toString(), selectedTask->priority);
 #endif
-			if(!executeTask(bestTask))
+
+			if(!executeTask(selectedTask))
 			{
 				if(hasAnySuccess)
 					break;
@@ -546,23 +550,25 @@ void Nullkiller::makeTurn()
 		if(!hasAnySuccess)
 		{
 			logAi->trace("Nothing was done this turn. Ending turn.");
+
 #if NKAI_TRACE_LEVEL >= 1
-			totalHeroStrength = 0;
-			totalTownLevel = 0;
-			for (auto heroInfo : cb->getHeroesInfo())
+			totalHeroesStrength = 0;
+			totalTownsLevel = 0;
+			for (const auto *heroInfo : cb->getHeroesInfo())
 			{
-				totalHeroStrength += heroInfo->getTotalStrength();
+				totalHeroesStrength += heroInfo->getTotalStrength();
 			}
-			for (auto townInfo : cb->getTownsInfo())
+			for (const auto *townInfo : cb->getTownsInfo())
 			{
-				totalTownLevel += townInfo->getTownLevel();
+				totalTownsLevel += townInfo->getTownLevel();
 			}
-			logAi->info("End: Strength: %f Townlevel: %d Resources: %s", totalHeroStrength, totalTownLevel, cb->getResourceAmount().toString());
+			logAi->info("End: totalHeroesStrength: %f, totalTownsLevel: %d, resources: %s", totalHeroesStrength, totalTownsLevel, cb->getResourceAmount().toString());
 #endif
+
 			return;
 		}
 
-		for (auto heroInfo : cb->getHeroesInfo())
+		for (const auto *heroInfo : cb->getHeroesInfo())
 			AIGateway::pickBestArtifacts(heroInfo);
 
 		if(i == settings->getMaxPass())

+ 1 - 1
AI/Nullkiller2/Engine/Nullkiller.h

@@ -140,7 +140,7 @@ public:
 	void invalidatePaths();
 
 private:
-	void resetAiState();
+	void resetState();
 	void updateAiState(int pass, bool fast = false);
 	void decompose(Goals::TGoalVec & result, Goals::TSubgoal behavior, int decompositionMaxDepth) const;
 	Goals::TTask choseBestTask(Goals::TGoalVec & tasks) const;