1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
|
// -------------------------------------------------------------------------
// AAI
//
// A skirmish AI for the Spring engine.
// Copyright Alexander Seizinger
//
// Released under GPL license: see LICENSE.html for more information.
// -------------------------------------------------------------------------
#ifndef AAI_H
#define AAI_H
#include <list>
#include <vector>
#include "ExternalAI/Interface/SSkirmishAICallback.h"
#include "LegacyCpp/IGlobalAI.h"
#include "aidef.h"
#include "AAIBuildTree.h"
namespace springLegacyAI {
class IAICallback;
}
using namespace springLegacyAI;
class AAIExecute;
class Profiler;
class AAIBrain;
class AAIBuildTask;
class AAIAirForceManager;
class AAIAttackManager;
class AAIBuildTable;
class AAIUnitTable;
class AAIMap;
class AAIThreatMap;
class AAIGroup;
class AAI : public IGlobalAI
{
public:
AAI(int skirmishAIId, const struct SSkirmishAICallback* callback);
virtual ~AAI();
void InitAI(IGlobalAICallback* callback, int team);
void UnitCreated(int unit, int builder); //called when a new unit is created on ai team
void UnitFinished(int unit); //called when an unit has finished building
void UnitIdle(int unit); //called when a unit go idle and is not assigned to any group
void UnitDestroyed(int unit, int attacker); //called when a unit is destroyed
void UnitDamaged(int damaged,int attacker,float damage,float3 dir); //called when one of your units are damaged
void UnitMoveFailed(int unit);
void EnemyEnterLOS(int enemy);
void EnemyLeaveLOS(int enemy);
void EnemyEnterRadar(int enemy); //called when an enemy enters radar coverage (not called if enemy go directly from not known -> los)
void EnemyLeaveRadar(int enemy); //called when an enemy leaves radar coverage (not called if enemy go directly from inlos -> now known)
void RecvChatMessage(const char* /*msg*/,int /*player*/) {} //called when someone writes a chat msg
void RecvLuaMessage(const char* /*inData*/, const char** /*outData*/) {}
void EnemyDamaged(int /*damaged*/,int /*attacker*/,float /*damage*/,float3 /*dir*/) {} //called when an enemy inside los or radar is damaged
void EnemyDestroyed(int enemy, int attacker);
void Log(const char* format, ...);
void LogConsole(const char* format, ...);
int HandleEvent(int msg, const void *data);
//! @brief Creates a buildTask (if a building is constructed)
void ConstructionStarted(UnitId unitId, UnitDefId unitDefId, UnitId constructor);
//! @brief Returns the number of AAI instances
int GetNumberOfAAIInstances() const { return s_aaiInstances; }
//! @brief Returns the id of this AAI instance
int GetAAIInstance() const { return m_aaiInstance; }
//! @brief Returns current game phase
const GamePhase& GetGamePhase() const { return m_gamePhase; }
// called every frame
void Update();
//! Workaround to get current LOS Map (ai callback version of legacy CPP interface is bugged)
const int* GetLosMap();
//! @brief Returns the unitDefId for a given unitId
UnitDefId GetUnitDefId(UnitId unitId) const;
//! @brief Returns the unit definition for the given unit name
const springLegacyAI::UnitDef* GetUnitDef(const std::string& unitName) const { return m_aiCallback->GetUnitDef(unitName.c_str()); }
//! @brief Returns pointer to AI callback
IAICallback* GetAICallback() const { return m_aiCallback; }
//! @brief Returns the side of this AAI instance
int GetSide() const { return m_side; }
//! @brief Return team (not ally team) of this AAI instance
int GetMyTeamId() const { return m_myTeamId; }
std::list<AAIBuildTask*>& GetBuildTasks() { return build_tasks; }
//! @brief Returns the list of units groups for the given unit category
std::list<AAIGroup*>& GetUnitGroupsList(const AAIUnitCategory& category)
{
return m_unitGroupsOfCategoryLists[category.GetArrayIndex()];
}
AAIMap* const Map() { return m_map; }
AAIBrain* const Brain() { return m_brain; }
AAIExecute* const Execute() { return m_execute; }
AAIUnitTable* const UnitTable() { return m_unitTable; }
AAIBuildTable* const BuildTable() { return m_buildTable; }
AAIAirForceManager* const AirForceMgr() { return m_airForceManager; }
//! The buildtree (who builds what, which unit belongs to which side, ...)
static AAIBuildTree s_buildTree;
private:
Profiler* GetProfiler(){ return profiler; }
//! Pointer to AI callback
IAICallback* m_aiCallback;
//! The ID of the AI (used to access the correct SkirmishAICallback)
int m_skirmishAIId;
//! The SkirmishAICallback of all AIs
const struct SSkirmishAICallback* m_skirmishAICallbacks;
//! LOS Map
std::vector<int> m_losMap;
// list of buildtasks
std::list<AAIBuildTask*> build_tasks;
//! Stores information about the map (shared between all AAI instances) and AI specific map related data (e.g. build map, threat map, defence maps, sectors, ...)
AAIMap* m_map;
//! The threat map is used to determine suitable targets to attack
AAIThreatMap* m_threatMap;
//! AAI's brain is responsible for analyzing the current situation of the game and making the appropriate decisions
AAIBrain* m_brain;
//! Collection of functions to execute all kinds of typical tasks (typically relying on data/decisions by other AAI components)
AAIExecute* m_execute;
//! The unit table stores information about the active units (both own and enemy/allied ones)
AAIUnitTable* m_unitTable;
//! The build table stores information about unit types and selects units from the available types according to given criteria
AAIBuildTable* m_buildTable;
//! The air force manager coordinates combat air units
AAIAirForceManager* m_airForceManager;
public:
//! The attack manager coordinates attakcs by ground and sea units
AAIAttackManager* m_attackManager;
private:
//! List of groups of unit of the different categories
std::vector< std::list<AAIGroup*> > m_unitGroupsOfCategoryLists;
Profiler* profiler;
//! Id of the team (not ally team) of the AAI instance
int m_myTeamId;
//! Side of this AAI instance; 0 always neutral, for TA-like mods 1 = Arm, 2 = Core
int m_side;
//! File to which log messages are written
FILE *m_logFile;
//! Initialization state - true if AAI has been sucessfully initialized and ready to run
bool m_initialized;
//! True if game/mod and general config have been loaded successfully
bool m_configLoaded;
//! Counter how many instances of AAI exist - if there is more than one instance of AAI, needed to ensure to allocate/free shared memory (e.g. unit learning data) only once
static int s_aaiInstances;
//! Id of this instance of AAI
int m_aaiInstance;
//! Current game phase
GamePhase m_gamePhase;
};
#endif
|