aboutsummaryrefslogtreecommitdiff
path: root/src/game/game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/game.cpp')
-rw-r--r--src/game/game.cpp77
1 files changed, 69 insertions, 8 deletions
diff --git a/src/game/game.cpp b/src/game/game.cpp
index 73ab7f5..8d15b86 100644
--- a/src/game/game.cpp
+++ b/src/game/game.cpp
@@ -3,7 +3,10 @@
#include "engine/data/bounds.hpp"
#include "engine/escape.hpp"
#include "engine/keycodes.hpp"
+#include "errors/RLE_reader.hpp"
+#include "errors/io.hpp"
#include "util/algorithm.hpp"
+#include "util/fs.hpp"
#include "util/string.hpp"
#include <fmt/color.h>
@@ -21,7 +24,8 @@ Game::Game(
std::shared_ptr<IGenerationTracker> generation_tracker,
std::shared_ptr<IStatusManager> status_manager,
std::shared_ptr<IUserInputObserver> user_input_observer,
- std::shared_ptr<ICellHelper> cell_helper) noexcept
+ std::shared_ptr<ICellHelper> cell_helper,
+ std::shared_ptr<IRLEReader> rle_reader) noexcept
: _statusline_factory(std::move(statusline_factory)),
_scene(std::move(scene)),
_cursor_controller(std::move(cursor_controller)),
@@ -29,6 +33,7 @@ Game::Game(
_status_manager(std::move(status_manager)),
_user_input_observer(std::move(user_input_observer)),
_cell_helper(std::move(cell_helper)),
+ _rle_reader(std::move(rle_reader)),
_current_mode(Mode::NORMAL),
_minimum_cursor_pos_y(0)
{
@@ -89,18 +94,74 @@ void Game::on_start() noexcept
scene_size.get_width(),
scene_size.get_height()));
- _commands["ping"] = CommandInfo(
- {.option_cnt = 0,
- .function = [this](CommandInfo::Options /*options*/)
+ _commands["open"] = CommandInfo(
+ {.option_cnt = 1U,
+ .function = [this](CommandInfo::Options options)
{
- _erase_entire_line();
+ const auto rle_file_path =
+ expand_path_home(std::filesystem::path(options[0]));
- const auto position = _cursor_controller->where();
+ std::unique_ptr<IMatrix<char>> rle_matrix;
- _cursor_controller->move_to(Vector2({.x = 0, .y = position.get_y()}));
+ try
+ {
+ rle_matrix = _rle_reader->read_RLE_file(rle_file_path);
+ }
+ catch (const InvalidRLEFileError &error)
+ {
+ _show_command_error(fmt::format("Error: {}", error.what()));
+ return;
+ }
+ catch (const IOError &error)
+ {
+ _show_command_error(fmt::format("Error: {}", error.what()));
+ return;
+ }
+
+ if (rle_matrix == nullptr)
+ {
+ _show_command_error(fmt::format(
+ "A unknown error occurred while reading RLE file with path '{}'",
+ rle_file_path.string()));
+ return;
+ }
+
+ _return_to_normal_mode();
+
+ const auto previous_pos = _cursor_controller->where();
+
+ auto scene_matrix = _scene->get_matrix();
+
+ for (auto row : *rle_matrix)
+ {
+ for (auto &col : row)
+ {
+ const auto col_pos = _cursor_controller->where();
+
+ std::cout.put(col);
+
+ _cursor_controller->move_to(col_pos);
+
+ scene_matrix->set(col_pos, col);
+
+ if (!container_has(_living_cell_positions, col_pos))
+ {
+ _living_cell_positions.push_back(col_pos);
+ }
+
+ _cursor_controller->move(Vector2::right(), 1U);
+ }
+
+ fmt::print("\n");
+ const auto current_pos = _cursor_controller->where();
+
+ _cursor_controller->move_to(
+ Vector2({.x = previous_pos.get_x(), .y = current_pos.get_y() - 1}));
+ }
- std::cout << "pong!";
std::cout.flush();
+
+ _cursor_controller->move_to(previous_pos);
}});
}