Peoplemon  0.1.0
Peoplemon 3 game source documentation
MapActions.cpp
Go to the documentation of this file.
1 #include "MapActions.hpp"
2 
3 #include <Core/Properties.hpp>
6 
7 namespace editor
8 {
9 namespace component
10 {
11 namespace
12 {
13 const core::map::Tile& getTile(const std::vector<core::map::LayerSet>& levels, unsigned int level,
14  unsigned int layer, const sf::Vector2i& pos) {
15  const core::map::LayerSet& l = levels[level];
16  if (layer >= l.bottomLayers().size() + l.ysortLayers().size()) {
17  const unsigned int i = layer - l.ysortLayers().size() - l.bottomLayers().size();
18  return l.topLayers()[i].get(pos.x, pos.y);
19  }
20  else if (layer >= l.bottomLayers().size()) {
21  const unsigned int i = layer - l.bottomLayers().size();
22  return l.ysortLayers()[i].get(pos.x, pos.y);
23  }
24  else { return l.bottomLayers()[layer].get(pos.x, pos.y); }
25 }
26 
27 const core::map::Tile& getTile(const std::vector<core::map::LayerSet>& levels, unsigned int level,
28  unsigned int layer, const glm::u32vec2& pos) {
29  return getTile(levels, level, layer, sf::Vector2i(pos.x, pos.y));
30 }
31 
32 void setSingleTile(std::vector<core::map::LayerSet>& levels, core::map::Tileset& tileset,
33  unsigned int level, unsigned int layer, const sf::Vector2i& pos,
34  core::map::Tile::IdType value, bool isAnim) {
35  core::map::LayerSet& l = levels[level];
36  core::map::Tile* tile;
37  if (layer >= l.bottomLayers().size() + l.ysortLayers().size()) {
38  const unsigned int i = layer - l.ysortLayers().size() - l.bottomLayers().size();
39  tile = &l.topLayers()[i].getRef(pos.x, pos.y);
40  tile->set(value, isAnim);
41  }
42  else if (layer >= l.bottomLayers().size()) {
43  const unsigned int i = layer - l.bottomLayers().size();
44  tile = &l.ysortLayers()[i].getRef(pos.x, pos.y);
45  tile->set(value, isAnim);
46  }
47  else {
48  tile = &l.bottomLayers()[layer].getRef(pos.x, pos.y);
49  tile->set(value, isAnim);
50  }
51 }
52 
53 void shiftLayerUp(core::map::LayerSet& level, unsigned int layer, core::map::Tileset& tileset,
54  std::vector<bool>& filter) {
55  if (layer < level.bottomLayers().size()) {
56  std::swap(level.bottomLayers()[layer], level.bottomLayers()[layer - 1]);
57  std::vector<bool>::swap(filter[layer], filter[layer - 1]);
58  }
59  else {
60  layer -= level.bottomLayers().size();
61  if (layer == 0) {
62  core::map::TileLayer temp(std::move(level.ysortLayers()[layer]));
63  level.ysortLayers().erase(level.ysortLayers().begin() + layer);
64  level.bottomLayers().emplace_back(std::move(temp));
65  }
66  else if (layer < level.ysortLayers().size()) {
67  std::swap(level.ysortLayers()[layer], level.ysortLayers()[layer - 1]);
68  std::vector<bool>::swap(filter[layer], filter[layer - 1]);
69  }
70  else {
71  layer -= level.ysortLayers().size();
72  if (layer == 0) {
73  core::map::TileLayer temp(std::move(level.topLayers()[layer]));
74  level.topLayers().erase(level.topLayers().begin() + layer);
75  level.ysortLayers().emplace_back(std::move(temp));
76  }
77  else {
78  std::swap(level.topLayers()[layer], level.topLayers()[layer - 1]);
79  std::vector<bool>::swap(filter[layer], filter[layer - 1]);
80  }
81  }
82  }
83 }
84 
85 void shiftLayerDown(core::map::LayerSet& level, unsigned int layer, core::map::Tileset& tileset,
86  std::vector<bool>& filter) {
87  if (layer < level.bottomLayers().size() - 1) {
88  std::swap(level.bottomLayers()[layer], level.bottomLayers()[layer + 1]);
89  std::vector<bool>::swap(filter[layer], filter[layer + 1]);
90  }
91  else if (layer == level.bottomLayers().size() - 1) {
92  core::map::TileLayer temp(std::move(level.bottomLayers()[layer]));
93  level.bottomLayers().erase(level.bottomLayers().begin() + layer);
94  level.ysortLayers().emplace(level.ysortLayers().begin(), std::move(temp));
95  }
96  else {
97  layer -= level.bottomLayers().size();
98  if (layer < level.ysortLayers().size() - 1) {
99  std::swap(level.ysortLayers()[layer], level.ysortLayers()[layer + 1]);
100  std::vector<bool>::swap(filter[layer], filter[layer + 1]);
101  }
102  else if (layer == level.ysortLayers().size() - 1) {
103  core::map::TileLayer temp(std::move(level.ysortLayers()[layer]));
104  level.ysortLayers().erase(level.ysortLayers().begin() + layer);
105  level.topLayers().emplace(level.topLayers().begin(), std::move(temp));
106  }
107  else {
108  layer -= level.ysortLayers().size();
109  std::swap(level.topLayers()[layer], level.topLayers()[layer + 1]);
110  std::vector<bool>::swap(filter[layer], filter[layer + 1]);
111  }
112  }
113 }
114 
115 void shiftLevelDown(std::vector<core::map::LayerSet>& levels, core::map::Tileset& ts,
116  unsigned int i) {
117  std::swap(levels[i], levels[i + 1]);
118 }
119 
120 void shiftLevelUp(std::vector<core::map::LayerSet>& levels, core::map::Tileset& ts,
121  unsigned int i) {
122  std::swap(levels[i], levels[i - 1]);
123 }
124 
125 void setNeighbors(const glm::i32vec2& pos, glm::i32vec2* neighbors) {
126  neighbors[0] = {pos.x - 1, pos.y};
127  neighbors[1] = {pos.x, pos.y - 1};
128  neighbors[2] = {pos.x + 1, pos.y};
129  neighbors[3] = {pos.x, pos.y + 1};
130 }
131 
132 } // namespace
133 
134 EditMap::Action::Ptr EditMap::SetTileAction::create(unsigned int level, unsigned int layer,
135  const sf::Vector2i& pos, bool isAnim,
137  const EditMap& map) {
139  bool wasAnim = false;
140  if (pos.x >= 0 && pos.y >= 0 && pos.x < map.sizeTiles().x && pos.y < map.sizeTiles().y) {
141  if (level < map.levels.size()) {
142  const core::map::LayerSet& l = map.levels[level];
143  if (layer < l.layerCount()) {
144  const core::map::Tile& tile = getTile(map.levels, level, layer, pos);
145  prev = tile.id();
146  wasAnim = tile.isAnimation();
147  }
148  }
149  }
150  return EditMap::Action::Ptr(
151  new EditMap::SetTileAction(level, layer, pos, prev, wasAnim, value, isAnim));
152 }
153 
154 EditMap::SetTileAction::SetTileAction(unsigned int level, unsigned int layer,
155  const sf::Vector2i& pos, core::map::Tile::IdType prev,
156  bool wasAnim, core::map::Tile::IdType value, bool isAnim)
157 : level(level)
158 , layer(layer)
159 , position(pos)
160 , prev(prev)
161 , wasAnim(wasAnim)
162 , updated(value)
163 , isAnim(isAnim) {}
164 
166  if (position.x >= 0 && position.y >= 0 && position.x < map.sizeTiles().x &&
167  position.y < map.sizeTiles().y) {
168  if (level < map.levels.size()) {
169  core::map::LayerSet& l = map.levels[level];
170  if (layer < l.layerCount()) {
171  setSingleTile(map.levels, *map.tileset, level, layer, position, updated, isAnim);
172  map.setupTile(level, layer, sf::Vector2u(position));
173  }
174  }
175  }
176  return false;
177 }
178 
180  if (position.x >= 0 && position.y >= 0 && position.x < map.sizeTiles().x &&
181  position.y < map.sizeTiles().y) {
182  if (level < map.levels.size()) {
183  core::map::LayerSet& l = map.levels[level];
184  if (layer < l.layerCount()) {
185  setSingleTile(map.levels, *map.tileset, level, layer, position, prev, wasAnim);
186  map.setupTile(level, layer, sf::Vector2u(position));
187  }
188  }
189  }
190  return false;
191 }
192 
193 const char* EditMap::SetTileAction::description() const { return "set tile"; }
194 
195 EditMap::Action::Ptr EditMap::SetTileAreaAction::create(unsigned int level, unsigned int layer,
196  const sf::IntRect& area, bool isAnim,
198  const EditMap& map) {
200  if (value != core::map::Tile::Blank) {
201  if (isAnim) {
202  auto anim = map.tileset->getAnim(value);
203  if (anim) { size = sf::Vector2f(anim->getMaxSize()); }
204  }
205  else {
206  auto tile = map.tileset->getTile(value);
207  if (tile) { size = sf::Vector2f(tile->getSize()); }
208  }
209  }
210  const float ts = static_cast<float>(core::Properties::PixelsPerTile());
211 
212  bl::ctr::Vector2D<core::map::Tile::IdType> prev;
213  bl::ctr::Vector2D<std::uint8_t> wasAnim;
214  prev.setSize(area.width, area.height, core::map::Tile::Blank);
215  wasAnim.setSize(area.width, area.height, 0);
216 
217  for (int x = area.left; x < area.left + area.width; ++x) {
218  for (int y = area.top; y < area.top + area.height; ++y) {
219  const auto& tile = getTile(map.levels, level, layer, sf::Vector2i{x, y});
220  prev(x - area.left, y - area.top) = tile.id();
221  wasAnim(x - area.left, y - area.top) = tile.isAnimation() ? 1 : 0;
222  }
223  }
224 
225  return Ptr(new SetTileAreaAction(level,
226  layer,
227  area,
228  std::move(prev),
229  std::move(wasAnim),
230  value,
231  isAnim,
232  std::max(1.f, std::floor(size.x / ts) - 1.f),
233  std::max(1.f, std::floor(size.y / ts) - 1.f)));
234 }
235 
236 EditMap::SetTileAreaAction::SetTileAreaAction(unsigned int level, unsigned int layer,
237  const sf::IntRect& area,
238  bl::ctr::Vector2D<core::map::Tile::IdType>&& prev,
239  bl::ctr::Vector2D<std::uint8_t>&& wasAnim,
240  core::map::Tile::IdType value, bool isAnim, int w,
241  int h)
242 : level(level)
243 , layer(layer)
244 , area(area)
245 , prev(prev)
246 , wasAnim(wasAnim)
247 , updated(value)
248 , isAnim(isAnim)
249 , w(w)
250 , h(h) {}
251 
253  for (int x = area.left; x < area.left + area.width; x += w) {
254  for (int y = area.top; y < area.top + area.height; y += h) {
255  setSingleTile(map.levels, *map.tileset, level, layer, {x, y}, updated, isAnim);
256  map.setupTile(level, layer, sf::Vector2u(x, y));
257  }
258  }
259  return false;
260 }
261 
263  for (int x = area.left; x < area.left + area.width; ++x) {
264  for (int y = area.top; y < area.top + area.height; ++y) {
265  setSingleTile(map.levels,
266  *map.tileset,
267  level,
268  layer,
269  {x, y},
270  prev(x - area.left, y - area.top),
271  wasAnim(x - area.left, y - area.top) == 1);
272  map.setupTile(level, layer, sf::Vector2u(x, y));
273  }
274  }
275  return false;
276 }
277 
278 const char* EditMap::SetTileAreaAction::description() const { return "set tile area"; }
279 
280 EditMap::Action::Ptr EditMap::FillTileAction::create(unsigned int level, unsigned int layer,
281  const sf::Vector2i& pos,
282  core::map::Tile::IdType id, bool isAnim,
283  EditMap& map) {
284  const core::map::Tile& tile = getTile(map.levels, level, layer, pos);
285  const unsigned int estSize = map.sizeTiles().x * map.sizeTiles().y / 8;
286 
287  bl::ctr::Vector2D<std::uint8_t> visited;
288  visited.setSize(map.sizeTiles().x, map.sizeTiles().y, 0);
289  visited(pos.x, pos.y) = 1;
290 
291  std::vector<glm::i32vec2> toVisit;
292  toVisit.reserve(estSize);
293  toVisit.emplace_back(glm::i32vec2(pos.x, pos.y));
294 
295  std::vector<FillTile> set;
296  set.reserve(estSize);
297 
298  while (!toVisit.empty()) {
299  const glm::i32vec2 p = toVisit.back();
300  toVisit.pop_back();
301  set.emplace_back(sf::Vector2i(p.x, p.y), getTile(map.levels, level, layer, p));
302 
303  glm::i32vec2 nps[4];
304  setNeighbors(p, nps);
305  for (unsigned int i = 0; i < 4; ++i) {
306  const auto& np = nps[i];
307  if (!map.contains({0, np, bl::tmap::Direction::Up})) continue;
308 
309  if (visited(np.x, np.y) == 0) {
310  visited(np.x, np.y) = 1;
311  const auto& t = getTile(map.levels, level, layer, np);
312  if (t.id() == tile.id() && t.isAnimation() == tile.isAnimation()) {
313  toVisit.emplace_back(np);
314  }
315  }
316  }
317  }
318 
319  return Ptr(new FillTileAction(level, layer, id, isAnim, std::move(set)));
320 }
321 
322 EditMap::FillTileAction::FillTileAction(unsigned int level, unsigned int layer,
323  core::map::Tile::IdType id, bool isAnim,
324  std::vector<FillTile>&& set)
325 : level(level)
326 , layer(layer)
327 , id(id)
328 , isAnim(isAnim)
329 , set(set) {}
330 
332  for (const auto& p : set) {
333  setSingleTile(map.levels, *map.tileset, level, layer, p.position, id, isAnim);
334  map.setupTile(level, layer, sf::Vector2u(p.position));
335  }
336  return false;
337 }
338 
340  for (const auto& p : set) {
341  setSingleTile(map.levels, *map.tileset, level, layer, p.position, p.id, p.isAnim);
342  map.setupTile(level, layer, sf::Vector2u(p.position));
343  }
344  return false;
345 }
346 
347 const char* EditMap::FillTileAction::description() const { return "fill tiles"; }
348 
349 EditMap::Action::Ptr EditMap::SetCollisionAction::create(unsigned int level,
350  const sf::Vector2i& pos,
351  core::map::Collision value,
352  const EditMap& map) {
353  return Ptr(new SetCollisionAction(
354  level, pos, value, map.levels[level].collisionLayer().get(pos.x, pos.y)));
355 }
356 
357 EditMap::SetCollisionAction::SetCollisionAction(unsigned int level, const sf::Vector2i& pos,
358  core::map::Collision value,
359  core::map::Collision ogVal)
360 : level(level)
361 , pos(pos)
362 , value(value)
363 , ogVal(ogVal) {}
364 
366  map.levels[level].collisionLayer().set(pos.x, pos.y, value);
367  map.updateCollisionTileTexture(level, pos.x, pos.y);
368  return false;
369 }
370 
372  map.levels[level].collisionLayer().set(pos.x, pos.y, ogVal);
373  map.updateCollisionTileTexture(level, pos.x, pos.y);
374  return false;
375 }
376 
377 const char* EditMap::SetCollisionAction::description() const { return "set collision"; }
378 
379 EditMap::Action::Ptr EditMap::SetCollisionAreaAction::create(unsigned int level,
380  const sf::IntRect& area,
381  core::map::Collision value,
382  const EditMap& map) {
383  bl::ctr::Vector2D<core::map::Collision> ogcols;
384  ogcols.setSize(area.width, area.height, core::map::Collision::Open);
385  for (int x = area.left; x < area.left + area.width; ++x) {
386  for (int y = area.top; y < area.top + area.height; ++y) {
387  ogcols(x - area.left, y - area.top) = map.levels[level].collisionLayer().get(x, y);
388  }
389  }
390  return Ptr(new SetCollisionAreaAction(level, area, value, std::move(ogcols)));
391 }
392 
393 EditMap::SetCollisionAreaAction::SetCollisionAreaAction(
394  unsigned int level, const sf::IntRect& area, core::map::Collision value,
395  bl::ctr::Vector2D<core::map::Collision>&& ogcols)
396 : level(level)
397 , area(area)
398 , value(value)
399 , ogVals(ogcols) {}
400 
402  for (int x = area.left; x < area.left + area.width; ++x) {
403  for (int y = area.top; y < area.top + area.height; ++y) {
404  map.levels[level].collisionLayer().set(x, y, value);
405  map.updateCollisionTileTexture(level, x, y);
406  }
407  }
408  return false;
409 }
410 
412  for (int x = area.left; x < area.left + area.width; ++x) {
413  for (int y = area.top; y < area.top + area.height; ++y) {
414  map.levels[level].collisionLayer().set(x, y, ogVals(x - area.left, y - area.top));
415  map.updateCollisionTileTexture(level, x, y);
416  }
417  }
418  return false;
419 }
420 
421 const char* EditMap::SetCollisionAreaAction::description() const { return "set col area"; }
422 
423 EditMap::Action::Ptr EditMap::FillCollisionAction::create(unsigned int level,
424  const sf::Vector2i& pos,
425  core::map::Collision col, EditMap& map) {
426  const core::map::Collision oc = map.levels[level].collisionLayer().get(pos.x, pos.y);
427  const unsigned int estSize = map.sizeTiles().x * map.sizeTiles().y / 8;
428 
429  bl::ctr::Vector2D<std::uint8_t> visited;
430  visited.setSize(map.sizeTiles().x, map.sizeTiles().y, 0);
431  visited(pos.x, pos.y) = 1;
432 
433  std::vector<glm::i32vec2> toVisit;
434  toVisit.reserve(estSize);
435  toVisit.emplace_back(glm::i32vec2(pos.x, pos.y));
436 
437  std::vector<std::pair<sf::Vector2i, core::map::Collision>> set;
438  set.reserve(estSize);
439 
440  while (!toVisit.empty()) {
441  const auto p = toVisit.back();
442  toVisit.pop_back();
443  set.emplace_back(sf::Vector2i(p.x, p.y), map.levels[level].collisionLayer().get(p.x, p.y));
444 
445  glm::i32vec2 nps[4];
446  setNeighbors(p, nps);
447  for (unsigned int i = 0; i < 4; ++i) {
448  const auto& np = nps[i];
449  if (!map.contains({0, np, bl::tmap::Direction::Up})) continue;
450 
451  if (map.levels[level].collisionLayer().get(np.x, np.y) == oc &&
452  visited(np.x, np.y) == 0) {
453  visited(np.x, np.y) = 1;
454  toVisit.emplace_back(np);
455  }
456  }
457  }
458 
459  return Ptr(new FillCollisionAction(level, col, std::move(set)));
460 }
461 
462 EditMap::FillCollisionAction::FillCollisionAction(
463  unsigned int level, core::map::Collision col,
464  std::vector<std::pair<sf::Vector2i, core::map::Collision>>&& set)
465 : level(level)
466 , col(col)
467 , set(set) {}
468 
470  for (const auto& p : set) {
471  map.levels[level].collisionLayer().set(p.first.x, p.first.y, col);
472  map.updateCollisionTileTexture(level, p.first.x, p.first.y);
473  }
474  return false;
475 }
476 
478  for (const auto& p : set) {
479  map.levels[level].collisionLayer().set(p.first.x, p.first.y, p.second);
480  map.updateCollisionTileTexture(level, p.first.x, p.first.y);
481  }
482  return false;
483 }
484 
485 const char* EditMap::FillCollisionAction::description() const { return "fill collisions"; }
486 
487 EditMap::Action::Ptr EditMap::SetCatchAction::create(unsigned int level, const sf::Vector2i& pos,
488  std::uint8_t value, const EditMap& map) {
489  return Ptr(
490  new SetCatchAction(level, pos, value, map.levels[level].catchLayer().get(pos.x, pos.y)));
491 }
492 
493 EditMap::SetCatchAction::SetCatchAction(unsigned int level, const sf::Vector2i& pos,
494  std::uint8_t value, std::uint8_t ogVal)
495 : level(level)
496 , pos(pos)
497 , value(value)
498 , ogVal(ogVal) {}
499 
501  map.levels[level].catchLayer().set(pos.x, pos.y, value);
502  map.updateCatchTileColor(level, pos.x, pos.y);
503  return false;
504 }
505 
507  map.levels[level].catchLayer().set(pos.x, pos.y, ogVal);
508  map.updateCatchTileColor(level, pos.x, pos.y);
509  return false;
510 }
511 
512 const char* EditMap::SetCatchAction::description() const { return "set catch tile"; }
513 
514 EditMap::Action::Ptr EditMap::SetCatchAreaAction::create(unsigned int level,
515  const sf::IntRect& area,
516  std::uint8_t value, const EditMap& map) {
517  bl::ctr::Vector2D<std::uint8_t> ogcols;
518  ogcols.setSize(area.width, area.height, 0);
519  for (int x = area.left; x < area.left + area.width; ++x) {
520  for (int y = area.top; y < area.top + area.height; ++y) {
521  ogcols(x - area.left, y - area.top) = map.levels[level].catchLayer().get(x, y);
522  }
523  }
524  return Ptr(new SetCatchAreaAction(level, area, value, std::move(ogcols)));
525 }
526 
527 EditMap::SetCatchAreaAction::SetCatchAreaAction(unsigned int level, const sf::IntRect& area,
528  std::uint8_t value,
529  bl::ctr::Vector2D<std::uint8_t>&& ogcols)
530 : level(level)
531 , area(area)
532 , value(value)
533 , ogVals(ogcols) {}
534 
536  for (int x = area.left; x < area.left + area.width; ++x) {
537  for (int y = area.top; y < area.top + area.height; ++y) {
538  map.levels[level].catchLayer().set(x, y, value);
539  map.updateCatchTileColor(level, x, y);
540  }
541  }
542  return false;
543 }
544 
546  for (int x = area.left; x < area.left + area.width; ++x) {
547  for (int y = area.top; y < area.top + area.height; ++y) {
548  map.levels[level].catchLayer().set(x, y, ogVals(x - area.left, y - area.top));
549  map.updateCatchTileColor(level, x, y);
550  }
551  }
552  return false;
553 }
554 
555 const char* EditMap::SetCatchAreaAction::description() const { return "set catch area"; }
556 
557 EditMap::Action::Ptr EditMap::FillCatchAction::create(unsigned int level, const sf::Vector2i& pos,
558  std::uint8_t id, EditMap& map) {
559  const std::uint8_t og = map.levels[level].catchLayer().get(pos.x, pos.y);
560  const unsigned int estSize = map.sizeTiles().x * map.sizeTiles().y / 8;
561 
562  bl::ctr::Vector2D<std::uint8_t> visited;
563  visited.setSize(map.sizeTiles().x, map.sizeTiles().y, 0);
564  visited(pos.x, pos.y) = 1;
565 
566  std::vector<glm::i32vec2> toVisit;
567  toVisit.reserve(estSize);
568  toVisit.emplace_back(glm::i32vec2(pos.x, pos.y));
569 
570  std::vector<std::pair<sf::Vector2i, std::uint8_t>> set;
571  set.reserve(estSize);
572 
573  while (!toVisit.empty()) {
574  const glm::i32vec2 p = toVisit.back();
575  toVisit.pop_back();
576  set.emplace_back(sf::Vector2i(p.x, p.y), map.levels[level].catchLayer().get(p.x, p.y));
577 
578  glm::i32vec2 nps[4];
579  setNeighbors(p, nps);
580  for (unsigned int i = 0; i < 4; ++i) {
581  const auto& np = nps[i];
582  if (!map.contains({0, np, bl::tmap::Direction::Up})) continue;
583 
584  if (visited(np.x, np.y) == 0 && map.levels[level].catchLayer().get(np.x, np.y) == og) {
585  visited(np.x, np.y) = 1;
586  toVisit.emplace_back(np);
587  }
588  }
589  }
590 
591  return Ptr(new FillCatchAction(level, id, std::move(set)));
592 }
593 
594 EditMap::FillCatchAction::FillCatchAction(unsigned int level, std::uint8_t id,
595  std::vector<std::pair<sf::Vector2i, std::uint8_t>>&& set)
596 : level(level)
597 , id(id)
598 , set(set) {}
599 
601  for (const auto& p : set) {
602  map.levels[level].catchLayer().set(p.first.x, p.first.y, id);
603  map.updateCatchTileColor(level, p.first.x, p.first.y);
604  }
605  return false;
606 }
607 
609  for (const auto& p : set) {
610  map.levels[level].catchLayer().set(p.first.x, p.first.y, p.second);
611  map.updateCatchTileColor(level, p.first.x, p.first.y);
612  }
613  return false;
614 }
615 
616 const char* EditMap::FillCatchAction::description() const { return "fill catch tiles"; }
617 
618 EditMap::Action::Ptr EditMap::SetPlaylistAction::create(const std::string& playlist,
619  const EditMap& map) {
620  return Ptr(new SetPlaylistAction(map.playlistField, playlist));
621 }
622 
623 EditMap::SetPlaylistAction::SetPlaylistAction(const std::string& orig, const std::string& playlist)
624 : orig(orig)
625 , playlist(playlist) {}
626 
628  map.playlistField = playlist;
629  return true;
630 }
631 
633  map.playlistField = orig;
634  return true;
635 }
636 
637 const char* EditMap::SetPlaylistAction::description() const { return "set playlist"; }
638 
639 EditMap::Action::Ptr EditMap::SetNameAction::create(const std::string& name, const EditMap& map) {
640  return Ptr(new SetNameAction(map.nameField, name));
641 }
642 
643 EditMap::SetNameAction::SetNameAction(const std::string& orig, const std::string& name)
644 : orig(orig)
645 , name(name) {}
646 
648  map.nameField = name;
649  return true;
650 }
651 
653  map.nameField = orig;
654  return true;
655 }
656 
657 const char* EditMap::SetNameAction::description() const { return "set name"; }
658 
660  const EditMap& map) {
661  return Ptr(new SetWeatherAction(type, map.weatherField));
662 }
663 
664 EditMap::SetWeatherAction::SetWeatherAction(core::map::Weather::Type type,
666 : type(type)
667 , orig(orig) {}
668 
670  map.weatherField = type;
671  map.weatherSystem().set(type, false);
672  return true;
673 }
674 
676  map.weatherField = orig;
677  map.weatherSystem().set(orig, false);
678  return true;
679 }
680 
681 const char* EditMap::SetWeatherAction::description() const { return "set weather"; }
682 
683 EditMap::Action::Ptr EditMap::AppendLayerAction::create(unsigned int level, Location l) {
684  return Ptr(new AppendLayerAction(level, l));
685 }
686 
687 EditMap::AppendLayerAction::AppendLayerAction(unsigned int lv, Location l)
688 : level(lv)
689 , location(l) {}
690 
692  core::map::LayerSet& lv = map.levels[level];
693  std::vector<core::map::TileLayer>* ls = nullptr;
694  unsigned int offset = 0;
695  switch (location) {
696  case Bottom:
697  ls = &lv.bottomLayers();
698  break;
699  case YSort:
700  ls = &lv.ysortLayers();
701  offset = lv.bottomLayers().size();
702  break;
703  default:
704  ls = &lv.topLayers();
705  offset = lv.bottomLayers().size() + lv.ysortLayers().size();
706  break;
707  }
708  const unsigned int i = ls->size();
709  const unsigned int gi = i + offset;
710 
711  ls->emplace_back();
712  ls->back().create(map.sizeTiles().x, map.sizeTiles().y, core::map::Tile::Blank);
713  std::next(map.renderLevels.begin(), level)->insertLayer(gi);
714  map.updateAllDepths();
715  map.layerFilter[level].insert(map.layerFilter[level].begin() + gi, true);
716  return true;
717 }
718 
720  core::map::LayerSet& lv = map.levels[level];
721  std::vector<core::map::TileLayer>* ls = nullptr;
722  unsigned int offset = 0;
723  switch (location) {
724  case Bottom:
725  ls = &lv.bottomLayers();
726  break;
727  case YSort:
728  ls = &lv.ysortLayers();
729  offset = lv.bottomLayers().size();
730  break;
731  default:
732  ls = &lv.topLayers();
733  offset = lv.bottomLayers().size() + lv.ysortLayers().size();
734  break;
735  }
736  const unsigned int i = ls->size() - 1;
737  const unsigned int gi = i + offset;
738 
739  ls->pop_back();
740  std::next(map.renderLevels.begin(), level)->removeLayer(gi);
741  map.updateAllDepths();
742  map.layerFilter[level].erase(map.layerFilter[level].begin() + gi);
743  return true;
744 }
745 
746 const char* EditMap::AppendLayerAction::description() const { return "add layer"; }
747 
748 EditMap::Action::Ptr EditMap::RemoveLayerAction::create(unsigned int level, unsigned int layer,
749  const EditMap& map) {
750  const core::map::TileLayer* ly = nullptr;
751  const core::map::LayerSet& lv = map.levels[level];
752  unsigned int ay = layer;
753  if (ay < lv.bottomLayers().size()) { ly = &lv.bottomLayers()[ay]; }
754  else {
755  ay -= lv.bottomLayers().size();
756  if (ay < lv.ysortLayers().size()) { ly = &lv.ysortLayers()[ay]; }
757  else {
758  ay -= lv.ysortLayers().size();
759  ly = &lv.topLayers()[ay];
760  }
761  }
762  return Ptr(new RemoveLayerAction(level, layer, *ly));
763 }
764 
765 EditMap::RemoveLayerAction::RemoveLayerAction(unsigned int level, unsigned int layer,
766  const core::map::TileLayer& rm)
767 : level(level)
768 , layer(layer)
769 , removedLayer(rm) {}
770 
772  unsigned int ay = layer;
773  core::map::LayerSet& lv = map.levels[level];
774  std::vector<core::map::TileLayer>* set = nullptr;
775  if (ay < lv.bottomLayers().size()) { set = &lv.bottomLayers(); }
776  else {
777  ay -= lv.bottomLayers().size();
778  if (ay < lv.ysortLayers().size()) { set = &lv.ysortLayers(); }
779  else {
780  ay -= lv.ysortLayers().size();
781  set = &lv.topLayers();
782  }
783  }
784  set->erase(set->begin() + ay);
785  map.layerFilter[level].erase(map.layerFilter[level].begin() + layer);
786  std::next(map.renderLevels.begin(), level)->removeLayer(layer);
787  map.updateAllDepths();
788  return true;
789 }
790 
792  unsigned int ay = layer;
793  core::map::LayerSet& lv = map.levels[level];
794  std::vector<core::map::TileLayer>* set = nullptr;
795  if (ay <= lv.bottomLayers().size()) { set = &lv.bottomLayers(); }
796  else {
797  ay -= lv.bottomLayers().size();
798  if (ay <= lv.ysortLayers().size()) { set = &lv.ysortLayers(); }
799  else {
800  ay -= lv.ysortLayers().size();
801  set = &lv.topLayers();
802  }
803  }
804  set->insert(set->begin() + ay, removedLayer);
805  map.layerFilter[level].insert(map.layerFilter[level].begin() + layer, true);
806  std::next(map.renderLevels.begin(), level)->insertLayer(layer);
807  map.setupLayer(level, layer);
808  map.updateAllDepths();
809  return true;
810 }
811 
812 const char* EditMap::RemoveLayerAction::description() const { return "delete layer"; }
813 
814 EditMap::Action::Ptr EditMap::ShiftLayerAction::create(unsigned int level, unsigned int layer,
815  bool up) {
816  return Ptr(new ShiftLayerAction(level, layer, up));
817 }
818 
819 EditMap::ShiftLayerAction::ShiftLayerAction(unsigned int level, unsigned int layer, bool up)
820 : level(level)
821 , layer(layer)
822 , up(up) {}
823 
825  if (up) {
826  shiftLayerUp(map.levels[level], layer, *map.tileset, map.layerFilter[level]);
827  map.swapRenderLayers(level, layer, layer - 1);
828  }
829  else {
830  shiftLayerDown(map.levels[level], layer, *map.tileset, map.layerFilter[level]);
831  map.swapRenderLayers(level, layer, layer + 1);
832  }
833  return true;
834 }
835 
837  if (up) {
838  unsigned int ay = layer - 1;
839  if (layer == map.levels[level].bottomLayers().size() - 1 ||
840  layer == map.levels[level].bottomLayers().size() +
841  map.levels[level].ysortLayers().size() - 1) {
842  ay = layer;
843  }
844  shiftLayerDown(map.levels[level], ay, *map.tileset, map.layerFilter[level]);
845  map.swapRenderLayers(level, ay, ay + 1);
846  }
847  else {
848  unsigned int ay = layer + 1;
849  if (layer == map.levels[level].bottomLayers().size() ||
850  layer ==
851  map.levels[level].bottomLayers().size() + map.levels[level].ysortLayers().size()) {
852  ay = layer;
853  }
854  shiftLayerUp(map.levels[level], ay, *map.tileset, map.layerFilter[level]);
855  map.swapRenderLayers(level, ay, ay - 1);
856  }
857  return true;
858 }
859 
860 const char* EditMap::ShiftLayerAction::description() const { return "shift layer"; }
861 
862 EditMap::Action::Ptr EditMap::ShiftLevelAction::create(unsigned int level, bool up) {
863  return Ptr(new ShiftLevelAction(level, up));
864 }
865 
866 EditMap::ShiftLevelAction::ShiftLevelAction(unsigned int level, bool up)
867 : level(level)
868 , up(up) {}
869 
871  if (up) {
872  shiftLevelUp(map.levels, *map.tileset, level);
873  std::vector<bool>::swap(map.levelFilter[level], map.levelFilter[level - 1]);
874  std::swap(map.layerFilter[level], map.layerFilter[level - 1]);
875  map.swapRenderLevels(level, level - 1);
876  }
877  else {
878  shiftLevelDown(map.levels, *map.tileset, level);
879  std::vector<bool>::swap(map.levelFilter[level], map.levelFilter[level + 1]);
880  std::swap(map.layerFilter[level], map.layerFilter[level + 1]);
881  map.swapRenderLevels(level, level + 1);
882  }
883  return true;
884 }
885 
887  if (!up) {
888  shiftLevelUp(map.levels, *map.tileset, level + 1);
889  std::vector<bool>::swap(map.levelFilter[level], map.levelFilter[level + 1]);
890  std::swap(map.layerFilter[level], map.layerFilter[level + 1]);
891  map.swapRenderLevels(level, level + 1);
892  }
893  else {
894  shiftLevelDown(map.levels, *map.tileset, level - 1);
895  std::vector<bool>::swap(map.levelFilter[level], map.levelFilter[level - 1]);
896  std::swap(map.layerFilter[level], map.layerFilter[level - 1]);
897  map.swapRenderLevels(level, level - 1);
898  }
899  return true;
900 }
901 
902 const char* EditMap::ShiftLevelAction::description() const { return "shift level"; }
903 
904 EditMap::Action::Ptr EditMap::AppendLevelAction::create() { return Ptr(new AppendLevelAction()); }
905 
907  map.levelFilter.push_back(true);
908  map.layerFilter.emplace_back(5, true);
909  map.levels.emplace_back();
910  map.levels.back().init(map.sizeTiles().x, map.sizeTiles().y, 2, 1, 1);
911  map.setupLevel(map.levels.size() - 1);
912  map.updateAllDepths();
914  return true;
915 }
916 
918  map.renderLevels.pop_back();
919  map.levels.pop_back();
920  map.updateAllDepths();
921  map.levelFilter.pop_back();
922  map.layerFilter.pop_back();
924  return true;
925 }
926 
927 const char* EditMap::AppendLevelAction::description() const { return "add level"; }
928 
929 EditMap::Action::Ptr EditMap::SetScriptAction::create(bool l, const std::string& s,
930  const std::string& p) {
931  return Ptr(new SetScriptAction(l, s, p));
932 }
933 
934 EditMap::SetScriptAction::SetScriptAction(bool l, const std::string& s, const std::string& p)
935 : load(l)
936 , s(s)
937 , p(p) {}
938 
940  if (load) { map.loadScriptField = s; }
941  else { map.unloadScriptField = s; }
942  return true;
943 }
944 
946  if (load) { map.loadScriptField = p; }
947  else { map.unloadScriptField = p; }
948  return true;
949 }
950 
952  if (load) { return "set load script"; }
953  return "set unload script";
954 }
955 
956 EditMap::Action::Ptr EditMap::AddEventAction::create(const core::map::Event& e, unsigned int i) {
957  return Ptr(new AddEventAction(e, i));
958 }
959 
960 EditMap::AddEventAction::AddEventAction(const core::map::Event& e, unsigned int i)
961 : event(e)
962 , i(i) {}
963 
965  map.eventsField.emplace_back(event);
966  map.addEventGfx(i);
967  return false;
968 }
969 
971  map.eventsField.erase(map.eventsField.begin() + i);
972  map.removeEventGfx(i);
973  return false;
974 }
975 
976 const char* EditMap::AddEventAction::description() const { return "add event"; }
977 
979  const core::map::Event& e, unsigned int i) {
980  return Ptr(new EditEventAction(o, e, i));
981 }
982 
983 EditMap::EditEventAction::EditEventAction(const core::map::Event& o, const core::map::Event& e,
984  unsigned int i)
985 : orig(o)
986 , val(e)
987 , i(i) {}
988 
990  map.eventsField[i] = val;
991  return false;
992 }
993 
995  map.eventsField[i] = orig;
996  return false;
997 }
998 
999 const char* EditMap::EditEventAction::description() const { return "edit event"; }
1000 
1001 EditMap::Action::Ptr EditMap::RemoveEventAction::create(const core::map::Event& e, unsigned int i) {
1002  return Ptr(new RemoveEventAction(e, i));
1003 }
1004 
1005 EditMap::RemoveEventAction::RemoveEventAction(const core::map::Event& e, unsigned int i)
1006 : event(e)
1007 , i(i) {}
1008 
1010  map.eventsField.erase(map.eventsField.begin() + i);
1011  map.removeEventGfx(i);
1012  return false;
1013 }
1014 
1016  map.eventsField.insert(map.eventsField.begin() + i, event);
1017  map.addEventGfx(i);
1018  return false;
1019 }
1020 
1021 const char* EditMap::RemoveEventAction::description() const { return "remove event"; }
1022 
1023 EditMap::Action::Ptr EditMap::AddSpawnAction::create(unsigned int l, const sf::Vector2i& pos,
1024  unsigned int id, bl::tmap::Direction dir) {
1025  return Ptr(new AddSpawnAction(l, pos, id, dir));
1026 }
1027 
1028 EditMap::AddSpawnAction::AddSpawnAction(unsigned int l, const sf::Vector2i& p, unsigned int id,
1029  bl::tmap::Direction dir)
1030 : level(l)
1031 , pos(p)
1032 , id(id)
1033 , dir(dir) {}
1034 
1036  const auto spawn =
1037  core::map::Spawn(id, bl::tmap::Position(level, glm::i32vec2(pos.x, pos.y), dir));
1038  map.spawns[id] = spawn;
1039  map.addSpawnGfx(spawn);
1040  return false;
1041 }
1042 
1044  map.spawns.erase(id);
1045  map.spawnSprites.erase(id);
1046  return false;
1047 }
1048 
1049 const char* EditMap::AddSpawnAction::description() const { return "add spawn"; }
1050 
1051 EditMap::Action::Ptr EditMap::RotateSpawnAction::create(unsigned int id) {
1052  return Ptr(new RotateSpawnAction(id));
1053 }
1054 
1055 EditMap::RotateSpawnAction::RotateSpawnAction(unsigned int id)
1056 : id(id) {}
1057 
1059  using namespace core::component;
1060 
1061  auto& d = map.spawns[id].position.direction;
1062  switch (d) {
1063  case bl::tmap::Direction::Up:
1064  d = bl::tmap::Direction::Right;
1065  break;
1066  case bl::tmap::Direction::Right:
1067  d = bl::tmap::Direction::Down;
1068  break;
1069  case bl::tmap::Direction::Down:
1070  d = bl::tmap::Direction::Left;
1071  break;
1072  case bl::tmap::Direction::Left:
1073  default:
1074  d = bl::tmap::Direction::Up;
1075  }
1076  map.updateSpawnRotation(id);
1077  return false;
1078 }
1079 
1081  using namespace core::component;
1082 
1083  auto& d = map.spawns[id].position.direction;
1084  switch (d) {
1085  case bl::tmap::Direction::Up:
1086  d = bl::tmap::Direction::Left;
1087  break;
1088  case bl::tmap::Direction::Right:
1089  d = bl::tmap::Direction::Up;
1090  break;
1091  case bl::tmap::Direction::Down:
1092  d = bl::tmap::Direction::Right;
1093  break;
1094  case bl::tmap::Direction::Left:
1095  default:
1096  d = bl::tmap::Direction::Down;
1097  }
1098  map.updateSpawnRotation(id);
1099  return false;
1100 }
1101 
1102 const char* EditMap::RotateSpawnAction::description() const { return "rotate spwwn"; }
1103 
1104 EditMap::Action::Ptr EditMap::RemoveSpawnAction::create(unsigned int id,
1105  const core::map::Spawn& spawn) {
1106  return Ptr(new RemoveSpawnAction(id, spawn));
1107 }
1108 
1109 EditMap::RemoveSpawnAction::RemoveSpawnAction(unsigned int id, const core::map::Spawn& spawn)
1110 : id(id)
1111 , spawn(spawn) {}
1112 
1114  map.spawns.erase(id);
1115  map.spawnSprites.erase(id);
1116  return false;
1117 }
1118 
1120  map.spawns[id] = spawn;
1121  map.addSpawnGfx(spawn);
1122  return false;
1123 }
1124 
1125 const char* EditMap::RemoveSpawnAction::description() const { return "delete spawn"; }
1126 
1128  unsigned int i) {
1129  return Ptr(new AddNpcSpawnAction(s, i));
1130 }
1131 
1132 EditMap::AddNpcSpawnAction::AddNpcSpawnAction(const core::map::CharacterSpawn& s, unsigned int i)
1133 : spawn(s)
1134 , i(i) {}
1135 
1137  map.characterField.push_back(spawn);
1138  map.systems->entity().spawnCharacter(spawn, map);
1139  return false;
1140 }
1141 
1143  map.characterField.erase(map.characterField.begin() + i);
1144  bl::ecs::Entity c = map.systems->position().getEntity(spawn.position);
1145  if (c != bl::ecs::InvalidEntity) { map.systems->engine().ecs().destroyEntity(c); }
1146  return false;
1147 }
1148 
1149 const char* EditMap::AddNpcSpawnAction::description() const { return "add character"; }
1150 
1151 EditMap::Action::Ptr EditMap::EditNpcSpawnAction::create(unsigned int i,
1152  const core::map::CharacterSpawn& spawn,
1153  const core::map::CharacterSpawn& s) {
1154  return Ptr(new EditNpcSpawnAction(i, spawn, s));
1155 }
1156 
1157 EditMap::EditNpcSpawnAction::EditNpcSpawnAction(unsigned int i,
1158  const core::map::CharacterSpawn& spawn,
1159  const core::map::CharacterSpawn& s)
1160 : i(i)
1161 , orig(spawn)
1162 , value(s) {}
1163 
1165  bl::ecs::Entity e = map.systems->position().getEntity(orig.position);
1166  map.systems->engine().ecs().destroyEntity(e);
1167  map.systems->entity().spawnCharacter(value, map);
1168  map.characterField[i] = value;
1169  return false;
1170 }
1171 
1173  bl::ecs::Entity e = map.systems->position().getEntity(value.position);
1174  map.systems->engine().ecs().destroyEntity(e);
1175  map.systems->entity().spawnCharacter(orig, map);
1176  map.characterField[i] = orig;
1177  return false;
1178 }
1179 
1180 const char* EditMap::EditNpcSpawnAction::description() const { return "edit character"; }
1181 
1183  unsigned int i) {
1184  return Ptr(new RemoveNpcSpawnAction(orig, i));
1185 }
1186 
1187 EditMap::RemoveNpcSpawnAction::RemoveNpcSpawnAction(const core::map::CharacterSpawn& orig,
1188  unsigned int i)
1189 : orig(orig)
1190 , i(i) {}
1191 
1193  map.characterField.erase(map.characterField.begin() + i);
1194  bl::ecs::Entity e = map.systems->position().getEntity(orig.position);
1195  map.systems->engine().ecs().destroyEntity(e);
1196  return false;
1197 }
1198 
1200  map.characterField.insert(map.characterField.begin() + i, orig);
1201  map.systems->entity().spawnCharacter(orig, map);
1202  return false;
1203 }
1204 
1205 const char* EditMap::RemoveNpcSpawnAction::description() const { return "remove character"; }
1206 
1207 EditMap::Action::Ptr EditMap::AddOrEditItemAction::create(unsigned int i, unsigned int level,
1208  const sf::Vector2i& pos,
1209  core::item::Id item, bool visible,
1210  const core::map::Item& orig, bool a) {
1211  return Action::Ptr(new AddOrEditItemAction(i, level, pos, item, visible, orig, a));
1212 }
1213 
1214 EditMap::AddOrEditItemAction::AddOrEditItemAction(unsigned int i, unsigned int level,
1215  const sf::Vector2i& pos, core::item::Id item,
1216  bool visible, const core::map::Item& orig, bool a)
1217 : i(i)
1218 , level(level)
1219 , position(pos)
1220 , item(item)
1221 , visible(visible)
1222 , orig(orig)
1223 , add(a) {}
1224 
1226  if (add) {
1227  map.itemsField.emplace_back(
1228  static_cast<std::uint16_t>(item), map.nextItemId, position, level, visible);
1229  ++map.nextItemId;
1230  map.systems->entity().spawnItem(
1231  core::map::Item(static_cast<std::uint16_t>(item), 0, position, level, visible), map);
1232  }
1233  else {
1234  map.itemsField[i].id = static_cast<std::uint16_t>(item);
1235  map.itemsField[i].visible = visible;
1236  }
1237  return false;
1238 }
1239 
1241  if (add) {
1242  map.itemsField.pop_back();
1243  const auto ent = map.systems->position().getEntity({static_cast<std::uint8_t>(level),
1244  glm::i32vec2(position.x, position.y),
1245  bl::tmap::Direction::Up});
1246  if (ent != bl::ecs::InvalidEntity) { map.systems->engine().ecs().destroyEntity(ent); }
1247  }
1248  else {
1249  map.itemsField[i].id = orig.id;
1250  map.itemsField[i].visible = orig.visible;
1251  }
1252  return false;
1253 }
1254 
1256  return add ? "spawn item" : "edit item";
1257 }
1258 
1259 EditMap::Action::Ptr EditMap::RemoveItemAction::create(unsigned int i, unsigned int level,
1260  const sf::Vector2i& pos,
1261  const core::map::Item& orig) {
1262  return Action::Ptr(new RemoveItemAction(i, level, pos, orig));
1263 }
1264 
1265 EditMap::RemoveItemAction::RemoveItemAction(unsigned int i, unsigned int level,
1266  const sf::Vector2i& pos, const core::map::Item& orig)
1267 : i(i)
1268 , level(level)
1269 , position(pos)
1270 , orig(orig) {}
1271 
1273  map.itemsField.erase(map.itemsField.begin() + i);
1274  const auto ent = map.systems->position().getEntity({static_cast<std::uint8_t>(level),
1275  glm::i32vec2(position.x, position.y),
1276  bl::tmap::Direction::Up});
1277  if (ent != bl::ecs::InvalidEntity) { map.systems->engine().ecs().destroyEntity(ent); }
1278  return false;
1279 }
1280 
1282  map.itemsField.insert(map.itemsField.begin() + i, orig);
1283  map.systems->entity().spawnItem(orig, map);
1284  return false;
1285 }
1286 
1287 const char* EditMap::RemoveItemAction::description() const { return "remove item"; }
1288 
1289 EditMap::Action::Ptr EditMap::SetLightAction::create(const sf::Vector2i& pos, unsigned int radius,
1290  const core::map::Light& orig) {
1291  return Action::Ptr(new SetLightAction(pos, radius, orig));
1292 }
1293 
1294 EditMap::SetLightAction::SetLightAction(const sf::Vector2i& pos, unsigned int radius,
1295  const core::map::Light& orig)
1296 : value(radius, pos)
1297 , orig(orig) {}
1298 
1300  const core::map::LightingSystem::Handle h = map.lighting.getClosestLight(value.position);
1302  map.lighting.addLight(value);
1303  spawned = true;
1304  }
1305  else { map.lighting.updateLight(h, value); }
1306  return false;
1307 }
1308 
1310  const core::map::LightingSystem::Handle h = map.lighting.getClosestLight(value.position);
1311  if (spawned) { map.lighting.removeLight(h); }
1312  else { map.lighting.updateLight(h, orig); }
1313  return false;
1314 }
1315 
1317  return spawned ? "spawn light" : "edit light";
1318 }
1319 
1320 EditMap::Action::Ptr EditMap::RemoveLightAction::create(const core::map::Light& orig) {
1321  return Action::Ptr(new RemoveLightAction(orig));
1322 }
1323 
1324 EditMap::RemoveLightAction::RemoveLightAction(const core::map::Light& orig)
1325 : orig(orig) {}
1326 
1328  const core::map::LightingSystem::Handle h = map.lighting.getClosestLight(orig.position);
1329  map.lighting.removeLight(h);
1330  return false;
1331 }
1332 
1334  map.lighting.addLight(orig);
1335  return false;
1336 }
1337 
1338 const char* EditMap::RemoveLightAction::description() const { return "remove light"; }
1339 
1341  return Action::Ptr{new AddCatchRegionAction()};
1342 }
1343 
1345  map.catchRegionsField.emplace_back();
1346  map.catchRegionsField.back().name = "New Region";
1347  return true;
1348 }
1349 
1351  map.catchRegionsField.pop_back();
1352  return true;
1353 }
1354 
1355 const char* EditMap::AddCatchRegionAction::description() const { return "add catch region"; }
1356 
1357 EditMap::Action::Ptr EditMap::EditCatchRegionAction::create(std::uint8_t index,
1358  const core::map::CatchRegion& val,
1359  const core::map::CatchRegion& orig) {
1360  return Action::Ptr{new EditCatchRegionAction(index, val, orig)};
1361 }
1362 
1363 EditMap::EditCatchRegionAction::EditCatchRegionAction(std::uint8_t i,
1364  const core::map::CatchRegion& v,
1365  const core::map::CatchRegion& o)
1366 : index(i)
1367 , value(v)
1368 , orig(o) {}
1369 
1371  map.catchRegionsField[index] = value;
1372  return true;
1373 }
1374 
1376  map.catchRegionsField[index] = orig;
1377  return true;
1378 }
1379 
1380 const char* EditMap::EditCatchRegionAction::description() const { return "edit catch region"; }
1381 
1382 EditMap::Action::Ptr EditMap::RemoveCatchRegionAction::create(std::uint8_t index,
1383  const core::map::CatchRegion& orig) {
1384  return Action::Ptr{new RemoveCatchRegionAction(index, orig)};
1385 }
1386 
1387 EditMap::RemoveCatchRegionAction::RemoveCatchRegionAction(std::uint8_t i,
1388  const core::map::CatchRegion& o)
1389 : index(i)
1390 , orig(o) {}
1391 
1393  const std::uint8_t i = index + 1;
1394 
1395  map.catchRegionsField.erase(map.catchRegionsField.begin() + index);
1396 
1397  if (cleared.empty()) {
1398  for (unsigned int level = 0; level < map.levels.size(); ++level) {
1399  for (unsigned int x = 0; x < map.levels[level].catchLayer().width(); ++x) {
1400  for (unsigned int y = 0; y < map.levels[level].catchLayer().height(); ++y) {
1401  if (map.levels[level].catchLayer().get(x, y) == i) {
1402  cleared.emplace_back(level, sf::Vector2i(x, y));
1403  }
1404  }
1405  }
1406  }
1407  }
1408 
1409  for (const auto& pos : cleared) {
1410  map.levels[pos.first].catchLayer().set(pos.second.x, pos.second.y, 0);
1411  }
1412 
1413  for (unsigned int level = 0; level < map.levels.size(); ++level) {
1414  for (unsigned int x = 0; x < map.levels[level].catchLayer().width(); ++x) {
1415  for (unsigned int y = 0; y < map.levels[level].catchLayer().height(); ++y) {
1416  const std::uint8_t j = map.levels[level].catchLayer().get(x, y);
1417  if (j > i) { map.levels[level].catchLayer().set(x, y, j - 1); }
1418  }
1419  }
1420  }
1421 
1422  return true;
1423 }
1424 
1426  const std::uint8_t i = index + 1;
1427 
1428  map.catchRegionsField.insert(map.catchRegionsField.begin() + index, orig);
1429 
1430  for (unsigned int level = 0; level < map.levels.size(); ++level) {
1431  for (unsigned int x = 0; x < map.levels[level].catchLayer().width(); ++x) {
1432  for (unsigned int y = 0; y < map.levels[level].catchLayer().height(); ++y) {
1433  const std::uint8_t j = map.levels[level].catchLayer().get(x, y);
1434  if (j >= i) { map.levels[level].catchLayer().set(x, y, j + 1); }
1435  }
1436  }
1437  }
1438 
1439  for (const auto& pos : cleared) {
1440  map.levels[pos.first].catchLayer().set(pos.second.x, pos.second.y, i);
1441  }
1442 
1443  return true;
1444 }
1445 
1446 const char* EditMap::RemoveCatchRegionAction::description() const { return "remove catch region"; }
1447 
1449  bool sun, std::uint8_t upper, std::uint8_t lower, const core::map::LightingSystem& lighting) {
1450  return Ptr(new SetAmbientLightAction(sun, upper, lower, lighting));
1451 }
1452 
1453 EditMap::SetAmbientLightAction::SetAmbientLightAction(bool sun, std::uint8_t upper,
1454  std::uint8_t lower,
1456 : sunlight(sun)
1457 , origSunlight(lighting.adjustsForSunlight())
1458 , origLower(lighting.getMinLightLevel())
1459 , lower(lower)
1460 , origUpper(lighting.getMaxLightLevel())
1461 , upper(upper) {}
1462 
1464  map.lightingSystem().adjustForSunlight(sunlight);
1465  map.lightingSystem().setAmbientLevel(lower, upper);
1466  return true;
1467 }
1468 
1470  map.lightingSystem().adjustForSunlight(origSunlight);
1471  map.lightingSystem().setAmbientLevel(origLower, origUpper);
1472  return true;
1473 }
1474 
1475 const char* EditMap::SetAmbientLightAction::description() const { return "set lighting"; }
1476 
1477 EditMap::Action::Ptr EditMap::AddTownAction::create() { return Ptr(new AddTownAction()); }
1478 
1480  core::map::Town t;
1481  t.name = "New Town";
1483  map.towns.emplace_back(std::move(t));
1484  return true;
1485 }
1486 
1488  map.towns.pop_back();
1489  return true;
1490 }
1491 
1492 const char* EditMap::AddTownAction::description() const { return "add town"; }
1493 
1494 EditMap::Action::Ptr EditMap::EditTownAction::create(std::uint8_t i, const core::map::Town& orig,
1495  const core::map::Town& val) {
1496  return Ptr(new EditTownAction(i, orig, val));
1497 }
1498 
1499 EditMap::EditTownAction::EditTownAction(std::uint8_t i, const core::map::Town& orig,
1500  const core::map::Town& val)
1501 : i(i)
1502 , orig(orig)
1503 , val(val) {}
1504 
1506  map.towns[i] = val;
1507  return val.name != orig.name;
1508 }
1509 
1511  map.towns[i] = orig;
1512  return val.name != orig.name;
1513 }
1514 
1515 const char* EditMap::EditTownAction::description() const { return "edit town"; }
1516 
1517 EditMap::Action::Ptr EditMap::RemoveTownAction::create(std::uint8_t i,
1518  const core::map::Town& orig) {
1519  return Ptr(new RemoveTownAction(i, orig));
1520 }
1521 
1522 EditMap::RemoveTownAction::RemoveTownAction(std::uint8_t i, const core::map::Town& t)
1523 : i(i)
1524 , orig(t) {}
1525 
1527  map.towns.erase(map.towns.begin() + i);
1528  const bool add = tiles.empty();
1529  const std::uint8_t j = i + 1;
1530  for (int x = 0; x < map.sizeTiles().x; ++x) {
1531  for (int y = 0; y < map.sizeTiles().y; ++y) {
1532  if (map.townTiles(x, y) == j && add) {
1533  tiles.emplace_back(x, y);
1534  map.townTiles(x, y) = 0;
1535  }
1536  else if (map.townTiles(x, y) > j) { map.townTiles(x, y) -= 1; }
1537  }
1538  }
1539  return true;
1540 }
1541 
1543  map.towns.insert(map.towns.begin() + i, orig);
1544  const std::uint8_t j = i + 1;
1545 
1546  for (int x = 0; x < map.sizeTiles().x; ++x) {
1547  for (int y = 0; y < map.sizeTiles().y; ++y) {
1548  if (map.townTiles(x, y) >= j) { map.townTiles(x, y) += 1; }
1549  }
1550  }
1551  for (const auto& pos : tiles) { map.townTiles(pos.x, pos.y) = j; }
1552 
1553  return true;
1554 }
1555 
1556 const char* EditMap::RemoveTownAction::description() const { return "remove town"; }
1557 
1558 EditMap::Action::Ptr EditMap::SetTownTileAction::create(const sf::Vector2i& pos, std::uint8_t id,
1559  std::uint8_t orig) {
1560  return Ptr(new SetTownTileAction(pos, id, orig));
1561 }
1562 
1563 EditMap::SetTownTileAction::SetTownTileAction(const sf::Vector2i& pos, std::uint8_t id,
1564  std::uint8_t orig)
1565 : pos(pos)
1566 , id(id)
1567 , orig(orig) {}
1568 
1570  map.townTiles(pos.x, pos.y) = id;
1571  map.updateTownTileColor(pos.x, pos.y);
1572  return false;
1573 }
1574 
1576  map.townTiles(pos.x, pos.y) = orig;
1577  map.updateTownTileColor(pos.x, pos.y);
1578  return false;
1579 }
1580 
1581 const char* EditMap::SetTownTileAction::description() const { return "set town tile"; }
1582 
1583 EditMap::Action::Ptr EditMap::SetTownTileAreaAction::create(const sf::IntRect& area,
1584  std::uint8_t id, EditMap& map) {
1585  bl::ctr::Vector2D<std::uint8_t> set;
1586  set.setSize(area.width, area.height, 0);
1587  for (int x = 0; x < area.width; ++x) {
1588  for (int y = 0; y < area.height; ++y) {
1589  set(x, y) = map.townTiles(area.left + x, area.top + y);
1590  }
1591  }
1592  return Ptr(new SetTownTileAreaAction(area, id, std::move(set)));
1593 }
1594 
1595 EditMap::SetTownTileAreaAction::SetTownTileAreaAction(const sf::IntRect& area, std::uint8_t id,
1596  bl::ctr::Vector2D<std::uint8_t>&& set)
1597 : area(area)
1598 , id(id)
1599 , orig(set) {}
1600 
1602  for (int x = area.left; x < area.left + area.width; ++x) {
1603  for (int y = area.top; y < area.top + area.height; ++y) {
1604  map.townTiles(x, y) = id;
1605  map.updateTownTileColor(x, y);
1606  }
1607  }
1608  return false;
1609 }
1610 
1612  for (int x = area.left; x < area.left + area.width; ++x) {
1613  for (int y = area.top; y < area.top + area.height; ++y) {
1614  map.townTiles(x, y) = orig(x - area.left, y - area.top);
1615  map.updateTownTileColor(x, y);
1616  }
1617  }
1618  return false;
1619 }
1620 
1621 const char* EditMap::SetTownTileAreaAction::description() const { return "set town selection"; }
1622 
1623 EditMap::Action::Ptr EditMap::FillTownTileAction::create(const sf::Vector2i& pos, std::uint8_t fill,
1624  EditMap& map) {
1625  const std::uint8_t val = map.townTiles(pos.x, pos.y);
1626  const unsigned int estSize = map.sizeTiles().x * map.sizeTiles().y / 8;
1627 
1628  bl::ctr::Vector2D<std::uint8_t> visited;
1629  visited.setSize(map.sizeTiles().x, map.sizeTiles().y, 0);
1630  visited(pos.x, pos.y) = 1;
1631 
1632  std::vector<glm::i32vec2> toVisit;
1633  toVisit.reserve(estSize);
1634  toVisit.emplace_back(glm::i32vec2(pos.x, pos.y));
1635 
1636  std::vector<std::pair<sf::Vector2i, std::uint8_t>> set;
1637  set.reserve(estSize);
1638 
1639  while (!toVisit.empty()) {
1640  const glm::i32vec2 p = toVisit.back();
1641  toVisit.pop_back();
1642  set.emplace_back(sf::Vector2i(p.x, p.y), map.townTiles(p.x, p.y));
1643 
1644  glm::i32vec2 nps[4];
1645  setNeighbors(p, nps);
1646  for (unsigned int i = 0; i < 4; ++i) {
1647  if (!map.contains({0, nps[i], bl::tmap::Direction::Up})) continue;
1648 
1649  if (map.townTiles(nps[i].x, nps[i].y) == val && visited(nps[i].x, nps[i].y) == 0) {
1650  toVisit.emplace_back(nps[i]);
1651  visited(nps[i].x, nps[i].y) = 1;
1652  }
1653  }
1654  }
1655 
1656  return Ptr(new FillTownTileAction(fill, std::move(set)));
1657 }
1658 
1659 EditMap::FillTownTileAction::FillTownTileAction(
1660  std::uint8_t fill, std::vector<std::pair<sf::Vector2i, std::uint8_t>>&& set)
1661 : set(set)
1662 , id(fill) {}
1663 
1665  for (const auto& p : set) {
1666  map.townTiles(p.first.x, p.first.y) = id;
1667  map.updateTownTileColor(p.first.x, p.first.y);
1668  }
1669  return false;
1670 }
1671 
1673  for (const auto& p : set) {
1674  map.townTiles(p.first.x, p.first.y) = p.second;
1675  map.updateTownTileColor(p.first.x, p.first.y);
1676  }
1677  return false;
1678 }
1679 
1680 const char* EditMap::FillTownTileAction::description() const { return "fill town tiles"; }
1681 
1682 EditMap::Action::Ptr EditMap::SetLevelTileAction::create(const sf::Vector2i& pos,
1685  return EditMap::Action::Ptr{new SetLevelTileAction(pos, lt, orig)};
1686 }
1687 
1688 EditMap::SetLevelTileAction::SetLevelTileAction(const sf::Vector2i& pos,
1691 : pos(pos)
1692 , lt(lt)
1693 , orig(orig) {}
1694 
1696  map.transitionField(pos.x, pos.y) = lt;
1697  map.updateLevelTransitionTexture(pos.x, pos.y);
1698  return false;
1699 }
1700 
1702  map.transitionField(pos.x, pos.y) = orig;
1703  map.updateLevelTransitionTexture(pos.x, pos.y);
1704  return false;
1705 }
1706 
1707 const char* EditMap::SetLevelTileAction::description() const { return "set level transition"; }
1708 
1709 EditMap::Action::Ptr EditMap::SetLevelTileAreaAction::create(const sf::IntRect& area,
1711  EditMap& map) {
1712  bl::ctr::Vector2D<core::map::LevelTransition> orig;
1713  orig.setSize(area.width, area.height);
1714  for (int x = area.left; x < area.left + area.width; ++x) {
1715  for (int y = area.top; y < area.top + area.height; ++y) {
1716  orig(x - area.left, y - area.top) = map.transitionField(x, y);
1717  }
1718  }
1719 
1720  return EditMap::Action::Ptr{new SetLevelTileAreaAction(area, lt, std::move(orig))};
1721 }
1722 
1723 EditMap::SetLevelTileAreaAction::SetLevelTileAreaAction(
1724  const sf::IntRect& area, core::map::LevelTransition lt,
1725  bl::ctr::Vector2D<core::map::LevelTransition>&& orig)
1726 : area(area)
1727 , lt(lt)
1728 , orig(orig) {}
1729 
1731  for (int x = area.left; x < area.left + area.width; ++x) {
1732  for (int y = area.top; y < area.top + area.height; ++y) {
1733  map.transitionField(x, y) = lt;
1734  map.updateLevelTransitionTexture(x, y);
1735  }
1736  }
1737  return false;
1738 }
1739 
1741  for (int x = area.left; x < area.left + area.width; ++x) {
1742  for (int y = area.top; y < area.top + area.height; ++y) {
1743  map.transitionField(x, y) = orig(x - area.left, y - area.top);
1744  map.updateLevelTransitionTexture(x, y);
1745  }
1746  }
1747  return false;
1748 }
1749 
1751  return "set level transition area";
1752 }
1753 
1754 } // namespace component
1755 } // namespace editor
Id
Represents an item in its simplist form.
Definition: Id.hpp:24
Collision
The different types of collisions in maps.
Definition: Collision.hpp:16
LevelTransition
Represents a level transition in a map. Level transitions are applied when an entity moves either ont...
All classes and functionality used for implementing the game editor.
Definition: Tile.hpp:11
Represents a class of catchable peoplemon.
Definition: CatchRegion.hpp:18
Represents a character to be spawned into a map on load.
Represents an event in a Map. A script that is run on a trigger within a given region.
Definition: Event.hpp:19
Basic struct representing a pickup-able item in Map.
Definition: Item.hpp:16
Generic map layer class. Can be used for any type of layer.
Definition: Layer.hpp:21
Encapsulates a set of layers for a given map height. Maps have one LayerSet per height level,...
Definition: LayerSet.hpp:51
std::vector< TileLayer > & bottomLayers()
Returns a reference to the bottom tiles in this set.
Definition: LayerSet.cpp:33
std::vector< TileLayer > & topLayers()
Returns a reference to the top tiles in this set.
Definition: LayerSet.cpp:37
std::vector< TileLayer > & ysortLayers()
Returns a reference to the sorted tiles in this set.
Definition: LayerSet.cpp:35
unsigned int layerCount() const
Returns the total number of layers contained.
Definition: LayerSet.cpp:39
Represents a renderable light in a Map.
Definition: Light.hpp:16
System for handling lighting in Maps. Manages all the lights and performs rendering....
std::uint16_t Handle
Handle representing a light in the map.
void addLight(const Light &light)
Adds a light to the map and to the persistent map file.
void adjustForSunlight(bool adjust)
Set whether or not the light level is adjusted based on time of day. If not adjusting for sunlight th...
void setAmbientLevel(std::uint8_t lowLightLevel, std::uint8_t highLightLevel)
The ambient light band. 0 is full darkness and 255 is full brightness.
void updateLight(Handle handle, const Light &value)
Updates the light with the given handle to the new information.
Handle getClosestLight(const sf::Vector2i &position)
Returns a handle to the light closest to the given position.
static constexpr Handle None
Special handle indicating that no light is referenced.
void removeLight(Handle light)
Remove the given light from the system and optionally persist the removal.
std::vector< Item > itemsField
Definition: Map.hpp:307
std::unordered_map< std::uint16_t, Spawn > spawns
Definition: Map.hpp:305
LightingSystem lighting
Definition: Map.hpp:309
std::string nameField
Definition: Map.hpp:298
std::vector< LayerSet > levels
Definition: Map.hpp:303
std::string unloadScriptField
Definition: Map.hpp:300
std::vector< Event > eventsField
Definition: Map.hpp:308
std::string loadScriptField
Definition: Map.hpp:299
Weather::Type weatherField
Definition: Map.hpp:302
LightingSystem & lightingSystem()
Returns a reference to the lighting system in this map.
Definition: Map.cpp:184
sf::Vector2i size
Definition: Map.hpp:318
bl::resource::Ref< Tileset > tileset
Definition: Map.hpp:319
bool contains(const bl::tmap::Position &position) const
Returns whether or not the map contains the given position.
Definition: Map.cpp:271
void setupTile(unsigned int level, unsigned int layer, const sf::Vector2u &pos)
Definition: Map.cpp:641
std::vector< Town > towns
Definition: Map.hpp:312
bl::ctr::Vector2D< std::uint8_t > townTiles
Definition: Map.hpp:313
const sf::Vector2i & sizeTiles() const
Returns the size of the map in tiles.
Definition: Map.cpp:173
std::vector< CharacterSpawn > characterField
Definition: Map.hpp:306
bl::ctr::Vector2D< LevelTransition > transitionField
Definition: Map.hpp:311
void setupLayer(unsigned int level, unsigned int layer)
Definition: Map.cpp:635
std::string playlistField
Definition: Map.hpp:301
Weather & weatherSystem()
Returns a reference to the weather system in this map.
Definition: Map.cpp:182
std::vector< CatchRegion > catchRegionsField
Definition: Map.hpp:310
system::Systems * systems
Definition: Map.hpp:315
void setupLevel(unsigned int level)
Definition: Map.cpp:624
const std::string & name() const
Returns the name of the map.
Definition: Map.cpp:171
std::list< RenderLevel > renderLevels
Definition: Map.hpp:329
Basic struct representing a spawn in a Map.
Definition: Spawn.hpp:19
Data representation of a tile in a Map TileLayer.
Definition: Tile.hpp:30
IdType id() const
Returns the id of the image or animation of this tile.
Definition: Tile.cpp:22
static constexpr IdType Blank
Special id for blank tiles.
Definition: Tile.hpp:36
std::uint16_t IdType
Definition: Tile.hpp:33
bool isAnimation() const
Returns whether this tile is an animation or not.
Definition: Tile.cpp:20
void set(IdType id, bool anim)
Sets the information of the tile.
Definition: Tile.cpp:24
Stores the collection of images and animations used by Tiles in a Map.
Definition: Tileset.hpp:23
Represents a town, route, or region within a map. Maps may have many towns. Individual tiles are asso...
Definition: Town.hpp:22
Weather::Type weather
Definition: Town.hpp:25
std::string name
Definition: Town.hpp:23
Type
The type of weather.
Definition: Weather.hpp:38
@ None
No weather will occur.
Definition: Weather.hpp:40
void set(Type type, bool immediate=false)
Sets the current weather type.
Definition: Weather.cpp:54
static int PixelsPerTile()
Definition: Properties.cpp:279
bool spawnItem(const map::Item &item, map::Map &map)
Spawns an item into the world.
Definition: Entity.cpp:98
bl::ecs::Entity spawnCharacter(const map::CharacterSpawn &spawn, map::Map &map)
Spawns a trainer or an npc from the given spawn information.
Definition: Entity.cpp:25
void editorPushLevel()
Called by the editor when a level is added.
Definition: Position.cpp:111
bl::ecs::Entity getEntity(const bl::tmap::Position &pos) const
Returns the entity at the given position or InvalidEntity if not found.
Definition: Position.cpp:96
void editorPopLevel()
Called by the editor when a level is removed.
Definition: Position.cpp:116
const bl::engine::Engine & engine() const
Const accessor for the Engine.
Definition: Systems.cpp:35
Entity & entity()
Returns the entity system.
Definition: Systems.cpp:55
Position & position()
Returns a reference to the position system.
Definition: Systems.cpp:47
Wrapper over the core::Map class that is directly usable in a bl::gui::GUI.
Definition: EditMap.hpp:28
std::shared_ptr< EditMap > Ptr
Pointer to an EditMap.
Definition: EditMap.hpp:31
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:179
virtual const char * description() const override
Definition: MapActions.cpp:193
static EditMap::Action::Ptr create(unsigned int level, unsigned int layer, const sf::Vector2i &pos, bool isAnim, core::map::Tile::IdType value, const EditMap &map)
Definition: MapActions.cpp:134
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:165
virtual const char * description() const override
Definition: MapActions.cpp:278
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:252
static EditMap::Action::Ptr create(unsigned int level, unsigned int layer, const sf::IntRect &area, bool isAnim, core::map::Tile::IdType value, const EditMap &map)
Definition: MapActions.cpp:195
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:262
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:339
static Action::Ptr create(unsigned int level, unsigned int layer, const sf::Vector2i &pos, core::map::Tile::IdType id, bool isAnim, EditMap &map)
Definition: MapActions.cpp:280
virtual const char * description() const override
Definition: MapActions.cpp:347
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:331
static EditMap::Action::Ptr create(unsigned int level, const sf::Vector2i &pos, core::map::Collision value, const EditMap &map)
Definition: MapActions.cpp:349
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:365
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:371
virtual const char * description() const override
Definition: MapActions.cpp:377
static Action::Ptr create(unsigned int level, const sf::Vector2i &pos, core::map::Collision col, EditMap &map)
Definition: MapActions.cpp:423
virtual const char * description() const override
Definition: MapActions.cpp:485
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:469
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:477
virtual const char * description() const override
Definition: MapActions.cpp:421
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:411
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:401
static EditMap::Action::Ptr create(unsigned int level, const sf::IntRect &area, core::map::Collision value, const EditMap &map)
Definition: MapActions.cpp:379
static EditMap::Action::Ptr create(unsigned int level, const sf::Vector2i &pos, std::uint8_t value, const EditMap &map)
Definition: MapActions.cpp:487
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:506
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:500
virtual const char * description() const override
Definition: MapActions.cpp:512
virtual const char * description() const override
Definition: MapActions.cpp:555
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:545
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:535
static EditMap::Action::Ptr create(unsigned int level, const sf::IntRect &area, std::uint8_t value, const EditMap &map)
Definition: MapActions.cpp:514
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:608
virtual const char * description() const override
Definition: MapActions.cpp:616
static Action::Ptr create(unsigned int level, const sf::Vector2i &pos, std::uint8_t id, EditMap &map)
Definition: MapActions.cpp:557
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:600
virtual const char * description() const override
Definition: MapActions.cpp:637
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:627
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:632
static EditMap::Action::Ptr create(const std::string &playlist, const EditMap &editMap)
Definition: MapActions.cpp:618
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:652
virtual const char * description() const override
Definition: MapActions.cpp:657
static EditMap::Action::Ptr create(const std::string &name, const EditMap &editMap)
Definition: MapActions.cpp:639
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:647
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:675
static EditMap::Action::Ptr create(core::map::Weather::Type type, const EditMap &map)
Definition: MapActions.cpp:659
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:669
virtual const char * description() const override
Definition: MapActions.cpp:681
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:719
static EditMap::Action::Ptr create(unsigned int level, Location location)
Definition: MapActions.cpp:683
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:691
virtual const char * description() const override
Definition: MapActions.cpp:746
virtual const char * description() const override
Definition: MapActions.cpp:812
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:791
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:771
static EditMap::Action::Ptr create(unsigned int level, unsigned int layer, const EditMap &map)
Definition: MapActions.cpp:748
virtual const char * description() const override
Definition: MapActions.cpp:860
static EditMap::Action::Ptr create(unsigned int level, unsigned int layer, bool up)
Definition: MapActions.cpp:814
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:836
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:824
static EditMap::Action::Ptr create(unsigned int level, bool up)
Definition: MapActions.cpp:862
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:886
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:870
virtual const char * description() const override
Definition: MapActions.cpp:902
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:917
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:906
virtual const char * description() const override
Definition: MapActions.cpp:927
static EditMap::Action::Ptr create()
Definition: MapActions.cpp:904
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:939
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:945
static EditMap::Action::Ptr create(bool load, const std::string &s, const std::string &p)
Definition: MapActions.cpp:929
virtual const char * description() const override
Definition: MapActions.cpp:951
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:970
virtual const char * description() const override
Definition: MapActions.cpp:976
static Action::Ptr create(const core::map::Event &e, unsigned int i)
Definition: MapActions.cpp:956
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:964
virtual bool apply(EditMap &map) override
Definition: MapActions.cpp:989
static Action::Ptr create(const core::map::Event &orig, const core::map::Event &val, unsigned int i)
Definition: MapActions.cpp:978
virtual const char * description() const override
Definition: MapActions.cpp:999
virtual bool undo(EditMap &map) override
Definition: MapActions.cpp:994
virtual bool apply(EditMap &map) override
static Action::Ptr create(const core::map::Event &e, unsigned int i)
virtual const char * description() const override
virtual bool undo(EditMap &map) override
static Action::Ptr create(unsigned int lvl, const sf::Vector2i &pos, unsigned int id, bl::tmap::Direction dir)
virtual bool undo(EditMap &map) override
virtual const char * description() const override
virtual bool apply(EditMap &map) override
static Action::Ptr create(unsigned int id)
virtual bool undo(EditMap &map) override
virtual bool apply(EditMap &map) override
virtual const char * description() const override
virtual bool undo(EditMap &map) override
virtual const char * description() const override
static Action::Ptr create(unsigned int id, const core::map::Spawn &spawn)
virtual bool apply(EditMap &map) override
virtual bool undo(EditMap &map) override
static Action::Ptr create(const core::map::CharacterSpawn &s, unsigned int i)
virtual bool apply(EditMap &map) override
virtual const char * description() const override
virtual bool undo(EditMap &map) override
static Action::Ptr create(unsigned int i, const core::map::CharacterSpawn &orig, const core::map::CharacterSpawn &s)
virtual bool apply(EditMap &map) override
virtual const char * description() const override
static Action::Ptr create(const core::map::CharacterSpawn &orig, unsigned int i)
virtual bool undo(EditMap &map) override
virtual const char * description() const override
virtual bool apply(EditMap &map) override
virtual const char * description() const override
static Action::Ptr create(unsigned int i, unsigned int level, const sf::Vector2i &pos, core::item::Id item, bool visible, const core::map::Item &orig, bool add)
virtual bool apply(EditMap &map) override
virtual bool undo(EditMap &map) override
virtual bool apply(EditMap &map) override
virtual const char * description() const override
virtual bool undo(EditMap &map) override
static Action::Ptr create(unsigned int i, unsigned int level, const sf::Vector2i &pos, const core::map::Item &orig)
virtual bool apply(EditMap &map) override
virtual const char * description() const override
virtual bool undo(EditMap &map) override
static Action::Ptr create(const sf::Vector2i &pos, unsigned int radius, const core::map::Light &orig)
virtual const char * description() const override
virtual bool undo(EditMap &map) override
virtual bool apply(EditMap &map) override
static Action::Ptr create(const core::map::Light &orig)
virtual const char * description() const override
virtual bool undo(EditMap &map) override
virtual bool apply(EditMap &map) override
virtual bool undo(EditMap &map) override
virtual const char * description() const override
virtual bool apply(EditMap &map) override
static Action::Ptr create(std::uint8_t index, const core::map::CatchRegion &value, const core::map::CatchRegion &orig)
virtual bool apply(EditMap &map) override
virtual const char * description() const override
virtual bool undo(EditMap &map) override
static Action::Ptr create(std::uint8_t index, const core::map::CatchRegion &orig)
virtual bool apply(EditMap &map) override
virtual const char * description() const override
static Action::Ptr create(bool sunlight, std::uint8_t upper, std::uint8_t lower, const core::map::LightingSystem &lighting)
virtual bool undo(EditMap &map) override
virtual const char * description() const override
virtual bool undo(EditMap &map) override
virtual bool apply(EditMap &map) override
static Action::Ptr create(std::uint8_t i, const core::map::Town &orig, const core::map::Town &town)
virtual bool apply(EditMap &map) override
virtual bool undo(EditMap &map) override
virtual const char * description() const override
virtual bool undo(EditMap &map) override
static Action::Ptr create(std::uint8_t i, const core::map::Town &orig)
virtual bool apply(EditMap &map) override
virtual const char * description() const override
virtual const char * description() const override
virtual bool apply(EditMap &map) override
static Action::Ptr create(const sf::Vector2i &pos, std::uint8_t id, std::uint8_t orig)
virtual bool undo(EditMap &map) override
virtual const char * description() const override
virtual bool undo(EditMap &map) override
virtual bool apply(EditMap &map) override
static Action::Ptr create(const sf::IntRect &area, std::uint8_t id, EditMap &map)
virtual bool undo(EditMap &map) override
virtual const char * description() const override
virtual bool apply(EditMap &map) override
static Action::Ptr create(const sf::Vector2i &pos, std::uint8_t id, EditMap &map)
static Action::Ptr create(const sf::Vector2i &pos, core::map::LevelTransition lt, core::map::LevelTransition orig)
virtual const char * description() const override
virtual bool apply(EditMap &map) override
virtual bool undo(EditMap &map) override
virtual bool apply(EditMap &map) override
virtual const char * description() const override
static Action::Ptr create(const sf::IntRect &area, core::map::LevelTransition id, EditMap &map)
virtual bool undo(EditMap &map) override