added option to read level data from file

This commit is contained in:
2024-07-21 00:42:10 -04:00
parent 25477c2cf8
commit 401b5b00b5
14 changed files with 366 additions and 58 deletions

View File

@ -19,13 +19,13 @@ level::level(character *player, RNG *rng, const feature enabled_features):
gen_potions(rng, tiles);
gen_gold(rng, tiles);
gen_enemies(rng, tiles);
gen_enemies({}, rng, tiles);
}
level::level(const std::string &map_data, character *player, RNG *rng,
level::level(const level_data &lvl, character *player, RNG *rng,
const feature enabled_features):
enabled_features{enabled_features},
map{player, map_data, rng, enabled_features}, player{player} {
map{lvl, player, rng, enabled_features}, player{player} {
auto tiles = map.get_room_list();
for (size_t i = 0; i < tiles.size(); ++i)
@ -38,23 +38,63 @@ level::level(const std::string &map_data, character *player, RNG *rng,
for (size_t i = 0; i < tiles.size(); ++i)
remove_from_list(tiles[i], map.get_up_stairs());
if (enabled_features & FEATURE_READ_MAP)
fill(lvl, tiles, rng);
gen_potions(rng, tiles);
gen_gold(rng, tiles);
gen_enemies(rng, tiles);
gen_enemies(lvl, rng, tiles);
}
gold_list level::dragon_hoard() {
void level::fill(const level_data &lvl, std::vector<position_list> &tiles,
RNG *rng) {
for (auto [type, pos] : lvl.enemies) {
for (size_t i = 0; i < tiles.size(); ++i)
remove_from_list(tiles[i], pos);
pelist.push_back(new_enemy(type, pos, enabled_features,
map.which_room(pos), rng));
elist.push_back(pelist[pelist.size() - 1].get());
}
for (auto [type, pos] : lvl.potions) {
for (size_t i = 0; i < tiles.size(); ++i)
remove_from_list(tiles[i], pos);
pplist.push_back(new_potion(type, pos));
plist.push_back(pplist[pplist.size() - 1].get());
}
for (auto g : lvl.gold_piles) {
for (size_t i = 0; i < tiles.size(); ++i)
remove_from_list(tiles[i], g.get_pos());
glist.push_back(g);
}
}
gold_list level::dragon_hoard(const level_data &lvl) {
gold_list result;
for (auto g : glist)
if (g.get_amount() == GOLD_DRAGON)
if (g.get_amount() == GOLD_DRAGON &&
!is_in_glist(g, lvl.gold_piles))
result.push_back(g);
return result;
}
void level::gen_enemies(RNG *rng, std::vector<position_list> &tiles) {
auto dhoard = dragon_hoard();
bool level::is_in_glist(gold &g, const gold_list &gl) {
for (auto tmp : gl)
if (tmp.get_pos() == g.get_pos())
return true;
return false;
}
void level::gen_enemies(const level_data &lvl, RNG *rng,
std::vector<position_list> &tiles) {
auto dhoard = dragon_hoard(lvl);
int cnt = enabled_features & FEATURE_EXTRA_STUFF ?
rng->rand_between(MIN_ENEMIE_CNT, MAX_ENEMIE_CNT + 1) :
MIN_ENEMIE_CNT + dhoard.size();
@ -87,7 +127,7 @@ void level::gen_enemies(RNG *rng, std::vector<position_list> &tiles) {
}
for (int i = dhoard.size(); i < cnt; ++i) {
for (int i = elist.size(); i < cnt; ++i) {
auto p = get_rand_pos(rng, tiles);
pelist.push_back(new_enemy(rng, p, enabled_features,
map.which_room(p)));
@ -116,7 +156,7 @@ void level::add_gold(gold g) {
void level::gen_gold(RNG *rng, std::vector<position_list> &tiles) {
glist.reserve(GOLD_CNT);
for (int i = 0; i < GOLD_CNT; ++i)
for (int i = glist.size(); i < GOLD_CNT; ++i)
glist.push_back(gold{get_rand_pos(rng, tiles), rand_gold_pile(rng)});
}
@ -135,7 +175,7 @@ void level::gen_potions(RNG *rng, std::vector<position_list> &tiles) {
plist.reserve(cnt);
pplist.reserve(cnt);
for (int i = 0; i < cnt; ++i) {
for (int i = pplist.size(); i < cnt; ++i) {
pplist.push_back(new_potion(static_cast<potion_type>
(rng->rand_under(max_type)),
get_rand_pos(rng, tiles)));