diff --git a/src/constants.h b/src/constants.h index 2e696bd..338652e 100644 --- a/src/constants.h +++ b/src/constants.h @@ -33,7 +33,9 @@ enum stat_name {HP, ATK, DEF, hostile}; const int RACE_CNT = 5; // TODO: update as you go -enum race {rshade = 0, rvampire, rgoblin, rdrow, rdragon /* TODO: fill out the other races (including enemies) */}; +// TODO: Update races as you go +// PC races [x], Enemy races [x], other? [ ] +enum race {rshade = 0, rdrow, rvampire, rtroll, rgoblin, rhuman, rdwarf, relf, rorc, rmerchant, rdragon, rhalfling}; // TODO: fill out the other races (including enemies) const int MAX_HP[RACE_CNT] = {125, INF, 110, 150, 150}; diff --git a/src/goblin.cc b/src/goblin.cc index 9abc4ac..fa0a745 100644 --- a/src/goblin.cc +++ b/src/goblin.cc @@ -1,9 +1,7 @@ #include "goblin.h" -#include -#include goblin::goblin(RNG *rng, const position &pos): - character{rng, race::rshade, pos} { + character{rng, race::rgoblin, pos} { gold = 0; hostile = true; } @@ -27,7 +25,7 @@ result goblin::attack(const direction dir, character_list &chlist) { result goblin::get_hit(const enum race &race, const int atk, const fraction hitrate) { - if (rng->trial(hitrate)) + if (rng->trial(hitrate)) HP = std::max(HP - calc_dmg(atk, DEF), 0); if (HP == 0) diff --git a/src/goblin.h b/src/goblin.h index a1d81cf..460fe9e 100644 --- a/src/goblin.h +++ b/src/goblin.h @@ -1,5 +1,6 @@ #ifndef __GOBLIN_H__ #define __GOBLIN_H__ + #include "characters.h" class goblin final: public character { diff --git a/src/races.h b/src/races.h index ddd0058..55b5a8a 100644 --- a/src/races.h +++ b/src/races.h @@ -2,8 +2,9 @@ #define __RACES_H__ #include "shade.h" -#include "goblin.h" #include "vampire.h" +#include "troll.h" +#include "goblin.h" #include "dragon.h" #endif diff --git a/src/shade.cc b/src/shade.cc index 9fcac64..ad3dbb5 100644 --- a/src/shade.cc +++ b/src/shade.cc @@ -1,8 +1,5 @@ #include "shade.h" -#include -#include - shade::shade(RNG *rng, const position &pos): character{rng, race::rshade, pos} { gold = 0; diff --git a/src/troll.cc b/src/troll.cc new file mode 100644 index 0000000..61a5b22 --- /dev/null +++ b/src/troll.cc @@ -0,0 +1,36 @@ +#include "troll.h" + +troll::troll(RNG *rng, const position &pos): + character{rng, race::rtroll, pos} { + gold = 0; + hostile = true; +} + +result troll::attack(const direction dir, character_list &chlist) { + position tmp{pos + MOVE[dir]}; + + if (HP + REGAIN_HP > HP_CAP) { + HP = HP_CAP; + } else { + HP += REGAIN_HP; + } + + for (auto &ch : chlist) + if (tmp == ch->get_position()) { + auto res = ch->get_hit(race, ATK, base_hit_rate); + return res; + } + + return result::fine; +} + +result troll::get_hit(const enum race &race, const int atk, + const fraction hitrate) { + if (rng->trial(hitrate)) + HP = std::max(HP - calc_dmg(atk, DEF), 0); + + if (HP == 0) + return result::died; + + return result::hit; +} diff --git a/src/troll.h b/src/troll.h new file mode 100644 index 0000000..d144db3 --- /dev/null +++ b/src/troll.h @@ -0,0 +1,18 @@ +#ifndef __TROLL_H__ +#define __TROLL_H__ + +#include "characters.h" + +class troll final: public character { + static const int REGAIN_HP = 5; + static const int HP_CAP = 120; +public: + troll(RNG *rng, const position &pos); + virtual result attack(const direction dir, + character_list &chlist) override; + virtual result get_hit(const enum race &race, const int afk, + const fraction hit_rate) override; + +}; + +#endif diff --git a/src/vampire.cc b/src/vampire.cc index 705a69f..79c27b1 100644 --- a/src/vampire.cc +++ b/src/vampire.cc @@ -1,9 +1,7 @@ #include "vampire.h" -#include -#include vampire::vampire(RNG *rng, const position &pos): - character{rng, race::rshade, pos} { + character{rng, race::rvampire, pos} { gold = 0; hostile = true; } diff --git a/src/vampire.h b/src/vampire.h index acb1a01..b7ccf6c 100644 --- a/src/vampire.h +++ b/src/vampire.h @@ -1,5 +1,6 @@ #ifndef __VAMPIRE_H__ #define __VAMPIRE_H__ + #include "characters.h" class vampire final: public character {