diff --git a/src/enemy.cc b/src/enemy.cc index 45b64ae..db4aa83 100644 --- a/src/enemy.cc +++ b/src/enemy.cc @@ -86,7 +86,7 @@ long_result enemy_base::get_hit(character *ch, const int tATK, return {miss, "PC tried to hit " + abbrev + " but missed. "}; } -void enemy_base::dies(level *lvl, character *pc) { +int enemy_base::dies(level *lvl) { auto &elist = lvl->get_elist(); for (size_t i = 0; i < elist.size(); ++i) @@ -96,17 +96,19 @@ void enemy_base::dies(level *lvl, character *pc) { } if (race == race::rdragon) { - return; + return 0; } else if (race == race::rmerchant) { lvl->add_gold({GOLD_MERCHANT, pos}); + return 0; } else if (race == race::rhuman) { lvl->add_gold({GOLD_NORMAL, pos}); auto plist = lvl->get_available_around_all(pos); lvl->add_gold({GOLD_NORMAL, rng->get_rand_in_vector(plist)}); + return 0; } - ((player_base *)pc)->add_gold(rand_gold_drop(rng)); + return rand_gold_drop(rng); } enemy_base *get_enemy_at(const position &pos, const enemy_list &elist) { diff --git a/src/enemy.h b/src/enemy.h index e43fd32..aed9034 100644 --- a/src/enemy.h +++ b/src/enemy.h @@ -26,7 +26,7 @@ public: virtual std::string get_abbrev() const override; - virtual void dies(level *lvl, character *pc); + virtual int dies(level *lvl); }; typedef std::vector enemy_list; diff --git a/src/game.cc b/src/game.cc index c21fe7a..3e85c79 100644 --- a/src/game.cc +++ b/src/game.cc @@ -73,8 +73,12 @@ character *game::move_enemies() { if (player->is_dead()) return ch; - if (ch->is_dead()) - ch->dies(levels[curr_level].get(), player.get()); + if (ch->is_dead()) { + int g = ch->dies(levels[curr_level].get()); + + if (g) + levels[curr_level]->add_gold({g, ch->get_pos()}); + } msg += res.msg; } diff --git a/src/level.cc b/src/level.cc index 6f66f5a..a50b357 100644 --- a/src/level.cc +++ b/src/level.cc @@ -67,9 +67,16 @@ void level::gen_enemies(RNG *rng, std::vector &tiles) { } pelist.push_back(nullptr); - new_dragon(rng, pelist[i], rng->get_rand_in_vector(spots), + auto pos = rng->get_rand_in_vector(spots); + new_dragon(rng, pelist[i], pos, dhoard[i].pos, enabled_features, map.which_room(dhoard[i].pos)); + int room = map.which_room(pos); + remove_from_list(tiles[room], pos); + + if (!tiles[room].size()) + tiles.erase(tiles.begin() + room); + elist.push_back(pelist[i].get()); } diff --git a/src/player.cc b/src/player.cc index d897e6e..9a40167 100644 --- a/src/player.cc +++ b/src/player.cc @@ -66,8 +66,14 @@ long_result player_base::move(level *lvl, } else if ((tmp = get_enemy_at(p, lvl->get_elist())) != nullptr) { auto res = attack((character *)tmp); - if (tmp->is_dead()) - tmp->dies(lvl, this); + if (tmp->is_dead()) { + int g = tmp->dies(lvl); + + if (g) + res.msg += "PC gains " + + std::to_string(g) + + " pieces of gold. "; + } return res; } @@ -121,6 +127,11 @@ long_result player_base::interpret_command(level *lvl, game_command cmd) { gold g = get_gold_at(pos, lvl->get_glist()); gold_cnt += g.amount; + + if (g.amount) + res.msg += "PC picked up " + std::to_string(g.amount) + + " pieces of gold. "; + return res; } else if (cmd >= apply_north && cmd <= apply_southwest) { auto res = apply(get_potion_at(pos + MOVE[cmd - apply_north], @@ -142,8 +153,14 @@ long_result player_base::interpret_command(level *lvl, game_command cmd) { auto res = attack((character *)tmp); - if (tmp != nullptr && tmp->is_dead()) - tmp->dies(lvl, this); + if (tmp != nullptr && tmp->is_dead()) { + int g = tmp->dies(lvl); + + if (g) + res.msg += "PC gains " + + std::to_string(g) + + " pieces of gold. "; + } return res; } else if (cmd == up_stairs) {