finished the bulk of game
This commit is contained in:
@ -1,161 +1,47 @@
|
||||
#include "characters.h"
|
||||
|
||||
#include "constants.h"
|
||||
#include "level.h"
|
||||
#include <algorithm>
|
||||
|
||||
character::character(RNG *rng, const enum race &nrace, const position &pos):
|
||||
rng{rng}, race{nrace}, HP{STARTING_HP[race]},
|
||||
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}, pos{pos} {}
|
||||
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 = {1, 1};
|
||||
}
|
||||
|
||||
void character::print(display *out, bool player) {
|
||||
out->print_char(pos, player ? '@' : CHARACTER_REP[race],
|
||||
player ? COLOR_PAIR(COLOR_BLUE) : COLOR_PAIR(COLOR_RED));
|
||||
base_hit_rate = base_hit_rate_reset;
|
||||
}
|
||||
|
||||
enum race character::get_race() const {
|
||||
return race;
|
||||
}
|
||||
|
||||
position character::get_position() const {
|
||||
position character::get_pos() const {
|
||||
return pos;
|
||||
}
|
||||
|
||||
int character::get_HP() const {
|
||||
return HP;
|
||||
}
|
||||
|
||||
int character::get_ATK() const {
|
||||
return ATK;
|
||||
}
|
||||
|
||||
int character::get_DEF() const {
|
||||
return DEF;
|
||||
}
|
||||
|
||||
int character::get_gold() const {
|
||||
return gold;
|
||||
}
|
||||
|
||||
float character::get_hitrate_real() const {
|
||||
return base_hit_rate.real();
|
||||
}
|
||||
|
||||
fraction character::get_hitrate() const {
|
||||
return base_hit_rate;
|
||||
}
|
||||
|
||||
int character::get_room_num() const {
|
||||
return room_num;
|
||||
}
|
||||
|
||||
<<< <<< < HEAD
|
||||
== == == =
|
||||
bool character::is_hostile() const {
|
||||
return hostile;
|
||||
}
|
||||
|
||||
>>> >>> > AL - races
|
||||
void character::set_room_num(const int room) {
|
||||
room_num = room;
|
||||
}
|
||||
|
||||
void character::set_position(const position &npos) {
|
||||
void character::set_pos(const position &npos) {
|
||||
pos = npos;
|
||||
}
|
||||
|
||||
void character::set_HP(const int nHP) {
|
||||
HP = nHP;
|
||||
void character::apply_effect(potion *effect) {
|
||||
insert_effect(effect);
|
||||
}
|
||||
|
||||
void character::set_ATK(const int nATK) {
|
||||
ATK = nATK;
|
||||
}
|
||||
|
||||
void character::set_DEF(const int nDEF) {
|
||||
DEF = nDEF;
|
||||
}
|
||||
|
||||
void character::set_gold(const int ngold) {
|
||||
gold = ngold;
|
||||
}
|
||||
|
||||
void character::set_hitrate(const fraction nhitrate) {
|
||||
base_hit_rate = nhitrate;
|
||||
}
|
||||
|
||||
<<< <<< < HEAD
|
||||
== == == =
|
||||
void character::set_hostile(const bool is_hostile) {
|
||||
hostile = is_hostile;
|
||||
}
|
||||
|
||||
void character::apply_buff(const stat_name statn, const int amount) {
|
||||
// TODO: add checks for bounds
|
||||
switch (statn) {
|
||||
case stat_name::HP:
|
||||
HP += amount;
|
||||
break;
|
||||
|
||||
case stat_name::ATK:
|
||||
ATK += amount;
|
||||
break;
|
||||
|
||||
case stat_name::DEF:
|
||||
DEF += amount;
|
||||
break;
|
||||
|
||||
case stat_name::hostile: {
|
||||
if (amount > 0)
|
||||
hostile = true;
|
||||
else
|
||||
hostile = false;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>>> >>> > AL - races
|
||||
direction_list character::moveable(const position_list &available_positions)
|
||||
const {
|
||||
direction_list result;
|
||||
|
||||
for (int i = 0; i < DIRECTION_CNT; ++i)
|
||||
if (find(available_positions, pos + MOVE[i])
|
||||
!= available_positions.size())
|
||||
result.push_back((direction)i);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
character::apply_result character::apply(const direction &dir,
|
||||
potion_list &plist) {
|
||||
for (size_t i = 0; i < plist.size(); ++i)
|
||||
if (pos + MOVE[dir] == plist[i]->get_pos()) {
|
||||
apply_result res{applied, plist[i]};
|
||||
insert_potion(plist[i]);
|
||||
plist.erase(plist.begin() + i);
|
||||
return res;
|
||||
}
|
||||
|
||||
return {applied_nothing, nullptr};
|
||||
}
|
||||
|
||||
void character::insert_potion(potion *p) {
|
||||
effects.push_back(p);
|
||||
void character::insert_effect(potion *effect) {
|
||||
effects.push_back(effect);
|
||||
|
||||
for (int i = effects.size() - 1; i > 0; --i)
|
||||
if (p->get_priority() < effects[i - 1]->get_priority())
|
||||
if (effect->get_priority() < effects[i - 1]->get_priority())
|
||||
std::swap(effects[i], effects[i - 1]);
|
||||
}
|
||||
|
||||
result character::apply_effects() {
|
||||
result character::calc_effects() {
|
||||
potion_list tmp;
|
||||
tmp.reserve(effects.size());
|
||||
|
||||
@ -190,17 +76,28 @@ void character::discard_level_effects() {
|
||||
}
|
||||
|
||||
// IMPORTANT: remember to check if player is on the stairs
|
||||
result character::move(const direction dir,
|
||||
const position_list &available_positions) {
|
||||
if (find(available_positions, pos + MOVE[dir])
|
||||
!= available_positions.size()) {
|
||||
pos += MOVE[dir];
|
||||
return result::moved;
|
||||
long_result character::move(level *lvl,
|
||||
const position &p) {
|
||||
if (lvl->is_available(p)) {
|
||||
pos = p;
|
||||
return {result::moved, ""};
|
||||
}
|
||||
|
||||
return result::fine;
|
||||
return {result::fine, ""};
|
||||
}
|
||||
|
||||
int character::calc_dmg(const int ATK, const int DEF) {
|
||||
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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user