#include #include "Location.h" #include "Dungeon.h" #include "RNG.h" #include "ListIterator.h" #include "print.h" Dungeon::Dungeon() : player(*this) { } void Dungeon::update() { ListRange enemies = this->player.get_location().get_enemies(); if (enemies.size() > 0) this->update_attacks(enemies); else this->update_movement(); } void Dungeon::update_attacks(ListRange & enemies) { lprtf(":: De vijand%s in je locatie vallen aan! ::\n", enemies.size() == 1 ? "" : "en"); RNG & rng = RNG::get(); for (Enemy * enemy : enemies) { if (rng.rand_double() < enemy->get_attack()) continue; unsigned damage = rng.rand_int(enemy->get_damage_min(), enemy->get_damage_max() + 1); this->player.take_damage(damage); lprtf("%s raakt en doet %d punt schade.\n", enemy->get_displayname().c_str(), damage); } } void Dungeon::update_movement() { bool moved = false; for (Location * location : this->locations) { for (Enemy * enemy : location->get_enemies()) { if (RNG::get().rand_double() < 0.5) continue; if (!moved) lprtf(":: De vijanden bewegen ::\n"); Direction direction = random_direction(*location); location->remove_enemy(enemy); Location * new_location = location->get_exit(direction); new_location->add_enemy(enemy); if (&this->player.get_location() == new_location) lprtf("%s komt de huidige locatie binnen\n", enemy->get_name().c_str()); moved = true; } } } void Dungeon::add_location(Location * location) { this->locations.push_back(location); } Location & Dungeon::get_start_location() { size_t size = this->locations.size(); assert(size > 0); size_t index = RNG::get().rand_int(size); return *this->locations[index]; } Player & Dungeon::get_player() { return this->player; }