diff --git a/src/characters.cc b/src/characters.cc index 34b1592..50b10aa 100644 --- a/src/characters.cc +++ b/src/characters.cc @@ -33,7 +33,7 @@ int character::get_gold() const { } float character::get_hitrate() const { - return base_hitrate; + return base_hit_rate; } bool character::is_hostile() const { @@ -61,7 +61,7 @@ void character::set_gold(const int ngold) { } void character::set_hitrate(const float nhitrate) { - base_hitrate = nhitrate; + base_hit_rate = nhitrate; } void character::set_hostile(const bool is_hostile) { diff --git a/src/characters.h b/src/characters.h index 88884e5..b14ff7e 100644 --- a/src/characters.h +++ b/src/characters.h @@ -90,7 +90,7 @@ protected: int gold; // characters spawn with gold // inventory inventory; // Reserved - float base_hitrate; // requires: between [0,1] + float base_hit_rate; // requires: between [0,1] bool hostile; }; diff --git a/src/constants.h b/src/constants.h index 1279f36..13be32c 100644 --- a/src/constants.h +++ b/src/constants.h @@ -8,7 +8,7 @@ const int INF = 0x3F3F3F3F; -enum error {none}; +enum error {none}; // TODO: update result to include subject enum result {fine, died, go_down, hit, moved, miss}; @@ -18,16 +18,16 @@ enum stat_name {HP, ATK, DEF, hostile}; const int LAYER_CNT = 4; // TODO: update as you go enum layer_num {map = 0, objects, characters, shop}; -const int RACE_CNT = 3; // TODO: update as you go +const int RACE_CNT = 4; // TODO: update as you go -enum race {unknown = 0, rshade , rvampire /* TODO: fill out the other races (including enemies) */}; +enum race {unknown = 0, rshade , rvampire, goblin /* TODO: fill out the other races (including enemies) */}; // TODO: fill out the other races (including enemies) -const int MAX_HP[RACE_CNT] = {0, 125, INF}; -const int STARTING_HP[RACE_CNT] = {0, 125, 50}; -const int STARTING_ATK[RACE_CNT] = {0, 25, 25}; -const int STARTING_DEF[RACE_CNT] = {0, 25, 25}; -const char CHARACTER_REP[RACE_CNT] = {'@', 'S'}; +const int MAX_HP[RACE_CNT] = {0, 125, INF, 110}; +const int STARTING_HP[RACE_CNT] = {0, 125, 50, 110}; +const int STARTING_ATK[RACE_CNT] = {0, 25, 25, 15}; +const int STARTING_DEF[RACE_CNT] = {0, 25, 25, 20}; +const char CHARACTER_REP[RACE_CNT] = {'@', 'S', 'V', 'G'}; diff --git a/src/goblin.cc b/src/goblin.cc new file mode 100644 index 0000000..48907b6 --- /dev/null +++ b/src/goblin.cc @@ -0,0 +1,30 @@ +#include "goblin.h" +#include +#include + + +result goblin::attack(const direction dir, const character_list &chlist) { + position tmp{pos + MOVE[dir]}; + + for (auto &ch : chlist) + if (tmp == ch->get_position()) { + auto res = ch->get_hit(race, ATK, base_hit_rate); + if (res == result::died) { + gold += GAIN_GOLD; + } + return res; + } + + return result::fine; +} + +result goblin::get_hit(const enum race &race, const int atk, + const float hitrate) { + if (rng.rand_num() <= hitrate * (float)RAND_MAX) + HP = std::max(HP - calc_dmg(atk, DEF), 0); + + if (HP == 0) + return result::died; + + return result::hit; +} diff --git a/src/goblin.h b/src/goblin.h new file mode 100644 index 0000000..d2f89db --- /dev/null +++ b/src/goblin.h @@ -0,0 +1,16 @@ +#ifndef __GOBLIN_H__ +#define __GOBLIN_H__ +#include "characters.h" + +const int GAIN_GOLD = 5; + +class goblin final: public character { +public: + goblin(const position_list &available_positions); // spawn at a random place + virtual result attack(const direction dir, + const character_list &chlist) override; + virtual result get_hit(const enum race &race, const int atk, + const float hit_rate) override; +}; + +#endif \ No newline at end of file diff --git a/src/races.cc b/src/races.cc index 1724a08..b3f8b1a 100644 --- a/src/races.cc +++ b/src/races.cc @@ -15,7 +15,7 @@ result shade::attack(const direction dir, const character_list &chlist) { for (auto &ch : chlist) if (tmp == ch->get_position()) { - return ch->get_hit(race, ATK, base_hitrate); + return ch->get_hit(race, ATK, base_hit_rate); } return result::fine; diff --git a/src/vampire.cc b/src/vampire.cc index 12cdb1d..99fffd7 100644 --- a/src/vampire.cc +++ b/src/vampire.cc @@ -1,5 +1,4 @@ #include "vampire.h" - #include #include @@ -9,7 +8,7 @@ result vampire::attack(const direction dir, const character_list &chlist) { for (auto &ch : chlist) if (tmp == ch->get_position()) { - auto res = ch->get_hit(race, ATK, base_hitrate); + auto res = ch->get_hit(race, ATK, base_hit_rate); if (res != result::miss) { HP += GAIN_HP; }