The Battle for Wesnoth 1.21.0-dev
 
Loading...
Searching...
No Matches
action.hpp
Go to the documentation of this file.
1/*
2 Copyright (C) 2008 - 2025
3 by Tomasz Sniatowski <kailoran@gmail.com>
4 Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY.
12
13 See the COPYING file for more details.
14*/
15
16/**
17 * @file
18 * Editor action classes. Some important points:
19 * - This is a polymorphic hierarchy of classes, so actions are usually passed around
20 * as editor_action pointers
21 * - The pointers can, in general, be null. Always check for null before doing anything.
22 * The helper functions perform_ that take a pointer do that.
23 * - The perform() functions can throw when an error occurs. Use smart pointers if you
24 * need to ensure the pointer is deleted.
25 */
26
27#pragma once
28
31
32namespace editor
33{
34/**
35 * Replace contents of the entire map,
36 * Useful as a fallback undo method when something else would be impractical
37 */
39{
40public:
42 : m_(m)
43 {
44 }
45
46 std::unique_ptr<editor_action> clone() const override;
47 void perform_without_undo(map_context& m) const override;
48 const std::string& get_name() const override;
49
50protected:
52};
53
54/**
55 * Base class for actions that:
56 * 1) operate on an area
57 * 2) can be used as undo for a click-drag operation
58 * 3) can be extended so one undo action undos several actual drag actions
59 */
61{
62public:
66
67 /**
68 * The crux of the extendable contract. This member function must be
69 * implemented so that the undo behavior is consistent, exactly the
70 * same as would be with separate undo actions for every part of
71 * the drag.
72 */
73 virtual void extend(const editor_map& map, const std::set<map_location>& locs) = 0;
74
75 const std::string& get_name() const override
76 {
77 static const std::string name("extendable");
78 return name;
79 }
80};
81
82/**
83 * Container action wrapping several actions into one.
84 * The actions are performed in the order they are added,
85 * i.e. in the usual iteration order through the container.
86 */
88{
89public:
90 /**
91 * Create an empty action chain
92 */
94 : actions_()
95 {
96 }
97
99
101
102 /** Inherited from editor_action, implemented by IMPLEMENT_ACTION. */
103 std::unique_ptr<editor_action> clone() const override;
104
105 /**
106 * Create an action chain from a deque of action pointers.
107 * Note: the action chain assumes ownership of the pointers.
108 */
109 explicit editor_action_chain(std::deque<std::unique_ptr<editor_action>> actions)
110 : actions_(std::move(actions))
111 {
112 }
113
114 /**
115 * The destructor deletes all the owned action pointers
116 */
117 ~editor_action_chain() override = default;
118
119 /**
120 * Go through the chain and add up all the action counts
121 */
122 int action_count() const override;
123
124 /**
125 * Add an action at the end of the chain
126 */
127 void append_action(std::unique_ptr<editor_action> a);
128
129 /**
130 * Add an action at the beginning of the chain
131 */
132 void prepend_action(std::unique_ptr<editor_action> a);
133
134 /**
135 * @return true when there are no actions in the chain. Empty
136 * action chains should usually be discarded as to not keep
137 * "empty" actions around.
138 */
139 bool empty() const;
140
141 /**
142 * Remove the last added action and return it, transferring
143 * ownership to the caller
144 */
145 std::unique_ptr<editor_action> pop_last_action();
146
147 /**
148 * Remove the first added action and return it, transferring
149 * ownership to the caller
150 */
151 std::unique_ptr<editor_action> pop_first_action();
152
153 /**
154 * Perform all the actions in order and create a undo action chain
155 */
156 std::unique_ptr<editor_action> perform(map_context& m) const override;
157
158 /**
159 * Perform all the actions in order
160 */
161 void perform_without_undo(map_context& m) const override;
162
163 const std::string& get_name() const override;
164
165protected:
166 /**
167 * The action pointers owned by this action chain
168 */
169 std::deque<std::unique_ptr<editor_action>> actions_;
170};
171
172/**
173 * Base class for actions which act on a specified location (and possibly on other locations
174 * that can be derived from the staring hex)
175 */
177{
178public:
183
184 const std::string& get_name() const override
185 {
186 static const std::string name("location");
187 return name;
188 }
189
190protected:
192};
193
194/** Base class for actions which in addition to acting on a hex,
195 * act with one terrain type, i.e. paint-related actions.
196 */
198{
199public:
205
206 const std::string& get_name() const override
207 {
208 static const std::string name("location_terrain");
209 return name;
210 }
211
212protected:
214};
215
216/**
217 * Base class for area-affecting actions
218 */
220{
221public:
222 editor_action_area(const std::set<map_location>& area)
223 : area_(area)
224 {
225 }
226
227 void extend(const editor_map& map, const std::set<map_location>& locs) override;
228
229 const std::string& get_name() const override
230 {
231 static const std::string name("area");
232 return name;
233 }
234
235protected:
236 std::set<map_location> area_;
237};
238
239/**
240 * Paste a map fragment into the map. No offset is used.
241 */
243{
244public:
246 : offset_(offset)
247 , paste_(paste)
248 {
249 }
250
251 std::unique_ptr<editor_action> clone() const override;
252 std::unique_ptr<editor_action> perform(map_context& mc) const override;
253 void perform_without_undo(map_context& mc) const override;
254 void extend(const editor_map& map, const std::set<map_location>& locs) override;
255 const std::string& get_name() const override;
256
257protected:
260};
261
262/**
263 * Paint the same terrain on a number of locations on the map.
264 */
266{
267public:
269 const std::set<map_location>& area, const t_translation::terrain_code& t, bool one_layer = false)
270 : editor_action_area(area)
271 , t_(t)
272 , one_layer_(one_layer)
273 {
274 }
275
276 std::unique_ptr<editor_action> clone() const override;
277 std::unique_ptr<editor_action> perform(map_context& mc) const override;
278 void perform_without_undo(map_context& mc) const override;
279 const std::string& get_name() const override;
280
281protected:
283
285};
286
287/**
288 * Flood fill. Somewhat redundant with paint_area.
289 */
291{
292public:
295 , one_layer_(one_layer)
296 {
297 }
298
299 std::unique_ptr<editor_action> clone() const override;
300 std::unique_ptr<editor_action> perform(map_context& mc) const override;
301 void perform_without_undo(map_context& mc) const override;
302 const std::string& get_name() const override;
303
304protected:
306};
307
308/**
309 * Set starting position action, sets location ids (both for starting locations
310 * and for non-starting locations).
311 */
313{
314public:
317 , loc_id_(loc_id)
318 {
319 }
320
321 std::unique_ptr<editor_action> clone() const override;
322 std::unique_ptr<editor_action> perform(map_context& mc) const override;
323 void perform_without_undo(map_context& mc) const override;
324 const std::string& get_name() const override;
325
326protected:
327 std::string loc_id_;
328};
329
330/**
331 * Resize the map. The offsets specify, indirectly, the direction of expanding/shrinking,
332 * and fill=NONE enables copying of edge terrain instead of filling.
333 */
335{
336public:
338 int y_size,
339 int x_offset,
340 int y_offset,
342 : x_size_(x_size)
343 , y_size_(y_size)
344 , x_offset_(x_offset)
345 , y_offset_(y_offset)
346 , fill_(fill)
347 {
348 }
349
350 std::unique_ptr<editor_action> clone() const override;
351 void perform_without_undo(map_context& mc) const override;
352 const std::string& get_name() const override;
353
354protected:
359
361};
362
364{
365public:
367 : mask_(mask)
368 {
369 }
370
371 std::unique_ptr<editor_action> clone() const override;
372 void perform_without_undo(map_context& mc) const override;
373 const std::string& get_name() const override;
374
375private:
377};
378
380{
381public:
383 : target_(target)
384 {
385 }
386
387 std::unique_ptr<editor_action> clone() const override;
388 void perform_without_undo(map_context& mc) const override;
389 const std::string& get_name() const override;
390
391private:
393};
394
395/**
396 * Randomize terrain in an area
397 */
399{
400public:
401 editor_action_shuffle_area(const std::set<map_location>& area)
402 : editor_action_area(area)
403 {
404 }
405
406 std::unique_ptr<editor_action> clone() const override;
407 std::unique_ptr<editor_action> perform(map_context& mc) const override;
408 void perform_without_undo(map_context& mc) const override;
409 const std::string& get_name() const override;
410};
411
413{
414public:
415 editor_action_time_area_move_all(int x_offset, int y_offset)
416 : x_offset_(x_offset)
417 , y_offset_(y_offset)
418 {
419 }
420
421 std::unique_ptr<editor_action> clone() const override;
422 std::unique_ptr<editor_action> perform(map_context& mc) const override;
423 void perform_without_undo(map_context& mc) const override;
424 const std::string& get_name() const override;
425
426protected:
428};
429
430} // end namespace editor
Base class for editor actions.
map_location loc
Definition move.cpp:172
double t
void perform_without_undo(map_context &mc) const override
Perform the action without creating an undo action.
Definition action.cpp:294
const std::string & get_name() const override
std::unique_ptr< editor_action > clone() const override
Action cloning.
editor_action_apply_mask(const gamemap &mask)
Definition action.hpp:366
Base class for area-affecting actions.
Definition action.hpp:220
const std::string & get_name() const override
Definition action.hpp:229
editor_action_area(const std::set< map_location > &area)
Definition action.hpp:222
void extend(const editor_map &map, const std::set< map_location > &locs) override
The crux of the extendable contract.
Definition action.cpp:174
std::set< map_location > area_
Definition action.hpp:236
Container action wrapping several actions into one.
Definition action.hpp:88
std::unique_ptr< editor_action > pop_last_action()
Remove the last added action and return it, transferring ownership to the caller.
Definition action.cpp:131
editor_action_chain(std::deque< std::unique_ptr< editor_action > > actions)
Create an action chain from a deque of action pointers.
Definition action.hpp:109
editor_action_chain()
Create an empty action chain.
Definition action.hpp:93
void perform_without_undo(map_context &m) const override
Perform all the actions in order.
Definition action.cpp:165
std::unique_ptr< editor_action > pop_first_action()
Remove the first added action and return it, transferring ownership to the caller.
Definition action.cpp:142
~editor_action_chain() override=default
The destructor deletes all the owned action pointers.
const std::string & get_name() const override
editor_action_chain & operator=(const editor_action_chain &other)
Definition action.cpp:87
void append_action(std::unique_ptr< editor_action > a)
Add an action at the end of the chain.
Definition action.cpp:116
int action_count() const override
Go through the chain and add up all the action counts.
Definition action.cpp:104
std::deque< std::unique_ptr< editor_action > > actions_
The action pointers owned by this action chain.
Definition action.hpp:169
void prepend_action(std::unique_ptr< editor_action > a)
Add an action at the beginning of the chain.
Definition action.cpp:121
std::unique_ptr< editor_action > perform(map_context &m) const override
Perform all the actions in order and create a undo action chain.
Definition action.cpp:153
std::unique_ptr< editor_action > clone() const override
Inherited from editor_action, implemented by IMPLEMENT_ACTION.
editor_action_create_mask(const editor_map &target)
Definition action.hpp:382
void perform_without_undo(map_context &mc) const override
Perform the action without creating an undo action.
Definition action.cpp:302
std::unique_ptr< editor_action > clone() const override
Action cloning.
const std::string & get_name() const override
Base class for actions that: 1) operate on an area 2) can be used as undo for a click-drag operation ...
Definition action.hpp:61
virtual void extend(const editor_map &map, const std::set< map_location > &locs)=0
The crux of the extendable contract.
const std::string & get_name() const override
Definition action.hpp:75
const std::string & get_name() const override
std::unique_ptr< editor_action > perform(map_context &mc) const override
Perform the action, returning an undo action that, when performed, shall reverse any effects of this ...
Definition action.cpp:221
std::unique_ptr< editor_action > clone() const override
Action cloning.
void perform_without_undo(map_context &mc) const override
Perform the action without creating an undo action.
Definition action.cpp:232
editor_action_fill(map_location loc, const t_translation::terrain_code &t, bool one_layer=false)
Definition action.hpp:293
Base class for actions which in addition to acting on a hex, act with one terrain type,...
Definition action.hpp:198
const std::string & get_name() const override
Definition action.hpp:206
editor_action_location_terrain(map_location loc, const t_translation::terrain_code &t)
Definition action.hpp:200
t_translation::terrain_code t_
Definition action.hpp:213
Base class for actions which act on a specified location (and possibly on other locations that can be...
Definition action.hpp:177
editor_action_location(map_location loc)
Definition action.hpp:179
const std::string & get_name() const override
Definition action.hpp:184
Paint the same terrain on a number of locations on the map.
Definition action.hpp:266
const std::string & get_name() const override
std::unique_ptr< editor_action > perform(map_context &mc) const override
Perform the action, returning an undo action that, when performed, shall reverse any effects of this ...
Definition action.cpp:204
editor_action_paint_area(const std::set< map_location > &area, const t_translation::terrain_code &t, bool one_layer=false)
Definition action.hpp:268
std::unique_ptr< editor_action > clone() const override
Action cloning.
void perform_without_undo(map_context &mc) const override
Perform the action without creating an undo action.
Definition action.cpp:213
t_translation::terrain_code t_
Definition action.hpp:282
Paste a map fragment into the map.
Definition action.hpp:243
std::unique_ptr< editor_action > clone() const override
Action cloning.
void extend(const editor_map &map, const std::set< map_location > &locs) override
The crux of the extendable contract.
Definition action.cpp:181
void perform_without_undo(map_context &mc) const override
Perform the action without creating an undo action.
Definition action.cpp:195
std::unique_ptr< editor_action > perform(map_context &mc) const override
Perform the action, returning an undo action that, when performed, shall reverse any effects of this ...
Definition action.cpp:186
const std::string & get_name() const override
editor_action_paste(const map_fragment &paste, const map_location &offset=map_location::ZERO())
Definition action.hpp:245
t_translation::terrain_code fill_
Definition action.hpp:360
std::unique_ptr< editor_action > clone() const override
Action cloning.
void perform_without_undo(map_context &mc) const override
Perform the action without creating an undo action.
Definition action.cpp:286
const std::string & get_name() const override
editor_action_resize_map(int x_size, int y_size, int x_offset, int y_offset, const t_translation::terrain_code &fill=t_translation::NONE_TERRAIN)
Definition action.hpp:337
Randomize terrain in an area.
Definition action.hpp:399
editor_action_shuffle_area(const std::set< map_location > &area)
Definition action.hpp:401
std::unique_ptr< editor_action > clone() const override
Action cloning.
std::unique_ptr< editor_action > perform(map_context &mc) const override
Perform the action, returning an undo action that, when performed, shall reverse any effects of this ...
Definition action.cpp:310
const std::string & get_name() const override
void perform_without_undo(map_context &mc) const override
Perform the action without creating an undo action.
Definition action.cpp:318
Set starting position action, sets location ids (both for starting locations and for non-starting loc...
Definition action.hpp:313
const std::string & get_name() const override
editor_action_starting_position(map_location loc, std::string loc_id)
Definition action.hpp:315
std::unique_ptr< editor_action > perform(map_context &mc) const override
Perform the action, returning an undo action that, when performed, shall reverse any effects of this ...
Definition action.cpp:241
std::unique_ptr< editor_action > clone() const override
Action cloning.
void perform_without_undo(map_context &mc) const override
Perform the action without creating an undo action.
Definition action.cpp:273
editor_action_time_area_move_all(int x_offset, int y_offset)
Definition action.hpp:415
const std::string & get_name() const override
void perform_without_undo(map_context &mc) const override
Perform the action without creating an undo action.
Definition action.cpp:350
std::unique_ptr< editor_action > clone() const override
Action cloning.
std::unique_ptr< editor_action > perform(map_context &mc) const override
Perform the action, returning an undo action that, when performed, shall reverse any effects of this ...
Definition action.cpp:343
Replace contents of the entire map, Useful as a fallback undo method when something else would be imp...
Definition action.hpp:39
std::unique_ptr< editor_action > clone() const override
Action cloning.
void perform_without_undo(map_context &m) const override
Perform the action without creating an undo action.
Definition action.cpp:73
editor_action_whole_map(const editor_map &m)
Definition action.hpp:41
const std::string & get_name() const override
Base class for all editor actions.
This class adds extra editor-specific functionality to a normal gamemap.
This class wraps around a map to provide a concise interface for the editor to work with.
A map fragment – a collection of locations and information abut them.
Encapsulates the map of the game.
Definition map.hpp:176
Manage the empty-palette in the editor.
Definition action.cpp:31
STL namespace.
constexpr terrain_code NONE_TERRAIN
Encapsulates the map of the game.
Definition location.hpp:46
static const map_location & ZERO()
Definition location.hpp:97
A terrain string which is converted to a terrain is a string with 1 or 2 layers the layers are separa...