added option to read level data from file
This commit is contained in:
62
src/level.cc
62
src/level.cc
@ -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)));
|
||||
|
Reference in New Issue
Block a user