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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
|
/*
* File: beam.h
* Summary: Functions related to ranged attacks.
* Written by: Linley Henzell
*
* Modified for Crawl Reference by $Author$ on $Date$
*
* Change History (most recent first):
*
* <1> -/--/-- LRH Created
*/
#ifndef BEAM_H
#define BEAM_H
#include "externs.h"
#include "ray.h"
class monsters;
enum demon_beam_type
{
DMNBM_HELLFIRE, // 0
DMNBM_SMITING,
DMNBM_BRAIN_FEED,
DMNBM_MUTATION
};
// must match wand subtypes! (see item_def::zap())
enum zap_type
{
ZAP_FLAME, // 0
ZAP_FROST,
ZAP_SLOWING,
ZAP_HASTING,
ZAP_MAGIC_DARTS,
ZAP_HEALING, // 5
ZAP_PARALYSIS,
ZAP_FIRE,
ZAP_COLD,
ZAP_CONFUSION,
ZAP_INVISIBILITY, // 10
ZAP_DIGGING,
ZAP_FIREBALL,
ZAP_TELEPORTATION,
ZAP_LIGHTNING,
ZAP_POLYMORPH_OTHER, // 15
ZAP_VENOM_BOLT,
ZAP_NEGATIVE_ENERGY,
ZAP_CRYSTAL_SPEAR,
ZAP_BEAM_OF_ENERGY,
ZAP_MYSTIC_BLAST, // 20
ZAP_ENSLAVEMENT,
ZAP_PAIN,
ZAP_STICKY_FLAME,
ZAP_DISPEL_UNDEAD,
ZAP_CLEANSING_FLAME, // 25
ZAP_BONE_SHARDS,
ZAP_BANISHMENT,
ZAP_DEGENERATION,
ZAP_STING,
ZAP_HELLFIRE, // 30
ZAP_IRON_BOLT,
ZAP_STRIKING,
ZAP_STONE_ARROW,
ZAP_ELECTRICITY,
ZAP_ORB_OF_ELECTRICITY, // 35
ZAP_SPIT_POISON,
ZAP_DEBUGGING_RAY,
ZAP_BREATHE_FIRE,
ZAP_BREATHE_FROST,
ZAP_BREATHE_ACID, // 40
ZAP_BREATHE_POISON,
ZAP_BREATHE_POWER,
ZAP_ENSLAVE_UNDEAD,
ZAP_AGONY,
ZAP_DISRUPTION, // 45
ZAP_DISINTEGRATION, // 46
// ZAP_ISKS_CROSS, // 47: Isk's Cross -- commented out, deprecated {dlb}
ZAP_BREATHE_STEAM = 48, // 48
ZAP_CONTROL_DEMON,
ZAP_ORB_OF_FRAGMENTATION, // 50
ZAP_ICE_BOLT,
ZAP_ICE_STORM,
ZAP_BACKLIGHT, //jmf: added next bunch 19mar2000
ZAP_SLEEP,
ZAP_FLAME_TONGUE,
ZAP_SANDBLAST,
ZAP_SMALL_SANDBLAST,
ZAP_MAGMA,
ZAP_POISON_ARROW,
ZAP_BREATHE_STICKY_FLAME,
ZAP_BREATHE_LIGHTNING,
ZAP_PETRIFY,
ZAP_HELLFROST,
NUM_ZAPS // must remain last member {dlb}
};
struct dist;
struct bolt
{
// INPUT parameters set by caller
int range; // minimum range
int rangeMax; // maximum range
unsigned type; // missile gfx
int colour;
beam_type flavour;
int source_x, source_y; // beam origin
dice_def damage;
int ench_power, hit;
int target_x, target_y; // intended target
coord_def pos; // actual position
killer_type thrower; // what kind of thing threw this?
char ex_size; // explosion radius (0==none)
int beam_source; // NON_MONSTER or monster index #
std::string name;
bool is_beam; // beams? (can hits multiple targets?)
bool is_explosion;
bool is_big_cloud; // expands into big_cloud at endpoint
bool is_enchant; // no block/dodge, but mag resist
bool is_energy; // mostly energy/non-physical attack
bool is_launched; // was fired from launcher?
bool is_thrown; // was thrown from hand?
bool target_first; // targeting by direction
bool aimed_at_spot; // aimed at (x,y), should not cross
std::string aux_source; // source of KILL_MISC beams
bool affects_nothing; // should not hit monsters or features
// OUTPUT parameters (tracing, ID)
bool obvious_effect; // did an 'obvious' effect happen?
bool effect_known; // did we _know_ this would happen?
int fr_count, foe_count; // # of times a friend/foe is "hit"
int fr_power, foe_power; // total levels/hit dice affected
int fr_hurt, foe_hurt; // # of friends/foes actually hurt
int fr_helped, foe_helped; // # of friends/foes actually helped
// INTERNAL use - should not usually be set outside of beam.cc
bool is_tracer; // is this a tracer?
bool aimed_at_feet; // this was aimed at self!
bool msg_generated; // an appropriate msg was already mpr'd
bool in_explosion_phase; // explosion phase (as opposed to beam phase)
bool smart_monster; // tracer firer can guess at other mons. resists?
bool can_see_invis; // tracer firer can see invisible?
mon_attitude_type attitude; // attitude of whoever fired tracer
int foe_ratio; // 100* foe ratio (see mons_should_fire())
bool chose_ray; // do we want a specific ray?
ray_def ray; // shoot on this specific ray
public:
// A constructor to try and fix some of the bugs that occur because
// this struct never seems to be properly initialized. Definition
// is over in beam.cc.
bolt();
void set_target(const dist &);
void setup_retrace();
// Returns YOU_KILL or MON_KILL, depending on the source of the beam.
killer_type killer() const;
coord_def target() const
{
return (coord_def(target_x, target_y));
}
};
dice_def calc_dice( int num_dice, int max_damage );
// Test if the to-hit (attack) beats evasion (defence).
bool test_beam_hit(int attack, int defence);
/* ***********************************************************************
* called from: bang - it_use2 - monstuff - mstuff2
* *********************************************************************** */
void fire_beam( bolt &pbolt, item_def *item = NULL, bool drop_item = false );
// last updated 19apr2001 {gdl}
/* ***********************************************************************
* called from: beam
* *********************************************************************** */
bool nasty_beam( monsters *mon, struct bolt &beam );
bool nice_beam( monsters *mon, struct bolt &beam );
// last updated 12may2000 {dlb}
/* ***********************************************************************
* called from: ability - it_use3 - item_use - mstuff2 - religion -
* spells - spells4
* *********************************************************************** */
void explosion( bolt &pbolt, bool hole_in_the_middle = false,
bool explode_in_wall = false,
bool stop_at_statues = true,
bool stop_at_walls = true,
bool show_more = true);
// last updated 22jan2001 {gdl}
/* ***********************************************************************
* called from: effects - spells2 - spells4
* *********************************************************************** */
int mons_adjust_flavoured( monsters *monster, struct bolt &pbolt,
int hurted, bool doFlavouredEffects = true );
/* ***********************************************************************
* called from: ability - item_use - spell
* returns true if messages were generated during the enchantment
* *********************************************************************** */
bool mass_enchantment( enchant_type wh_enchant, int pow, int who,
int *m_succumbed = NULL, int *m_attempted = NULL );
/* ***********************************************************************
* called from: fight - monstuff - mstuff2
* *********************************************************************** */
int mons_ench_f2( monsters *monster, struct bolt &pbolt );
/* ***********************************************************************
* called from: fight - monstuff - spells2
* *********************************************************************** */
bool poison_monster( monsters *monster, kill_category who,
int levels = 1, bool force = false, bool verbose = true );
/* ***********************************************************************
* called from: monstuff
* *********************************************************************** */
void fire_tracer( const monsters *monster, struct bolt &pbolt );
bool check_line_of_sight( int sx, int sy, int tx, int ty );
/* ***********************************************************************
* called from: monstuff
* *********************************************************************** */
void mimic_alert( monsters *mimic );
bool zapping( zap_type ztype, int power, struct bolt &pbolt );
int affect(bolt &beam, int x, int y, item_def *item = NULL);
void beam_drop_object( bolt &beam, item_def *item, int x, int y );
#endif
|