Quake II RTX doxygen  1.0 dev
m_mutant.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 mutant
22 
23 ==============================================================================
24 */
25 
26 #include "g_local.h"
27 #include "m_mutant.h"
28 
29 
30 static int sound_swing;
31 static int sound_hit;
32 static int sound_hit2;
33 static int sound_death;
34 static int sound_idle;
35 static int sound_pain1;
36 static int sound_pain2;
37 static int sound_sight;
38 static int sound_search;
39 static int sound_step1;
40 static int sound_step2;
41 static int sound_step3;
42 static int sound_thud;
43 
44 //
45 // SOUNDS
46 //
47 
48 void mutant_step(edict_t *self)
49 {
50  int n;
51  n = (rand() + 1) % 3;
52  if (n == 0)
53  gi.sound(self, CHAN_VOICE, sound_step1, 1, ATTN_NORM, 0);
54  else if (n == 1)
55  gi.sound(self, CHAN_VOICE, sound_step2, 1, ATTN_NORM, 0);
56  else
57  gi.sound(self, CHAN_VOICE, sound_step3, 1, ATTN_NORM, 0);
58 }
59 
60 void mutant_sight(edict_t *self, edict_t *other)
61 {
62  gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
63 }
64 
65 void mutant_search(edict_t *self)
66 {
67  gi.sound(self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
68 }
69 
70 void mutant_swing(edict_t *self)
71 {
72  gi.sound(self, CHAN_VOICE, sound_swing, 1, ATTN_NORM, 0);
73 }
74 
75 
76 //
77 // STAND
78 //
79 
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 }, // 10
91 
92  { ai_stand, 0, NULL },
93  { ai_stand, 0, NULL },
94  { ai_stand, 0, NULL },
95  { ai_stand, 0, NULL },
96  { ai_stand, 0, NULL },
97  { ai_stand, 0, NULL },
98  { ai_stand, 0, NULL },
99  { ai_stand, 0, NULL },
100  { ai_stand, 0, NULL },
101  { ai_stand, 0, NULL }, // 20
102 
103  { ai_stand, 0, NULL },
104  { ai_stand, 0, NULL },
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 }, // 30
113 
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 }, // 40
124 
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 }, // 50
135 
136  { ai_stand, 0, NULL }
137 };
139 
140 void mutant_stand(edict_t *self)
141 {
142  self->monsterinfo.currentmove = &mutant_move_stand;
143 }
144 
145 
146 //
147 // IDLE
148 //
149 
150 void mutant_idle_loop(edict_t *self)
151 {
152  if (random() < 0.75)
153  self->monsterinfo.nextframe = FRAME_stand155;
154 }
155 
157  { ai_stand, 0, NULL },
158  { ai_stand, 0, NULL },
159  { ai_stand, 0, NULL },
160  { ai_stand, 0, NULL }, // scratch loop start
161  { ai_stand, 0, NULL },
162  { ai_stand, 0, NULL },
163  { ai_stand, 0, mutant_idle_loop }, // scratch loop end
164  { ai_stand, 0, NULL },
165  { ai_stand, 0, NULL },
166  { ai_stand, 0, NULL },
167  { ai_stand, 0, NULL },
168  { ai_stand, 0, NULL },
169  { ai_stand, 0, NULL }
170 };
172 
173 void mutant_idle(edict_t *self)
174 {
175  self->monsterinfo.currentmove = &mutant_move_idle;
176  gi.sound(self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0);
177 }
178 
179 
180 //
181 // WALK
182 //
183 
184 void mutant_walk(edict_t *self);
185 
187  { ai_walk, 3, NULL },
188  { ai_walk, 1, NULL },
189  { ai_walk, 5, NULL },
190  { ai_walk, 10, NULL },
191  { ai_walk, 13, NULL },
192  { ai_walk, 10, NULL },
193  { ai_walk, 0, NULL },
194  { ai_walk, 5, NULL },
195  { ai_walk, 6, NULL },
196  { ai_walk, 16, NULL },
197  { ai_walk, 15, NULL },
198  { ai_walk, 6, NULL }
199 };
201 
202 void mutant_walk_loop(edict_t *self)
203 {
204  self->monsterinfo.currentmove = &mutant_move_walk;
205 }
206 
208  { ai_walk, 5, NULL },
209  { ai_walk, 5, NULL },
210  { ai_walk, -2, NULL },
211  { ai_walk, 1, NULL }
212 };
214 
215 void mutant_walk(edict_t *self)
216 {
217  self->monsterinfo.currentmove = &mutant_move_start_walk;
218 }
219 
220 
221 //
222 // RUN
223 //
224 
226  { ai_run, 40, NULL },
227  { ai_run, 40, mutant_step },
228  { ai_run, 24, NULL },
229  { ai_run, 5, mutant_step },
230  { ai_run, 17, NULL },
231  { ai_run, 10, NULL }
232 };
234 
235 void mutant_run(edict_t *self)
236 {
237  if (self->monsterinfo.aiflags & AI_STAND_GROUND)
238  self->monsterinfo.currentmove = &mutant_move_stand;
239  else
240  self->monsterinfo.currentmove = &mutant_move_run;
241 }
242 
243 
244 //
245 // MELEE
246 //
247 
248 void mutant_hit_left(edict_t *self)
249 {
250  vec3_t aim;
251 
252  VectorSet(aim, MELEE_DISTANCE, self->mins[0], 8);
253  if (fire_hit(self, aim, (10 + (rand() % 5)), 100))
254  gi.sound(self, CHAN_WEAPON, sound_hit, 1, ATTN_NORM, 0);
255  else
256  gi.sound(self, CHAN_WEAPON, sound_swing, 1, ATTN_NORM, 0);
257 }
258 
259 void mutant_hit_right(edict_t *self)
260 {
261  vec3_t aim;
262 
263  VectorSet(aim, MELEE_DISTANCE, self->maxs[0], 8);
264  if (fire_hit(self, aim, (10 + (rand() % 5)), 100))
265  gi.sound(self, CHAN_WEAPON, sound_hit2, 1, ATTN_NORM, 0);
266  else
267  gi.sound(self, CHAN_WEAPON, sound_swing, 1, ATTN_NORM, 0);
268 }
269 
270 void mutant_check_refire(edict_t *self)
271 {
272  if (!self->enemy || !self->enemy->inuse || self->enemy->health <= 0)
273  return;
274 
275  if (((skill->value == 3) && (random() < 0.5)) || (range(self, self->enemy) == RANGE_MELEE))
276  self->monsterinfo.nextframe = FRAME_attack09;
277 }
278 
280  { ai_charge, 0, NULL },
281  { ai_charge, 0, NULL },
282  { ai_charge, 0, mutant_hit_left },
283  { ai_charge, 0, NULL },
284  { ai_charge, 0, NULL },
285  { ai_charge, 0, mutant_hit_right },
287 };
289 
290 void mutant_melee(edict_t *self)
291 {
292  self->monsterinfo.currentmove = &mutant_move_attack;
293 }
294 
295 
296 //
297 // ATTACK
298 //
299 
300 void mutant_jump_touch(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
301 {
302  if (self->health <= 0) {
303  self->touch = NULL;
304  return;
305  }
306 
307  if (other->takedamage) {
308  if (VectorLength(self->velocity) > 400) {
309  vec3_t point;
310  vec3_t normal;
311  int damage;
312 
313  VectorCopy(self->velocity, normal);
314  VectorNormalize(normal);
315  VectorMA(self->s.origin, self->maxs[0], normal, point);
316  damage = 40 + 10 * random();
317  T_Damage(other, self, self, self->velocity, point, normal, damage, damage, 0, MOD_UNKNOWN);
318  }
319  }
320 
321  if (!M_CheckBottom(self)) {
322  if (self->groundentity) {
323  self->monsterinfo.nextframe = FRAME_attack02;
324  self->touch = NULL;
325  }
326  return;
327  }
328 
329  self->touch = NULL;
330 }
331 
332 void mutant_jump_takeoff(edict_t *self)
333 {
334  vec3_t forward;
335 
336  gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
337  AngleVectors(self->s.angles, forward, NULL, NULL);
338  self->s.origin[2] += 1;
339  VectorScale(forward, 600, self->velocity);
340  self->velocity[2] = 250;
341  self->groundentity = NULL;
342  self->monsterinfo.aiflags |= AI_DUCKED;
343  self->monsterinfo.attack_finished = level.time + 3;
344  self->touch = mutant_jump_touch;
345 }
346 
347 void mutant_check_landing(edict_t *self)
348 {
349  if (self->groundentity) {
350  gi.sound(self, CHAN_WEAPON, sound_thud, 1, ATTN_NORM, 0);
351  self->monsterinfo.attack_finished = 0;
352  self->monsterinfo.aiflags &= ~AI_DUCKED;
353  return;
354  }
355 
356  if (level.time > self->monsterinfo.attack_finished)
357  self->monsterinfo.nextframe = FRAME_attack02;
358  else
359  self->monsterinfo.nextframe = FRAME_attack05;
360 }
361 
363  { ai_charge, 0, NULL },
364  { ai_charge, 17, NULL },
366  { ai_charge, 15, NULL },
368  { ai_charge, 0, NULL },
369  { ai_charge, 3, NULL },
370  { ai_charge, 0, NULL }
371 };
373 
374 void mutant_jump(edict_t *self)
375 {
376  self->monsterinfo.currentmove = &mutant_move_jump;
377 }
378 
379 
380 //
381 // CHECKATTACK
382 //
383 
384 qboolean mutant_check_melee(edict_t *self)
385 {
386  if (range(self, self->enemy) == RANGE_MELEE)
387  return qtrue;
388  return qfalse;
389 }
390 
391 qboolean mutant_check_jump(edict_t *self)
392 {
393  vec3_t v;
394  float distance;
395 
396  if (self->absmin[2] > (self->enemy->absmin[2] + 0.75 * self->enemy->size[2]))
397  return qfalse;
398 
399  if (self->absmax[2] < (self->enemy->absmin[2] + 0.25 * self->enemy->size[2]))
400  return qfalse;
401 
402  v[0] = self->s.origin[0] - self->enemy->s.origin[0];
403  v[1] = self->s.origin[1] - self->enemy->s.origin[1];
404  v[2] = 0;
405  distance = VectorLength(v);
406 
407  if (distance < 100)
408  return qfalse;
409  if (distance > 100) {
410  if (random() < 0.9)
411  return qfalse;
412  }
413 
414  return qtrue;
415 }
416 
417 qboolean mutant_checkattack(edict_t *self)
418 {
419  if (!self->enemy || self->enemy->health <= 0)
420  return qfalse;
421 
422  if (mutant_check_melee(self)) {
423  self->monsterinfo.attack_state = AS_MELEE;
424  return qtrue;
425  }
426 
427  if (mutant_check_jump(self)) {
428  self->monsterinfo.attack_state = AS_MISSILE;
429  // FIXME play a jump sound here
430  return qtrue;
431  }
432 
433  return qfalse;
434 }
435 
436 
437 //
438 // PAIN
439 //
440 
442  { ai_move, 4, NULL },
443  { ai_move, -3, NULL },
444  { ai_move, -8, NULL },
445  { ai_move, 2, NULL },
446  { ai_move, 5, NULL }
447 };
449 
451  { ai_move, -24, NULL },
452  { ai_move, 11, NULL },
453  { ai_move, 5, NULL },
454  { ai_move, -2, NULL },
455  { ai_move, 6, NULL },
456  { ai_move, 4, NULL }
457 };
459 
461  { ai_move, -22, NULL },
462  { ai_move, 3, NULL },
463  { ai_move, 3, NULL },
464  { ai_move, 2, NULL },
465  { ai_move, 1, NULL },
466  { ai_move, 1, NULL },
467  { ai_move, 6, NULL },
468  { ai_move, 3, NULL },
469  { ai_move, 2, NULL },
470  { ai_move, 0, NULL },
471  { ai_move, 1, NULL }
472 };
474 
475 void mutant_pain(edict_t *self, edict_t *other, float kick, int damage)
476 {
477  float r;
478 
479  if (self->health < (self->max_health / 2))
480  self->s.skinnum = 1;
481 
482  if (level.time < self->pain_debounce_time)
483  return;
484 
485  self->pain_debounce_time = level.time + 3;
486 
487  if (skill->value == 3)
488  return; // no pain anims in nightmare
489 
490  r = random();
491  if (r < 0.33) {
492  gi.sound(self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
493  self->monsterinfo.currentmove = &mutant_move_pain1;
494  } else if (r < 0.66) {
495  gi.sound(self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
496  self->monsterinfo.currentmove = &mutant_move_pain2;
497  } else {
498  gi.sound(self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
499  self->monsterinfo.currentmove = &mutant_move_pain3;
500  }
501 }
502 
503 
504 //
505 // DEATH
506 //
507 
508 void mutant_dead(edict_t *self)
509 {
510  VectorSet(self->mins, -16, -16, -24);
511  VectorSet(self->maxs, 16, 16, -8);
512  self->movetype = MOVETYPE_TOSS;
513  self->svflags |= SVF_DEADMONSTER;
514  gi.linkentity(self);
515 
516  M_FlyCheck(self);
517 }
518 
520  { ai_move, 0, NULL },
521  { ai_move, 0, NULL },
522  { ai_move, 0, NULL },
523  { ai_move, 0, NULL },
524  { ai_move, 0, NULL },
525  { ai_move, 0, NULL },
526  { ai_move, 0, NULL },
527  { ai_move, 0, NULL },
528  { ai_move, 0, NULL }
529 };
531 
533  { ai_move, 0, NULL },
534  { ai_move, 0, NULL },
535  { ai_move, 0, NULL },
536  { ai_move, 0, NULL },
537  { ai_move, 0, NULL },
538  { ai_move, 0, NULL },
539  { ai_move, 0, NULL },
540  { ai_move, 0, NULL },
541  { ai_move, 0, NULL },
542  { ai_move, 0, NULL }
543 };
545 
546 void mutant_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
547 {
548  int n;
549 
550  if (self->health <= self->gib_health) {
551  gi.sound(self, CHAN_VOICE, gi.soundindex("misc/udeath.wav"), 1, ATTN_NORM, 0);
552  for (n = 0; n < 2; n++)
553  ThrowGib(self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
554  for (n = 0; n < 4; n++)
555  ThrowGib(self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
556  ThrowHead(self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
557  self->deadflag = DEAD_DEAD;
558  return;
559  }
560 
561  if (self->deadflag == DEAD_DEAD)
562  return;
563 
564  gi.sound(self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
565  self->deadflag = DEAD_DEAD;
566  self->takedamage = DAMAGE_YES;
567  self->s.skinnum = 1;
568 
569  if (random() < 0.5)
570  self->monsterinfo.currentmove = &mutant_move_death1;
571  else
572  self->monsterinfo.currentmove = &mutant_move_death2;
573 }
574 
575 
576 //
577 // SPAWN
578 //
579 
580 /*QUAKED monster_mutant (1 .5 0) (-32 -32 -24) (32 32 32) Ambush Trigger_Spawn Sight
581 */
582 void SP_monster_mutant(edict_t *self)
583 {
584  if (deathmatch->value) {
585  G_FreeEdict(self);
586  return;
587  }
588 
589  sound_swing = gi.soundindex("mutant/mutatck1.wav");
590  sound_hit = gi.soundindex("mutant/mutatck2.wav");
591  sound_hit2 = gi.soundindex("mutant/mutatck3.wav");
592  sound_death = gi.soundindex("mutant/mutdeth1.wav");
593  sound_idle = gi.soundindex("mutant/mutidle1.wav");
594  sound_pain1 = gi.soundindex("mutant/mutpain1.wav");
595  sound_pain2 = gi.soundindex("mutant/mutpain2.wav");
596  sound_sight = gi.soundindex("mutant/mutsght1.wav");
597  sound_search = gi.soundindex("mutant/mutsrch1.wav");
598  sound_step1 = gi.soundindex("mutant/step1.wav");
599  sound_step2 = gi.soundindex("mutant/step2.wav");
600  sound_step3 = gi.soundindex("mutant/step3.wav");
601  sound_thud = gi.soundindex("mutant/thud1.wav");
602 
603  self->movetype = MOVETYPE_STEP;
604  self->solid = SOLID_BBOX;
605  self->s.modelindex = gi.modelindex("models/monsters/mutant/tris.md2");
606  VectorSet(self->mins, -32, -32, -24);
607  VectorSet(self->maxs, 32, 32, 48);
608 
609  self->health = 300;
610  self->gib_health = -120;
611  self->mass = 300;
612 
613  self->pain = mutant_pain;
614  self->die = mutant_die;
615 
616  self->monsterinfo.stand = mutant_stand;
617  self->monsterinfo.walk = mutant_walk;
618  self->monsterinfo.run = mutant_run;
619  self->monsterinfo.dodge = NULL;
620  self->monsterinfo.attack = mutant_jump;
621  self->monsterinfo.melee = mutant_melee;
622  self->monsterinfo.sight = mutant_sight;
623  self->monsterinfo.search = mutant_search;
624  self->monsterinfo.idle = mutant_idle;
625  self->monsterinfo.checkattack = mutant_checkattack;
626 
627  gi.linkentity(self);
628 
629  self->monsterinfo.currentmove = &mutant_move_stand;
630 
631  self->monsterinfo.scale = MODEL_SCALE;
632  walkmonster_start(self);
633 }
gi
game_import_t gi
Definition: g_main.c:23
FRAME_death201
#define FRAME_death201
Definition: m_actor.h:33
deathmatch
cvar_t * deathmatch
Definition: g_main.c:33
mutant_check_landing
void mutant_check_landing(edict_t *self)
Definition: m_mutant.c:347
DEAD_DEAD
#define DEAD_DEAD
Definition: g_local.h:112
mutant_sight
void mutant_sight(edict_t *self, edict_t *other)
Definition: m_mutant.c:60
FRAME_attack01
#define FRAME_attack01
Definition: m_mutant.h:22
FRAME_pain301
#define FRAME_pain301
Definition: m_actor.h:102
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
FRAME_walk05
#define FRAME_walk05
Definition: m_actor.h:277
FRAME_attack09
#define FRAME_attack09
Definition: m_mutant.h:30
ai_charge
void ai_charge(edict_t *self, float dist)
Definition: g_ai.c:175
mutant_run
void mutant_run(edict_t *self)
Definition: m_mutant.c:235
FRAME_attack15
#define FRAME_attack15
Definition: m_boss2.h:106
mutant_move_death2
mmove_t mutant_move_death2
Definition: m_mutant.c:544
mutant_pain
void mutant_pain(edict_t *self, edict_t *other, float kick, int damage)
Definition: m_mutant.c:475
sound_step1
static int sound_step1
Definition: m_mutant.c:39
FRAME_death109
#define FRAME_death109
Definition: m_brain.h:153
FRAME_stand101
#define FRAME_stand101
Definition: m_actor.h:150
mutant_move_start_walk
mmove_t mutant_move_start_walk
Definition: m_mutant.c:213
FRAME_walk16
#define FRAME_walk16
Definition: m_boss2.h:87
sound_search
static int sound_search
Definition: m_mutant.c:38
mutant_hit_left
void mutant_hit_left(edict_t *self)
Definition: m_mutant.c:248
sound_thud
static int sound_thud
Definition: m_mutant.c:42
mutant_jump
void mutant_jump(edict_t *self)
Definition: m_mutant.c:374
mutant_frames_jump
mframe_t mutant_frames_jump[]
Definition: m_mutant.c:362
sound_sight
static int sound_sight
Definition: m_mutant.c:37
FRAME_walk04
#define FRAME_walk04
Definition: m_actor.h:276
FRAME_death101
#define FRAME_death101
Definition: m_actor.h:26
mutant_step
void mutant_step(edict_t *self)
Definition: m_mutant.c:48
AI_STAND_GROUND
#define AI_STAND_GROUND
Definition: g_local.h:126
mutant_move_pain2
mmove_t mutant_move_pain2
Definition: m_mutant.c:458
mutant_move_walk
mmove_t mutant_move_walk
Definition: m_mutant.c:200
mutant_move_pain3
mmove_t mutant_move_pain3
Definition: m_mutant.c:473
MODEL_SCALE
#define MODEL_SCALE
Definition: m_actor.h:504
mutant_check_melee
qboolean mutant_check_melee(edict_t *self)
Definition: m_mutant.c:384
mutant_frames_attack
mframe_t mutant_frames_attack[]
Definition: m_mutant.c:279
FRAME_attack05
#define FRAME_attack05
Definition: m_mutant.h:26
mutant_frames_run
mframe_t mutant_frames_run[]
Definition: m_mutant.c:225
DAMAGE_YES
@ DAMAGE_YES
Definition: g_local.h:88
SP_monster_mutant
void SP_monster_mutant(edict_t *self)
Definition: m_mutant.c:582
fire_hit
qboolean fire_hit(edict_t *self, vec3_t aim, int damage, int kick)
Definition: g_weapon.c:59
mutant_search
void mutant_search(edict_t *self)
Definition: m_mutant.c:65
mutant_frames_stand
mframe_t mutant_frames_stand[]
Definition: m_mutant.c:80
T_Damage
void T_Damage(edict_t *targ, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t normal, int damage, int knockback, int dflags, int mod)
Definition: g_combat.c:358
other
@ other
Definition: ogg.c:63
FRAME_pain101
#define FRAME_pain101
Definition: m_actor.h:96
sound_step2
static int sound_step2
Definition: m_mutant.c:40
walkmonster_start
void walkmonster_start(edict_t *self)
Definition: g_monster.c:630
MOVETYPE_STEP
@ MOVETYPE_STEP
Definition: g_local.h:192
mutant_move_idle
mmove_t mutant_move_idle
Definition: m_mutant.c:171
mutant_jump_touch
void mutant_jump_touch(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
Definition: m_mutant.c:300
mutant_move_run
mmove_t mutant_move_run
Definition: m_mutant.c:233
FRAME_run08
#define FRAME_run08
Definition: m_actor.h:121
sound_idle
static int sound_idle
Definition: m_mutant.c:34
mutant_jump_takeoff
void mutant_jump_takeoff(edict_t *self)
Definition: m_mutant.c:332
mutant_frames_pain3
mframe_t mutant_frames_pain3[]
Definition: m_mutant.c:460
mutant_move_pain1
mmove_t mutant_move_pain1
Definition: m_mutant.c:448
G_FreeEdict
void G_FreeEdict(edict_t *e)
Definition: g_utils.c:421
mutant_melee
void mutant_melee(edict_t *self)
Definition: m_mutant.c:290
sound_step3
static int sound_step3
Definition: m_mutant.c:41
FRAME_attack08
#define FRAME_attack08
Definition: m_mutant.h:29
FRAME_pain206
#define FRAME_pain206
Definition: m_brain.h:136
forward
static vec3_t forward
Definition: p_view.c:27
AS_MISSILE
#define AS_MISSILE
Definition: g_local.h:146
mutant_idle
void mutant_idle(edict_t *self)
Definition: m_mutant.c:173
sound_swing
static int sound_swing
Definition: m_mutant.c:30
mframe_t
Definition: g_local.h:394
mmove_t
Definition: g_local.h:400
mutant_move_death1
mmove_t mutant_move_death1
Definition: m_mutant.c:530
FRAME_stand151
#define FRAME_stand151
Definition: m_float.h:216
sound_hit2
static int sound_hit2
Definition: m_mutant.c:32
ai_walk
void ai_walk(edict_t *self, float dist)
Definition: g_ai.c:148
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
M_CheckBottom
qboolean M_CheckBottom(edict_t *ent)
Definition: m_move.c:35
FRAME_stand164
#define FRAME_stand164
Definition: m_mutant.h:147
mutant_check_refire
void mutant_check_refire(edict_t *self)
Definition: m_mutant.c:270
mutant_dead
void mutant_dead(edict_t *self)
Definition: m_mutant.c:508
mutant_hit_right
void mutant_hit_right(edict_t *self)
Definition: m_mutant.c:259
mutant_frames_start_walk
mframe_t mutant_frames_start_walk[]
Definition: m_mutant.c:207
mutant_walk
void mutant_walk(edict_t *self)
Definition: m_mutant.c:215
FRAME_pain105
#define FRAME_pain105
Definition: m_brain.h:114
sound_hit
static int sound_hit
Definition: m_mutant.c:31
skill
cvar_t * skill
Definition: g_main.c:36
FRAME_death210
#define FRAME_death210
Definition: m_actor.h:42
mutant_walk_loop
void mutant_walk_loop(edict_t *self)
Definition: m_mutant.c:202
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
mutant_frames_idle
mframe_t mutant_frames_idle[]
Definition: m_mutant.c:156
RANGE_MELEE
#define RANGE_MELEE
Definition: g_local.h:116
mutant_frames_pain2
mframe_t mutant_frames_pain2[]
Definition: m_mutant.c:450
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
m_mutant.h
FRAME_run03
#define FRAME_run03
Definition: m_actor.h:116
level
level_locals_t level
Definition: g_main.c:22
FRAME_pain311
#define FRAME_pain311
Definition: m_boss31.h:119
FRAME_attack02
#define FRAME_attack02
Definition: m_mutant.h:23
M_FlyCheck
void M_FlyCheck(edict_t *self)
Definition: g_monster.c:121
mutant_stand
void mutant_stand(edict_t *self)
Definition: m_mutant.c:140
MOD_UNKNOWN
#define MOD_UNKNOWN
Definition: g_local.h:457
mutant_frames_walk
mframe_t mutant_frames_walk[]
Definition: m_mutant.c:186
ThrowHead
void ThrowHead(edict_t *self, char *gibname, int damage, int type)
Definition: g_misc.c:175
mutant_frames_pain1
mframe_t mutant_frames_pain1[]
Definition: m_mutant.c:441
FRAME_pain201
#define FRAME_pain201
Definition: m_actor.h:99
sound_pain2
static int sound_pain2
Definition: m_mutant.c:36
MOVETYPE_TOSS
@ MOVETYPE_TOSS
Definition: g_local.h:194
range
int range(edict_t *self, edict_t *other)
Definition: g_ai.c:245
mutant_checkattack
qboolean mutant_checkattack(edict_t *self)
Definition: m_mutant.c:417
mutant_move_jump
mmove_t mutant_move_jump
Definition: m_mutant.c:372
sound_pain1
static int sound_pain1
Definition: m_mutant.c:35
AI_DUCKED
#define AI_DUCKED
Definition: g_local.h:137
mutant_die
void mutant_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
Definition: m_mutant.c:546
mutant_frames_death1
mframe_t mutant_frames_death1[]
Definition: m_mutant.c:519
sound_death
static int sound_death
Definition: m_mutant.c:33
AS_MELEE
#define AS_MELEE
Definition: g_local.h:145
FRAME_stand152
#define FRAME_stand152
Definition: m_float.h:217
mutant_swing
void mutant_swing(edict_t *self)
Definition: m_mutant.c:70
VectorNormalize
vec_t VectorNormalize(vec3_t v)
Definition: shared.c:55
FRAME_stand155
#define FRAME_stand155
Definition: m_insane.h:176
ai_stand
void ai_stand(edict_t *self, float dist)
Definition: g_ai.c:100
mutant_move_stand
mmove_t mutant_move_stand
Definition: m_mutant.c:138
mutant_idle_loop
void mutant_idle_loop(edict_t *self)
Definition: m_mutant.c:150
mutant_check_jump
qboolean mutant_check_jump(edict_t *self)
Definition: m_mutant.c:391
g_local.h
mutant_move_attack
mmove_t mutant_move_attack
Definition: m_mutant.c:288
mutant_frames_death2
mframe_t mutant_frames_death2[]
Definition: m_mutant.c:532