From 4e9f052e986c04fcf3e9427935b91538094e58c2 Mon Sep 17 00:00:00 2001 From: MichalZr6 Date: Mon, 30 Dec 2024 00:06:10 +0100 Subject: [PATCH] Fix creature upgrades in Fort and town's dwellings --- AI/Nullkiller/Analyzers/BuildAnalyzer.cpp | 15 ++++++--------- client/windows/CCastleInterface.cpp | 11 ++++++----- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/AI/Nullkiller/Analyzers/BuildAnalyzer.cpp b/AI/Nullkiller/Analyzers/BuildAnalyzer.cpp index 89b87324e..6a1c0c070 100644 --- a/AI/Nullkiller/Analyzers/BuildAnalyzer.cpp +++ b/AI/Nullkiller/Analyzers/BuildAnalyzer.cpp @@ -17,13 +17,9 @@ namespace NKAI void BuildAnalyzer::updateTownDwellings(TownDevelopmentInfo & developmentInfo) { - auto townInfo = developmentInfo.town->getTown(); - auto creatures = townInfo->creatures; - auto buildings = townInfo->getAllBuildings(); - std::map parentMap; - for(auto &pair : townInfo->buildings) + for(auto &pair : developmentInfo.town->getTown()->buildings) { if(pair.second->upgrade != BuildingID::NONE) { @@ -36,13 +32,14 @@ void BuildAnalyzer::updateTownDwellings(TownDevelopmentInfo & developmentInfo) logAi->trace("Checking dwelling level %d", level); BuildingInfo nextToBuild = BuildingInfo(); - for(int upgradeIndex : {2, 1, 0}) + BuildingID buildID = BuildingID(BuildingID::getDwellingFromLevel(level, 0)); + + for(; developmentInfo.town->getBuildings().count(buildID); BuildingID::advanceDwelling(buildID)) { - BuildingID building = BuildingID(BuildingID::getDwellingFromLevel(level, upgradeIndex)); - if(!vstd::contains(buildings, building)) + if(!developmentInfo.town->hasBuilt(buildID)) continue; // no such building in town - auto info = getBuildingOrPrerequisite(developmentInfo.town, building); + auto info = getBuildingOrPrerequisite(developmentInfo.town, buildID); if(info.exists) { diff --git a/client/windows/CCastleInterface.cpp b/client/windows/CCastleInterface.cpp index 2ab065ad0..5ac0341c1 100644 --- a/client/windows/CCastleInterface.cpp +++ b/client/windows/CCastleInterface.cpp @@ -1813,12 +1813,13 @@ CFortScreen::CFortScreen(const CGTownInstance * town): BuildingID buildingID; if(fortSize == town->getTown()->creatures.size()) { - BuildingID dwelling = BuildingID::getDwellingFromLevel(i, 1); + BuildingID buildID = BuildingID(BuildingID::getDwellingFromLevel(i, 0)); - if(town->hasBuilt(dwelling)) - buildingID = BuildingID(BuildingID::getDwellingFromLevel(i, 1)); - else - buildingID = BuildingID(BuildingID::getDwellingFromLevel(i, 0)); + for(; town->getBuildings().count(buildID); BuildingID::advanceDwelling(buildID)) + { + if(town->hasBuilt(buildID)) + buildingID = buildID; + } } else {