full implementation!

bug: level generation will generate nullptrs
This commit is contained in:
2024-07-15 00:09:14 -04:00
parent c3b974c83c
commit 6768d73d16
13 changed files with 407 additions and 46 deletions

View File

@ -46,9 +46,9 @@ bool compare_characters(const character *a, const character *b) {
return a->get_pos() < b->get_pos();
}
void game::move_enemies() {
character *game::move_enemies() {
if (the_world)
return;
return nullptr;
auto enemies = levels[curr_level]->get_elist();
std::sort(enemies.begin(), enemies.end(), ::compare_characters);
@ -62,16 +62,18 @@ void game::move_enemies() {
ch->act(levels[curr_level].get(), player.get(), hostile);
if (player->is_dead())
return;
return ch;
if (ch->is_dead())
ch->dies(levels[curr_level].get(), player.get());
msg += res.msg;
}
return nullptr;
}
game_status game::run() {
game_result game::run() {
player->start_turn();
auto res = player->interpret_command(levels[curr_level].get(),
in->get_command());
@ -79,28 +81,40 @@ game_status game::run() {
switch (res.res) {
case result::terminate:
return terminated;
return {terminated, ""};
case result::died:
return game_status::dead;
return {dead, "You died: killed by your own stupidity!"};
case result::go_down: {
if (curr_level == max_level - 1)
return game_status::won;
return {won, "You won! You collected " +
std::to_string(player->get_gold()) +
" after " + std::to_string(curr_turn + 1) +
" turns!"};
player->discard_level_effects();
++curr_level;
new_level();
break;
}
case result::go_up: {
if (curr_level == 0)
return game_status::escaped;
return {escaped, "You escaped the dungeon with " +
std::to_string(player->get_gold()) +
" after " + std::to_string(curr_turn + 1) +
" turns! Coward!"};
player->discard_level_effects();
--curr_level;
player->set_pos(levels[curr_level]->get_down_stairs());
break;
}
@ -109,13 +123,13 @@ game_status game::run() {
break;
case restart_game:
return restart;
return {restart, ""};
case unknown:
case fine:
case applied_nothing:
++curr_turn;
return game_status::in_game;
return {in_game, ""};
default:
break;
@ -125,15 +139,20 @@ game_status game::run() {
player->calc_effects();
if (player->is_dead())
return game_status::dead;
return {dead, "You died: killed by your own stupidity!"};
move_enemies();
auto killer = move_enemies();
if (player->is_dead())
return game_status::dead;
if (player->is_dead()) {
if (killer == nullptr)
return {dead, "You died: killed by your own stupidity!"};
return {dead, (std::string)"You died: killed by a(n) " +
killer->get_race_name()};
}
++curr_turn;
return game_status::in_game;
return {in_game, ""};
}
const position STATUS_RACE{0, 25};