From d2237aa606bde88e2130a6164c2857eb8e578fd9 Mon Sep 17 00:00:00 2001
From: Joseph Walton-Rivers <joseph@walton-rivers.uk>
Date: Sun, 4 Sep 2022 00:33:44 +0100
Subject: [PATCH] add reset system to robot puzzle

---
 demo/demo/grid.cpp    | 28 +++++++++++++++++++++++++++-
 demo/include/grid.hpp |  7 +++++++
 2 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/demo/demo/grid.cpp b/demo/demo/grid.cpp
index cd23691..6d95d62 100644
--- a/demo/demo/grid.cpp
+++ b/demo/demo/grid.cpp
@@ -92,9 +92,12 @@ namespace demo {
 		{
 			player = manager.create();
 			auto& cellPos = manager.add<CellPos>(player);
+			auto& robotState = manager.add<RobotState>(player);
 			cellPos.pos = {5,5};
 			cellPos.direction = 1;
+			robotState.power = 32;
 		}
+
 		return player;
 	}
 
@@ -160,6 +163,8 @@ namespace demo {
 		// create the grid world
 		m_grid = std::make_unique<DemoGrid>(m_tiles);
 		m_player = build_test_env(m_grid.get());
+
+		resetPuzzle();
 	}
 
 	void GridScene::deactivate() {
@@ -267,8 +272,15 @@ namespace demo {
 			return;
 		}
 
-		auto &manager = m_grid->entities();
 		if ( m_program.m_currInstruction < m_program.m_instructions.size() ) {
+			auto& robotState = m_grid->entities().get<RobotState>(m_player);
+			if (robotState.power == 0) {
+				// a looser is you
+				resetPuzzle();
+				return;
+			}
+
+			robotState.power--;
 			m_program.m_instructions[ m_program.m_currInstruction ]();
 			m_program.m_currInstruction++;
 		} else {
@@ -279,6 +291,20 @@ namespace demo {
 		}
 	}
 
+	void GridScene::resetPuzzle() {
+		auto& robotPos = m_grid->entities().get<CellPos>(m_player);
+		auto& robotState = m_grid->entities().get<RobotState>(m_player);
+
+		// reset instruction panel
+		m_program.playing = false;
+		m_program.m_currInstruction = 0;
+
+		// reset robot state
+		robotPos.pos = {5, 5};
+		robotPos.direction = 1;
+		robotState.power = 32;
+	}
+
 	void GridScene::checkVictory() {
 		if ( !m_program.playing ) {
 			auto& botPos = m_grid->entities().get<CellPos>(m_player).pos;
diff --git a/demo/include/grid.hpp b/demo/include/grid.hpp
index 91ffab3..cdea3a7 100644
--- a/demo/include/grid.hpp
+++ b/demo/include/grid.hpp
@@ -50,6 +50,11 @@ namespace demo {
 		bool playing = false;
 	};
 
+	struct RobotState {
+		uint32_t power = 64;
+
+	};
+
 	class GridScene : public fggl::scenes::GameBase {
 		public:
 			explicit GridScene(fggl::App& app);
@@ -67,6 +72,8 @@ namespace demo {
 			fggl::entity::EntityID m_player = fggl::entity::INVALID;
 			Program m_program;
 
+			void resetPuzzle();
+
 			void tickPlayer();
 			void checkVictory();
 
-- 
GitLab