full implementation!
bug: level generation will generate nullptrs
This commit is contained in:
49
src/game.cc
49
src/game.cc
@ -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};
|
||||
|
Reference in New Issue
Block a user