#include "engine.hpp" #include "input_actions.hpp" #include "strings.hpp" #include "util/function.hpp" #include #include #include CLIGameEngine::CLIGameEngine(IGameFactory game_factory, ISceneFactory scene_factory, std::shared_ptr input_handler, std::shared_ptr cursor_controller, std::shared_ptr window) noexcept : _game_factory(game_factory), _scene_factory(scene_factory), _input_handler(std::move(input_handler)), _cursor_controller(std::move(cursor_controller)), _window(std::move(window)) { } void CLIGameEngine::start() noexcept { auto scene = _scene_factory(_cursor_controller, _window); scene->enter(); _input_handler->enter_raw_mode(); const auto window_size = _window->size(); const auto center_position = Vector2({.x = static_cast(window_size.get_width()) / 2, .y = static_cast(window_size.get_height()) / 2}); _cursor_controller->move_to(center_position); scene->write_status(fmt::format(STATUS_BAR_COORDINATES, fmt::arg("x", center_position.get_x()), fmt::arg("y", center_position.get_y()))); std::atexit(normalize_lambda( [scene, this]() { scene->leave(); _input_handler->leave_raw_mode(); })); const std::unordered_map input_config = { {'q', InputActions::exit_success}, {'k', InputActions::move_cursor(Vector2::up(), _cursor_controller, scene, _window)}, {'j', InputActions::move_cursor(Vector2::down(), _cursor_controller, scene, _window)}, {'h', InputActions::move_cursor(Vector2::left(), _cursor_controller, scene, _window)}, {'l', InputActions::move_cursor(Vector2::right(), _cursor_controller, scene, _window)}}; _configure_input(input_config); _input_handler->listen(); auto game = _game_factory(); game->run(); } void CLIGameEngine::_configure_input( const std::unordered_map &input_config) { for (const auto &config_pair : input_config) { _input_handler->attach(config_pair.first, config_pair.second); } }