/* * Nullkiller.h, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ #pragma once #include "PriorityEvaluator.h" #include "FuzzyHelper.h" #include "AIMemory.h" #include "../Analyzers/DangerHitMapAnalyzer.h" #include "../Analyzers/BuildAnalyzer.h" #include "../Analyzers/ArmyManager.h" #include "../Analyzers/HeroManager.h" #include "../Analyzers/ObjectClusterizer.h" #include "../Goals/AbstractGoal.h" const float MAX_GOLD_PEASURE = 0.3f; const float MIN_PRIORITY = 0.01f; enum class HeroLockedReason { NOT_LOCKED = 0, STARTUP = 1, DEFENCE = 2, HERO_CHAIN = 3 }; class Nullkiller { private: const CGHeroInstance * activeHero; int3 targetTile; std::map lockedHeroes; public: std::unique_ptr dangerHitMap; std::unique_ptr buildAnalyzer; std::unique_ptr objectClusterizer; std::unique_ptr priorityEvaluator; std::unique_ptr pathfinder; std::unique_ptr heroManager; std::unique_ptr armyManager; std::unique_ptr memory; std::unique_ptr dangerEvaluator; PlayerColor playerID; std::shared_ptr cb; Nullkiller(); void init(std::shared_ptr cb, PlayerColor playerID); void makeTurn(); bool isActive(const CGHeroInstance * hero) const { return activeHero == hero; } bool isHeroLocked(const CGHeroInstance * hero) const; HeroPtr getActiveHero() { return activeHero; } HeroLockedReason getHeroLockedReason(const CGHeroInstance * hero) const; int3 getTargetTile() const { return targetTile; } void setActive(const CGHeroInstance * hero, int3 tile) { activeHero = hero; targetTile = tile; } void lockHero(const CGHeroInstance * hero, HeroLockedReason lockReason) { lockedHeroes[hero] = lockReason; } void unlockHero(const CGHeroInstance * hero) { lockedHeroes.erase(hero); } bool arePathHeroesLocked(const AIPath & path) const; private: void resetAiState(); void updateAiState(); Goals::TTask choseBestTask(Goals::TSubgoal behavior) const; Goals::TTask choseBestTask(Goals::TTaskVec & tasks) const; };