fixed: enemies may spawn on top of dragons
added prompting to picking up gold
This commit is contained in:
@ -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) {
|
||||
|
@ -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_base *> enemy_list;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -67,9 +67,16 @@ void level::gen_enemies(RNG *rng, std::vector<position_list> &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());
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
Reference in New Issue
Block a user