diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bootstrap.cpp | 7 | ||||
-rw-r--r-- | src/engine/engine.cpp | 41 | ||||
-rw-r--r-- | src/game/game.cpp | 63 | ||||
-rw-r--r-- | src/game/game.hpp | 20 | ||||
-rw-r--r-- | src/interfaces/game.hpp | 12 |
5 files changed, 81 insertions, 62 deletions
diff --git a/src/bootstrap.cpp b/src/bootstrap.cpp index 0ef0584..713991d 100644 --- a/src/bootstrap.cpp +++ b/src/bootstrap.cpp @@ -36,16 +36,17 @@ Container bootstrap() noexcept auto container = Container(); container.bind<IArgumentParser>().to<ArgumentParser>(); - container.bind<IGame>().to<Game>(); container.bind<IInputHandler>().to<InputHandler>(); container.bind<ICursorController>().to<CursorController>(); container.bind<ICLIGameEngine>().to<CLIGameEngine>(); container.bind<IWindow>().to<Window>(); container.bind<IGameFactory>().to_factory(normalize_lambda( - [&container]() + [](const std::shared_ptr<IWindow> &window, const std::shared_ptr<IScene> &scene, + const std::shared_ptr<ICursorController> &cursor_controller) { - return container.get<IGame>(); + return std::dynamic_pointer_cast<IGame>( + std::make_shared<Game>(window, scene, cursor_controller)); })); container.bind<IRandomNumberGeneratorFactory>().to_factory( diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index b2add9c..db3ffb7 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1,10 +1,7 @@ #include "engine.hpp" -#include "strings.hpp" #include "util/function.hpp" -#include <fmt/core.h> -#include <iostream> #include <utility> CLIGameEngine::CLIGameEngine(IGameFactory game_factory, ISceneFactory scene_factory, @@ -13,9 +10,9 @@ CLIGameEngine::CLIGameEngine(IGameFactory game_factory, ISceneFactory scene_fact std::shared_ptr<IWindow> 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)) + _input_handler(std::move(std::move(input_handler))), + _cursor_controller(std::move(std::move(cursor_controller))), + _window(std::move(std::move(window))) { } @@ -26,44 +23,22 @@ void CLIGameEngine::start() noexcept scene->enter(); _input_handler->enter_raw_mode(); - const auto window_size = _window->size(); + auto game = _game_factory(_window, scene, _cursor_controller); - const auto center_position = - Vector2({.x = static_cast<Vector2::Value>(window_size.get_width()) / 2, - .y = static_cast<Vector2::Value>(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()))); + game->on_start(); std::atexit(normalize_lambda( - [this, scene]() + [this, scene, game]() { scene->leave(); _input_handler->leave_raw_mode(); - for (auto row : *scene->get_matrix()) - { - for (auto &col : row) - { - fmt::print("{}", col); - } - - fmt::print("\n"); - } - - std::cout.flush(); + game->on_exit(); })); - auto game = _game_factory(); - - _configure_input(game->get_input_config(_window, scene, _cursor_controller)); + _configure_input(game->get_input_config()); _input_handler->listen(); - - game->run(); } void CLIGameEngine::_configure_input( diff --git a/src/game/game.cpp b/src/game/game.cpp index 45e6a79..5df3935 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -3,21 +3,58 @@ #include "commands/insert_cell.hpp" #include "commands/move_cursor.hpp" #include "commands/quit.hpp" +#include "strings.hpp" -void Game::run() noexcept {} +#include <fmt/core.h> +#include <iostream> -std::unordered_map<char, std::shared_ptr<ICommand>> Game::get_input_config( - const std::shared_ptr<IWindow> &window, const std::shared_ptr<IScene> &scene, - const std::shared_ptr<ICursorController> &cursor_controller) const noexcept +Game::Game(const std::shared_ptr<IWindow> &window, const std::shared_ptr<IScene> &scene, + const std::shared_ptr<ICursorController> &cursor_controller) noexcept + : _window(window), _scene(scene), _cursor_controller(cursor_controller) +{ +} + +void Game::on_start() noexcept +{ + const auto window_size = _window->size(); + + const auto center_position = + Vector2({.x = static_cast<Vector2::Value>(window_size.get_width()) / 2, + .y = static_cast<Vector2::Value>(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()))); +} + +void Game::on_exit() const noexcept +{ + for (auto row : *_scene->get_matrix()) + { + for (auto &col : row) + { + fmt::print("{}", col); + } + + fmt::print("\n"); + } + + std::cout.flush(); +} + +std::unordered_map<char, std::shared_ptr<ICommand>> +Game::get_input_config() const noexcept { return {{'q', std::make_shared<QuitCommand>()}, - {'i', std::make_shared<InsertCellCommand>(cursor_controller, scene)}, - {'k', std::make_shared<MoveCursorCommand>(Vector2::up(), cursor_controller, - scene, window)}, - {'j', std::make_shared<MoveCursorCommand>(Vector2::down(), cursor_controller, - scene, window)}, - {'h', std::make_shared<MoveCursorCommand>(Vector2::left(), cursor_controller, - scene, window)}, - {'l', std::make_shared<MoveCursorCommand>(Vector2::right(), cursor_controller, - scene, window)}}; + {'i', std::make_shared<InsertCellCommand>(_cursor_controller, _scene)}, + {'k', std::make_shared<MoveCursorCommand>(Vector2::up(), _cursor_controller, + _scene, _window)}, + {'j', std::make_shared<MoveCursorCommand>(Vector2::down(), _cursor_controller, + _scene, _window)}, + {'h', std::make_shared<MoveCursorCommand>(Vector2::left(), _cursor_controller, + _scene, _window)}, + {'l', std::make_shared<MoveCursorCommand>( + Vector2::right(), _cursor_controller, _scene, _window)}}; } diff --git a/src/game/game.hpp b/src/game/game.hpp index 9ec5b41..2493a42 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -1,6 +1,5 @@ #pragma once -#include "DI/auto_wirable.hpp" #include "interfaces/cursor.hpp" #include "interfaces/game.hpp" #include "interfaces/scene.hpp" @@ -8,16 +7,21 @@ #include <memory> -class Game : public IGame, public AutoWirable<IGame, Game> +class Game : public IGame { public: - Game() noexcept = default; + Game(const std::shared_ptr<IWindow> &window, const std::shared_ptr<IScene> &scene, + const std::shared_ptr<ICursorController> &cursor_controller) noexcept; - void run() noexcept override; + void on_start() noexcept override; + + void on_exit() const noexcept override; [[nodiscard]] std::unordered_map<char, std::shared_ptr<ICommand>> - get_input_config(const std::shared_ptr<IWindow> &window, - const std::shared_ptr<IScene> &scene, - const std::shared_ptr<ICursorController> &cursor_controller) - const noexcept override; + get_input_config() const noexcept override; + +private: + const std::shared_ptr<IWindow> &_window; + const std::shared_ptr<IScene> &_scene; + const std::shared_ptr<ICursorController> &_cursor_controller; }; diff --git a/src/interfaces/game.hpp b/src/interfaces/game.hpp index cfff8c5..c99c01f 100644 --- a/src/interfaces/game.hpp +++ b/src/interfaces/game.hpp @@ -13,12 +13,14 @@ class IGame public: virtual ~IGame() = default; - virtual void run() = 0; + virtual void on_start() = 0; + + virtual void on_exit() const noexcept = 0; [[nodiscard]] virtual std::unordered_map<char, std::shared_ptr<ICommand>> - get_input_config( - const std::shared_ptr<IWindow> &window, const std::shared_ptr<IScene> &scene, - const std::shared_ptr<ICursorController> &cursor_controller) const noexcept = 0; + get_input_config() const noexcept = 0; }; -using IGameFactory = std::shared_ptr<IGame> (*)(); +using IGameFactory = std::shared_ptr<IGame> (*)( + const std::shared_ptr<IWindow> &window, const std::shared_ptr<IScene> &scene, + const std::shared_ptr<ICursorController> &cursor_controller); |