summaryrefslogtreecommitdiffstats
path: root/src/Map.h
blob: e9e4f65ecee8df8e76163a4b41a89e1dd49476be (plain) (blame)
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

// Map.h

// Implementation of in-game coloured maps





#pragma once

#include "Defines.h"
#include "ChunkDef.h"




class cClientHandle;
class cWorld;
class cPlayer;
class cMap;





/** Encapsulates a map decorator.
A map decorator represents an object drawn on the map that can move freely.
(e.g. player trackers and item frame pointers)

Excluding manually placed decorators,
decorators are automatically managed (allocated and freed) by their parent cMap instance.
*/
struct cMapDecorator
{
  public:
	enum class eType
	{
		E_TYPE_PLAYER = 0x00,
		E_TYPE_ITEM_FRAME = 0x01,

		/** Player outside of the boundaries of the map. */
		E_TYPE_PLAYER_OUTSIDE = 0x06
	};

	cMapDecorator(eType a_Type, unsigned int a_X, unsigned int a_Z, int a_Rot) :
		m_Type(a_Type), m_PixelX(a_X), m_PixelZ(a_Z), m_Rot(a_Rot)
	{
	}

  public:
	unsigned int GetPixelX(void) const { return m_PixelX; }
	unsigned int GetPixelZ(void) const { return m_PixelZ; }

	int GetRot(void) const { return m_Rot; }

	eType GetType(void) const { return m_Type; }

  private:
	eType m_Type;

	unsigned int m_PixelX;
	unsigned int m_PixelZ;

	int m_Rot;
};





// tolua_begin

/** Encapsulates an in-game world map. */
class cMap
{
  public:
	enum eBaseColor
	{
		E_BASE_COLOR_TRANSPARENT = 0, /* Air     */
		E_BASE_COLOR_LIGHT_GREEN = 4, /* Grass   */
		E_BASE_COLOR_LIGHT_BLUE = 5,
		E_BASE_COLOR_LIGHT_BROWN = 8, /* Sand    */
		E_BASE_COLOR_GRAY_1 = 12, /* Cloth   */
		E_BASE_COLOR_RED = 16, /* TNT     */
		E_BASE_COLOR_PALE_BLUE = 20, /* Ice     */
		E_BASE_COLOR_GRAY_2 = 24, /* Iron    */
		E_BASE_COLOR_DARK_GREEN = 28, /* Foliage */
		E_BASE_COLOR_WHITE = 32, /* Snow    */
		E_BASE_COLOR_LIGHT_GRAY = 36, /* Clay    */
		E_BASE_COLOR_BROWN = 40, /* Dirt    */
		E_BASE_COLOR_DARK_GRAY = 44, /* Stone   */
		E_BASE_COLOR_BLUE = 48, /* Water   */
		E_BASE_COLOR_DARK_BROWN = 52 /* Wood    */
	};

	typedef Byte ColorID;

	// tolua_end

	typedef std::vector<ColorID> cColorList;
	typedef std::vector<cClientHandle *> cMapClientList;
	typedef std::vector<cMapDecorator> cMapDecoratorList;

	/** Construct an empty map. */
	cMap(unsigned int a_ID, cWorld * a_World);

	/** Construct an empty map at the specified coordinates. */
	cMap(unsigned int a_ID, int a_CenterX, int a_CenterZ, cWorld * a_World, unsigned int a_Scale = 3);

	/** Sends a map update to all registered clients
	Clears the list holding registered clients and decorators */
	void Tick();

	/** Update a circular region with the specified radius and center (in pixels). */
	void UpdateRadius(int a_PixelX, int a_PixelZ, unsigned int a_Radius);

	/** Update a circular region around the specified player. */
	void UpdateRadius(cPlayer & a_Player, unsigned int a_Radius);

	/** Send next update packet to the specified player and remove invalid decorators / clients. */
	void UpdateClient(cPlayer * a_Player);

	// tolua_begin

	void Resize(unsigned int a_Width, unsigned int a_Height);

	void SetPosition(int a_CenterX, int a_CenterZ);

	void SetScale(unsigned int a_Scale) { m_Scale = a_Scale; }

	bool SetPixel(unsigned int a_X, unsigned int a_Z, ColorID a_Data);

	ColorID GetPixel(unsigned int a_X, unsigned int a_Z);

	unsigned int GetWidth(void) const { return m_Width; }
	unsigned int GetHeight(void) const { return m_Height; }

	unsigned int GetScale(void) const { return m_Scale; }

	int GetCenterX(void) const { return m_CenterX; }
	int GetCenterZ(void) const { return m_CenterZ; }

	unsigned int GetID(void) const { return m_ID; }

	cWorld * GetWorld(void) { return m_World; }

	AString GetName(void) { return m_Name; }

	eDimension GetDimension(void) const;

	unsigned int GetNumPixels(void) const;

	unsigned int GetPixelWidth(void) const;

	// tolua_end

	const cMapDecorator CreateDecorator(const cEntity * a_TrackedEntity);

	const cMapDecoratorList GetDecorators(void) const { return m_Decorators; }

	const cColorList & GetData(void) const { return m_Data; }

  private:
	/** Update the specified pixel. */
	bool UpdatePixel(unsigned int a_X, unsigned int a_Z);

	unsigned int m_ID;

	unsigned int m_Width;
	unsigned int m_Height;

	/** The zoom level, 2^scale square blocks per pixel */
	unsigned int m_Scale;

	int m_CenterX;
	int m_CenterZ;

	bool m_Dirty;

	/** Column-major array of colours */
	cColorList m_Data;

	cWorld * m_World;

	cMapClientList m_ClientsInCurrentTick;

	cMapDecoratorList m_Decorators;

	AString m_Name;

	friend class cMapManager;
	friend class cMapSerializer;

};  // tolua_export