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