#include "cc3k.h" #include "constants.h" CC3K::CC3K(const feature enabled_features, input *in, output *out, RNG *rng): enabled_features{enabled_features}, in{in}, out{out}, rng{rng} { curr_menu = std::make_unique(enabled_features); out->clear(); curr_menu->print(out, rng->get_init_seed()); out->render(); gresult.status = game_status::MAIN_MENU; } game_status CC3K::run() { switch (gresult.status) { case MAIN_MENU: { auto tmp = curr_menu->run(in); if (tmp == -2) { gresult.status = TERMINATED; return TERMINATED; } if (tmp != -1) { curr_menu.reset(); curr_game = std::make_unique(static_cast(tmp), enabled_features, in, out, rng); out->clear(); curr_game->print(); out->render(); gresult.status = IN_GAME; return IN_GAME; } out->clear(); curr_menu->print(out, rng->get_init_seed()); out->render(); return MAIN_MENU; } case IN_GAME: { gresult = curr_game->run(); if (gresult.status == RESTART) { curr_game.reset(); curr_menu = std::make_unique(enabled_features); out->clear(); curr_menu->print(out, rng->get_init_seed()); out->render(); gresult.status = MAIN_MENU; return MAIN_MENU; } else if (gresult.status == IN_GAME) { out->clear(); curr_game->print(); out->render(); return IN_GAME; } else if (gresult.status == TERMINATED) { return TERMINATED; } out->clear(); gresult.print(out); out->render(); return gresult.status; } case DEAD: case WON: case ESCAPED: curr_game.reset(); gresult.run(in); if (gresult.status == RESTART) { curr_menu = std::make_unique(enabled_features); out->clear(); curr_menu->print(out, rng->get_init_seed()); out->render(); gresult.status = MAIN_MENU; return MAIN_MENU; } return TERMINATED; default: break; } return TERMINATED; }