File: AIAICallback.h

package info (click to toggle)
spring 104.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 47,512 kB
  • sloc: cpp: 391,093; ansic: 79,943; python: 12,356; java: 12,201; awk: 5,889; sh: 1,826; xml: 655; makefile: 486; perl: 405; php: 211; objc: 194; sed: 2
file content (287 lines) | stat: -rw-r--r-- 8,904 bytes parent folder | download | duplicates (2)
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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */

#ifndef _AI_AI_CALLBACK_H
#define _AI_AI_CALLBACK_H

#include <memory>

#include "IAICallback.h"

// engine header copies
#include "UnitDef.h"
#include "FeatureDef.h"
#include "WeaponDef.h"

struct SSkirmishAICallback;


namespace springLegacyAI {

/**
 * The AI side wrapper over the C AI interface for IAICallback.
 */
class CAIAICallback : public IAICallback {
public:
	CAIAICallback();
	CAIAICallback(int skirmishAIId, const SSkirmishAICallback* sAICallback);
	~CAIAICallback();

	void SendTextMsg(const char* text, int zone);
	void SetLastMsgPos(float3 pos);
	void AddNotification(float3 pos, float3 color, float alpha);

	bool SendResources(float mAmount, float eAmount, int receivingTeam);

	int SendUnits(const std::vector<int>& unitIDs, int receivingTeam);

	bool PosInCamera(float3 pos, float radius);

	int GetCurrentFrame();

	int GetMySkirmishAIId();
	int GetMyTeam();
	int GetMyAllyTeam();
	int GetPlayerTeam(int player);
	int GetTeams();
	const char* GetTeamSide(int teamId);
	int GetTeamAllyTeam(int teamId);

	float GetTeamMetalCurrent(int teamId);
	float GetTeamMetalIncome(int teamId);
	float GetTeamMetalUsage(int teamId);
	float GetTeamMetalStorage(int teamId);

	float GetTeamEnergyCurrent(int teamId);
	float GetTeamEnergyIncome(int teamId);
	float GetTeamEnergyUsage(int teamId);
	float GetTeamEnergyStorage(int teamId);

	bool IsAllied(int firstAllyTeamId, int secondAllyTeamId);

	void* CreateSharedMemArea(char* name, int size);

	void ReleasedSharedMemArea(char* name);

	int CreateGroup();

	void EraseGroup(int groupid);
	bool AddUnitToGroup(int unitid, int groupid);

	bool RemoveUnitFromGroup(int unitid);
	int GetUnitGroup(int unitid);
	const std::vector<SCommandDescription>* GetGroupCommands(int unitid);
	int GiveGroupOrder(int unitid, Command* c);

	int GiveOrder(int unitid, Command* c);

	const std::vector<SCommandDescription>* GetUnitCommands(int unitid);
	const CCommandQueue* GetCurrentUnitCommands(int unitid);

	int GetMaxUnits();

	int GetUnitAiHint(int unitid);
	int GetUnitTeam(int unitid);
	int GetUnitAllyTeam(int unitid);
	float GetUnitHealth(int unitid);
	float GetUnitMaxHealth(int unitid);
	float GetUnitSpeed(int unitid);
	float GetUnitPower(int unitid);
	float GetUnitExperience(int unitid);
	float GetUnitMaxRange(int unitid);
	bool IsUnitActivated (int unitid);
	bool UnitBeingBuilt(int unitid);
	const UnitDef* GetUnitDef(int unitid);

	float3 GetUnitPos(int unitid);
	float3 GetUnitVel(int unitid);

	int GetBuildingFacing(int unitid);
	bool IsUnitCloaked(int unitid);
	bool IsUnitParalyzed(int unitid);
	bool IsUnitNeutral(int unitid);
	bool GetUnitResourceInfo(int unitid, UnitResourceInfo* resourceInfo);

	const UnitDef* GetUnitDef(const char* unitName);
	const UnitDef* GetUnitDefById(int unitDefId);

	int InitPath(float3 start, float3 end, int pathType, float goalRadius);
	float3 GetNextWaypoint(int pathid);
	void FreePath(int pathid);

	float GetPathLength(float3 start, float3 end, int pathType,
			float goalRadius);

	int GetEnemyUnits(int* unitIds, int unitIds_max);
	int GetEnemyUnitsInRadarAndLos(int* unitIds, int unitIds_max);
	int GetEnemyUnits(int* unitIds, const float3& pos, float radius, int unitIds_max);
	int GetFriendlyUnits(int* unitIds, int unitIds_max);
	int GetFriendlyUnits(int* unitIds, const float3& pos, float radius, int unitIds_max);
	int GetNeutralUnits(int* unitIds, int unitIds_max);
	int GetNeutralUnits(int* unitIds, const float3& pos, float radius, int unitIds_max);

	int GetMapWidth();
	int GetMapHeight();
	const float* GetHeightMap();
	const float* GetCornersHeightMap();
	float GetMinHeight();
	float GetMaxHeight();
	const float* GetSlopeMap();

	const unsigned short* GetLosMap();
	int GetLosMapResolution();
	const unsigned short* GetRadarMap();
	const unsigned short* GetJammerMap();
	const unsigned char* GetMetalMap();
	int GetMapHash();
	const char* GetMapName();
	const char* GetMapHumanName();
	int GetModHash();
	const char* GetModName();
	const char* GetModHumanName();
	const char* GetModShortName();
	const char* GetModVersion();

	float GetElevation(float x, float z);

