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