diff --git a/Makefile b/Makefile index 1040bdd..23d1527 100644 --- a/Makefile +++ b/Makefile @@ -12,8 +12,8 @@ build: patch config: powershell "cp tarpit_sample.json .tarpit.json" -test: - meson test -C builddir --suite turings_tarpit +test: build + ./builddir/runtests # make an install for real maybe copy dll and .exe to dir and zip? install: build test diff --git a/builder.cpp b/builder.cpp index 69514aa..266e036 100644 --- a/builder.cpp +++ b/builder.cpp @@ -83,7 +83,7 @@ void Builder::building(BuildEvent ev) { gui.build_works(); } else { game.event(GameEvent::BUILD_FAILED); - gui.build_failed(true, build_cmd); + gui.build_failed(!game.is_dead(), build_cmd); } build_out = NULL; diff --git a/game_engine.cpp b/game_engine.cpp index 460b2a5..309ab5a 100644 --- a/game_engine.cpp +++ b/game_engine.cpp @@ -25,10 +25,8 @@ int GameEngine::determine_damage(string &type) { } void GameEngine::reset() { - rounds = 0; streak = 0; hit_points = starting_hp; - hits_taken = 0; } bool GameEngine::hit(string &type) { @@ -83,8 +81,15 @@ void GameEngine::in_round(GameEvent ev, string &hit_type) { } void GameEngine::dead(GameEvent ev) { - reset(); - state(GameState::IDLE); + if(ev == GameEvent::BUILD_DONE) { + reset(); + state(GameState::FAILURE); + failure(ev); + } else if(ev == GameEvent::HIT) { + ++hits_taken; + } else { + state(GameState::DEAD); + } } void GameEngine::success(GameEvent ev) { diff --git a/game_engine.hpp b/game_engine.hpp index 2dc342e..e02a534 100644 --- a/game_engine.hpp +++ b/game_engine.hpp @@ -52,13 +52,18 @@ class GameEngine : DeadSimpleFSM { } } + void event(GameEvent ev, const char *hit_type) { + string ht{hit_type}; + event(ev, ht); + } + void event(GameEvent ev) { switch(_state) { - FSM_STATE(GameState::START, start, ev); - FSM_STATE(GameState::IDLE, idle, ev); - FSM_STATE(GameState::DEAD, dead, ev); - FSM_STATE(GameState::SUCCESS, success, ev); - FSM_STATE(GameState::FAILURE, failure, ev); + FSM_STATE_LOG(GameState, START, start, ev); + FSM_STATE_LOG(GameState, IDLE, idle, ev); + FSM_STATE_LOG(GameState, DEAD, dead, ev); + FSM_STATE_LOG(GameState, SUCCESS, success, ev); + FSM_STATE_LOG(GameState, FAILURE, failure, ev); case GameState::IN_ROUND: { string hit_type = ""; in_round(ev, hit_type); @@ -67,7 +72,6 @@ class GameEngine : DeadSimpleFSM { } } - // FSM to replace the others void start(GameEvent ev); void idle(GameEvent ev); void in_round(GameEvent ev, string &hit_type); @@ -75,7 +79,6 @@ class GameEngine : DeadSimpleFSM { void success(GameEvent ev); void failure(GameEvent ev); - // current API that will die void heal(); bool hit(string &type); void reset(); diff --git a/status.txt b/status.txt index 0849661..1023b4f 100644 --- a/status.txt +++ b/status.txt @@ -4,7 +4,6 @@ BUGS: * BUG: Log doesn't scroll. -* BUG: plays two sounds on death. TODO: * Rewrite dbc.hpp to actually work. diff --git a/tests/game_engine.cpp b/tests/game_engine.cpp index 9329903..bd9b7ec 100644 --- a/tests/game_engine.cpp +++ b/tests/game_engine.cpp @@ -4,13 +4,38 @@ using namespace fmt; -TEST_CASE("game engine can start and take hit", "[game_engine]") { +TEST_CASE("game engine death cycle", "[game_engine]") { // test fails on purpose right now GameEngine game{4}; - REQUIRE(!game.is_dead() == true); + + for(int i = 0; i < 4; i++) { + game.event(GameEvent::BUILD_START); + REQUIRE(game.hit_points == 4); + // confirm streaks, hit_taken, rounds are maintained + REQUIRE(game.streak == 0); + REQUIRE(game.rounds == i); + + game.event(GameEvent::HIT, "error"); + REQUIRE(game.hit_points == 0); + + // in dead state these are ignored + game.event(GameEvent::HIT); + game.event(GameEvent::HIT); + game.event(GameEvent::HIT); + game.event(GameEvent::HIT); + REQUIRE(game.hit_points == 0); + REQUIRE(game.is_dead() == true); + + // this is ignored too for now + game.event(GameEvent::BUILD_FAILED); + REQUIRE(game.hits_taken == 5); + REQUIRE(game.hit_points == 0); + REQUIRE(game.is_dead() == true); + game.event(GameEvent::BUILD_DONE); + } } -TEST_CASE("", "[game_engine]") { +TEST_CASE("game can do success build", "[game_engine]") { // test fails on purpose right now GameEngine game{100}; REQUIRE(game.is_dead() == false);