finished the bulk of game

This commit is contained in:
2024-07-14 21:32:41 -04:00
parent b3475b7530
commit af8bc4112c
110 changed files with 1876 additions and 1481 deletions

View File

@ -1,5 +1,7 @@
#include "level.h"
#include "constants.h"
level::level(character *player, RNG *rng, const feature enabled_features):
enabled_features{enabled_features}, map{player, rng, enabled_features},
player{player} {
@ -34,24 +36,29 @@ void level::gen_enemies(RNG *rng, std::vector<position_list> &tiles) {
rng->rand_between(MIN_ENEMIE_CNT, MAX_ENEMIE_CNT + 1) :
MIN_ENEMIE_CNT + dhoard.size();
chlist.reserve(cnt);
pchlist.reserve(cnt);
elist.reserve(cnt);
pelist.reserve(cnt);
for (size_t i = 0; i < dhoard.size(); ++i) {
auto spots = get_available_around(dhoard[i].pos);
pchlist.push_back(nullptr);
new_dragon(rng, pchlist[i], rng->get_rand_in_vector(spots),
dhoard[i].pos);
chlist.push_back(pchlist[i].get());
position_list spots;
for (int i = 0; i < DIRECTION_CNT; ++i)
if (map.which_room(dhoard[i].pos + MOVE[i]) != -1)
spots.push_back(dhoard[i].pos + MOVE[i]);
pelist.push_back(nullptr);
new_dragon(rng, pelist[i], rng->get_rand_in_vector(spots),
dhoard[i].pos, enabled_features,
map.which_room(dhoard[i].pos));
elist.push_back(pelist[i].get());
}
for (int i = dhoard.size(); i < cnt; ++i) {
pchlist.push_back(nullptr);
new_enemy(rng, pchlist[i], get_rand_pos(rng, tiles),
enabled_features & FEATURE_EXTRA_STUFF);
pchlist[i]->set_room_num(map.which_room(pchlist[i]->get_position()));
chlist.push_back(pchlist[i].get());
pelist.push_back(nullptr);
auto p = get_rand_pos(rng, tiles);
new_enemy(rng, pelist[i], p, enabled_features, map.which_room(p));
elist.push_back(pelist[i].get());
}
}
@ -69,6 +76,10 @@ position level::get_rand_pos(RNG *rng, std::vector<position_list> &tiles) {
return pos;
}
void level::add_gold(gold g) {
glist.push_back(g);
}
void level::gen_gold(RNG *rng, std::vector<position_list> &tiles) {
glist.reserve(GOLD_CNT);
@ -103,7 +114,7 @@ void level::gen_potions(RNG *rng, std::vector<position_list> &tiles) {
void level::print(display *out) const {
map.print(out);
for (auto ch : chlist)
for (auto ch : elist)
ch->print(out);
for (auto p : plist)
@ -113,21 +124,50 @@ void level::print(display *out) const {
out->print_char(gold.pos, 'G', COLOR_PAIR(COLOR_YELLOW));
}
bool level::is_available(const position &pos) const {
bool level::is_available(const position &pos, bool is_player) const {
if (!map.is_available(pos))
return false;
for (auto ch : chlist)
if (pos == ch->get_position())
for (auto ch : elist)
if (pos == ch->get_pos())
return false;
if (!(enabled_features & FEATURE_WALK_OVER) && !is_player) {
for (auto p : plist)
if (pos == p->get_pos())
return false;
for (auto g : glist)
if (pos == g.pos)
return false;
}
return true;
}
bool level::is_available_all(const position &pos) const {
if (!map.is_available(pos))
return false;
for (auto ch : elist)
if (pos == ch->get_pos())
return false;
for (auto p : plist)
if (pos == p->get_pos())
return false;
for (auto g : glist)
if (pos == g.pos)
return false;
return true;
}
int level::get_room(const position &pos) const {
return map.which_room(pos);
}
position_list level::get_available_around(const position &pos) const {
position_list result;
@ -138,6 +178,16 @@ position_list level::get_available_around(const position &pos) const {
return result;
}
position_list level::get_available_around_all(const position &pos) const {
position_list result;
for (int i = 0; i < DIRECTION_CNT; ++i)
if (is_available_all(pos + MOVE[i]))
result.push_back(pos + MOVE[i]);
return result;
}
position level::get_up_stairs() const {
return map.get_up_stairs();
}
@ -146,8 +196,8 @@ position level::get_down_stairs() const {
return map.get_down_stairs();
}
character_list &level::get_chlist() {
return chlist;
enemy_list &level::get_elist() {
return elist;
}
potion_list &level::get_plist() {