1 /*
2 Copyright (C) 1997-2001 Id Software, Inc.
3 
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 
13 See the GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 
19 */
20 /*
21 ==============================================================================
22 
23 chick
24 
25 ==============================================================================
26 */
27 
28 #include "g_local.h"
29 #include "m_chick.h"
30 
31 qboolean visible (edict_t *self, edict_t *other);
32 
33 void chick_stand (edict_t *self);
34 void chick_run (edict_t *self);
35 void chick_reslash(edict_t *self);
36 void chick_rerocket(edict_t *self);
37 void chick_attack1(edict_t *self);
38 
39 static int	sound_missile_prelaunch;
40 static int	sound_missile_launch;
41 static int	sound_melee_swing;
42 static int	sound_melee_hit;
43 static int	sound_missile_reload;
44 static int	sound_death1;
45 static int	sound_death2;
46 static int	sound_fall_down;
47 static int	sound_idle1;
48 static int	sound_idle2;
49 static int	sound_pain1;
50 static int	sound_pain2;
51 static int	sound_pain3;
52 static int	sound_sight;
53 static int	sound_search;
54 
55 
ChickMoan(edict_t * self)56 void ChickMoan (edict_t *self)
57 {
58 	if (random() < 0.5)
59 		gi.sound (self, CHAN_VOICE, sound_idle1, 1, ATTN_IDLE, 0);
60 	else
61 		gi.sound (self, CHAN_VOICE, sound_idle2, 1, ATTN_IDLE, 0);
62 }
63 
64 mframe_t chick_frames_fidget [] =
65 {
66 	{ai_stand, 0,  NULL},
67 	{ai_stand, 0,  NULL},
68 	{ai_stand, 0,  NULL},
69 	{ai_stand, 0,  NULL},
70 	{ai_stand, 0,  NULL},
71 	{ai_stand, 0,  NULL},
72 	{ai_stand, 0,  NULL},
73 	{ai_stand, 0,  NULL},
74 	{ai_stand, 0,  ChickMoan},
75 	{ai_stand, 0,  NULL},
76 	{ai_stand, 0,  NULL},
77 	{ai_stand, 0,  NULL},
78 	{ai_stand, 0,  NULL},
79 	{ai_stand, 0,  NULL},
80 	{ai_stand, 0,  NULL},
81 	{ai_stand, 0,  NULL},
82 	{ai_stand, 0,  NULL},
83 	{ai_stand, 0,  NULL},
84 	{ai_stand, 0,  NULL},
85 	{ai_stand, 0,  NULL},
86 	{ai_stand, 0,  NULL},
87 	{ai_stand, 0,  NULL},
88 	{ai_stand, 0,  NULL},
89 	{ai_stand, 0,  NULL},
90 	{ai_stand, 0,  NULL},
91 	{ai_stand, 0,  NULL},
92 	{ai_stand, 0,  NULL},
93 	{ai_stand, 0,  NULL},
94 	{ai_stand, 0,  NULL},
95 	{ai_stand, 0,  NULL}
96 };
97 mmove_t chick_move_fidget = {FRAME_stand201, FRAME_stand230, chick_frames_fidget, chick_stand};
98 
chick_fidget(edict_t * self)99 void chick_fidget (edict_t *self)
100 {
101 	if (self->monsterinfo.aiflags & AI_STAND_GROUND)
102 		return;
103 	if (random() <= 0.3)
104 		self->monsterinfo.currentmove = &chick_move_fidget;
105 }
106 
107 mframe_t chick_frames_stand [] =
108 {
109 	{ai_stand, 0, NULL},
110 	{ai_stand, 0, NULL},
111 	{ai_stand, 0, NULL},
112 	{ai_stand, 0, NULL},
113 	{ai_stand, 0, NULL},
114 	{ai_stand, 0, NULL},
115 	{ai_stand, 0, NULL},
116 	{ai_stand, 0, NULL},
117 	{ai_stand, 0, NULL},
118 	{ai_stand, 0, NULL},
119 	{ai_stand, 0, NULL},
120 	{ai_stand, 0, NULL},
121 	{ai_stand, 0, NULL},
122 	{ai_stand, 0, NULL},
123 	{ai_stand, 0, NULL},
124 	{ai_stand, 0, NULL},
125 	{ai_stand, 0, NULL},
126 	{ai_stand, 0, NULL},
127 	{ai_stand, 0, NULL},
128 	{ai_stand, 0, NULL},
129 	{ai_stand, 0, NULL},
130 	{ai_stand, 0, NULL},
131 	{ai_stand, 0, NULL},
132 	{ai_stand, 0, NULL},
133 	{ai_stand, 0, NULL},
134 	{ai_stand, 0, NULL},
135 	{ai_stand, 0, NULL},
136 	{ai_stand, 0, NULL},
137 	{ai_stand, 0, NULL},
138 	{ai_stand, 0, chick_fidget},
139 
140 };
141 mmove_t chick_move_stand = {FRAME_stand101, FRAME_stand130, chick_frames_stand, NULL};
142 
chick_stand(edict_t * self)143 void chick_stand (edict_t *self)
144 {
145 	self->monsterinfo.currentmove = &chick_move_stand;
146 }
147 
148 mframe_t chick_frames_start_run [] =
149 {
150 	{ai_run, 1,  NULL},
151 	{ai_run, 0,  NULL},
152 	{ai_run, 0,	 NULL},
153 	{ai_run, -1, NULL},
154 	{ai_run, -1, NULL},
155 	{ai_run, 0,  NULL},
156 	{ai_run, 1,  NULL},
157 	{ai_run, 3,  NULL},
158 	{ai_run, 6,	 NULL},
159 	{ai_run, 3,	 NULL}
160 };
161 mmove_t chick_move_start_run = {FRAME_walk01, FRAME_walk10, chick_frames_start_run, chick_run};
162 
163 mframe_t chick_frames_run [] =
164 {
165 	{ai_run, 6,	NULL},
166 	{ai_run, 8,  NULL},
167 	{ai_run, 13, NULL},
168 	{ai_run, 5,  NULL},
169 	{ai_run, 7,  NULL},
170 	{ai_run, 4,  NULL},
171 	{ai_run, 11, NULL},
172 	{ai_run, 5,  NULL},
173 	{ai_run, 9,  NULL},
174 	{ai_run, 7,  NULL}
175 
176 };
177 
178 mmove_t chick_move_run = {FRAME_walk11, FRAME_walk20, chick_frames_run, NULL};
179 
180 mframe_t chick_frames_walk [] =
181 {
182 	{ai_walk, 6,	 NULL},
183 	{ai_walk, 8,  NULL},
184 	{ai_walk, 13, NULL},
185 	{ai_walk, 5,  NULL},
186 	{ai_walk, 7,  NULL},
187 	{ai_walk, 4,  NULL},
188 	{ai_walk, 11, NULL},
189 	{ai_walk, 5,  NULL},
190 	{ai_walk, 9,  NULL},
191 	{ai_walk, 7,  NULL}
192 };
193 
194 mmove_t chick_move_walk = {FRAME_walk11, FRAME_walk20, chick_frames_walk, NULL};
195 
chick_walk(edict_t * self)196 void chick_walk (edict_t *self)
197 {
198 	self->monsterinfo.currentmove = &chick_move_walk;
199 }
200 
chick_run(edict_t * self)201 void chick_run (edict_t *self)
202 {
203 	if (self->monsterinfo.aiflags & AI_STAND_GROUND)
204 	{
205 		self->monsterinfo.currentmove = &chick_move_stand;
206 		return;
207 	}
208 
209 	if (self->monsterinfo.currentmove == &chick_move_walk ||
210 		self->monsterinfo.currentmove == &chick_move_start_run)
211 	{
212 		self->monsterinfo.currentmove = &chick_move_run;
213 	}
214 	else
215 	{
216 		self->monsterinfo.currentmove = &chick_move_start_run;
217 	}
218 }
219 
220 mframe_t chick_frames_pain1 [] =
221 {
222 	{ai_move, 0, NULL},
223 	{ai_move, 0, NULL},
224 	{ai_move, 0, NULL},
225 	{ai_move, 0, NULL},
226 	{ai_move, 0, NULL}
227 };
228 mmove_t chick_move_pain1 = {FRAME_pain101, FRAME_pain105, chick_frames_pain1, chick_run};
229 
230 mframe_t chick_frames_pain2 [] =
231 {
232 	{ai_move, 0, NULL},
233 	{ai_move, 0, NULL},
234 	{ai_move, 0, NULL},
235 	{ai_move, 0, NULL},
236 	{ai_move, 0, NULL}
237 };
238 mmove_t chick_move_pain2 = {FRAME_pain201, FRAME_pain205, chick_frames_pain2, chick_run};
239 
240 mframe_t chick_frames_pain3 [] =
241 {
242 	{ai_move, 0,		NULL},
243 	{ai_move, 0,		NULL},
244 	{ai_move, -6,	NULL},
245 	{ai_move, 3,		NULL},
246 	{ai_move, 11,	NULL},
247 	{ai_move, 3,		NULL},
248 	{ai_move, 0,		NULL},
249 	{ai_move, 0,		NULL},
250 	{ai_move, 4,		NULL},
251 	{ai_move, 1,		NULL},
252 	{ai_move, 0,		NULL},
253 	{ai_move, -3,	NULL},
254 	{ai_move, -4,	NULL},
255 	{ai_move, 5,		NULL},
256 	{ai_move, 7,		NULL},
257 	{ai_move, -2,	NULL},
258 	{ai_move, 3,		NULL},
259 	{ai_move, -5,	NULL},
260 	{ai_move, -2,	NULL},
261 	{ai_move, -8,	NULL},
262 	{ai_move, 2,		NULL}
263 };
264 mmove_t chick_move_pain3 = {FRAME_pain301, FRAME_pain321, chick_frames_pain3, chick_run};
265 
chick_pain(edict_t * self,edict_t * other,float kick,int damage)266 void chick_pain (edict_t *self, edict_t *other, float kick, int damage)
267 {
268 	float	r;
269 
270 	if (self->health < (self->max_health / 2))
271 		self->s.skinnum = 1;
272 
273 	if (level.time < self->pain_debounce_time)
274 		return;
275 
276 	self->pain_debounce_time = level.time + 3;
277 
278 	r = random();
279 	if (r < 0.33)
280 		gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
281 	else if (r < 0.66)
282 		gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
283 	else
284 		gi.sound (self, CHAN_VOICE, sound_pain3, 1, ATTN_NORM, 0);
285 
286 	if (skill->value == 3)
287 		return;		// no pain anims in nightmare
288 
289 	if (damage <= 10)
290 		self->monsterinfo.currentmove = &chick_move_pain1;
291 	else if (damage <= 25)
292 		self->monsterinfo.currentmove = &chick_move_pain2;
293 	else
294 		self->monsterinfo.currentmove = &chick_move_pain3;
295 }
296 
chick_dead(edict_t * self)297 void chick_dead (edict_t *self)
298 {
299 	VectorSet (self->mins, -16, -16, 0);
300 	VectorSet (self->maxs, 16, 16, 16);
301 	self->movetype = MOVETYPE_TOSS;
302 	self->svflags |= SVF_DEADMONSTER;
303 	self->nextthink = 0;
304 	gi.linkentity (self);
305 }
306 
307 mframe_t chick_frames_death2 [] =
308 {
309 	{ai_move, -6, NULL},
310 	{ai_move, 0,  NULL},
311 	{ai_move, -1,  NULL},
312 	{ai_move, -5, NULL},
313 	{ai_move, 0, NULL},
314 	{ai_move, -1,  NULL},
315 	{ai_move, -2,  NULL},
316 	{ai_move, 1,  NULL},
317 	{ai_move, 10, NULL},
318 	{ai_move, 2,  NULL},
319 	{ai_move, 3,  NULL},
320 	{ai_move, 1,  NULL},
321 	{ai_move, 2, NULL},
322 	{ai_move, 0,  NULL},
323 	{ai_move, 3,  NULL},
324 	{ai_move, 3,  NULL},
325 	{ai_move, 1,  NULL},
326 	{ai_move, -3,  NULL},
327 	{ai_move, -5, NULL},
328 	{ai_move, 4, NULL},
329 	{ai_move, 15, NULL},
330 	{ai_move, 14, NULL},
331 	{ai_move, 1, NULL}
332 };
333 mmove_t chick_move_death2 = {FRAME_death201, FRAME_death223, chick_frames_death2, chick_dead};
334 
335 mframe_t chick_frames_death1 [] =
336 {
337 	{ai_move, 0,  NULL},
338 	{ai_move, 0,  NULL},
339 	{ai_move, -7, NULL},
340 	{ai_move, 4,  NULL},
341 	{ai_move, 11, NULL},
342 	{ai_move, 0,  NULL},
343 	{ai_move, 0,  NULL},
344 	{ai_move, 0,  NULL},
345 	{ai_move, 0,  NULL},
346 	{ai_move, 0,  NULL},
347 	{ai_move, 0,  NULL},
348 	{ai_move, 0,  NULL}
349 
350 };
351 mmove_t chick_move_death1 = {FRAME_death101, FRAME_death112, chick_frames_death1, chick_dead};
352 
chick_die(edict_t * self,edict_t * inflictor,edict_t * attacker,int damage,vec3_t point)353 void chick_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
354 {
355 	int		n;
356 
357 // check for gib
358 	if (self->health <= self->gib_health)
359 	{
360 		gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
361 		for (n= 0; n < 2; n++)
362 			ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
363 		for (n= 0; n < 4; n++)
364 			ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
365 		ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
366 		self->deadflag = DEAD_DEAD;
367 		return;
368 	}
369 
370 	if (self->deadflag == DEAD_DEAD)
371 		return;
372 
373 // regular death
374 	self->deadflag = DEAD_DEAD;
375 	self->takedamage = DAMAGE_YES;
376 
377 	n = rand() % 2;
378 	if (n == 0)
379 	{
380 		self->monsterinfo.currentmove = &chick_move_death1;
381 		gi.sound (self, CHAN_VOICE, sound_death1, 1, ATTN_NORM, 0);
382 	}
383 	else
384 	{
385 		self->monsterinfo.currentmove = &chick_move_death2;
386 		gi.sound (self, CHAN_VOICE, sound_death2, 1, ATTN_NORM, 0);
387 	}
388 }
389 
390 
chick_duck_down(edict_t * self)391 void chick_duck_down (edict_t *self)
392 {
393 	if (self->monsterinfo.aiflags & AI_DUCKED)
394 		return;
395 	self->monsterinfo.aiflags |= AI_DUCKED;
396 	self->maxs[2] -= 32;
397 	self->takedamage = DAMAGE_YES;
398 	self->monsterinfo.pausetime = level.time + 1;
399 	gi.linkentity (self);
400 }
401 
chick_duck_hold(edict_t * self)402 void chick_duck_hold (edict_t *self)
403 {
404 	if (level.time >= self->monsterinfo.pausetime)
405 		self->monsterinfo.aiflags &= ~AI_HOLD_FRAME;
406 	else
407 		self->monsterinfo.aiflags |= AI_HOLD_FRAME;
408 }
409 
chick_duck_up(edict_t * self)410 void chick_duck_up (edict_t *self)
411 {
412 	self->monsterinfo.aiflags &= ~AI_DUCKED;
413 	self->maxs[2] += 32;
414 	self->takedamage = DAMAGE_AIM;
415 	gi.linkentity (self);
416 }
417 
418 mframe_t chick_frames_duck [] =
419 {
420 	{ai_move, 0, chick_duck_down},
421 	{ai_move, 1, NULL},
422 	{ai_move, 4, chick_duck_hold},
423 	{ai_move, -4,  NULL},
424 	{ai_move, -5,  chick_duck_up},
425 	{ai_move, 3, NULL},
426 	{ai_move, 1,  NULL}
427 };
428 mmove_t chick_move_duck = {FRAME_duck01, FRAME_duck07, chick_frames_duck, chick_run};
429 
chick_dodge(edict_t * self,edict_t * attacker,float eta)430 void chick_dodge (edict_t *self, edict_t *attacker, float eta)
431 {
432 	if (random() > 0.25)
433 		return;
434 
435 	if (!self->enemy)
436 		self->enemy = attacker;
437 
438 	self->monsterinfo.currentmove = &chick_move_duck;
439 }
440 
ChickSlash(edict_t * self)441 void ChickSlash (edict_t *self)
442 {
443 	vec3_t	aim;
444 
445 	VectorSet (aim, MELEE_DISTANCE, self->mins[0], 10);
446 	gi.sound (self, CHAN_WEAPON, sound_melee_swing, 1, ATTN_NORM, 0);
447 	fire_hit (self, aim, (10 + (rand() %6)), 100);
448 }
449 
450 
ChickRocket(edict_t * self)451 void ChickRocket (edict_t *self)
452 {
453 	vec3_t	forward, right;
454 	vec3_t	start;
455 	vec3_t	dir;
456 	vec3_t	vec;
457 
458 	AngleVectors (self->s.angles, forward, right, NULL);
459 	G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_CHICK_ROCKET_1], forward, right, start);
460 
461 	VectorCopy (self->enemy->s.origin, vec);
462 	vec[2] += self->enemy->viewheight;
463 	VectorSubtract (vec, start, dir);
464 	VectorNormalize (dir);
465 
466 	monster_fire_rocket (self, start, dir, 50, 500, MZ2_CHICK_ROCKET_1);
467 }
468 
Chick_PreAttack1(edict_t * self)469 void Chick_PreAttack1 (edict_t *self)
470 {
471 	gi.sound (self, CHAN_VOICE, sound_missile_prelaunch, 1, ATTN_NORM, 0);
472 }
473 
ChickReload(edict_t * self)474 void ChickReload (edict_t *self)
475 {
476 	gi.sound (self, CHAN_VOICE, sound_missile_reload, 1, ATTN_NORM, 0);
477 }
478 
479 
480 mframe_t chick_frames_start_attack1 [] =
481 {
482 	{ai_charge, 0,	Chick_PreAttack1},
483 	{ai_charge, 0,	NULL},
484 	{ai_charge, 0,	NULL},
485 	{ai_charge, 4,	NULL},
486 	{ai_charge, 0,	NULL},
487 	{ai_charge, -3,  NULL},
488 	{ai_charge, 3,	NULL},
489 	{ai_charge, 5,	NULL},
490 	{ai_charge, 7,	NULL},
491 	{ai_charge, 0,	NULL},
492 	{ai_charge, 0,	NULL},
493 	{ai_charge, 0,	NULL},
494 	{ai_charge, 0,	chick_attack1}
495 };
496 mmove_t chick_move_start_attack1 = {FRAME_attak101, FRAME_attak113, chick_frames_start_attack1, NULL};
497 
498 
499 mframe_t chick_frames_attack1 [] =
500 {
501 	{ai_charge, 19,	ChickRocket},
502 	{ai_charge, -6,	NULL},
503 	{ai_charge, -5,	NULL},
504 	{ai_charge, -2,	NULL},
505 	{ai_charge, -7,	NULL},
506 	{ai_charge, 0,	NULL},
507 	{ai_charge, 1,	NULL},
508 	{ai_charge, 10,	ChickReload},
509 	{ai_charge, 4,	NULL},
510 	{ai_charge, 5,	NULL},
511 	{ai_charge, 6,	NULL},
512 	{ai_charge, 6,	NULL},
513 	{ai_charge, 4,	NULL},
514 	{ai_charge, 3,	chick_rerocket}
515 
516 };
517 mmove_t chick_move_attack1 = {FRAME_attak114, FRAME_attak127, chick_frames_attack1, NULL};
518 
519 mframe_t chick_frames_end_attack1 [] =
520 {
521 	{ai_charge, -3,	NULL},
522 	{ai_charge, 0,	NULL},
523 	{ai_charge, -6,	NULL},
524 	{ai_charge, -4,	NULL},
525 	{ai_charge, -2,  NULL}
526 };
527 mmove_t chick_move_end_attack1 = {FRAME_attak128, FRAME_attak132, chick_frames_end_attack1, chick_run};
528 
chick_rerocket(edict_t * self)529 void chick_rerocket(edict_t *self)
530 {
531 	if (self->enemy->health > 0)
532 	{
533 		if (range (self, self->enemy) > RANGE_MELEE)
534 			if ( visible (self, self->enemy) )
535 				if (random() <= 0.6)
536 				{
537 					self->monsterinfo.currentmove = &chick_move_attack1;
538 					return;
539 				}
540 	}
541 	self->monsterinfo.currentmove = &chick_move_end_attack1;
542 }
543 
chick_attack1(edict_t * self)544 void chick_attack1(edict_t *self)
545 {
546 	self->monsterinfo.currentmove = &chick_move_attack1;
547 }
548 
549 mframe_t chick_frames_slash [] =
550 {
551 	{ai_charge, 1,	NULL},
552 	{ai_charge, 7,	ChickSlash},
553 	{ai_charge, -7,	NULL},
554 	{ai_charge, 1,	NULL},
555 	{ai_charge, -1,	NULL},
556 	{ai_charge, 1,	NULL},
557 	{ai_charge, 0,	NULL},
558 	{ai_charge, 1,	NULL},
559 	{ai_charge, -2,	chick_reslash}
560 };
561 mmove_t chick_move_slash = {FRAME_attak204, FRAME_attak212, chick_frames_slash, NULL};
562 
563 mframe_t chick_frames_end_slash [] =
564 {
565 	{ai_charge, -6,	NULL},
566 	{ai_charge, -1,	NULL},
567 	{ai_charge, -6,	NULL},
568 	{ai_charge, 0,	NULL}
569 };
570 mmove_t chick_move_end_slash = {FRAME_attak213, FRAME_attak216, chick_frames_end_slash, chick_run};
571 
572 
chick_reslash(edict_t * self)573 void chick_reslash(edict_t *self)
574 {
575 	if (self->enemy->health > 0)
576 	{
577 		if (range (self, self->enemy) == RANGE_MELEE) {
578 			if (random() <= 0.9)
579 			{
580 				self->monsterinfo.currentmove = &chick_move_slash;
581 				return;
582 			}
583 			else
584 			{
585 				self->monsterinfo.currentmove = &chick_move_end_slash;
586 				return;
587 			}
588 		}
589 	}
590 	self->monsterinfo.currentmove = &chick_move_end_slash;
591 }
592 
chick_slash(edict_t * self)593 void chick_slash(edict_t *self)
594 {
595 	self->monsterinfo.currentmove = &chick_move_slash;
596 }
597 
598 
599 mframe_t chick_frames_start_slash [] =
600 {
601 	{ai_charge, 1,	NULL},
602 	{ai_charge, 8,	NULL},
603 	{ai_charge, 3,	NULL}
604 };
605 mmove_t chick_move_start_slash = {FRAME_attak201, FRAME_attak203, chick_frames_start_slash, chick_slash};
606 
607 
608 
chick_melee(edict_t * self)609 void chick_melee(edict_t *self)
610 {
611 	self->monsterinfo.currentmove = &chick_move_start_slash;
612 }
613 
614 
chick_attack(edict_t * self)615 void chick_attack(edict_t *self)
616 {
617 	self->monsterinfo.currentmove = &chick_move_start_attack1;
618 }
619 
chick_sight(edict_t * self,edict_t * other)620 void chick_sight(edict_t *self, edict_t *other)
621 {
622 	gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
623 }
624 
625 /*QUAKED monster_chick (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
626 */
SP_monster_chick(edict_t * self)627 void SP_monster_chick (edict_t *self)
628 {
629 	if (deathmatch->value)
630 	{
631 		G_FreeEdict (self);
632 		return;
633 	}
634 
635 	sound_missile_prelaunch	= gi.soundindex ("chick/chkatck1.wav");
636 	sound_missile_launch	= gi.soundindex ("chick/chkatck2.wav");
637 	sound_melee_swing		= gi.soundindex ("chick/chkatck3.wav");
638 	sound_melee_hit			= gi.soundindex ("chick/chkatck4.wav");
639 	sound_missile_reload	= gi.soundindex ("chick/chkatck5.wav");
640 	sound_death1			= gi.soundindex ("chick/chkdeth1.wav");
641 	sound_death2			= gi.soundindex ("chick/chkdeth2.wav");
642 	sound_fall_down			= gi.soundindex ("chick/chkfall1.wav");
643 	sound_idle1				= gi.soundindex ("chick/chkidle1.wav");
644 	sound_idle2				= gi.soundindex ("chick/chkidle2.wav");
645 	sound_pain1				= gi.soundindex ("chick/chkpain1.wav");
646 	sound_pain2				= gi.soundindex ("chick/chkpain2.wav");
647 	sound_pain3				= gi.soundindex ("chick/chkpain3.wav");
648 	sound_sight				= gi.soundindex ("chick/chksght1.wav");
649 	sound_search			= gi.soundindex ("chick/chksrch1.wav");
650 
651 	self->movetype = MOVETYPE_STEP;
652 	self->solid = SOLID_BBOX;
653 	self->s.modelindex = gi.modelindex ("models/monsters/bitch/tris.md2");
654 	VectorSet (self->mins, -16, -16, 0);
655 	VectorSet (self->maxs, 16, 16, 56);
656 
657 	self->health = 175;
658 	self->gib_health = -70;
659 	self->mass = 200;
660 
661 	self->pain = chick_pain;
662 	self->die = chick_die;
663 
664 	self->monsterinfo.stand = chick_stand;
665 	self->monsterinfo.walk = chick_walk;
666 	self->monsterinfo.run = chick_run;
667 	self->monsterinfo.dodge = chick_dodge;
668 	self->monsterinfo.attack = chick_attack;
669 	self->monsterinfo.melee = chick_melee;
670 	self->monsterinfo.sight = chick_sight;
671 
672 	gi.linkentity (self);
673 
674 	self->monsterinfo.currentmove = &chick_move_stand;
675 	self->monsterinfo.scale = MODEL_SCALE;
676 
677 	walkmonster_start (self);
678 }
679