#ifndef __CHARACTERS_H__ #define __CHARACTERS_H__ #include #include #include #include #include "display.h" #include "fraction.h" #include "position.h" #include "potions.h" #include "gold.h" #include "rng.h" class level; typedef unsigned int feature; struct long_result; enum result : int; class character { public: character(RNG *rng, const feature enabled_features, const race &nrace, const position &pos); // fills out the starting stats virtual long_result move(level *lvl, const position &p); virtual long_result attack(character *ch) = 0; virtual long_result get_hit(character *ch, const int tATK, const fraction &hit_rate) = 0; virtual void apply_effect(potion *effect); // override for different types virtual void print(display *out) = 0; result calc_effects(); void discard_level_effects(); virtual void start_turn(); virtual const char *get_race_name() const = 0; enum race get_race() const; position get_pos() const; virtual std::string get_abbrev() const = 0; void set_pos(const position &npos); bool is_dead() const; protected: RNG *rng; const feature enabled_features; const enum race race; int HP; position pos; // IMPORTANT: keep track at turn time int ATK; int DEF; fraction base_hit_rate; fraction base_hit_rate_reset; potion_list effects; private: void insert_effect(potion *effect); }; int calc_dmg(const int ATK, const int DEF); typedef std::vector character_list; character *get_ch_at(const position &pos, const character_list &chlist); #endif