diff --git a/demo/demo/grid.cpp b/demo/demo/grid.cpp index cd23691de5e58efbd785e23638e574092e4711de..6d95d62b57bf4fdc3eb03456a0c6197219c30bcc 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 91ffab3e5d6dd42825d8e06919e50b6a2d7447fc..cdea3a74fac908e5367608c7954742074db506e3 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();