-
Notifications
You must be signed in to change notification settings - Fork 224
/
brush.h
316 lines (248 loc) · 9.16 KB
/
brush.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
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
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
//////////////////////////////////////////////////////////////////////
// This file is part of Remere's Map Editor
//////////////////////////////////////////////////////////////////////
// Remere's Map Editor is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Remere's Map Editor is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//////////////////////////////////////////////////////////////////////
#ifndef RME_BRUSH_H_
#define RME_BRUSH_H_
#include "main.h"
#include "position.h"
#include "brush_enums.h"
// Thanks to a million forward declarations, we don't have to include any files!
// TODO move to a declarations file.
class ItemType;
class CreatureType;
class BaseMap;
class House;
class Item;
class Tile;
typedef std::vector<Tile*> TileVector;
class AutoBorder;
class Brush;
class RAWBrush;
class DoodadBrush;
class TerrainBrush;
class GroundBrush;
class WallBrush;
class WallDecorationBrush;
class TableBrush;
class CarpetBrush;
class DoorBrush;
class OptionalBorderBrush;
class CreatureBrush;
class SpawnBrush;
class HouseBrush;
class HouseExitBrush;
class WaypointBrush;
class FlagBrush;
class EraserBrush;
//=============================================================================
// Brushes, holds all brushes
typedef std::multimap<std::string, Brush*> BrushMap;
class Brushes
{
public:
Brushes();
~Brushes();
void init();
void clear();
Brush* getBrush(const std::string& name) const;
void addBrush(Brush* brush);
bool unserializeBorder(pugi::xml_node node, wxArrayString& warnings);
bool unserializeBrush(pugi::xml_node node, wxArrayString& warnings);
const BrushMap& getMap() const noexcept { return brushes; }
protected:
typedef std::map<uint32_t, AutoBorder*> BorderMap;
BrushMap brushes;
BorderMap borders;
friend class AutoBorder;
friend class GroundBrush;
};
extern Brushes g_brushes;
//=============================================================================
// Common brush interface
class Brush
{
public:
Brush();
virtual ~Brush();
virtual bool load(pugi::xml_node node, wxArrayString& warnings) {
return true;
}
virtual void draw(BaseMap* map, Tile* tile, void* parameter = nullptr) = 0;
virtual void undraw(BaseMap* map, Tile* tile) = 0;
virtual bool canDraw(BaseMap* map, const Position& position) const = 0;
//
uint32_t getID() const noexcept { return id; }
virtual std::string getName() const = 0;
virtual void setName(const std::string& newName) {
ASSERT(_MSG("setName attempted on nameless brush!"));
}
virtual int getLookID() const = 0;
virtual bool needBorders() const { return false; }
virtual bool canDrag() const { return false; }
virtual bool canSmear() const { return true; }
virtual bool oneSizeFitsAll() const { return false; }
virtual int32_t getMaxVariation() const { return 0; }
virtual bool isRaw() const { return false; }
virtual bool isDoodad() const { return false; }
virtual bool isTerrain() const { return false; }
virtual bool isGround() const { return false; }
virtual bool isWall() const { return false; }
virtual bool isWallDecoration() const { return false; }
virtual bool isTable() const { return false; }
virtual bool isCarpet() const { return false; }
virtual bool isDoor() const { return false; }
virtual bool isOptionalBorder() const { return false; }
virtual bool isCreature() const { return false; }
virtual bool isSpawn() const { return false; }
virtual bool isHouse() const { return false; }
virtual bool isHouseExit() const { return false; }
virtual bool isWaypoint() const { return false; }
virtual bool isFlag() const { return false; }
virtual bool isEraser() const { return false; }
virtual RAWBrush* asRaw() { return nullptr; }
virtual DoodadBrush* asDoodad() { return nullptr; }
virtual TerrainBrush* asTerrain() { return nullptr; }
virtual GroundBrush* asGround() { return nullptr; }
virtual WallBrush* asWall() { return nullptr; }
virtual WallDecorationBrush* asWallDecoration() { return nullptr; }
virtual TableBrush* asTable() { return nullptr; }
virtual CarpetBrush* asCarpet() { return nullptr; }
virtual DoorBrush* asDoor() { return nullptr; }
virtual OptionalBorderBrush* asOptionalBorder() { return nullptr; }
virtual CreatureBrush* asCreature() { return nullptr; }
virtual SpawnBrush* asSpawn() { return nullptr; }
virtual HouseBrush* asHouse() { return nullptr; }
virtual HouseExitBrush* asHouseExit() { return nullptr; }
virtual WaypointBrush* asWaypoint() { return nullptr; }
virtual FlagBrush* asFlag() { return nullptr; }
virtual EraserBrush* asEraser() { return nullptr; }
bool visibleInPalette() const { return visible; }
void flagAsVisible() { visible = true; }
protected:
static uint32_t id_counter;
uint32_t id;
bool visible; // Visible in any palette?
};
//=============================================================================
// Terrain brush interface
class TerrainBrush : public Brush
{
public:
TerrainBrush();
virtual ~TerrainBrush();
bool isTerrain() const { return true; }
TerrainBrush* asTerrain() { return static_cast<TerrainBrush*>(this); }
virtual bool canDraw(BaseMap* map, const Position& position) const { return true; }
virtual std::string getName() const { return name; }
virtual void setName(const std::string& newName) { name = newName; }
virtual int32_t getZ() const { return 0; }
virtual int32_t getLookID() const { return look_id; }
virtual bool needBorders() const { return true; }
virtual bool canDrag() const { return true; }
bool friendOf(TerrainBrush* other);
protected:
std::vector<uint32_t> friends;
std::string name;
uint16_t look_id;
bool hate_friends;
};
//=============================================================================
// FlagBrush, draw PZ etc.
class FlagBrush : public Brush
{
public:
FlagBrush(uint32_t _flag);
virtual ~FlagBrush();
bool isFlag() const { return true; }
FlagBrush* asFlag() { return static_cast<FlagBrush*>(this); }
virtual bool canDraw(BaseMap* map, const Position& position) const;
virtual void draw(BaseMap* map, Tile* tile, void* parameter);
virtual void undraw(BaseMap* map, Tile* tile);
virtual bool canDrag() const { return true; }
virtual int getLookID() const;
virtual std::string getName() const;
protected:
uint32_t flag;
};
//=============================================================================
// Doorbrush, add doors, windows etc.
class DoorBrush : public Brush
{
public:
DoorBrush(DoorType _doortype);
virtual ~DoorBrush();
bool isDoor() const { return true; }
DoorBrush* asDoor() { return static_cast<DoorBrush*>(this); }
static void switchDoor(Item* door);
virtual bool canDraw(BaseMap* map, const Position& position) const;
virtual void draw(BaseMap* map, Tile* tile, void* parameter);
virtual void undraw(BaseMap* map, Tile* tile);
virtual int getLookID() const;
virtual std::string getName() const;
virtual bool oneSizeFitsAll() const { return true; }
protected:
DoorType doortype;
};
//=============================================================================
// OptionalBorderBrush, add gravel 'round mountains.
class OptionalBorderBrush : public Brush
{
public:
OptionalBorderBrush();
virtual ~OptionalBorderBrush();
bool isOptionalBorder() const { return true; }
OptionalBorderBrush* asOptionalBorder() { return static_cast<OptionalBorderBrush*>(this); }
virtual bool canDraw(BaseMap* map, const Position& position) const;
virtual void draw(BaseMap* map, Tile* tile, void* parameter);
virtual void undraw(BaseMap* map, Tile* tile);
virtual bool canDrag() const { return true; }
virtual int getLookID() const;
virtual std::string getName() const;
};
//=============================================================================
// Rampbrush, add ramps to mountains.
class EraserBrush : public Brush
{
public:
EraserBrush();
virtual ~EraserBrush();
bool isEraser() const { return true; }
EraserBrush* asEraser() { return static_cast<EraserBrush*>(this); }
virtual bool canDraw(BaseMap* map, const Position& position) const;
virtual void draw(BaseMap* map, Tile* tile, void* parameter);
virtual void undraw(BaseMap* map, Tile* tile);
virtual bool needBorders() const { return true; }
virtual bool canDrag() const { return true; }
virtual int getLookID() const;
virtual std::string getName() const;
};
//=============================================================================
// Autoborder, used by GroundBrush, should be transparent to users
class AutoBorder
{
public:
AutoBorder(int _id) : id(_id), group(0), ground(false) {
for(int i = 0; i < 13; i++) tiles[i] = 0;
}
~AutoBorder() {}
static int edgeNameToID(const std::string& edgename);
bool load(pugi::xml_node node, wxArrayString& warnings, GroundBrush* owner = nullptr, uint16_t ground_equivalent = 0);
uint32_t tiles[13];
uint32_t id;
uint16_t group;
bool ground;
};
#endif