#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); const sf::Color Black = sf::Color( 0, 0, 0); } 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; coordinate height_shift; public: Cell(coordinate cell_row = 0, coordinate cell_col = 0, const sf::Color &color = palette::White); virtual ~Cell() override; sf::Color color() const noexcept; /// "shift_by_y" indicates the height of current cell /// Height is a shift of y coordinate on the scene, relatively to the ground (which is 0) void setHeightShift(coordinate shift_by_y); coordinate heightShift() const; /// Determine if Hero can move onto this cell or not virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) = 0; virtual CellPtr getDefaultInstance() const = 0; }; /////////////////////////////////////// /// Any cell where Hero is free to move class PassableCell final : 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; virtual CellPtr getDefaultInstance() const override; }; /////////////////////////////////////// /// A cell which requires Hero to spend a charge for bridge to move on class WaterCell final : 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; virtual CellPtr getDefaultInstance() const override; }; /////////////////////////////////////// /// A cell which is impossible to move on class WallCell final : 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; virtual CellPtr getDefaultInstance() const override; }; /////////////////////////////////////// /// A cell which gives hero a charge class ChargeCell final : 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; virtual CellPtr getDefaultInstance() const override; }; /////////////////////////////////////// /// A cell which moves hero to next level class ExitCell final : 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; virtual CellPtr getDefaultInstance() const override; }; /////////////////////////////////////// /// A cell which teleports hero to following coordinates class TeleportCell final : public Cell { private: coordinate new_row, new_col; 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; void setDestination(coordinate new_cell_row, coordinate new_cell_col); virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override; virtual CellPtr getDefaultInstance() const override; }; /////////////////////////////////////// /// A cell which replaces and changes other map cells when activated class TriggerCell final : 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; virtual CellPtr getDefaultInstance() const override; }; #endif // CELL_H