Bläddra i källkod

Nullkiller: fix defence

Andrii Danylchenko 4 år sedan
förälder
incheckning
3480f17a68
2 ändrade filer med 17 tillägg och 7 borttagningar
  1. 16 7
      AI/Nullkiller/Engine/PriorityEvaluator.cpp
  2. 1 0
      AI/Nullkiller/Engine/PriorityEvaluator.h

+ 16 - 7
AI/Nullkiller/Engine/PriorityEvaluator.cpp

@@ -20,8 +20,8 @@
 #include "../../../CCallback.h"
 #include "../../../lib/filesystem/Filesystem.h"
 #include "../Goals/ExecuteHeroChain.h"
-#include "../Markers/UnlockCluster.h"
 #include "../Goals/BuildThis.h"
+#include "../Markers/UnlockCluster.h"
 #include "../Markers/HeroExchange.h"
 #include "../Markers/ArmyUpgrade.h"
 #include "../Markers/DefendTown.h"
@@ -388,17 +388,22 @@ float RewardEvaluator::getSkillReward(const CGObjectInstance * target, const CGH
 	}
 }
 
-uint64_t RewardEvaluator::getEnemyHeroDanger(const AIPath & path) const
+uint64_t RewardEvaluator::getEnemyHeroDanger(const int3 & tile, uint8_t turn) const
 {
-	auto & treatNode = ai->dangerHitMap->getTileTreat(path.targetTile());
+	auto & treatNode = ai->dangerHitMap->getTileTreat(tile);
 
 	if(treatNode.maximumDanger.danger == 0)
 		return 0;
-	
-	if(treatNode.maximumDanger.turn <= path.turn())
+
+	if(treatNode.maximumDanger.turn <= turn)
 		return treatNode.maximumDanger.danger;
 
-	return treatNode.fastestDanger.turn <= path.turn() ? treatNode.fastestDanger.danger : 0;
+	return treatNode.fastestDanger.turn <= turn ? treatNode.fastestDanger.danger : 0;
+}
+
+uint64_t RewardEvaluator::getEnemyHeroDanger(const AIPath & path) const
+{
+	return getEnemyHeroDanger(path.targetTile(), path.turn());
 }
 
 int32_t getArmyCost(const CArmedInstance * army)
@@ -536,6 +541,10 @@ public:
 		evaluationContext.armyReward += armyIncome * multiplier;
 		evaluationContext.goldReward += dailyIncome * 5 * multiplier;
 		evaluationContext.strategicalValue += strategicalValue * multiplier;
+		vstd::amax(evaluationContext.danger, defendTown.getTreat().danger);
+
+		auto enemyDanger = evaluationContext.evaluator.getEnemyHeroDanger(town->visitablePos(), defendTown.getTurn());
+		vstd::amax(evaluationContext.enemyHeroDangerRatio, enemyDanger / (double)defendTown.getDefenceStrength());
 	}
 };
 
@@ -773,7 +782,7 @@ float PriorityEvaluator::evaluate(Goals::TSubgoal task)
 		logAi->error("evaluate VisitTile: %s", fe.getWhat());
 	}
 
-#ifdef AI_TRACE_LEVEL >= 2
+#if AI_TRACE_LEVEL >= 2
 	logAi->trace("Evaluated %s, loss: %f, turn: %d, turns main: %f, scout: %f, gold: %d, cost: %d, army gain: %d, danger: %d, role: %s, strategical value: %f, cwr: %f, fear: %f, result %f",
 		task->toString(),
 		evaluationContext.armyLossPersentage,

+ 1 - 0
AI/Nullkiller/Engine/PriorityEvaluator.h

@@ -34,6 +34,7 @@ public:
 	int32_t getGoldReward(const CGObjectInstance * target, const CGHeroInstance * hero) const;
 	uint64_t getUpgradeArmyReward(const CGTownInstance * town, const BuildingInfo & bi) const;
 	uint64_t getEnemyHeroDanger(const AIPath & path) const;
+	uint64_t getEnemyHeroDanger(const int3 & tile, uint8_t turn) const;
 };
 
 struct DLL_EXPORT EvaluationContext