1 #ifndef __PROJECTILE_DEFINITIONS_H
2 #define __PROJECTILE_DEFINITIONS_H
3 
4 /*
5 PROJECTILE_DEFINITIONS.H
6 
7 	Copyright (C) 1991-2001 and beyond by Bungie Studios, Inc.
8 	and the "Aleph One" developers.
9 
10 	This program is free software; you can redistribute it and/or modify
11 	it under the terms of the GNU General Public License as published by
12 	the Free Software Foundation; either version 3 of the License, or
13 	(at your option) any later version.
14 
15 	This program is distributed in the hope that it will be useful,
16 	but WITHOUT ANY WARRANTY; without even the implied warranty of
17 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 	GNU General Public License for more details.
19 
20 	This license is contained in the file "COPYING",
21 	which is included with this source code; it is available online at
22 	http://www.gnu.org/licenses/gpl.html
23 
24 Tuesday, May 31, 1994 5:19:56 PM
25 
26 Feb 4, 2000 (Loren Petrich):
27 	Added SMG bullet and its ability to enter/exit liquids
28 */
29 
30 #include "effects.h"
31 #include "map.h"
32 #include "media.h"
33 #include "projectiles.h"
34 #include "SoundManagerEnums.h"
35 
36 /* ---------- constants */
37 
38 enum /* projectile flags */
39 {
40 	_guided= 0x0001,
41 	_stop_when_animation_loops= 0x0002,
42 	_persistent= 0x0004, /* does stops doing damage and stops moving against a target, but doesn't vanish */
43 	_alien_projectile= 0x0008, /* does less damage and moves slower on lower levels */
44 	_affected_by_gravity= 0x0010,
45 	_no_horizontal_error= 0x0020,
46 	_no_vertical_error= 0x0040,
47 	_can_toggle_control_panels= 0x0080,
48 	_positive_vertical_error= 0x0100,
49 	_melee_projectile= 0x0200, /* can use a monster�s custom melee detonation */
50 	_persistent_and_virulent= 0x0400, /* keeps moving and doing damage after a successful hit */
51 	_usually_pass_transparent_side= 0x0800,
52 	_sometimes_pass_transparent_side= 0x1000,
53 	_doubly_affected_by_gravity= 0x2000,
54 	_rebounds_from_floor= 0x4000, /* unless v.z<kvzMIN */
55 	_penetrates_media= 0x8000, /* huh uh huh ... i said penetrate */
56 	_becomes_item_on_detonation= 0x10000, /* item type in .permutation field of projectile */
57 	_bleeding_projectile= 0x20000, /* can use a monster�s custom bleeding detonation */
58 	_horizontal_wander= 0x40000, /* random horizontal error perpendicular to direction of movement */
59 	_vertical_wander= 0x80000, /* random vertical movement perpendicular to direction of movement */
60 	_affected_by_half_gravity= 0x100000,
61 	_penetrates_media_boundary=0x200000 // Can enter/exit liquids
62 };
63 
64 /* ---------- structures */
65 
66 struct projectile_definition
67 {
68 	int16 collection, shape; /* collection can be NONE (invisible) */
69 	int16 detonation_effect, media_detonation_effect;
70 	int16 contrail_effect, ticks_between_contrails, maximum_contrails; /* maximum of NONE is infinite */
71 	int16 media_projectile_promotion;
72 
73 	world_distance radius; /* can be zero and will still hit */
74 	world_distance area_of_effect; /* one target if ==0 */
75 	struct damage_definition damage;
76 
77 	uint32 flags;
78 
79 	world_distance speed;
80 	world_distance maximum_range;
81 
82 	_fixed sound_pitch;
83 	int16 flyby_sound, rebound_sound;
84 };
85 
86 #ifndef DONT_REPEAT_DEFINITIONS
87 
88 /* ---------- projectile definitions */
89 
90 static struct projectile_definition projectile_definitions[NUMBER_OF_PROJECTILE_TYPES];
91 const struct projectile_definition original_projectile_definitions[NUMBER_OF_PROJECTILE_TYPES]=
92 {
93 	{	/* player�s rocket */
94 		_collection_rocket, 0, /* collection number, shape number */
95 		_effect_rocket_explosion, NONE, /* detonation effect, media_detonation_effect */
96 		_effect_rocket_contrail, 1, NONE, /* contrail effect, ticks between contrails, maximum contrails */
97 		NONE, /* media projectile promotion */
98 
99 		WORLD_ONE/8, /* radius */
100 		WORLD_ONE+WORLD_ONE_HALF, /* area-of-effect */
101 		{_damage_explosion, 0, 250, 50}, /* damage */
102 
103 		_can_toggle_control_panels|_guided, /* flags */
104 
105 		WORLD_ONE/4, /* speed */
106 		NONE, /* maximum range */
107 
108 		_normal_frequency, /* sound pitch */
109 		_snd_rocket_flyby, NONE, /* flyby sound, rebound sound */
110 	},
111 
112 	{	/* player�s grenade */
113 		_collection_rocket, 3, /* collection number, shape number */
114 		_effect_grenade_explosion, _medium_media_detonation_effect, /* detonation effect, media_detonation_effect */
115 		_effect_grenade_contrail, 1, 8, /* contrail effect, ticks between contrails, maximum contrails */
116 		NONE, /* media projectile promotion */
117 
118 		0, /* radius */
119 		WORLD_THREE_FOURTHS, /* area-of-effect */
120 		{_damage_explosion, 0, 80, 20}, /* damage */
121 
122 		_affected_by_gravity|_can_toggle_control_panels, /* flags */
123 
124 		WORLD_ONE/4, /* speed */
125 		NONE, /* maximum range */
126 
127 		_normal_frequency, /* sound pitch */
128 		_snd_grenade_flyby, NONE, /* flyby sound, rebound sound */
129 	},
130 
131 	{	/* player�s pistol bullet */
132 		NONE, 0, /* collection number, shape number */
133 		_effect_bullet_ricochet, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
134 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
135 		NONE, /* media projectile promotion */
136 
137 		0, /* radius */
138 		0, /* area-of-effect */
139 		{_damage_projectile, 0, 20, 8}, /* damage */
140 
141 		_bleeding_projectile|_usually_pass_transparent_side, /* flags */
142 
143 		WORLD_ONE, /* speed */
144 		NONE, /* maximum range */
145 
146 		_normal_frequency, /* sound pitch */
147 		NONE, NONE, /* flyby sound, rebound sound */
148 	},
149 
150 	{	/* player�s rifle bullet */
151 		NONE, 0, /* collection number, shape number */
152 		_effect_bullet_ricochet, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
153 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
154 		NONE, /* media projectile promotion */
155 
156 		0, /* radius */
157 		0, /* area-of-effect */
158 		{_damage_projectile, 0, 9, 6}, /* damage */
159 
160 		_bleeding_projectile|_usually_pass_transparent_side, /* flags */
161 
162 		WORLD_ONE, /* speed */
163 		NONE, /* maximum range */
164 
165 		_normal_frequency, /* sound pitch */
166 		NONE, NONE, /* flyby sound, rebound sound */
167 	},
168 
169 	{	/* player�s shotgun bullet */
170 		NONE, 0, /* collection number, shape number */
171 		_effect_bullet_ricochet, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
172 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
173 		NONE, /* media projectile promotion */
174 
175 		0, /* radius */
176 		0, /* area-of-effect */
177 		{_damage_shotgun_projectile, 0, 20, 4}, /* damage */
178 
179 		_bleeding_projectile|_can_toggle_control_panels|_usually_pass_transparent_side, /* flags */
180 
181 		WORLD_ONE, /* speed */
182 		NONE, /* maximum range */
183 
184 		_normal_frequency, /* sound pitch */
185 		NONE, NONE, /* flyby sound, rebound sound */
186 	},
187 
188 	{	/* electrical melee staff */
189 		NONE, 0, /* collection number, shape number */
190 		_effect_fighter_melee_detonation, NONE, /* detonation effect, media_detonation_effect */
191 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
192 		NONE, /* media projectile promotion */
193 
194 		0, /* radius */
195 		0, /* area-of-effect */
196 		{_damage_electrical_staff, _alien_damage, 20, 5}, /* damage */
197 
198 		_sometimes_pass_transparent_side|_alien_projectile|_melee_projectile|_penetrates_media, /* flags */
199 
200 		WORLD_ONE_HALF, /* speed */
201 		WORLD_ONE, /* maximum range */
202 
203 		_normal_frequency, /* sound pitch */
204 		NONE, NONE, /* flyby sound, rebound sound */
205 	},
206 
207 	{	/* electrical melee staff projectile */
208 		BUILD_COLLECTION(_collection_fighter, 2), 9, /* collection number, shape number */
209 		_effect_fighter_projectile_detonation, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
210 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
211 		NONE, /* media projectile promotion */
212 
213 		0, /* radius */
214 		0, /* area-of-effect */
215 		{_damage_electrical_staff, _alien_damage, 30, 5}, /* damage */
216 
217 		_sometimes_pass_transparent_side|_alien_projectile, /* flags */
218 
219 		WORLD_ONE/8, /* speed */
220 		NONE, /* maximum range */
221 
222 		_normal_frequency, /* sound pitch */
223 		_snd_fighter_projectile_flyby, NONE, /* flyby sound, rebound sound */
224 	},
225 
226 	{	/* player�s flame thrower burst */
227 		_collection_rocket, 6, /* collection number, shape number */
228 		NONE, NONE, /* detonation effect, media_detonation_effect */
229 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
230 		NONE, /* media projectile promotion */
231 
232 		WORLD_ONE/3, /* radius */
233 		0, /* area-of-effect */
234 		{_damage_flame, 0, 8, 4}, /* damage */
235 
236 		_sometimes_pass_transparent_side|_stop_when_animation_loops|_persistent, /* flags */
237 
238 		WORLD_ONE/3, /* speed */
239 		NONE, /* maximum range */
240 
241 		_normal_frequency, /* sound pitch */
242 		NONE, NONE, /* flyby sound, rebound sound */
243 	},
244 
245 	{	/* _projectile_compiler_bolt_minor */
246 		BUILD_COLLECTION(_collection_compiler, 0), 4, /* collection number, shape number */
247 		_effect_compiler_bolt_minor_detonation, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
248 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
249 		NONE, /* media projectile promotion */
250 
251 		0, /* radius */
252 		0, /* area-of-effect */
253 		{_damage_compiler_bolt, _alien_damage, 40, 10}, /* damage */
254 
255 		_sometimes_pass_transparent_side|_alien_projectile, /* flags */
256 
257 		WORLD_ONE/8, /* speed */
258 		NONE, /* maximum range */
259 
260 		_normal_frequency, /* sound pitch */
261 		_snd_compiler_projectile_flyby, NONE, /* flyby sound, rebound sound */
262 	},
263 
264 	{	/* _projectile_compiler_bolt_major */
265 		BUILD_COLLECTION(_collection_compiler, 1), 4, /* collection number, shape number */
266 		_effect_compiler_bolt_major_detonation, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
267 		_effect_compiler_bolt_major_contrail, 0, NONE, /* contrail effect, ticks between contrails, maximum contrails */
268 		NONE, /* media projectile promotion */
269 
270 		0, /* radius */
271 		0, /* area-of-effect */
272 		{_damage_compiler_bolt, _alien_damage, 40, 10}, /* damage */
273 
274 		_sometimes_pass_transparent_side|_alien_projectile|_guided, /* flags */
275 
276 		WORLD_ONE/12, /* speed */
277 		NONE, /* maximum range */
278 
279 		_higher_frequency, /* sound pitch */
280 		_snd_compiler_projectile_flyby, NONE, /* flyby sound, rebound sound */
281 	},
282 
283 	{	/* alien weapon */
284 		_collection_rocket, 22, /* collection number, shape number */
285 		_effect_alien_weapon_ricochet, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
286 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
287 		NONE, /* media projectile promotion */
288 
289 		WORLD_ONE/10, /* radius */
290 		0, /* area-of-effect */
291 		{_damage_alien_projectile, _alien_damage, 20, 8}, /* damage */
292 
293 		_usually_pass_transparent_side|_alien_projectile|_can_toggle_control_panels, /* flags */
294 
295 		WORLD_ONE/4, /* speed */
296 		NONE, /* maximum range */
297 
298 		_snd_enforcer_projectile_flyby, NONE, /* flyby sound, rebound sound */
299 	},
300 
301 	{	/* _projectile_fusion_minor */
302 		_collection_rocket, 11, /* collection number, shape number */
303 		_effect_minor_fusion_detonation, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
304 		NONE, 0, NONE, /* contrail effect, ticks between contrails, maximum contrails */
305 		_projectile_minor_fusion_dispersal, /* media projectile promotion */
306 
307 		WORLD_ONE/20, /* radius */
308 		0, /* area-of-effect */
309 		{_damage_fusion_bolt, 0, 30, 10}, /* damage */
310 
311 		_usually_pass_transparent_side, /* flags */
312 
313 		WORLD_ONE/4, /* speed */
314 		NONE, /* maximum range */
315 
316 		_normal_frequency, /* sound pitch */
317 		_snd_fusion_flyby, NONE, /* flyby sound, rebound sound */
318 	},
319 
320 	{	/* _projectile_fusion_major */
321 		_collection_rocket, 12, /* collection number, shape number */
322 		_effect_major_fusion_detonation, _medium_media_detonation_effect, /* detonation effect, media_detonation_effect */
323 		_effect_major_fusion_contrail, 0, NONE, /* contrail effect, ticks between contrails, maximum contrails */
324 		_projectile_major_fusion_dispersal, /* media projectile promotion */
325 
326 		WORLD_ONE/10, /* radius */
327 		0, /* area-of-effect */
328 		{_damage_fusion_bolt, 0, 80, 20}, /* damage */
329 
330 		_sometimes_pass_transparent_side|_can_toggle_control_panels, /* flags */
331 
332 		WORLD_ONE/3, /* speed */
333 		NONE, /* maximum range */
334 
335 		_higher_frequency, /* sound pitch */
336 		_snd_fusion_flyby, NONE, /* flyby sound, rebound sound */
337 	},
338 
339 	{	/* _projectile_hunter */
340 		BUILD_COLLECTION(_collection_hunter, 0), 5, /* collection number, shape number */
341 		_effect_hunter_projectile_detonation, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
342 		NONE, 0, NONE, /* contrail effect, ticks between contrails, maximum contrails */
343 		NONE, /* media projectile promotion */
344 
345 		0, /* radius */
346 		0, /* area-of-effect */
347 		{_damage_hunter_bolt, 0, 15, 5}, /* damage */
348 
349 		_usually_pass_transparent_side|_alien_projectile, /* flags */
350 
351 		WORLD_ONE/4, /* speed */
352 		NONE, /* maximum range */
353 
354 		_normal_frequency, /* sound pitch */
355 		_snd_hunter_projectile_flyby, NONE, /* flyby sound, rebound sound */
356 	},
357 
358 	{	/* _projectile_fist */
359 		NONE, 0, /* collection number, shape number */
360 		_effect_fist_detonation, NONE, /* detonation effect, media_detonation_effect */
361 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
362 		NONE, /* media projectile promotion */
363 
364 		WORLD_ONE/4, /* radius */
365 		0, /* area-of-effect */
366 		{_damage_fist, 0, 50, 10}, /* damage (will be scaled by player�s velocity) */
367 
368 		_usually_pass_transparent_side|_can_toggle_control_panels|_melee_projectile|_penetrates_media, /* flags */
369 
370 		(3*WORLD_ONE)/4, /* speed */
371 		(3*WORLD_ONE)/4, /* maximum range */
372 
373 		_normal_frequency, /* sound pitch */
374 		NONE, NONE, /* flyby sound, rebound sound */
375 	},
376 
377 	{	/* _projectile_armageddon_sphere */
378 		0
379 	},
380 
381 	{	/* _projectile_armageddon_electricity */
382 		0
383 	},
384 
385 	{ /* _projectile_juggernaut_rocket */
386 		_collection_rocket, 0, /* collection number, shape number */
387 		_effect_rocket_explosion, _medium_media_detonation_effect, /* detonation effect, media_detonation_effect */
388 		_effect_rocket_contrail, 1, NONE, /* contrail effect, ticks between contrails, maximum contrails */
389 		NONE, /* media projectile promotion */
390 
391 		WORLD_ONE/8, /* radius */
392 		WORLD_ONE+WORLD_ONE_HALF, /* area-of-effect */
393 		{_damage_explosion, _alien_damage, 250, 50}, /* damage */
394 
395 		_guided|_can_toggle_control_panels, /* flags */
396 
397 		WORLD_ONE/4, /* speed */
398 		NONE, /* maximum range */
399 
400 		_normal_frequency, /* sound pitch */
401 		NONE, NONE, /* flyby sound, rebound sound */
402 	},
403 
404 	{ /* _projectile_trooper_bullet */
405 		NONE, 0, /* collection number, shape number */
406 		_effect_bullet_ricochet, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
407 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
408 		NONE, /* media projectile promotion */
409 
410 		0, /* radius */
411 		0, /* area-of-effect */
412 		{_damage_projectile, _alien_damage, 15, 4}, /* damage */
413 
414 		_bleeding_projectile|_usually_pass_transparent_side, /* flags */
415 
416 		WORLD_ONE, /* speed */
417 		NONE, /* maximum range */
418 
419 		_normal_frequency, /* sound pitch */
420 		NONE, NONE, /* flyby sound, rebound sound */
421 	},
422 
423 	{ /* _projectile_trooper_grenade */
424 		_collection_trooper, 5, /* collection number, shape number */
425 		_effect_grenade_explosion, _medium_media_detonation_effect, /* detonation effect, media_detonation_effect */
426 		_effect_grenade_contrail, 1, 8, /* contrail effect, ticks between contrails, maximum contrails */
427 		NONE, /* media projectile promotion */
428 
429 		0, /* radius */
430 		WORLD_THREE_FOURTHS, /* area-of-effect */
431 		{_damage_explosion, _alien_damage, 40, 20}, /* damage */
432 
433 		_affected_by_gravity|_can_toggle_control_panels, /* flags */
434 
435 		WORLD_ONE/5, /* speed */
436 		NONE, /* maximum range */
437 
438 		_normal_frequency, /* sound pitch */
439 		NONE, NONE, /* flyby sound, rebound sound */
440 	},
441 
442 	{ /* _projectile_minor_defender */
443 		BUILD_COLLECTION(_collection_defender, 0), 4, /* collection number, shape number */
444 		_effect_minor_defender_detonation, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
445 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
446 		NONE, /* media projectile promotion */
447 
448 		WORLD_ONE/4, /* radius */
449 		0, /* area-of-effect */
450 		{_damage_defender, 0, 30, 8}, /* damage */
451 
452 		_usually_pass_transparent_side, /* flags */
453 
454 		WORLD_ONE/8, /* speed */
455 		NONE, /* maximum range */
456 
457 		_normal_frequency, /* sound pitch */
458 		_snd_defender_flyby, NONE, /* flyby sound, rebound sound */
459 	},
460 
461 	{ /* _projectile_major_defender */
462 		BUILD_COLLECTION(_collection_defender, 1), 4, /* collection number, shape number */
463 		_effect_major_defender_detonation, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
464 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
465 		NONE, /* media projectile promotion */
466 
467 		WORLD_ONE/4, /* radius */
468 		0, /* area-of-effect */
469 		{_damage_defender, 0, 30, 8}, /* damage */
470 
471 		_usually_pass_transparent_side|_guided, /* flags */
472 
473 		WORLD_ONE/6, /* speed */
474 		NONE, /* maximum range */
475 
476 		_higher_frequency, /* sound pitch */
477 		_snd_defender_flyby, NONE, /* flyby sound, rebound sound */
478 	},
479 
480 	{ /* _projectile_juggernaut_missile */
481 		_collection_juggernaut, 4, /* collection number, shape number */
482 		_effect_grenade_explosion, _medium_media_detonation_effect, /* detonation effect, media_detonation_effect */
483 		_effect_juggernaut_missile_contrail, 2, NONE, /* contrail effect, ticks between contrails, maximum contrails */
484 		NONE, /* media projectile promotion */
485 
486 		0, /* radius */
487 		WORLD_THREE_FOURTHS, /* area-of-effect */
488 		{_damage_explosion, _alien_damage, 40, 20}, /* damage */
489 
490 		_affected_by_half_gravity|_can_toggle_control_panels|_guided|_positive_vertical_error, /* flags */
491 
492 		WORLD_ONE/5, /* speed */
493 		NONE, /* maximum range */
494 
495 		_normal_frequency, /* sound pitch */
496 		NONE, NONE, /* flyby sound, rebound sound */
497 	},
498 
499 	{	/* _projectile_minor_energy_drain */
500 		NONE, 0, /* collection number, shape number */
501 		NONE, NONE, /* detonation effect, media_detonation_effect */
502 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
503 		NONE, /* media projectile promotion */
504 
505 		WORLD_ONE/8, /* radius */
506 		0, /* area-of-effect */
507 		{_damage_energy_drain, 0, 4, 0}, /* damage (will be scaled by player�s velocity) */
508 
509 		_melee_projectile|_penetrates_media, /* flags */
510 
511 		(3*WORLD_ONE)/4, /* speed */
512 		(3*WORLD_ONE)/4, /* maximum range */
513 
514 		_normal_frequency, /* sound pitch */
515 		NONE, NONE, /* flyby sound, rebound sound */
516 	},
517 
518 	{	/* _projectile_major_energy_drain */
519 		NONE, 0, /* collection number, shape number */
520 		NONE, NONE, /* detonation effect, media_detonation_effect */
521 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
522 		NONE, /* media projectile promotion */
523 
524 		WORLD_ONE/8, /* radius */
525 		0, /* area-of-effect */
526 		{_damage_energy_drain, 0, 8, 0}, /* damage (will be scaled by player�s velocity) */
527 
528 		_melee_projectile|_penetrates_media, /* flags */
529 
530 		(3*WORLD_ONE)/4, /* speed */
531 		(3*WORLD_ONE)/4, /* maximum range */
532 
533 		_normal_frequency, /* sound pitch */
534 		NONE, NONE, /* flyby sound, rebound sound */
535 	},
536 
537 	{	/* _projectile_oxygen_drain */
538 		NONE, 0, /* collection number, shape number */
539 		NONE, NONE, /* detonation effect, media_detonation_effect */
540 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
541 		NONE, /* media projectile promotion */
542 
543 		WORLD_ONE/8, /* radius */
544 		0, /* area-of-effect */
545 		{_damage_oxygen_drain, 0, 4, 0}, /* damage (will be scaled by player�s velocity) */
546 
547 		_melee_projectile|_penetrates_media, /* flags */
548 
549 		(3*WORLD_ONE)/4, /* speed */
550 		(3*WORLD_ONE)/4, /* maximum range */
551 
552 		_normal_frequency, /* sound pitch */
553 		NONE, NONE, /* flyby sound, rebound sound */
554 	},
555 
556 	{	/* _projectile_hummer_slow */
557 		BUILD_COLLECTION(_collection_hummer, 0), 5, /* collection number, shape number */
558 		_effect_minor_hummer_projectile_detonation, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
559 		NONE, 0, NONE, /* contrail effect, ticks between contrails, maximum contrails */
560 		NONE, /* media projectile promotion */
561 
562 		0, /* radius */
563 		0, /* area-of-effect */
564 		{_damage_hummer_bolt, 0, 15, 5}, /* damage */
565 
566 		_usually_pass_transparent_side|_alien_projectile, /* flags */
567 
568 		WORLD_ONE/8, /* speed */
569 		NONE, /* maximum range */
570 
571 		_normal_frequency, /* sound pitch */
572 		_snd_hummer_projectile_flyby, NONE, /* flyby sound, rebound sound */
573 	},
574 
575 	{	/* _projectile_hummer_fast */
576 		BUILD_COLLECTION(_collection_hummer, 1), 5, /* collection number, shape number */
577 		_effect_major_hummer_projectile_detonation, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
578 		NONE, 0, NONE, /* contrail effect, ticks between contrails, maximum contrails */
579 		NONE, /* media projectile promotion */
580 
581 		0, /* radius */
582 		0, /* area-of-effect */
583 		{_damage_hummer_bolt, 0, 15, 5}, /* damage */
584 
585 		_usually_pass_transparent_side|_alien_projectile, /* flags */
586 
587 		WORLD_ONE/6, /* speed */
588 		NONE, /* maximum range */
589 
590 		_higher_frequency, /* sound pitch */
591 		_snd_hummer_projectile_flyby, NONE, /* flyby sound, rebound sound */
592 	},
593 
594 	{	/* _projectile_hummer_durandal */
595 		BUILD_COLLECTION(_collection_hummer, 1), 5, /* collection number, shape number */
596 		_effect_durandal_hummer_projectile_detonation, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
597 		NONE, 0, NONE, /* contrail effect, ticks between contrails, maximum contrails */
598 		NONE, /* media projectile promotion */
599 
600 		0, /* radius */
601 		0, /* area-of-effect */
602 		{_damage_hummer_bolt, 0, 15, 5}, /* damage */
603 
604 		_guided|_usually_pass_transparent_side|_alien_projectile, /* flags */
605 
606 		WORLD_ONE/8, /* speed */
607 		NONE, /* maximum range */
608 
609 		_lower_frequency, /* sound pitch */
610 		_snd_hummer_projectile_flyby, NONE, /* flyby sound, rebound sound */
611 	},
612 
613 	{	/* _projectile_minor_cyborg_ball */
614 		BUILD_COLLECTION(_collection_cyborg, 0), 6, /* collection number, shape number */
615 		_effect_grenade_explosion, _medium_media_detonation_effect, /* detonation effect, media_detonation_effect */
616 		_effect_grenade_contrail, 1, 8, /* contrail effect, ticks between contrails, maximum contrails */
617 		NONE, /* media projectile promotion */
618 
619 		WORLD_ONE/8, /* radius */
620 		WORLD_ONE, /* area-of-effect */
621 		{_damage_explosion, 0, 20, 10}, /* damage */
622 
623 		_can_toggle_control_panels|_sometimes_pass_transparent_side|_alien_projectile|_rebounds_from_floor|_doubly_affected_by_gravity, /* flags */
624 
625 		WORLD_ONE/10, /* speed */
626 		NONE, /* maximum range */
627 
628 		_normal_frequency, /* sound pitch */
629 		_snd_cyborg_projectile_flyby, _snd_cyborg_projectile_bounce, /* flyby sound, rebound sound */
630 	},
631 
632 	{	/* _projectile_major_cyborg_ball */
633 		BUILD_COLLECTION(_collection_cyborg, 1), 6, /* collection number, shape number */
634 		_effect_grenade_explosion, _medium_media_detonation_effect, /* detonation effect, media_detonation_effect */
635 		_effect_grenade_contrail, 1, 8, /* contrail effect, ticks between contrails, maximum contrails */
636 		NONE, /* media projectile promotion */
637 
638 		WORLD_ONE/8, /* radius */
639 		WORLD_ONE, /* area-of-effect */
640 		{_damage_explosion, 0, 40, 10}, /* damage */
641 
642 		_guided|_can_toggle_control_panels|_sometimes_pass_transparent_side|_alien_projectile|_rebounds_from_floor|_doubly_affected_by_gravity, /* flags */
643 
644 		WORLD_ONE/8, /* speed */
645 		NONE, /* maximum range */
646 
647 		_lower_frequency, /* sound pitch */
648 		_snd_cyborg_projectile_flyby, _snd_cyborg_projectile_bounce, /* flyby sound, rebound sound */
649 	},
650 
651 	{	/* _projectile_ball */
652 		BUILD_COLLECTION(_collection_player, 0), 0, /* collection number, shape number */
653 		NONE, NONE, /* detonation effect, media_detonation_effect */
654 		NONE, 1, 8, /* contrail effect, ticks between contrails, maximum contrails */
655 		NONE, /* media projectile promotion */
656 
657 		WORLD_ONE/4, /* radius */
658 		NONE, /* area-of-effect */
659 		{NONE, 0, 40, 10}, /* damage */
660 
661 		_persistent_and_virulent|_penetrates_media|_becomes_item_on_detonation|_can_toggle_control_panels|_rebounds_from_floor|_doubly_affected_by_gravity|_penetrates_media, /* flags */
662 
663 		0, /* speed */
664 		NONE, /* maximum range */
665 
666 		_normal_frequency, /* sound pitch */
667 		NONE, _snd_ball_bounce, /* flyby sound, rebound sound */
668 	},
669 
670 	{	/* _projectile_minor_fusion_dispersal */
671 		_collection_rocket, 11, /* collection number, shape number */
672 		_effect_minor_fusion_dispersal, NONE, /* detonation effect, media_detonation_effect */
673 		NONE, 0, NONE, /* contrail effect, ticks between contrails, maximum contrails */
674 		NONE, /* media projectile promotion */
675 
676 		WORLD_ONE/20, /* radius */
677 		WORLD_ONE, /* area-of-effect */
678 		{_damage_fusion_bolt, 0, 30, 10}, /* damage */
679 
680 		0, /* flags */
681 
682 		WORLD_ONE/4, /* speed */
683 		NONE, /* maximum range */
684 
685 		_normal_frequency, /* sound pitch */
686 		_snd_fusion_flyby, NONE, /* flyby sound, rebound sound */
687 	},
688 
689 	{	/* _projectile_major_fusion_dispersal */
690 		_collection_rocket, 12, /* collection number, shape number */
691 		_effect_major_fusion_dispersal, NONE, /* detonation effect, media_detonation_effect */
692 		NONE, 0, NONE, /* contrail effect, ticks between contrails, maximum contrails */
693 		NONE, /* media projectile promotion */
694 
695 		WORLD_ONE/10, /* radius */
696 		2*WORLD_ONE, /* area-of-effect */
697 		{_damage_fusion_bolt, 0, 80, 20}, /* damage */
698 
699 		0, /* flags */
700 
701 		WORLD_ONE/3, /* speed */
702 		NONE, /* maximum range */
703 
704 		_higher_frequency, /* sound pitch */
705 		_snd_fusion_flyby, NONE, /* flyby sound, rebound sound */
706 	},
707 
708 	{	/* _projectile_overloaded_fusion_dispersal */
709 		_collection_rocket, 12, /* collection number, shape number */
710 		_effect_overloaded_fusion_dispersal, NONE, /* detonation effect, media_detonation_effect */
711 		NONE, 0, NONE, /* contrail effect, ticks between contrails, maximum contrails */
712 		NONE, /* media projectile promotion */
713 
714 		WORLD_ONE/10, /* radius */
715 		4*WORLD_ONE, /* area-of-effect */
716 		{_damage_fusion_bolt, 0, 500, 0}, /* damage */
717 
718 		0, /* flags */
719 
720 		WORLD_ONE/3, /* speed */
721 		NONE, /* maximum range */
722 
723 		_lower_frequency, /* sound pitch */
724 		_snd_fusion_flyby, NONE, /* flyby sound, rebound sound */
725 	},
726 
727 	{	/* _projectile_yeti */
728 		NONE, 0, /* collection number, shape number */
729 		_effect_yeti_melee_detonation, NONE, /* detonation effect, media_detonation_effect */
730 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
731 		NONE, /* media projectile promotion */
732 
733 		0, /* radius */
734 		0, /* area-of-effect */
735 		{_damage_yeti_claws, _alien_damage, 20, 5}, /* damage */
736 
737 		_sometimes_pass_transparent_side|_alien_projectile|_melee_projectile|_penetrates_media, /* flags */
738 
739 		WORLD_ONE_HALF, /* speed */
740 		WORLD_ONE, /* maximum range */
741 
742 		_normal_frequency, /* sound pitch */
743 		NONE, NONE, /* flyby sound, rebound sound */
744 	},
745 
746 	{	/* _projectile_sewage_yeti */
747 		BUILD_COLLECTION(_collection_yeti, 0), 10, /* collection number, shape number */
748 		_effect_sewage_yeti_projectile_detonation, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
749 		NONE, 0, NONE, /* contrail effect, ticks between contrails, maximum contrails */
750 		NONE, /* media projectile promotion */
751 
752 		0, /* radius */
753 		0, /* area-of-effect */
754 		{_damage_yeti_projectile, 0, 15, 5}, /* damage */
755 
756 		_usually_pass_transparent_side|_alien_projectile|_affected_by_half_gravity, /* flags */
757 
758 		WORLD_ONE/8, /* speed */
759 		NONE, /* maximum range */
760 
761 		_normal_frequency, /* sound pitch */
762 		_snd_yeti_projectile_sewage_flyby, NONE, /* flyby sound, rebound sound */
763 	},
764 
765 	{	/* _projectile_lava_yeti */
766 		BUILD_COLLECTION(_collection_yeti, 2), 6, /* collection number, shape number */
767 		_effect_lava_yeti_projectile_detonation, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
768 		NONE, 0, NONE, /* contrail effect, ticks between contrails, maximum contrails */
769 		NONE, /* media projectile promotion */
770 
771 		0, /* radius */
772 		0, /* area-of-effect */
773 		{_damage_flame, 0, 30, 10}, /* damage */
774 
775 		_usually_pass_transparent_side|_alien_projectile, /* flags */
776 
777 		WORLD_ONE/8, /* speed */
778 		NONE, /* maximum range */
779 
780 		_normal_frequency, /* sound pitch */
781 		_snd_yeti_projectile_lava_flyby, NONE, /* flyby sound, rebound sound */
782 	},
783 
784 	// LP addition: SMG bullet is a clone of the rifle one, except for entering/exiting liquids
785 	{	/* player�s smg bullet */
786 		NONE, 0, /* collection number, shape number */
787 		_effect_bullet_ricochet, _small_media_detonation_effect, /* detonation effect, media_detonation_effect */
788 		NONE, 0, 0, /* contrail effect, ticks between contrails, maximum contrails */
789 		NONE, /* media projectile promotion */
790 
791 		0, /* radius */
792 		0, /* area-of-effect */
793 		{_damage_projectile, 0, 9, 6}, /* damage */
794 
795 		_bleeding_projectile|_usually_pass_transparent_side|_penetrates_media_boundary, /* flags */
796 
797 		WORLD_ONE, /* speed */
798 		NONE, /* maximum range */
799 
800 		_normal_frequency, /* sound pitch */
801 		NONE, NONE, /* flyby sound, rebound sound */
802 	},
803 };
804 
805 // Added for the convenience of the 1-2-3 Converter
806 uint8 *unpack_projectile_definition(uint8 *Stream, projectile_definition *Objects, size_t Count);
807 uint8 *pack_projectile_definition(uint8 *Stream, projectile_definition *Objects, size_t Count);
808 
809 #endif
810 
811 #endif
812 
813