File: CDefenseMatrix.h

package info (click to toggle)
spring 103.0%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 43,720 kB
  • ctags: 63,685
  • sloc: cpp: 368,283; ansic: 33,988; python: 12,417; java: 12,203; awk: 5,879; sh: 1,846; xml: 655; perl: 405; php: 211; objc: 194; makefile: 77; sed: 2
file content (75 lines) | stat: -rw-r--r-- 1,505 bytes parent folder | download | duplicates (4)
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