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