#ifndef CELL_H #define CELL_H #include #include #include #include "entity.h" namespace palette { const sf::Color Brown = sf::Color(165, 42, 42); const sf::Color White = sf::Color(255, 255, 255); const sf::Color Blue = sf::Color( 0, 255, 255); const sf::Color Gray = sf::Color(125, 125, 125); const sf::Color Green = sf::Color( 0, 255, 0); const sf::Color Red = sf::Color(250, 0, 0); const sf::Color Purple = sf::Color(128, 0, 128); const sf::Color Pink = sf::Color(255, 192, 203); } enum CELL_TYPES { PASSABLE_CELL = 0, WATER_CELL, WALL_CELL, CHARGE_CELL, EXIT_CELL, TELEPORT_CELL, TRIGGER_CELL, N_CELLS }; /////////////////////////////////////// class Hero; class Level; class Cell; using HeroPtr = std::unique_ptr; using LevelPtr = std::unique_ptr; using CellPtr = std::unique_ptr /////////////////////////////////////// /// Represents interface for all level cells class Cell : public Entity { protected: sf::Color cell_color; public: Cell(coordinate cell_row = 0, coordinate cell_col = 0, const sf::Color &color = palette::White); virtual ~Cell() override; sf::Color color() const noexcept; /// Determine if Hero can move onto this cell or not virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) = 0; }; /////////////////////////////////////// /// Any cell where Hero is free to move class PassableCell : public Cell { public: PassableCell(coordinate cell_row = 0, coordinate cell_col = 0, const sf::Color &color = palette::Brown); virtual ~PassableCell() override; virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override; }; /////////////////////////////////////// /// A cell which requires Hero to spend a charge for bridge to move on class WaterCell : public Cell { public: WaterCell(coordinate cell_row = 0, coordinate cell_col = 0, const sf::Color &color = palette::Blue); virtual ~WaterCell() override; virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override; }; /////////////////////////////////////// /// A cell which is impossible to move on class WallCell : public Cell { public: WallCell(coordinate cell_row = 0, coordinate cell_col = 0, const sf::Color &color = palette::Gray); virtual ~WallCell() override; virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override; }; /////////////////////////////////////// /// A cell which gives hero a charge class ChargeCell : public Cell { private: int cell_charges; public: ChargeCell(coordinate cell_row = 0, coordinate cell_col = 0, int has_charges = 1, const sf::Color &color = palette::Green); virtual ~ChargeCell() override; virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override; }; /////////////////////////////////////// /// A cell which moves hero to next level class ExitCell : public Cell { public: ExitCell(coordinate cell_row = 0, coordinate cell_col = 0, const sf::Color &color = palette::Red); virtual ~ExitCell() override; virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override; }; /////////////////////////////////////// /// A cell which teleports hero to following coordinates class TeleportCell : public Cell { private: coordinate new_x, new_y; public: TeleportCell(coordinate cell_row = 0, coordinate cell_col = 0, coordinate new_cell_row = 0, coordinate new_cell_col = 0, const sf::Color &color = palette::Purple); virtual ~TeleportCell() override; 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(//std::vector &&cells_to_change, coordinate cell_row = 0, coordinate cell_col = 0, const sf::Color &color = palette::Pink); virtual ~TriggerCell() override; virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override; }; #endif // CELL_H