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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
|
/*
* File: fight.cc
* Summary: Functions used during combat.
* Written by: Linley Henzell
*
* Modified for Crawl Reference by $Author$ on $Date$
*
* Change History (most recent first):
*
* <1> -/--/-- LRH Created
*/
#ifndef FIGHT_H
#define FIGHT_H
#include "externs.h"
#include "randart.h"
// added Sept 18, 2000 -- bwr
/* ***********************************************************************
* called from: item_use.cc
* *********************************************************************** */
int effective_stat_bonus( int wepType = -1 );
// added Sept 18, 2000 -- bwr
/* ***********************************************************************
* called from: describe.cc
* *********************************************************************** */
int weapon_str_weight( int wpn_class, int wpn_type );
// last updated: 08jun2000 {dlb}
/* ***********************************************************************
* called from: acr - it_use3
* *********************************************************************** */
bool you_attack(int monster_attacked, bool unarmed_attacks);
// last updated: 08jun2000 {dlb}
/* ***********************************************************************
* called from: monstuff
* *********************************************************************** */
void monster_attack(int monster_attacking);
// last updated: 08jun2000 {dlb}
/* ***********************************************************************
* called from: monstuff
* *********************************************************************** */
bool monsters_fight(int monster_attacking, int monster_attacked);
int calc_your_to_hit( bool random_factor );
int calc_heavy_armour_penalty( bool random_factor );
struct melee_attack
{
public:
// At the moment this only covers players fighting monsters
actor *attacker, *defender;
// If attacker and/or defender are monsters, these are set.
monsters *atk, *def;
bool did_hit;
bool unarmed_ok;
int attack_number;
int to_hit;
int base_damage;
int potential_damage;
int damage_done;
int special_damage;
int aux_damage;
bool stab_attempt;
int stab_bonus;
int min_delay;
int final_attack_delay;
// Attacker's damage output potential:
item_def *weapon;
int damage_brand; // Can be special even if unarmed (transforms)
int wpn_skill, hands;
int spwld; // Special wield effects?
bool hand_half_bonus;
// If weapon is a randart, its properties.
randart_properties_t art_props;
// Attack messages
std::string attack_verb, verb_degree;
std::string no_damage_message;
std::string special_damage_message;
std::string unarmed_attack;
item_def *shield;
// Armour penalties?
int heavy_armour_penalty;
bool can_do_unarmed;
// Attacker uses watery terrain to advantage vs defender. Implies that
// both attacker and defender are in water.
bool water_attack;
public:
melee_attack(actor *attacker, actor *defender,
bool allow_unarmed = true, int attack_num = -1);
// Applies attack damage and other effects.
bool attack();
int calc_to_hit(bool random = true);
private:
void init_attack();
bool is_water_attack(const actor *, const actor *) const;
void check_hand_half_bonus_eligible();
void check_autoberserk();
void check_special_wield_effects();
void emit_nodmg_hit_message();
std::string debug_damage_number();
std::string special_attack_punctuation();
std::string attack_strength_punctuation();
private:
// Monster-attack specific stuff
bool mons_attack_you();
bool mons_attack_mons();
int mons_to_hit();
private:
// Player-attack specific stuff
bool player_attack();
bool player_aux_unarmed();
bool player_apply_aux_unarmed();
int player_stat_modify_damage(int damage);
int player_aux_stat_modify_damage(int damage);
int player_to_hit(bool random_factor);
void player_apply_attack_delay();
int player_apply_water_attack_bonus(int damage);
int player_apply_weapon_bonuses(int damage);
int player_apply_weapon_skill(int damage);
int player_apply_fighting_skill(int damage, bool aux);
int player_apply_misc_modifiers(int damage);
int player_apply_monster_ac(int damage);
void player_weapon_auto_id();
int player_stab_weapon_bonus(int damage);
int player_stab(int damage);
int player_weapon_type_modify(int damage);
bool player_hits_monster();
int player_calc_base_weapon_damage();
int player_calc_base_unarmed_damage();
bool player_hurt_monster();
void player_exercise_combat_skills();
bool player_monattk_hit_effects(bool mondied);
void player_calc_brand_damage(int res, const char *message_format);
bool player_apply_damage_brand();
void player_sustain_passive_damage();
int player_staff_damage(int skill);
void player_apply_staff_damage();
bool player_check_monster_died();
void player_calc_hit_damage();
void player_stab_check();
int player_weapon_speed();
int player_unarmed_speed();
int player_apply_shield_delay(int attack_delay);
void player_announce_hit();
std::string player_why_missed();
void player_warn_miss();
};
#endif
|