	float GetMaxMetal() const;
	float GetExtractorRadius() const;
	float GetMinWind() const;
	float GetMaxWind() const;
	float GetCurWind() const;
	float GetTidalStrength() const;
	float GetGravity() const;

	void LineDrawerStartPath(const float3& pos, const float* color);
	void LineDrawerFinishPath();
	void LineDrawerDrawLine(const float3& endPos, const float* color);
	void LineDrawerDrawLineAndIcon(int cmdID, const float3& endPos,
			const float* color);
	void LineDrawerDrawIconAtLastPos(int cmdID);
	void LineDrawerBreak(const float3& endPos, const float* color);
	void LineDrawerRestart();
	void LineDrawerRestartSameColor();

	int CreateSplineFigure(float3 pos1, float3 pos2, float3 pos3,
			float3 pos4, float width, int arrow, int lifetime, int group);
	int CreateLineFigure(float3 pos1, float3 pos2, float width,
			int arrow, int lifetime, int group);
	void SetFigureColor(int group, float red, float green, float blue,
			float alpha);
	void DeleteFigureGroup(int group);

	void DrawUnit(const char* name, float3 pos, float rotation,
			int lifetime, int team, bool transparent, bool drawBorder,
			int facing);


	bool IsDebugDrawerEnabled() const;
	void DebugDrawerAddGraphPoint(int, float, float);
	void DebugDrawerDelGraphPoints(int, int);
	void DebugDrawerSetGraphPos(float, float);
	void DebugDrawerSetGraphSize(float, float);
	void DebugDrawerSetGraphLineColor(int, const float3&);
	void DebugDrawerSetGraphLineLabel(int, const char*);

	int DebugDrawerAddOverlayTexture(const float*, int, int);
	void DebugDrawerUpdateOverlayTexture(int, const float*, int, int, int, int);
	void DebugDrawerDelOverlayTexture(int);
	void DebugDrawerSetOverlayTexturePos(int, float, float);
	void DebugDrawerSetOverlayTextureSize(int, float, float);
	void DebugDrawerSetOverlayTextureLabel(int, const char*);


	bool CanBuildAt(const UnitDef* unitDef, float3 pos, int facing);

	float3 ClosestBuildSite(const UnitDef* unitdef, float3 pos,
			float searchRadius, int minDist, int facing);

	bool GetProperty(int id, int property, void* dst);
	bool GetValue(int id, void* dst);
	int HandleCommand(int commandId, void* data);

	int GetFileSize(const char* name);
	bool ReadFile(const char* name, void* buffer, int bufferLen);

	int GetSelectedUnits(int* unitIds, int unitIds_max);
	float3 GetMousePos();
	int GetMapPoints(PointMarker* pm, int pm_sizeMax, bool includeAllies);
	int GetMapLines(LineMarker* lm, int lm_sizeMax, bool includeAllies);

	float GetMetal();
	float GetMetalIncome();
	float GetMetalUsage();
	float GetMetalStorage();

	float GetEnergy();
	float GetEnergyIncome();
	float GetEnergyUsage();
	float GetEnergyStorage();

	int GetFeatures(int *features, int max);
	int GetFeatures(int *features, int max, const float3& pos,
			float radius);
	const FeatureDef* GetFeatureDef(int feature);
	const FeatureDef* GetFeatureDefById(int featureDefId);
	float GetFeatureHealth(int feature);
	float GetFeatureReclaimLeft(int feature);
	float3 GetFeaturePos(int feature);

	int GetNumUnitDefs();
	void GetUnitDefList(const UnitDef** list);
	float GetUnitDefHeight(int def);
	float GetUnitDefRadius(int def);

	const WeaponDef* GetWeapon(const char* weaponName);
	const WeaponDef* GetWeaponDefById(int weaponDefId);

	const float3* GetStartPos();

	unsigned int GetCategoryFlag(const char* categoryName);
	unsigned int GetCategoriesFlag(const char* categoryNames);
	void GetCategoryName(int categoryFlag, char* name, int name_sizeMax);


	std::string CallLuaRules(const char* inData, int inSize);
	std::string CallLuaUI(const char* inData, int inSize);

	std::map<std::string, std::string> GetMyInfo();
	std::map<std::string, std::string> GetMyOptionValues();

private:
	int skirmishAIId;
	const SSkirmishAICallback* sAICallback;

	void init();

	int Internal_GiveOrder(int unitId, int groupId, Command* c);

	// caches
	std::vector<UnitDef> unitDefs;
	std::vector<FeatureDef> featureDefs;
	std::vector<WeaponDef> weaponDefs;

	std::vector<int> unitDefFrames;
	std::vector<int> featureDefFrames;
	std::vector<int> weaponDefFrames;

	// the following three are needed to prevent memory leaks
	std::vector< std::vector<SCommandDescription> > groupPossibleCommands;
	std::vector< std::vector<SCommandDescription> > unitPossibleCommands;
	std::vector< std::unique_ptr<CCommandQueue> > unitCurrentCommandQueues;

	float3 startPos;

	static size_t numClbInstances;

	static std::vector<float> heightMap;
	static std::vector<float> cornersHeightMap;
	static std::vector<float> slopeMap;
	static std::vector<unsigned short> losMap;
	static std::vector<unsigned short> radarMap;
	static std::vector<unsigned short> jammerMap;
	static std::vector<unsigned char> metalMap;
};

} // namespace springLegacyAI

#endif // _AI_AI_CALLBACK_H