Files
cc3k/src/characters.cc
Peisong Xiao 8e52309626 fixed potions not working properly
need to test: vampire draining
2024-07-15 10:35:28 -04:00

104 lines
2.5 KiB
C++

#include "characters.h"
#include "constants.h"
#include "level.h"
#include <algorithm>
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;
}