-
Notifications
You must be signed in to change notification settings - Fork 8
/
CDefenseMatrix.h
75 lines (59 loc) · 1.47 KB
/
CDefenseMatrix.h
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
#ifndef CDEFENSEMATRIX_H
#define CDEFENSEMATRIX_H
#include <map>
#include "headers/Defines.h"
#include "headers/HEngine.h"
#define CLUSTER_RADIUS 320.0f
class AIClasses;
struct UnitType;
class CUnit;
class CDefenseMatrix {
public:
CDefenseMatrix(AIClasses* ai);
~CDefenseMatrix();
/* Determine all clusters currently ingame */
void update();
/* Get the spot that needs defense the most */
float3 getDefenseBuildSite(UnitType* tower);
/* Number of "big" clusters */
int getClusters();
/* Get the nth best defended pos */
float3 getBestDefendedPos(int n);
bool isPosInBounds(const float3& pos) const;
/* Distance to defense matrix border */
float distance2D(const float3& pos) const;
bool switchDebugMode();
protected:
AIClasses* ai;
private:
/* A group with spacing s between each building such that s < n */
struct Cluster {
Cluster() {
reset();
}
/* Sum of all units cost registered in current cluster? */
float value;
/* Center of cluster */
float3 center;
/* Number of defense buildings in a cluster */
int defenses;
/* Static units in a cluster (<unit_cost, unit>) */
std::multimap<float, CUnit*> members;
void reset() {
value = 0.0f;
center = ZeroVector;
defenses = 0;
}
};
bool drawMatrix;
int X, Z;
/* Heightmap data */
const float *hm;
/* Total clustervalue */
float totalValue;
/* The clusters, sorted on importance */
std::multimap<float, Cluster*> clusters;
float getValue(CUnit* building);
void draw();
};
#endif