#pragma once #include "interfaces/cell_helper.hpp" #include "interfaces/cursor.hpp" #include "interfaces/game.hpp" #include "interfaces/generation_tracker.hpp" #include "interfaces/input.hpp" #include "interfaces/matrix.hpp" #include "interfaces/scene.hpp" #include "interfaces/status_manager.hpp" #include "engine/data/vector2.hpp" #include #include #include #include constexpr auto GENERATION_UPDATE_SPEED_MILLIS = 1000; class Game : public IGame { public: Game( std::shared_ptr scene, std::shared_ptr cursor_controller, std::shared_ptr generation_tracker, std::shared_ptr status_manager, std::shared_ptr user_input_observer, std::shared_ptr cell_helper) noexcept; void on_start() noexcept override; void on_update() noexcept override; void on_exit() const noexcept override; private: std::shared_ptr _scene; std::shared_ptr _cursor_controller; std::shared_ptr _generation_tracker; std::shared_ptr _status_manager; std::shared_ptr _user_input_observer; std::shared_ptr _cell_helper; using TimePoint = std::chrono::system_clock::time_point; TimePoint _last_update_time; TimePoint _last_gen_update_time; std::list _living_cell_positions; void _move_cursor(const Vector2 &direction) noexcept; void _set_space( const std::shared_ptr> &matrix, const Vector2 &position, char character) noexcept; };