From 566249a10f0b41f853d16adc8aa125100defd75e Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Wed, 8 Jan 2025 14:34:40 +0000 Subject: [PATCH 1/4] Switch NKAI back to non-graph mode --- config/ai/nkai/nkai-settings.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/config/ai/nkai/nkai-settings.json b/config/ai/nkai/nkai-settings.json index 55cfe9cb5..1a60fff8a 100644 --- a/config/ai/nkai/nkai-settings.json +++ b/config/ai/nkai/nkai-settings.json @@ -42,9 +42,9 @@ "updateHitmapOnTileReveal" : false, "useTroopsFromGarrisons" : true, "openMap": true, - "allowObjectGraph": true, - "pathfinderBucketsCount" : 4, // old value: 3, - "pathfinderBucketSize" : 8, // old value: 7, + "allowObjectGraph": false, + "pathfinderBucketsCount" : 3, + "pathfinderBucketSize" : 7, "retreatThresholdRelative" : 0, "retreatThresholdAbsolute" : 0, "safeAttackRatio" : 1.1, @@ -62,9 +62,9 @@ "updateHitmapOnTileReveal" : false, "useTroopsFromGarrisons" : true, "openMap": true, - "allowObjectGraph": true, - "pathfinderBucketsCount" : 4, // old value: 3, - "pathfinderBucketSize" : 8, // old value: 7, + "allowObjectGraph": false, + "pathfinderBucketsCount" : 3, + "pathfinderBucketSize" : 7, "retreatThresholdRelative" : 0.1, "retreatThresholdAbsolute" : 5000, "safeAttackRatio" : 1.1, @@ -82,9 +82,9 @@ "updateHitmapOnTileReveal" : false, "useTroopsFromGarrisons" : true, "openMap": true, - "allowObjectGraph": true, - "pathfinderBucketsCount" : 4, // old value: 3, - "pathfinderBucketSize" : 8, // old value: 7, + "allowObjectGraph": false, + "pathfinderBucketsCount" : 3, + "pathfinderBucketSize" : 7, "retreatThresholdRelative" : 0.3, "retreatThresholdAbsolute" : 10000, "safeAttackRatio" : 1.1, @@ -102,9 +102,9 @@ "updateHitmapOnTileReveal" : false, "useTroopsFromGarrisons" : true, "openMap": true, - "allowObjectGraph": true, - "pathfinderBucketsCount" : 4, // old value: 3, - "pathfinderBucketSize" : 8, // old value: 7, + "allowObjectGraph": false, + "pathfinderBucketsCount" : 3, + "pathfinderBucketSize" : 7, "retreatThresholdRelative" : 0.3, "retreatThresholdAbsolute" : 10000, "safeAttackRatio" : 1.1, @@ -122,9 +122,9 @@ "updateHitmapOnTileReveal" : false, "useTroopsFromGarrisons" : true, "openMap": true, - "allowObjectGraph": true, - "pathfinderBucketsCount" : 4, // old value: 3, - "pathfinderBucketSize" : 8, // old value: 7, + "allowObjectGraph": false, + "pathfinderBucketsCount" : 3, + "pathfinderBucketSize" : 7, "retreatThresholdRelative" : 0.3, "retreatThresholdAbsolute" : 10000, "safeAttackRatio" : 1.1, From 9f56c00336ac02fa24c1a0c4d5f91af89a3e91b8 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Wed, 8 Jan 2025 14:35:14 +0000 Subject: [PATCH 2/4] Reduce excessive FoW updates --- server/CGameHandler.cpp | 6 ++---- server/processors/PlayerMessageProcessor.cpp | 4 +++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index 0e4688db0..839636f1d 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -4115,12 +4115,10 @@ void CGameHandler::changeFogOfWar(const std::unordered_set &tiles, PlayerC for (auto tile : observedTiles) vstd::erase_if_present (fow.tiles, tile); - - if (fow.tiles.empty()) - return; } - sendAndApply(fow); + if (!fow.tiles.empty()) + sendAndApply(fow); } const CGHeroInstance * CGameHandler::getVisitingHero(const CGObjectInstance *obj) diff --git a/server/processors/PlayerMessageProcessor.cpp b/server/processors/PlayerMessageProcessor.cpp index 89b034128..84787af96 100644 --- a/server/processors/PlayerMessageProcessor.cpp +++ b/server/processors/PlayerMessageProcessor.cpp @@ -618,7 +618,9 @@ void PlayerMessageProcessor::cheatMapReveal(PlayerColor player, bool reveal) fc.tiles.insert(hlp_tab, hlp_tab + lastUnc); delete [] hlp_tab; - gameHandler->sendAndApply(fc); + + if (!fc.tiles.empty()) + gameHandler->sendAndApply(fc); } void PlayerMessageProcessor::cheatPuzzleReveal(PlayerColor player) From 82e8db3037c480cb0a481c7cda3fbc0c90fb43e5 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Wed, 8 Jan 2025 14:38:16 +0000 Subject: [PATCH 3/4] Do not compute threats that are too far away to be useful --- AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.cpp | 2 +- AI/Nullkiller/Engine/Settings.cpp | 1 + AI/Nullkiller/Engine/Settings.h | 2 ++ config/ai/nkai/nkai-settings.json | 5 +++++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.cpp b/AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.cpp index 5a8d0a24f..95dcb63a0 100644 --- a/AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.cpp +++ b/AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.cpp @@ -119,7 +119,7 @@ void DangerHitMapAnalyzer::updateHitMap() PathfinderSettings ps; - ps.scoutTurnDistanceLimit = ps.mainTurnDistanceLimit = ai->settings->getMainHeroTurnDistanceLimit(); + ps.scoutTurnDistanceLimit = ps.mainTurnDistanceLimit = ai->settings->getThreatTurnDistanceLimit(); ps.useHeroChain = false; ai->pathfinder->updatePaths(pair.second, ps); diff --git a/AI/Nullkiller/Engine/Settings.cpp b/AI/Nullkiller/Engine/Settings.cpp index 44ef27176..11357f9c1 100644 --- a/AI/Nullkiller/Engine/Settings.cpp +++ b/AI/Nullkiller/Engine/Settings.cpp @@ -28,6 +28,7 @@ namespace NKAI : maxRoamingHeroes(8), mainHeroTurnDistanceLimit(10), scoutHeroTurnDistanceLimit(5), + threatTurnDistanceLimit(5), maxGoldPressure(0.3f), retreatThresholdRelative(0.3), retreatThresholdAbsolute(10000), diff --git a/AI/Nullkiller/Engine/Settings.h b/AI/Nullkiller/Engine/Settings.h index 01f4f2a9c..ff2d1b859 100644 --- a/AI/Nullkiller/Engine/Settings.h +++ b/AI/Nullkiller/Engine/Settings.h @@ -24,6 +24,7 @@ namespace NKAI int maxRoamingHeroes; int mainHeroTurnDistanceLimit; int scoutHeroTurnDistanceLimit; + int threatTurnDistanceLimit; int maxPass; int maxPriorityPass; int pathfinderBucketsCount; @@ -52,6 +53,7 @@ namespace NKAI int getMaxRoamingHeroes() const { return maxRoamingHeroes; } int getMainHeroTurnDistanceLimit() const { return mainHeroTurnDistanceLimit; } int getScoutHeroTurnDistanceLimit() const { return scoutHeroTurnDistanceLimit; } + int getThreatTurnDistanceLimit() const { return threatTurnDistanceLimit; } int getPathfinderBucketsCount() const { return pathfinderBucketsCount; } int getPathfinderBucketSize() const { return pathfinderBucketSize; } bool isObjectGraphAllowed() const { return allowObjectGraph; } diff --git a/config/ai/nkai/nkai-settings.json b/config/ai/nkai/nkai-settings.json index 1a60fff8a..167d436ce 100644 --- a/config/ai/nkai/nkai-settings.json +++ b/config/ai/nkai/nkai-settings.json @@ -38,6 +38,7 @@ "maxPriorityPass" : 10, "mainHeroTurnDistanceLimit" : 10, "scoutHeroTurnDistanceLimit" : 5, + "threatTurnDistanceLimit" : 1, "maxGoldPressure" : 0.3, "updateHitmapOnTileReveal" : false, "useTroopsFromGarrisons" : true, @@ -58,6 +59,7 @@ "maxPriorityPass" : 10, "mainHeroTurnDistanceLimit" : 10, "scoutHeroTurnDistanceLimit" : 5, + "threatTurnDistanceLimit" : 4, "maxGoldPressure" : 0.3, "updateHitmapOnTileReveal" : false, "useTroopsFromGarrisons" : true, @@ -78,6 +80,7 @@ "maxPriorityPass" : 10, "mainHeroTurnDistanceLimit" : 10, "scoutHeroTurnDistanceLimit" : 5, + "threatTurnDistanceLimit" : 5, "maxGoldPressure" : 0.3, "updateHitmapOnTileReveal" : false, "useTroopsFromGarrisons" : true, @@ -98,6 +101,7 @@ "maxPriorityPass" : 10, "mainHeroTurnDistanceLimit" : 10, "scoutHeroTurnDistanceLimit" : 5, + "threatTurnDistanceLimit" : 5, "maxGoldPressure" : 0.3, "updateHitmapOnTileReveal" : false, "useTroopsFromGarrisons" : true, @@ -118,6 +122,7 @@ "maxPriorityPass" : 10, "mainHeroTurnDistanceLimit" : 10, "scoutHeroTurnDistanceLimit" : 5, + "threatTurnDistanceLimit" : 5, "maxGoldPressure" : 0.3, "updateHitmapOnTileReveal" : false, "useTroopsFromGarrisons" : true, From ec9dbfd66795abf08a4c2f4f83b3393d03100576 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Wed, 8 Jan 2025 14:38:55 +0000 Subject: [PATCH 4/4] Remove excessive recomputations of tile owners --- AI/Nullkiller/AIGateway.cpp | 15 ++++++++------- AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.cpp | 6 ------ AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.h | 2 +- AI/Nullkiller/Engine/Nullkiller.cpp | 2 +- config/ai/nkai/nkai-settings.json | 10 +++++----- 5 files changed, 15 insertions(+), 20 deletions(-) diff --git a/AI/Nullkiller/AIGateway.cpp b/AI/Nullkiller/AIGateway.cpp index c8a7efb30..a10010cbb 100644 --- a/AI/Nullkiller/AIGateway.cpp +++ b/AI/Nullkiller/AIGateway.cpp @@ -285,8 +285,8 @@ void AIGateway::tileRevealed(const std::unordered_set & pos) addVisitableObj(obj); } - if (nullkiller->settings->isUpdateHitmapOnTileReveal()) - nullkiller->dangerHitMap->reset(); + if (nullkiller->settings->isUpdateHitmapOnTileReveal() && !pos.empty()) + nullkiller->dangerHitMap->resetTileOwners(); } void AIGateway::heroExchangeStarted(ObjectInstanceID hero1, ObjectInstanceID hero2, QueryID query) @@ -389,9 +389,10 @@ void AIGateway::objectRemoved(const CGObjectInstance * obj, const PlayerColor & } if(obj->ID == Obj::HERO && cb->getPlayerRelations(obj->tempOwner, playerID) == PlayerRelations::ENEMIES) - { - nullkiller->dangerHitMap->reset(); - } + nullkiller->dangerHitMap->resetHitmap(); + + if(obj->ID == Obj::TOWN) + nullkiller->dangerHitMap->resetTileOwners(); } void AIGateway::showHillFortWindow(const CGObjectInstance * object, const CGHeroInstance * visitor) @@ -507,7 +508,7 @@ void AIGateway::objectPropertyChanged(const SetObjectProperty * sop) else if(relations == PlayerRelations::SAME_PLAYER && obj->ID == Obj::TOWN) { // reevaluate defence for a new town - nullkiller->dangerHitMap->reset(); + nullkiller->dangerHitMap->resetHitmap(); } } } @@ -1246,7 +1247,7 @@ void AIGateway::addVisitableObj(const CGObjectInstance * obj) if(obj->ID == Obj::HERO && cb->getPlayerRelations(obj->tempOwner, playerID) == PlayerRelations::ENEMIES) { - nullkiller->dangerHitMap->reset(); + nullkiller->dangerHitMap->resetHitmap(); } } diff --git a/AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.cpp b/AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.cpp index 95dcb63a0..750bfb772 100644 --- a/AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.cpp +++ b/AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.cpp @@ -345,10 +345,4 @@ std::set DangerHitMapAnalyzer::getOneTurnAccessibleObj return result; } -void DangerHitMapAnalyzer::reset() -{ - hitMapUpToDate = false; - tileOwnersUpToDate = false; -} - } diff --git a/AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.h b/AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.h index 2bd39a2d8..7e9a66c8a 100644 --- a/AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.h +++ b/AI/Nullkiller/Analyzers/DangerHitMapAnalyzer.h @@ -87,7 +87,7 @@ public: const HitMapNode & getObjectThreat(const CGObjectInstance * obj) const; const HitMapNode & getTileThreat(const int3 & tile) const; std::set getOneTurnAccessibleObjects(const CGHeroInstance * enemy) const; - void reset(); + void resetHitmap() {hitMapUpToDate = false;} void resetTileOwners() { tileOwnersUpToDate = false; } PlayerColor getTileOwner(const int3 & tile) const; const CGTownInstance * getClosestTown(const int3 & tile) const; diff --git a/AI/Nullkiller/Engine/Nullkiller.cpp b/AI/Nullkiller/Engine/Nullkiller.cpp index 88ee4f1dc..99decafd4 100644 --- a/AI/Nullkiller/Engine/Nullkiller.cpp +++ b/AI/Nullkiller/Engine/Nullkiller.cpp @@ -229,7 +229,7 @@ void Nullkiller::resetAiState() lockedResources = TResources(); scanDepth = ScanDepth::MAIN_FULL; lockedHeroes.clear(); - dangerHitMap->reset(); + dangerHitMap->resetHitmap(); useHeroChain = true; objectClusterizer->reset(); diff --git a/config/ai/nkai/nkai-settings.json b/config/ai/nkai/nkai-settings.json index 167d436ce..25cbcda38 100644 --- a/config/ai/nkai/nkai-settings.json +++ b/config/ai/nkai/nkai-settings.json @@ -40,7 +40,7 @@ "scoutHeroTurnDistanceLimit" : 5, "threatTurnDistanceLimit" : 1, "maxGoldPressure" : 0.3, - "updateHitmapOnTileReveal" : false, + "updateHitmapOnTileReveal" : true, "useTroopsFromGarrisons" : true, "openMap": true, "allowObjectGraph": false, @@ -61,7 +61,7 @@ "scoutHeroTurnDistanceLimit" : 5, "threatTurnDistanceLimit" : 4, "maxGoldPressure" : 0.3, - "updateHitmapOnTileReveal" : false, + "updateHitmapOnTileReveal" : true, "useTroopsFromGarrisons" : true, "openMap": true, "allowObjectGraph": false, @@ -82,7 +82,7 @@ "scoutHeroTurnDistanceLimit" : 5, "threatTurnDistanceLimit" : 5, "maxGoldPressure" : 0.3, - "updateHitmapOnTileReveal" : false, + "updateHitmapOnTileReveal" : true, "useTroopsFromGarrisons" : true, "openMap": true, "allowObjectGraph": false, @@ -103,7 +103,7 @@ "scoutHeroTurnDistanceLimit" : 5, "threatTurnDistanceLimit" : 5, "maxGoldPressure" : 0.3, - "updateHitmapOnTileReveal" : false, + "updateHitmapOnTileReveal" : true, "useTroopsFromGarrisons" : true, "openMap": true, "allowObjectGraph": false, @@ -124,7 +124,7 @@ "scoutHeroTurnDistanceLimit" : 5, "threatTurnDistanceLimit" : 5, "maxGoldPressure" : 0.3, - "updateHitmapOnTileReveal" : false, + "updateHitmapOnTileReveal" : true, "useTroopsFromGarrisons" : true, "openMap": true, "allowObjectGraph": false,