-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreature.h
129 lines (101 loc) · 4.39 KB
/
creature.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//
// Created by anton on 07.04.16.
//
//данный класс отвечает за взаимодействие существ на поле боя
#ifndef HMM_CREATURE_H
#define HMM_CREATURE_H
#include <iostream>
#include <cmath>
#include "map.h"
using namespace std;
//todo-anton написать самописный модуль, если потребуется
class creature {
protected:
unsigned int ID;
// уникальный номе персонажа
int start_hp;
// начальное кол-во здоровья
int health;
//количество очков здоровья
int defense = 0;
//защита - то, сколько урона существо может предотвратить
int path_length;
//длина хода
int x0;
//абцисса координаты, на которой находится существо
int y0;
//ордината координаты, на которой находится существо
bool alive;
//живо существо(1) или нет(0)
int belong_to;
//принадлежность к 1 или 2 игроку
int count_hp = 0; // сколько здоровья вылечивает
int count_hp_max = 0;
int damage = 0;
int damage_max = 0;
int arrow_damage = 0; // урон от стрел
int arrow_damage_max = 0;
string race; // хранит название расы существа
SDL_Texture * skin = NULL; // текстура персонажа
bool is_it_active = false;
public:
friend class player;
friend class undead;
friend class doctor;
friend class warrior;
friend class archer;
friend class vampire;
friend class skeleton_archer;
friend class map;
friend class the_game;
virtual int get_damage(int enemy_damage) {
// int hit = arrow_damage > damage ? arrow_damage : damage;//выбираем наибольший урон из возможных
if (defense < enemy_damage) {//если защита не полностью поглощает урон, то наносим урон
int health_los = enemy_damage - defense;//потеря хп = дамаг - защита
health = health - health_los;//уменьшаем здоровье в соответствии с нанесённым уроном
cout << ID << " lose " << health_los << " hp" << endl;
if (health <= 0) {//если существо умерло
alive = false;
cout << ID << "is dead " << endl;
map::wipe_from_map(x0, y0);
}
return health_los; // возвращаем для вампира
}
else
return 0;
}
virtual bool add_hp(creature *another) // Восстановление здоровья персонажа. по умолчанию существо не лечит
{
return false;
}
unsigned int get_id() {
return ID;
}
void move(int new_x, int new_y) // перемещает персонажа в указанную клетку
{
map_of_id[x0][y0] = 0; // удалили из прошлой клетки
map_of_id[new_x][new_y] = ID; // преместили в новую клетку
x0 = new_x;
y0 = new_y;
}
virtual bool arrow_attack(creature *attacked_creature) // по умолчанию существо не стреляет
{
return false;
}
virtual bool attack(creature *attacked_creature) { // по умолчанию существо не атакует
return false;
}
bool can_creature_move_to_point(int x,
int y) // проверяет находится ли заданная координата в зоне досягаемости хода персонажа
{
if ((abs(this->x0 - x) >= this->path_length) || (abs(this->y0 - y) >= this->path_length)) {
return false;
}
return true;
}
double distance_to_point(int x, int y) // возвращает расстояние от точки (x,y) до персонажа
{
return sqrt(abs(x - this->x0) + abs(y - this->y0));
}
};
#endif //HMM_CREATURE_H