1 /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
2 
3 #ifndef _AI_AI_CALLBACK_H
4 #define _AI_AI_CALLBACK_H
5 
6 #include "IAICallback.h"
7 
8 struct SSkirmishAICallback;
9 
10 
11 namespace springLegacyAI {
12 
13 /**
14  * The AI side wrapper over the C AI interface for IAICallback.
15  */
16 class CAIAICallback : public IAICallback {
17 public:
18 	CAIAICallback();
19 	CAIAICallback(int skirmishAIId, const SSkirmishAICallback* sAICallback);
20 	~CAIAICallback();
21 
22 	void SendTextMsg(const char* text, int zone);
23 	void SetLastMsgPos(float3 pos);
24 	void AddNotification(float3 pos, float3 color, float alpha);
25 
26 	bool SendResources(float mAmount, float eAmount, int receivingTeam);
27 
28 	int SendUnits(const std::vector<int>& unitIDs, int receivingTeam);
29 
30 	bool PosInCamera(float3 pos, float radius);
31 
32 	int GetCurrentFrame();
33 
34 	int GetMySkirmishAIId();
35 	int GetMyTeam();
36 	int GetMyAllyTeam();
37 	int GetPlayerTeam(int player);
38 	int GetTeams();
39 	const char* GetTeamSide(int teamId);
40 	int GetTeamAllyTeam(int teamId);
41 
42 	float GetTeamMetalCurrent(int teamId);
43 	float GetTeamMetalIncome(int teamId);
44 	float GetTeamMetalUsage(int teamId);
45 	float GetTeamMetalStorage(int teamId);
46 
47 	float GetTeamEnergyCurrent(int teamId);
48 	float GetTeamEnergyIncome(int teamId);
49 	float GetTeamEnergyUsage(int teamId);
50 	float GetTeamEnergyStorage(int teamId);
51 
52 	bool IsAllied(int firstAllyTeamId, int secondAllyTeamId);
53 
54 	void* CreateSharedMemArea(char* name, int size);
55 
56 	void ReleasedSharedMemArea(char* name);
57 
58 	int CreateGroup();
59 
60 	void EraseGroup(int groupid);
61 	bool AddUnitToGroup(int unitid, int groupid);
62 
63 	bool RemoveUnitFromGroup(int unitid);
64 	int GetUnitGroup(int unitid);
65 	const std::vector<CommandDescription>* GetGroupCommands(int unitid);
66 	int GiveGroupOrder(int unitid, Command* c);
67 
68 	int GiveOrder(int unitid, Command* c);
69 
70 	const std::vector<CommandDescription>* GetUnitCommands(int unitid);
71 	const CCommandQueue* GetCurrentUnitCommands(int unitid);
72 
73 	int GetMaxUnits();
74 
75 	int GetUnitAiHint(int unitid);
76 	int GetUnitTeam(int unitid);
77 	int GetUnitAllyTeam(int unitid);
78 	float GetUnitHealth(int unitid);
79 	float GetUnitMaxHealth(int unitid);
80 	float GetUnitSpeed(int unitid);
81 	float GetUnitPower(int unitid);
82 	float GetUnitExperience(int unitid);
83 	float GetUnitMaxRange(int unitid);
84 	bool IsUnitActivated (int unitid);
85 	bool UnitBeingBuilt(int unitid);
86 	const UnitDef* GetUnitDef(int unitid);
87 
88 	float3 GetUnitPos(int unitid);
89 	float3 GetUnitVel(int unitid);
90 
91 	int GetBuildingFacing(int unitid);
92 	bool IsUnitCloaked(int unitid);
93 	bool IsUnitParalyzed(int unitid);
94 	bool IsUnitNeutral(int unitid);
95 	bool GetUnitResourceInfo(int unitid, UnitResourceInfo* resourceInfo);
96 
97 	const UnitDef* GetUnitDef(const char* unitName);
98 	const UnitDef* GetUnitDefById(int unitDefId);
99 
100 	int InitPath(float3 start, float3 end, int pathType, float goalRadius);
101 	float3 GetNextWaypoint(int pathid);
102 	void FreePath(int pathid);
103 
104 	float GetPathLength(float3 start, float3 end, int pathType,
105 			float goalRadius);
106 
107 	int GetEnemyUnits(int* unitIds, int unitIds_max);
108 	int GetEnemyUnitsInRadarAndLos(int* unitIds, int unitIds_max);
109 	int GetEnemyUnits(int* unitIds, const float3& pos, float radius,
110 			int unitIds_max);
111 	int GetFriendlyUnits(int* unitIds, int unitIds_max);
112 	int GetFriendlyUnits(int* unitIds, const float3& pos, float radius,
113 			int unitIds_max);
114 	int GetNeutralUnits(int* unitIds, int unitIds_max);
115 	int GetNeutralUnits(int* unitIds, const float3& pos, float radius,
116 			int unitIds_max);
117 
118 	int GetMapWidth();
119 	int GetMapHeight();
120 	const float* GetHeightMap();
121 	const float* GetCornersHeightMap();
122 	float GetMinHeight();
123 	float GetMaxHeight();
124 	const float* GetSlopeMap();
125 
126 	const unsigned short* GetLosMap();
127 	int GetLosMapResolution();
128 	const unsigned short* GetRadarMap();
129 	const unsigned short* GetJammerMap();
130 	const unsigned char* GetMetalMap();
131 	int GetMapHash();
132 	const char* GetMapName();
133 	const char* GetMapHumanName();
134 	int GetModHash();
135 	const char* GetModName();
136 	const char* GetModHumanName();
137 	const char* GetModShortName();
138 	const char* GetModVersion();
139 
140 	float GetElevation(float x, float z);
141 
142 	float GetMaxMetal() const;
143 	float GetExtractorRadius() const;
144 	float GetMinWind() const;
145 	float GetMaxWind() const;
146 	float GetCurWind() const;
147 	float GetTidalStrength() const;
148 	float GetGravity() const;
149 
150 	void LineDrawerStartPath(const float3& pos, const float* color);
151 	void LineDrawerFinishPath();
152 	void LineDrawerDrawLine(const float3& endPos, const float* color);
153 	void LineDrawerDrawLineAndIcon(int cmdID, const float3& endPos,
154 			const float* color);
155 	void LineDrawerDrawIconAtLastPos(int cmdID);
156 	void LineDrawerBreak(const float3& endPos, const float* color);
157 	void LineDrawerRestart();
158 	void LineDrawerRestartSameColor();
159 
160 	int CreateSplineFigure(float3 pos1, float3 pos2, float3 pos3,
161 			float3 pos4, float width, int arrow, int lifetime, int group);
162 	int CreateLineFigure(float3 pos1, float3 pos2, float width,
163 			int arrow, int lifetime, int group);
164 	void SetFigureColor(int group, float red, float green, float blue,
165 			float alpha);
166 	void DeleteFigureGroup(int group);
167 
168 	void DrawUnit(const char* name, float3 pos, float rotation,
169 			int lifetime, int team, bool transparent, bool drawBorder,
170 			int facing);
171 
172 
173 	bool IsDebugDrawerEnabled() const;
174 	void DebugDrawerAddGraphPoint(int, float, float);
175 	void DebugDrawerDelGraphPoints(int, int);
176 	void DebugDrawerSetGraphPos(float, float);
177 	void DebugDrawerSetGraphSize(float, float);
178 	void DebugDrawerSetGraphLineColor(int, const float3&);
179 	void DebugDrawerSetGraphLineLabel(int, const char*);
180 
181 	int DebugDrawerAddOverlayTexture(const float*, int, int);
182 	void DebugDrawerUpdateOverlayTexture(int, const float*, int, int, int, int);
183 	void DebugDrawerDelOverlayTexture(int);
184 	void DebugDrawerSetOverlayTexturePos(int, float, float);
185 	void DebugDrawerSetOverlayTextureSize(int, float, float);
186 	void DebugDrawerSetOverlayTextureLabel(int, const char*);
187 
188 
189 	bool CanBuildAt(const UnitDef* unitDef, float3 pos, int facing);
190 
191 	float3 ClosestBuildSite(const UnitDef* unitdef, float3 pos,
192 			float searchRadius, int minDist, int facing);
193 
194 	bool GetProperty(int id, int property, void* dst);
195 	bool GetValue(int id, void* dst);
196 	int HandleCommand(int commandId, void* data);
197 
198 	int GetFileSize(const char* name);
199 	bool ReadFile(const char* name, void* buffer, int bufferLen);
200 
201 	int GetSelectedUnits(int* unitIds, int unitIds_max);
202 	float3 GetMousePos();
203 	int GetMapPoints(PointMarker* pm, int pm_sizeMax, bool includeAllies);
204 	int GetMapLines(LineMarker* lm, int lm_sizeMax, bool includeAllies);
205 
206 	float GetMetal();
207 	float GetMetalIncome();
208 	float GetMetalUsage();
209 	float GetMetalStorage();
210 
211 	float GetEnergy();
212 	float GetEnergyIncome();
213 	float GetEnergyUsage();
214 	float GetEnergyStorage();
215 
216 	int GetFeatures(int *features, int max);
217 	int GetFeatures(int *features, int max, const float3& pos,
218 			float radius);
219 	const FeatureDef* GetFeatureDef(int feature);
220 	const FeatureDef* GetFeatureDefById(int featureDefId);
221 	float GetFeatureHealth(int feature);
222 	float GetFeatureReclaimLeft(int feature);
223 	float3 GetFeaturePos(int feature);
224 
225 	int GetNumUnitDefs();
226 	void GetUnitDefList(const UnitDef** list);
227 	float GetUnitDefHeight(int def);
228 	float GetUnitDefRadius(int def);
229 
230 	const WeaponDef* GetWeapon(const char* weaponName);
231 	const WeaponDef* GetWeaponDefById(int weaponDefId);
232 
233 	const float3* GetStartPos();
234 
235 	unsigned int GetCategoryFlag(const char* categoryName);
236 	unsigned int GetCategoriesFlag(const char* categoryNames);
237 	void GetCategoryName(int categoryFlag, char* name, int name_sizeMax);
238 
239 
240 	const char* CallLuaRules(const char* inData, int inSize, int* outSize);
241 	const char* CallLuaUI(const char* inData, int inSize, int* outSize);
242 
243 	std::map<std::string, std::string> GetMyInfo();
244 	std::map<std::string, std::string> GetMyOptionValues();
245 
246 private:
247 	int skirmishAIId;
248 	const SSkirmishAICallback* sAICallback;
249 
250 	void init();
251 
252 	int Internal_GiveOrder(int unitId, int groupId, Command* c);
253 
254 	// caches
255 	WeaponDef** weaponDefs;
256 	int* weaponDefFrames;
257 	UnitDef** unitDefs;
258 	int* unitDefFrames;
259 	// the following three are needed to prevent memory leaks
260 	std::vector<CommandDescription>** groupPossibleCommands;
261 	std::vector<CommandDescription>** unitPossibleCommands;
262 	CCommandQueue** unitCurrentCommandQueues;
263 	FeatureDef** featureDefs;
264 	int* featureDefFrames;
265 	float3 startPos;
266 
267 	static size_t numClbInstances;
268 	static float* heightMap;
269 	static float* cornersHeightMap;
270 	static float* slopeMap;
271 	static unsigned short* losMap;
272 	static unsigned short* radarMap;
273 	static unsigned short* jammerMap;
274 	static unsigned char* metalMap;
275 };
276 
277 } // namespace springLegacyAI
278 
279 #endif // _AI_AI_CALLBACK_H
280