1 /*
2  *  This file is part of Dune Legacy.
3  *
4  *  Dune Legacy is free software: you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation, either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  Dune Legacy is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with Dune Legacy.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef MAPEDITOROPERATION_H
19 #define MAPEDITOROPERATION_H
20 
21 #include <data.h>
22 
23 #include <DataTypes.h>
24 
25 #include <MapEditor/ReinforcementInfo.h>
26 #include <MapEditor/TeamInfo.h>
27 #include <MapEditor/MapInfo.h>
28 
29 #include <vector>
30 #include <memory>
31 
32 class MapEditor;
33 
34 class MapEditorOperation {
35 public:
36 
MapEditorOperation()37     MapEditorOperation() {
38     }
39 
~MapEditorOperation()40     virtual ~MapEditorOperation() {
41     }
42 
43     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor) = 0;
44 };
45 
46 class MapEditorNoOperation : public MapEditorOperation {
47 public:
48 
MapEditorNoOperation()49     MapEditorNoOperation() {
50     }
51 
~MapEditorNoOperation()52     virtual ~MapEditorNoOperation() {
53     }
54 
perform(MapEditor * pMapEditor)55     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor) {
56         return std::shared_ptr<MapEditorOperation>(new MapEditorNoOperation());
57     };
58 };
59 
60 class MapEditorStartOperation : public MapEditorOperation {
61 public:
62 
MapEditorStartOperation()63     MapEditorStartOperation() : MapEditorOperation() {
64     }
65 
~MapEditorStartOperation()66     virtual ~MapEditorStartOperation() {
67     }
68 
69     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
70 };
71 
72 class MapEditorTerrainEditOperation : public MapEditorOperation {
73 public:
74 
MapEditorTerrainEditOperation(int x,int y,TERRAINTYPE terrainType)75     MapEditorTerrainEditOperation(int x, int y, TERRAINTYPE terrainType)
76      : MapEditorOperation(), x(x), y(y), terrainType(terrainType) {
77     }
78 
~MapEditorTerrainEditOperation()79     virtual ~MapEditorTerrainEditOperation() {
80     }
81 
82     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
83 
84     int x;
85     int y;
86     TERRAINTYPE terrainType;
87 };
88 
89 class MapEditorTerrainAddSpiceBloomOperation : public MapEditorOperation {
90 public:
91 
MapEditorTerrainAddSpiceBloomOperation(int x,int y)92     MapEditorTerrainAddSpiceBloomOperation(int x, int y)
93      : MapEditorOperation(), x(x), y(y) {
94     }
95 
~MapEditorTerrainAddSpiceBloomOperation()96     virtual ~MapEditorTerrainAddSpiceBloomOperation() {
97     }
98 
99     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
100 
101     int x;
102     int y;
103 };
104 
105 class MapEditorTerrainRemoveSpiceBloomOperation : public MapEditorOperation {
106 public:
107 
MapEditorTerrainRemoveSpiceBloomOperation(int x,int y)108     MapEditorTerrainRemoveSpiceBloomOperation(int x, int y)
109      : MapEditorOperation(), x(x), y(y) {
110     }
111 
~MapEditorTerrainRemoveSpiceBloomOperation()112     virtual ~MapEditorTerrainRemoveSpiceBloomOperation() {
113     }
114 
115     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
116 
117     int x;
118     int y;
119 };
120 
121 class MapEditorTerrainAddSpecialBloomOperation : public MapEditorOperation {
122 public:
123 
MapEditorTerrainAddSpecialBloomOperation(int x,int y)124     MapEditorTerrainAddSpecialBloomOperation(int x, int y)
125      : MapEditorOperation(), x(x), y(y) {
126     }
127 
~MapEditorTerrainAddSpecialBloomOperation()128     virtual ~MapEditorTerrainAddSpecialBloomOperation() {
129     }
130 
131     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
132 
133     int x;
134     int y;
135 };
136 
137 class MapEditorTerrainRemoveSpecialBloomOperation : public MapEditorOperation {
138 public:
139 
MapEditorTerrainRemoveSpecialBloomOperation(int x,int y)140     MapEditorTerrainRemoveSpecialBloomOperation(int x, int y)
141      : MapEditorOperation(), x(x), y(y) {
142     }
143 
~MapEditorTerrainRemoveSpecialBloomOperation()144     virtual ~MapEditorTerrainRemoveSpecialBloomOperation() {
145     }
146 
147     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
148 
149     int x;
150     int y;
151 };
152 
153 class MapEditorTerrainAddSpiceFieldOperation : public MapEditorOperation {
154 public:
155 
MapEditorTerrainAddSpiceFieldOperation(int x,int y)156     MapEditorTerrainAddSpiceFieldOperation(int x, int y)
157      : MapEditorOperation(), x(x), y(y) {
158     }
159 
~MapEditorTerrainAddSpiceFieldOperation()160     virtual ~MapEditorTerrainAddSpiceFieldOperation() {
161     }
162 
163     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
164 
165     int x;
166     int y;
167 };
168 
169 class MapEditorTerrainRemoveSpiceFieldOperation : public MapEditorOperation {
170 public:
171 
MapEditorTerrainRemoveSpiceFieldOperation(int x,int y)172     MapEditorTerrainRemoveSpiceFieldOperation(int x, int y)
173      : MapEditorOperation(), x(x), y(y) {
174     }
175 
~MapEditorTerrainRemoveSpiceFieldOperation()176     virtual ~MapEditorTerrainRemoveSpiceFieldOperation() {
177     }
178 
179     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
180 
181     int x;
182     int y;
183 };
184 
185 
186 
187 class MapEditorSetTacticalPositionOperation : public MapEditorOperation {
188 public:
189 
MapEditorSetTacticalPositionOperation(int x,int y)190     MapEditorSetTacticalPositionOperation(int x, int y)
191      : MapEditorOperation(), x(x), y(y) {
192     }
193 
~MapEditorSetTacticalPositionOperation()194     virtual ~MapEditorSetTacticalPositionOperation() {
195     }
196 
197     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
198 
199     int x;
200     int y;
201 };
202 
203 
204 
205 class MapEditorStructurePlaceOperation : public MapEditorOperation {
206 public:
207 
MapEditorStructurePlaceOperation(int preferredID,Coord position,HOUSETYPE house,int itemID,int health)208     MapEditorStructurePlaceOperation(int preferredID, Coord position, HOUSETYPE house, int itemID, int health)
209      : MapEditorOperation(), preferredID(preferredID), position(position), house(house), itemID(itemID), health(health) {
210     }
211 
MapEditorStructurePlaceOperation(Coord position,HOUSETYPE house,int itemID,int health)212     MapEditorStructurePlaceOperation(Coord position, HOUSETYPE house, int itemID, int health)
213      : MapEditorOperation(), preferredID(INVALID), position(position), house(house), itemID(itemID), health(health) {
214     }
215 
~MapEditorStructurePlaceOperation()216     virtual ~MapEditorStructurePlaceOperation() {
217     }
218 
219     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
220 
221     int             preferredID;
222     Coord           position;
223     HOUSETYPE       house;
224     int             itemID;
225     int             health;
226 };
227 
228 class MapEditorRemoveStructureOperation : public MapEditorOperation {
229 public:
230 
MapEditorRemoveStructureOperation(int id)231     explicit MapEditorRemoveStructureOperation(int id)
232      : MapEditorOperation(), id(id) {
233     }
234 
~MapEditorRemoveStructureOperation()235     virtual ~MapEditorRemoveStructureOperation() {
236     }
237 
238     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
239 
240     int             id;
241 };
242 
243 class MapEditorUnitPlaceOperation : public MapEditorOperation {
244 public:
245 
MapEditorUnitPlaceOperation(int preferredID,Coord position,HOUSETYPE house,int itemID,int health,unsigned char angle,ATTACKMODE attackmode)246     MapEditorUnitPlaceOperation(int preferredID, Coord position, HOUSETYPE house, int itemID, int health, unsigned char angle, ATTACKMODE attackmode)
247      : MapEditorOperation(), preferredID(preferredID), position(position), house(house), itemID(itemID), health(health), angle(angle), attackmode(attackmode) {
248     }
249 
MapEditorUnitPlaceOperation(Coord position,HOUSETYPE house,int itemID,int health,unsigned char angle,ATTACKMODE attackmode)250     MapEditorUnitPlaceOperation(Coord position, HOUSETYPE house, int itemID, int health, unsigned char angle, ATTACKMODE attackmode)
251      : MapEditorOperation(), preferredID(INVALID), position(position), house(house), itemID(itemID), health(health), angle(angle), attackmode(attackmode) {
252     }
253 
~MapEditorUnitPlaceOperation()254     virtual ~MapEditorUnitPlaceOperation() {
255     }
256 
257     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
258 
259     int             preferredID;
260     Coord           position;
261     HOUSETYPE       house;
262     int             itemID;
263     int             health;
264     unsigned char   angle;
265     ATTACKMODE      attackmode;
266 };
267 
268 class MapEditorRemoveUnitOperation : public MapEditorOperation {
269 public:
270 
MapEditorRemoveUnitOperation(int id)271     explicit MapEditorRemoveUnitOperation(int id)
272      : MapEditorOperation(), id(id) {
273     }
274 
~MapEditorRemoveUnitOperation()275     virtual ~MapEditorRemoveUnitOperation() {
276     }
277 
278     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
279 
280     int             id;
281 };
282 
283 
284 class MapEditorEditStructureOperation : public MapEditorOperation {
285 public:
286 
MapEditorEditStructureOperation(int id,int health)287     MapEditorEditStructureOperation(int id, int health)
288      : MapEditorOperation(), id(id), health(health) {
289     }
290 
~MapEditorEditStructureOperation()291     virtual ~MapEditorEditStructureOperation() {
292     }
293 
294     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
295 
296     int             id;
297     int             health;
298 };
299 
300 
301 class MapEditorEditUnitOperation : public MapEditorOperation {
302 public:
303 
MapEditorEditUnitOperation(int id,int health,unsigned char angle,ATTACKMODE attackmode)304     MapEditorEditUnitOperation(int id, int health, unsigned char angle, ATTACKMODE attackmode)
305      : MapEditorOperation(), id(id), health(health), angle(angle), attackmode(attackmode) {
306     }
307 
~MapEditorEditUnitOperation()308     virtual ~MapEditorEditUnitOperation() {
309     }
310 
311     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
312 
313     int             id;
314     int             health;
315     unsigned char  angle;
316     ATTACKMODE      attackmode;
317 };
318 
319 class MapEditorChangePlayer : public MapEditorOperation {
320 public:
321 
322     MapEditorChangePlayer(int playerNum, bool bActive, bool bAnyHouse, int credits, const std::string& brain, int quota = 0, int maxunit = 0)
playerNum(playerNum)323      : playerNum(playerNum), bActive(bActive), bAnyHouse(bAnyHouse), credits(credits), brain(brain), quota(quota), maxunit(maxunit) {
324     }
325 
~MapEditorChangePlayer()326     virtual ~MapEditorChangePlayer() {
327     }
328 
329     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
330 
331     int playerNum;
332     bool bActive;
333     bool bAnyHouse;
334     int credits;
335     std::string brain;
336     int quota;
337     int maxunit;
338 };
339 
340 
341 class MapEditorChangeChoam : public MapEditorOperation {
342 public:
343 
MapEditorChangeChoam(int itemID,int amount)344     MapEditorChangeChoam(int itemID, int amount)
345      : itemID(itemID), amount(amount) {
346     }
347 
~MapEditorChangeChoam()348     virtual ~MapEditorChangeChoam() {
349     }
350 
351     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
352 
353     int itemID;
354     int amount;
355 };
356 
357 
358 class MapEditorChangeReinforcements : public MapEditorOperation {
359 public:
360 
MapEditorChangeReinforcements(std::vector<ReinforcementInfo> & reinforcements)361     explicit MapEditorChangeReinforcements(std::vector<ReinforcementInfo>& reinforcements)
362      : reinforcements(reinforcements) {
363     }
364 
~MapEditorChangeReinforcements()365     virtual ~MapEditorChangeReinforcements() {
366     }
367 
368     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
369 
370     std::vector<ReinforcementInfo>  reinforcements;
371 };
372 
373 class MapEditorChangeTeams : public MapEditorOperation {
374 public:
375 
MapEditorChangeTeams(std::vector<TeamInfo> & teams)376     explicit MapEditorChangeTeams(std::vector<TeamInfo>& teams)
377      : teams(teams) {
378     }
379 
~MapEditorChangeTeams()380     virtual ~MapEditorChangeTeams() {
381     }
382 
383     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
384 
385     std::vector<TeamInfo>  teams;
386 };
387 
388 class MapEditorChangeMapInfo : public MapEditorOperation {
389 public:
390 
MapEditorChangeMapInfo(MapInfo & mapInfo)391     explicit MapEditorChangeMapInfo(MapInfo& mapInfo)
392      : mapInfo(mapInfo) {
393     }
394 
~MapEditorChangeMapInfo()395     virtual ~MapEditorChangeMapInfo() {
396     }
397 
398     virtual std::shared_ptr<MapEditorOperation> perform(MapEditor *pMapEditor);
399 
400     MapInfo  mapInfo;
401 };
402 
403 
404 
405 #endif // MAPEDITOROPERATION_H
406