Files
cc3k/src/cc3k.cc
2024-07-20 15:11:13 -04:00

94 lines
3.0 KiB
C++

#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<menu>(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<game>(static_cast<race>(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<menu>(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<menu>(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;
}