1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-19 00:17:56 +02:00
Files
.github
AI
BattleAI
EmptyAI
FuzzyLite
Nullkiller
Analyzers
Behaviors
Engine
AIMemory.cpp
AIMemory.h
DeepDecomposer.cpp
DeepDecomposer.h
FuzzyEngines.cpp
FuzzyEngines.h
FuzzyHelper.cpp
FuzzyHelper.h
Nullkiller.cpp
Nullkiller.h
PriorityEvaluator.cpp
PriorityEvaluator.h
Goals
Helpers
Markers
Pathfinding
AIGateway.cpp
AIGateway.h
AIUtility.cpp
AIUtility.h
CMakeLists.txt
StdInc.cpp
StdInc.h
main.cpp
StupidAI
VCAI
CMakeLists.txt
FuzzyLite.cbp
GeniusAI.brain
CI
Mods
android
client
cmake_modules
config
debian
docs
include
ios
launcher
lib
lib_server
mapeditor
osx
rpm
scripting
scripts
server
test
win
xcode
.gitattributes
.gitignore
.gitmodules
.travis.yml
AUTHORS.h
CCallback.cpp
CCallback.h
CMakeLists.txt
CMakePresets.json
ChangeLog.md
Global.h
VCMI_VS15.sln
VCMI_global.props
VCMI_global_debug.props
VCMI_global_release.props
VCMI_global_user.props
Version.cpp.in
Version.h
conanfile.py
fuzzylite.pc.in
license.txt
vcmi.workspace
vcmibuilder
vcmi/AI/Nullkiller/Engine/Nullkiller.h

107 lines
3.2 KiB
C++
Raw Normal View History

/*
* 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 "DeepDecomposer.h"
#include "../Analyzers/DangerHitMapAnalyzer.h"
#include "../Analyzers/BuildAnalyzer.h"
#include "../Analyzers/ArmyManager.h"
#include "../Analyzers/HeroManager.h"
2021-05-16 14:45:12 +03:00
#include "../Analyzers/ObjectClusterizer.h"
#include "../Helpers/ArmyFormation.h"
2022-09-26 21:01:07 +03:00
namespace NKAI
{
const float MAX_GOLD_PEASURE = 0.3f;
const float MIN_PRIORITY = 0.01f;
2023-02-28 09:07:59 +02:00
const float SMALL_SCAN_MIN_PRIORITY = 0.4f;
enum class HeroLockedReason
{
NOT_LOCKED = 0,
STARTUP = 1,
DEFENCE = 2,
HERO_CHAIN = 3
};
2021-05-16 15:01:34 +03:00
enum class ScanDepth
{
2023-07-27 15:58:49 +03:00
MAIN_FULL = 0,
2021-05-16 15:01:34 +03:00
2023-07-27 15:58:49 +03:00
SMALL = 1,
ALL_FULL = 2
2021-05-16 15:01:34 +03:00
};
class Nullkiller
{
private:
2021-05-16 14:07:54 +03:00
const CGHeroInstance * activeHero;
int3 targetTile;
2023-02-28 09:07:59 +02:00
ObjectInstanceID targetObject;
std::map<const CGHeroInstance *, HeroLockedReason> lockedHeroes;
2021-05-16 15:01:34 +03:00
ScanDepth scanDepth;
2021-05-16 15:39:38 +03:00
TResources lockedResources;
2022-09-06 21:14:22 +03:00
bool useHeroChain;
public:
std::unique_ptr<DangerHitMapAnalyzer> dangerHitMap;
std::unique_ptr<BuildAnalyzer> buildAnalyzer;
2021-05-16 14:45:12 +03:00
std::unique_ptr<ObjectClusterizer> objectClusterizer;
std::unique_ptr<PriorityEvaluator> priorityEvaluator;
std::unique_ptr<SharedPool<PriorityEvaluator>> priorityEvaluators;
std::unique_ptr<AIPathfinder> pathfinder;
std::unique_ptr<HeroManager> heroManager;
std::unique_ptr<ArmyManager> armyManager;
std::unique_ptr<AIMemory> memory;
std::unique_ptr<FuzzyHelper> dangerEvaluator;
std::unique_ptr<DeepDecomposer> decomposer;
std::unique_ptr<ArmyFormation> armyFormation;
PlayerColor playerID;
std::shared_ptr<CCallback> cb;
2023-12-17 10:11:05 +02:00
std::mutex aiStateMutex;
Nullkiller();
void init(std::shared_ptr<CCallback> cb, PlayerColor playerID);
void makeTurn();
2021-05-16 14:07:54 +03:00
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; }
2023-02-28 09:07:59 +02:00
ObjectInstanceID getTargetObject() const { return targetObject; }
void setTargetObject(int objid) { targetObject = ObjectInstanceID(objid); }
void setActive(const CGHeroInstance * hero, int3 tile) { activeHero = hero; targetTile = tile; }
void lockHero(const CGHeroInstance * hero, HeroLockedReason lockReason) { lockedHeroes[hero] = lockReason; }
2021-05-16 14:07:54 +03:00
void unlockHero(const CGHeroInstance * hero) { lockedHeroes.erase(hero); }
bool arePathHeroesLocked(const AIPath & path) const;
2021-05-16 15:39:38 +03:00
TResources getFreeResources() const;
2023-04-05 03:26:29 +03:00
int32_t getFreeGold() const { return getFreeResources()[EGameResID::GOLD]; }
2021-05-16 15:39:38 +03:00
void lockResources(const TResources & res);
const TResources & getLockedResources() const { return lockedResources; }
ScanDepth getScanDepth() const { return scanDepth; }
private:
void resetAiState();
2022-09-06 21:14:22 +03:00
void updateAiState(int pass, bool fast = false);
Goals::TTask choseBestTask(Goals::TSubgoal behavior, int decompositionMaxDepth) const;
Goals::TTask choseBestTask(Goals::TTaskVec & tasks) const;
2022-09-06 21:14:22 +03:00
void executeTask(Goals::TTask task);
};
2022-09-26 21:01:07 +03:00
}