瀏覽代碼

Allow per-difficulty parameters for NKAI

Ivan Savenko 11 月之前
父節點
當前提交
71d9664295

+ 14 - 9
AI/Nullkiller/Engine/Nullkiller.cpp

@@ -34,13 +34,12 @@ using namespace Goals;
 std::unique_ptr<ObjectGraph> Nullkiller::baseGraph;
 
 Nullkiller::Nullkiller()
-	:activeHero(nullptr), scanDepth(ScanDepth::MAIN_FULL), useHeroChain(true)
+	: activeHero(nullptr)
+	, scanDepth(ScanDepth::MAIN_FULL)
+	, useHeroChain(true)
+	, memory(std::make_unique<AIMemory>())
 {
-	memory = std::make_unique<AIMemory>();
-	settings = std::make_unique<Settings>();
 
-	useObjectGraph = settings->isObjectGraphAllowed();
-	openMap = settings->isOpenMap() || useObjectGraph;
 }
 
 bool canUseOpenMap(std::shared_ptr<CCallback> cb, PlayerColor playerID)
@@ -62,17 +61,23 @@ bool canUseOpenMap(std::shared_ptr<CCallback> cb, PlayerColor playerID)
 		return false;
 	}
 
-	return cb->getStartInfo()->difficulty >= 3;
+	return true;
 }
 
 void Nullkiller::init(std::shared_ptr<CCallback> cb, AIGateway * gateway)
 {
 	this->cb = cb;
 	this->gateway = gateway;
-	
-	playerID = gateway->playerID;
+	this->playerID = gateway->playerID;
+
+	settings = std::make_unique<Settings>(cb->getStartInfo()->difficulty);
 
-	if(openMap && !canUseOpenMap(cb, playerID))
+	if(canUseOpenMap(cb, playerID))
+	{
+		useObjectGraph = settings->isObjectGraphAllowed();
+		openMap = settings->isOpenMap() || useObjectGraph;
+	}
+	else
 	{
 		useObjectGraph = false;
 		openMap = false;

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

@@ -11,6 +11,8 @@
 #include <limits>
 
 #include "Settings.h"
+
+#include "../../../lib/constants/StringConstants.h"
 #include "../../../lib/mapObjectConstructors/AObjectTypeHandler.h"
 #include "../../../lib/mapObjectConstructors/CObjectClassesHandler.h"
 #include "../../../lib/mapObjectConstructors/CBankInstanceConstructor.h"
@@ -22,7 +24,7 @@
 
 namespace NKAI
 {
-	Settings::Settings()
+	Settings::Settings(int difficultyLevel)
 		: maxRoamingHeroes(8),
 		mainHeroTurnDistanceLimit(10),
 		scoutHeroTurnDistanceLimit(5),
@@ -35,7 +37,9 @@ namespace NKAI
 		openMap(true),
 		useFuzzy(false)
 	{
-		JsonNode node = JsonUtils::assembleFromFiles("config/ai/nkai/nkai-settings");
+		const std::string & difficultyName = GameConstants::DIFFICULTY_NAMES[difficultyLevel];
+		const JsonNode & rootNode = JsonUtils::assembleFromFiles("config/ai/nkai/nkai-settings");
+		const JsonNode & node = rootNode[difficultyName];
 
 		maxRoamingHeroes = node["maxRoamingHeroes"].Integer();
 		mainHeroTurnDistanceLimit = node["mainHeroTurnDistanceLimit"].Integer();

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

@@ -34,7 +34,7 @@ namespace NKAI
 		bool useFuzzy;
 
 	public:
-		Settings();
+		explicit Settings(int difficultyLevel);
 
 		int getMaxPass() const { return maxpass; }
 		float getMaxGoldPressure() const { return maxGoldPressure; }

+ 69 - 11
config/ai/nkai/nkai-settings.json

@@ -1,13 +1,71 @@
 {
-	"maxRoamingHeroes" : 8,
-	"maxpass" : 30,
-	"mainHeroTurnDistanceLimit" : 10,
-	"scoutHeroTurnDistanceLimit" : 5,
-	"maxGoldPressure" : 0.3,
-	"useTroopsFromGarrisons" : true,
-	"openMap": true,
-	"allowObjectGraph": false,
-	"pathfinderBucketsCount" : 1, // old value: 3,
-	"pathfinderBucketSize" : 32, // old value: 7,
-	"useFuzzy" : false
+	"pawn" : {
+		"maxRoamingHeroes" : 8,
+		"maxpass" : 30,
+		"mainHeroTurnDistanceLimit" : 10,
+		"scoutHeroTurnDistanceLimit" : 5,
+		"maxGoldPressure" : 0.3,
+		"useTroopsFromGarrisons" : true,
+		"openMap": false,
+		"allowObjectGraph": false,
+		"pathfinderBucketsCount" : 1, // old value: 3,
+		"pathfinderBucketSize" : 32, // old value: 7,
+		"useFuzzy" : false
+	},
+	
+	"knight" : {
+		"maxRoamingHeroes" : 8,
+		"maxpass" : 30,
+		"mainHeroTurnDistanceLimit" : 10,
+		"scoutHeroTurnDistanceLimit" : 5,
+		"maxGoldPressure" : 0.3,
+		"useTroopsFromGarrisons" : true,
+		"openMap": false,
+		"allowObjectGraph": false,
+		"pathfinderBucketsCount" : 1, // old value: 3,
+		"pathfinderBucketSize" : 32, // old value: 7,
+		"useFuzzy" : false
+	},
+	
+	"rook" : {
+		"maxRoamingHeroes" : 8,
+		"maxpass" : 30,
+		"mainHeroTurnDistanceLimit" : 10,
+		"scoutHeroTurnDistanceLimit" : 5,
+		"maxGoldPressure" : 0.3,
+		"useTroopsFromGarrisons" : true,
+		"openMap": false,
+		"allowObjectGraph": false,
+		"pathfinderBucketsCount" : 1, // old value: 3,
+		"pathfinderBucketSize" : 32, // old value: 7,
+		"useFuzzy" : false
+	},
+	
+	"queen" : {
+		"maxRoamingHeroes" : 8,
+		"maxpass" : 30,
+		"mainHeroTurnDistanceLimit" : 10,
+		"scoutHeroTurnDistanceLimit" : 5,
+		"maxGoldPressure" : 0.3,
+		"useTroopsFromGarrisons" : true,
+		"openMap": true,
+		"allowObjectGraph": false,
+		"pathfinderBucketsCount" : 1, // old value: 3,
+		"pathfinderBucketSize" : 32, // old value: 7,
+		"useFuzzy" : false
+	},
+	
+	"king" : {
+		"maxRoamingHeroes" : 8,
+		"maxpass" : 30,
+		"mainHeroTurnDistanceLimit" : 10,
+		"scoutHeroTurnDistanceLimit" : 5,
+		"maxGoldPressure" : 0.3,
+		"useTroopsFromGarrisons" : true,
+		"openMap": true,
+		"allowObjectGraph": false,
+		"pathfinderBucketsCount" : 1, // old value: 3,
+		"pathfinderBucketSize" : 32, // old value: 7,
+		"useFuzzy" : false
+	}
 }