From 0037de691fd0571875e0fa4c658229a79f8b8b38 Mon Sep 17 00:00:00 2001 From: NaiJi Date: Tue, 3 Mar 2020 19:11:04 +0300 Subject: [PATCH] Add TriggerCell for more in-game fun --- src/cell.cpp | 28 ++++++++++++++++++++++++++++ src/cell.h | 25 +++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/cell.cpp b/src/cell.cpp index 20e80a3..b0b4908 100644 --- a/src/cell.cpp +++ b/src/cell.cpp @@ -131,3 +131,31 @@ bool TeleportCell::onMovingTo(HeroPtr &hero, LevelPtr &level) hero->setPosition(new_x, new_y); return true; } + +/////////////////////////////////////// + +TriggerCell::TriggerCell(coordinate cell_x, coordinate cell_y, const std::vector &cells_to_change, const sf::Color &color) : + Cell(cell_x, cell_y, color) +{ + cells.assign(std::move(cells_to_change)); +} + +TriggerCell::~TriggerCell() +{} + +bool TriggerCell::onMovingTo(HeroPtr &hero, LevelPtr &level) +{ + UNUSED(hero) + + Map &map = level->mapArray(); + + // We replace needed cells with the ones that the trigger provides. + for (const &cell : cells) + map[cell->x()][cell->y()].reset(cell.release()); + + // Trigger works only once. + cells.clear(); + + // It's an impassable object, so player can't move to here. + return false; +} diff --git a/src/cell.h b/src/cell.h index 3d6899f..bc68aef 100644 --- a/src/cell.h +++ b/src/cell.h @@ -8,8 +8,9 @@ class Hero; class Level; -using HeroPtr = std::unique_ptr; -using LevelPtr = std::unique_ptr; +using HeroPtr = std::unique_ptr; +using LevelPtr = std::unique_ptr; +using CellPtr = std::unique_ptr; /////////////////////////////////////// @@ -131,4 +132,24 @@ public: virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override; }; +/////////////////////////////////////// + +/// A cell which replaces and changes other map cells when activated +class TriggerCell : public Cell +{ +private: + // Vector of cells to place on map + std::vector cells; + +public: + TriggerCell(coordinate cell_x = 0, + coordinate cell_y = 0, + const std::vector &cells_to_change = std::vector(), // Pink + const sf::Color &color = sf::Color(255, 192, 203)); + + virtual ~TriggerCell() override; + + virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override; +}; + #endif // CELL_H