diff options
Diffstat (limited to 'src/game/game.hpp')
-rw-r--r-- | src/game/game.hpp | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/src/game/game.hpp b/src/game/game.hpp index 8363c4d..a35c0ce 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -14,14 +14,41 @@ #include <chrono> #include <cstddef> +#include <functional> #include <list> #include <memory> +#include <optional> +#include <string> +#include <string_view> +#include <vector> constexpr auto DEFAULT_MIN_TIME_SINCE_LAST_GEN_MILLIS = 200; constexpr auto MIN_TIME_SINCE_LAST_GEN_INCREMENT = 50; constexpr auto MIN_TIME_SINCE_LAST_GEN_DECREMENT = 50; +constexpr auto CURSOR_FALLBACK_POS_X = 10; +constexpr auto CURSOR_FALLBACK_POS_Y = 10; + +constexpr std::string_view ERASE_ENTIRE_LINE = "{esc}[2K"; +constexpr std::string_view ERASE_LINE_FROM_CURSOR = "{esc}[0K"; + +enum Mode +{ + NORMAL, + COMMAND +}; + +class CommandInfo +{ +public: + using Options = const std::vector<std::string> &; + using CommandFunction = std::function<void(Options)>; + + std::size_t option_cnt; + CommandFunction function; +}; + class Game : public IGame { public: @@ -50,19 +77,38 @@ private: std::shared_ptr<IUserInputObserver> _user_input_observer; std::shared_ptr<ICellHelper> _cell_helper; - using TimePoint = std::chrono::system_clock::time_point; + Mode _current_mode; - TimePoint _last_update_time; - TimePoint _last_gen_update_time; + std::optional<Vector2> _last_pos_before_command_mode; + + std::string _command_mode_input; + + std::unordered_map<std::string, CommandInfo> _commands; + + std::chrono::system_clock::time_point _last_gen_update_time; int32_t _min_time_since_last_gen_millis = DEFAULT_MIN_TIME_SINCE_LAST_GEN_MILLIS; std::list<Vector2> _living_cell_positions; + void _on_normal_mode_update() noexcept; + + void _on_command_mode_update() noexcept; + + void _return_to_normal_mode() noexcept; + + void _run_command(const std::string &command) noexcept; + + void _show_command_error(const std::string_view &error_message) noexcept; + auto _move_cursor(const Vector2 &direction) noexcept -> bool; void _set_space( const std::shared_ptr<IMatrix<IScene::MatrixElement>> &matrix, const Vector2 &position, char character) noexcept; + + static void _erase_entire_line() noexcept; + + static void _erase_line_from_cursor() noexcept; }; |