aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2022-03-08 16:26:17 +0100
committerHampusM <hampus@hampusmat.com>2022-06-13 17:56:55 +0200
commit9dd5936333082305b0b9680db2eac9abd128129b (patch)
treec99bff09a066bde806a520058347b549ed287a9f /src
parent3a24ec6e5b5236ad6b943548b9948603e053559d (diff)
refactor: add game factory
Diffstat (limited to 'src')
-rw-r--r--src/bootstrap.cpp8
-rw-r--r--src/engine/game_initializer.cpp8
-rw-r--r--src/engine/game_initializer.hpp10
-rw-r--r--src/interfaces/game.hpp4
4 files changed, 22 insertions, 8 deletions
diff --git a/src/bootstrap.cpp b/src/bootstrap.cpp
index ddeba4d..610945f 100644
--- a/src/bootstrap.cpp
+++ b/src/bootstrap.cpp
@@ -24,6 +24,8 @@
#include "randomization/generator.hpp"
#include "randomization/seed_generator.hpp"
+#include "util/function.hpp"
+
#include <memory>
#include <random>
#include <string_view>
@@ -40,6 +42,12 @@ Container bootstrap()
container.bind<IGameInitializer>().to<GameInitializer>();
container.bind<IInputConfigurator>().to<InputConfigurator>();
+ container.bind<IGameFactory>().to_factory(normalize_lambda(
+ [&container]()
+ {
+ return container.get<IGame>();
+ }));
+
container.bind<IRandomNumberGeneratorFactory>().to_factory(
[](const uint32_t &seed)
{
diff --git a/src/engine/game_initializer.cpp b/src/engine/game_initializer.cpp
index 52e109a..13d9ba0 100644
--- a/src/engine/game_initializer.cpp
+++ b/src/engine/game_initializer.cpp
@@ -7,10 +7,10 @@
GameInitializer::GameInitializer(std::shared_ptr<IScene> scene,
std::shared_ptr<IInputHandler> input_handler,
- std::shared_ptr<IGame> game)
+ IGameFactory game_factory)
: _scene(std::move(scene)),
_input_handler(std::move(input_handler)),
- _game(std::move(game))
+ _game_factory(game_factory)
{
}
@@ -26,5 +26,7 @@ void GameInitializer::initialize()
_input_handler->leave_raw_mode();
}));
- _game->run(*_scene, *_input_handler);
+ auto game = _game_factory();
+
+ game->run(*_scene, *_input_handler);
}
diff --git a/src/engine/game_initializer.hpp b/src/engine/game_initializer.hpp
index 12b42de..2f63e0f 100644
--- a/src/engine/game_initializer.hpp
+++ b/src/engine/game_initializer.hpp
@@ -8,19 +8,19 @@
#include <memory>
-class GameInitializer
- : public IGameInitializer,
- public AutoWirable<IGameInitializer, GameInitializer, IScene, IInputHandler, IGame>
+class GameInitializer : public IGameInitializer,
+ public AutoWirable<IGameInitializer, GameInitializer, IScene,
+ IInputHandler, IGameFactory>
{
public:
GameInitializer(std::shared_ptr<IScene> scene,
std::shared_ptr<IInputHandler> input_handler,
- std::shared_ptr<IGame> game);
+ IGameFactory game_factory);
void initialize() override;
private:
std::shared_ptr<IScene> _scene;
std::shared_ptr<IInputHandler> _input_handler;
- std::shared_ptr<IGame> _game;
+ IGameFactory _game_factory;
};
diff --git a/src/interfaces/game.hpp b/src/interfaces/game.hpp
index eb13dc3..85c20e5 100644
--- a/src/interfaces/game.hpp
+++ b/src/interfaces/game.hpp
@@ -3,6 +3,8 @@
#include "interfaces/input.hpp"
#include "interfaces/scene.hpp"
+#include <memory>
+
class IGame
{
public:
@@ -10,3 +12,5 @@ public:
virtual void run(IScene &scene, IInputHandler &input_handler) = 0;
};
+
+using IGameFactory = std::shared_ptr<IGame> (*)();