2
0
Эх сурвалжийг харах

expose safeAttackRatio to AI config

Ivan Savenko 10 сар өмнө
parent
commit
b25702f15e

+ 1 - 4
AI/Nullkiller/AIGateway.cpp

@@ -34,9 +34,6 @@
 namespace NKAI
 {
 
-// our to enemy strength ratio constants
-const float SAFE_ATTACK_CONSTANT = 1.1f;
-
 //one thread may be turn of AI and another will be handling a side effect for AI2
 thread_local CCallback * cb = nullptr;
 thread_local AIGateway * ai = nullptr;
@@ -668,7 +665,7 @@ void AIGateway::showBlockingDialog(const std::string & text, const std::vector<C
 				else if(objType == Obj::ARTIFACT || objType == Obj::RESOURCE)
 				{
 					bool dangerUnknown = danger == 0;
-					bool dangerTooHigh = ratio > (1 / SAFE_ATTACK_CONSTANT);
+					bool dangerTooHigh = ratio * nullkiller->settings->getSafeAttackRatio() > 1;
 
 					answer = !dangerUnknown && !dangerTooHigh;
 				}

+ 4 - 4
AI/Nullkiller/AIUtility.cpp

@@ -146,21 +146,21 @@ bool HeroPtr::operator==(const HeroPtr & rhs) const
 	return h == rhs.get(true);
 }
 
-bool isSafeToVisit(const CGHeroInstance * h, const CCreatureSet * heroArmy, uint64_t dangerStrength)
+bool isSafeToVisit(const CGHeroInstance * h, const CCreatureSet * heroArmy, uint64_t dangerStrength, float safeAttackRatio)
 {
 	const ui64 heroStrength = h->getHeroStrength() * heroArmy->getArmyStrength();
 
 	if(dangerStrength)
 	{
-		return heroStrength / SAFE_ATTACK_CONSTANT > dangerStrength;
+		return heroStrength > dangerStrength * safeAttackRatio;
 	}
 
 	return true; //there's no danger
 }
 
-bool isSafeToVisit(const CGHeroInstance * h, uint64_t dangerStrength)
+bool isSafeToVisit(const CGHeroInstance * h, uint64_t dangerStrength, float safeAttackRatio)
 {
-	return isSafeToVisit(h, h, dangerStrength);
+	return isSafeToVisit(h, h, dangerStrength, safeAttackRatio);
 }
 
 bool isObjectRemovable(const CGObjectInstance * obj)

+ 2 - 6
AI/Nullkiller/AIUtility.h

@@ -63,10 +63,6 @@ const int RESOURCE_MINE_PRODUCTION = 1;
 const int ACTUAL_RESOURCE_COUNT = 7;
 const int ALLOWED_ROAMING_HEROES = 8;
 
-//implementation-dependent
-extern const float SAFE_ATTACK_CONSTANT;
-extern const int GOLD_RESERVE;
-
 extern thread_local CCallback * cb;
 
 enum HeroRole
@@ -213,8 +209,8 @@ bool isBlockVisitObj(const int3 & pos);
 bool isWeeklyRevisitable(const Nullkiller * ai, const CGObjectInstance * obj);
 
 bool isObjectRemovable(const CGObjectInstance * obj); //FIXME FIXME: move logic to object property!
-bool isSafeToVisit(const CGHeroInstance * h, uint64_t dangerStrength);
-bool isSafeToVisit(const CGHeroInstance * h, const CCreatureSet *, uint64_t dangerStrength);
+bool isSafeToVisit(const CGHeroInstance * h, uint64_t dangerStrength, float safeAttackRatio);
+bool isSafeToVisit(const CGHeroInstance * h, const CCreatureSet *, uint64_t dangerStrength, float safeAttackRatio);
 
 bool compareHeroStrength(const CGHeroInstance * h1, const CGHeroInstance * h2);
 bool compareArmyStrength(const CArmedInstance * a1, const CArmedInstance * a2);

+ 2 - 2
AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.cpp

@@ -316,8 +316,8 @@ uint64_t DangerHitMapAnalyzer::enemyCanKillOurHeroesAlongThePath(const AIPath &
 
 	const auto& info = getTileThreat(tile);
 	
-	return (info.fastestDanger.turn <= turn && !isSafeToVisit(path.targetHero, path.heroArmy, info.fastestDanger.danger))
-		|| (info.maximumDanger.turn <= turn && !isSafeToVisit(path.targetHero, path.heroArmy, info.maximumDanger.danger));
+	return (info.fastestDanger.turn <= turn && !isSafeToVisit(path.targetHero, path.heroArmy, info.fastestDanger.danger, ai->settings->getSafeAttackRatio()))
+		|| (info.maximumDanger.turn <= turn && !isSafeToVisit(path.targetHero, path.heroArmy, info.maximumDanger.danger, ai->settings->getSafeAttackRatio()));
 }
 
 const HitMapNode & DangerHitMapAnalyzer::getObjectThreat(const CGObjectInstance * obj) const

+ 1 - 1
AI/Nullkiller/Behaviors/CaptureObjectsBehavior.cpp

@@ -114,7 +114,7 @@ Goals::TGoalVec CaptureObjectsBehavior::getVisitGoals(
 			continue;
 		}
 
-		auto isSafe = isSafeToVisit(hero, path.heroArmy, danger);
+		auto isSafe = isSafeToVisit(hero, path.heroArmy, danger, nullkiller->settings->getSafeAttackRatio());
 
 #if NKAI_TRACE_LEVEL >= 2
 		logAi->trace(

+ 1 - 1
AI/Nullkiller/Behaviors/DefenceBehavior.cpp

@@ -305,7 +305,7 @@ void DefenceBehavior::evaluateDefence(Goals::TGoalVec & tasks, const CGTownInsta
 				continue;
 			}
 				
-			if(threat.turn == 0 || (path.turn() <= threat.turn && path.getHeroStrength() * SAFE_ATTACK_CONSTANT >= threat.danger))
+			if(threat.turn == 0 || (path.turn() <= threat.turn && path.getHeroStrength() * ai->settings->getSafeAttackRatio() >= threat.danger))
 			{
 				if(ai->arePathHeroesLocked(path))
 				{

+ 2 - 2
AI/Nullkiller/Behaviors/GatherArmyBehavior.cpp

@@ -145,7 +145,7 @@ Goals::TGoalVec GatherArmyBehavior::deliverArmyToHero(const Nullkiller * ai, con
 		}
 
 		auto danger = path.getTotalDanger();
-		auto isSafe = isSafeToVisit(hero, path.heroArmy, danger);
+		auto isSafe = isSafeToVisit(hero, path.heroArmy, danger, ai->settings->getSafeAttackRatio());
 
 #if NKAI_TRACE_LEVEL >= 2
 		logAi->trace(
@@ -341,7 +341,7 @@ Goals::TGoalVec GatherArmyBehavior::upgradeArmy(const Nullkiller * ai, const CGT
 
 		auto danger = path.getTotalDanger();
 
-		auto isSafe = isSafeToVisit(path.targetHero, path.heroArmy, danger);
+		auto isSafe = isSafeToVisit(path.targetHero, path.heroArmy, danger, ai->settings->getSafeAttackRatio());
 
 #if NKAI_TRACE_LEVEL >= 2
 		logAi->trace(

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

@@ -31,6 +31,7 @@ namespace NKAI
 		maxGoldPressure(0.3f),
 		retreatThresholdRelative(0.3),
 		retreatThresholdAbsoolute(10000),
+		safeAttackRatio(1.1),
 		maxpass(10),
 		pathfinderBucketsCount(1),
 		pathfinderBucketSize(32),
@@ -52,6 +53,7 @@ namespace NKAI
 		maxGoldPressure = node["maxGoldPressure"].Float();
 		retreatThresholdRelative = node["retreatThresholdRelative"].Float();
 		retreatThresholdAbsoolute = node["retreatThresholdAbsoolute"].Float();
+		safeAttackRatio = node["safeAttackRatio"].Float();
 		allowObjectGraph = node["allowObjectGraph"].Bool();
 		openMap = node["openMap"].Bool();
 		useFuzzy = node["useFuzzy"].Bool();

+ 2 - 0
AI/Nullkiller/Engine/Settings.h

@@ -30,6 +30,7 @@ namespace NKAI
 		float maxGoldPressure;
 		float retreatThresholdRelative;
 		float retreatThresholdAbsoolute;
+		float safeAttackRatio;
 		bool allowObjectGraph;
 		bool useTroopsFromGarrisons;
 		bool openMap;
@@ -42,6 +43,7 @@ namespace NKAI
 		float getMaxGoldPressure() const { return maxGoldPressure; }
 		float getRetreatThresholdRelative() const { return retreatThresholdRelative; }
 		float getRetreatThresholdAbsoolute() const { return retreatThresholdAbsoolute; }
+		float getSafeAttackRatio() const { return safeAttackRatio; }
 		int getMaxRoamingHeroes() const { return maxRoamingHeroes; }
 		int getMainHeroTurnDistanceLimit() const { return mainHeroTurnDistanceLimit; }
 		int getScoutHeroTurnDistanceLimit() const { return scoutHeroTurnDistanceLimit; }

+ 1 - 1
AI/Nullkiller/Helpers/ExplorationHelper.cpp

@@ -175,7 +175,7 @@ void ExplorationHelper::scanTile(const int3 & tile)
 				continue;
 			}
 
-			if(isSafeToVisit(hero, path.heroArmy, path.getTotalDanger()))
+			if(isSafeToVisit(hero, path.heroArmy, path.getTotalDanger(), ai->settings->getSafeAttackRatio()))
 			{
 				bestGoal = goal;
 				bestValue = ourValue;

+ 5 - 0
config/ai/nkai/nkai-settings.json

@@ -12,6 +12,7 @@
 		"pathfinderBucketSize" : 32, // old value: 7,
 		"retreatThresholdRelative" : 0.3,
 		"retreatThresholdAbsoolute" : 10000,
+		"safeAttackRatio" : 1.1,
 		"useFuzzy" : false
 	},
 	
@@ -28,6 +29,7 @@
 		"pathfinderBucketSize" : 32, // old value: 7,
 		"retreatThresholdRelative" : 0.3,
 		"retreatThresholdAbsoolute" : 10000,
+		"safeAttackRatio" : 1.1,
 		"useFuzzy" : false
 	},
 	
@@ -44,6 +46,7 @@
 		"pathfinderBucketSize" : 32, // old value: 7,
 		"retreatThresholdRelative" : 0.3,
 		"retreatThresholdAbsoolute" : 10000,
+		"safeAttackRatio" : 1.1,
 		"useFuzzy" : false
 	},
 	
@@ -60,6 +63,7 @@
 		"pathfinderBucketSize" : 32, // old value: 7,
 		"retreatThresholdRelative" : 0.3,
 		"retreatThresholdAbsoolute" : 10000,
+		"safeAttackRatio" : 1.1,
 		"useFuzzy" : false
 	},
 	
@@ -76,6 +80,7 @@
 		"pathfinderBucketSize" : 32, // old value: 7,
 		"retreatThresholdRelative" : 0.3,
 		"retreatThresholdAbsoolute" : 10000,
+		"safeAttackRatio" : 1.1,
 		"useFuzzy" : false
 	}
 }