#include "characters.h" #include "constants.h" #include "level.h" #include character::character(RNG *rng, const feature enabled_features, const enum race &nrace, const position &pos): rng{rng}, enabled_features{enabled_features}, race{nrace}, HP{STARTING_HP[race]}, pos{pos}, ATK{STARTING_ATK[race]}, DEF{STARTING_DEF[race]}, base_hit_rate{1, 1}, base_hit_rate_reset{1, 1} {} void character::start_turn() { ATK = STARTING_ATK[race]; DEF = STARTING_DEF[race]; base_hit_rate = base_hit_rate_reset; } enum race character::get_race() const { return race; } position character::get_pos() const { return pos; } void character::set_pos(const position &npos) { pos = npos; } void character::apply_effect(potion *effect) { insert_effect(effect); } void character::insert_effect(potion *effect) { effects.push_back(effect); for (int i = effects.size() - 1; i > 0 && effect->get_priority() < effects[i - 1]->get_priority(); --i) std::swap(effects[i], effects[i - 1]); } result character::calc_effects() { potion_list tmp; tmp.reserve(effects.size()); for (auto p : effects) { p->apply(this->race, HP, ATK, DEF, base_hit_rate); if (HP <= 0) return result::died; if (p->get_duration() != 0) tmp.push_back(p); } tmp.shrink_to_fit(); std::swap(tmp, effects); return result::fine; } void character::discard_level_effects() { potion_list tmp; tmp.reserve(effects.size()); for (auto p : effects) if (p->get_duration() > 0) tmp.push_back(p); tmp.shrink_to_fit(); std::swap(tmp, effects); } // IMPORTANT: remember to check if player is on the stairs long_result character::move(level *lvl, const position &p) { if (lvl->is_available(p)) { pos = p; return {result::moved, ""}; } return {result::fine, ""}; } int calc_dmg(const int ATK, const int DEF) { return ceil((100.0f / (100.0f + DEF)) * ATK); } character *get_ch_at(const position &pos, const character_list &chlist) { for (auto ch : chlist) if (ch->get_pos() == pos) return ch; return nullptr; } bool character::is_dead() const { return HP <= 0; }