Quake II RTX doxygen  1.0 dev
m_parasite.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 parasite
22 
23 ==============================================================================
24 */
25 
26 #include "g_local.h"
27 #include "m_parasite.h"
28 
29 
30 static int sound_pain1;
31 static int sound_pain2;
32 static int sound_die;
33 static int sound_launch;
34 static int sound_impact;
35 static int sound_suck;
36 static int sound_reelin;
37 static int sound_sight;
38 static int sound_tap;
39 static int sound_scratch;
40 static int sound_search;
41 
42 
43 void parasite_stand(edict_t *self);
44 void parasite_start_run(edict_t *self);
45 void parasite_run(edict_t *self);
46 void parasite_walk(edict_t *self);
47 void parasite_start_walk(edict_t *self);
48 void parasite_end_fidget(edict_t *self);
49 void parasite_do_fidget(edict_t *self);
50 void parasite_refidget(edict_t *self);
51 
52 
53 void parasite_launch(edict_t *self)
54 {
55  gi.sound(self, CHAN_WEAPON, sound_launch, 1, ATTN_NORM, 0);
56 }
57 
58 void parasite_reel_in(edict_t *self)
59 {
60  gi.sound(self, CHAN_WEAPON, sound_reelin, 1, ATTN_NORM, 0);
61 }
62 
63 void parasite_sight(edict_t *self, edict_t *other)
64 {
65  gi.sound(self, CHAN_WEAPON, sound_sight, 1, ATTN_NORM, 0);
66 }
67 
68 void parasite_tap(edict_t *self)
69 {
70  gi.sound(self, CHAN_WEAPON, sound_tap, 1, ATTN_IDLE, 0);
71 }
72 
73 void parasite_scratch(edict_t *self)
74 {
75  gi.sound(self, CHAN_WEAPON, sound_scratch, 1, ATTN_IDLE, 0);
76 }
77 
78 void parasite_search(edict_t *self)
79 {
80  gi.sound(self, CHAN_WEAPON, sound_search, 1, ATTN_IDLE, 0);
81 }
82 
83 
85  { ai_stand, 0, NULL },
86  { ai_stand, 0, NULL },
87  { ai_stand, 0, NULL },
88  { ai_stand, 0, NULL }
89 };
91 
93  { ai_stand, 0, parasite_scratch },
94  { ai_stand, 0, NULL },
95  { ai_stand, 0, NULL },
96  { ai_stand, 0, parasite_scratch },
97  { ai_stand, 0, NULL },
98  { ai_stand, 0, NULL }
99 };
101 
103  { ai_stand, 0, parasite_scratch },
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 };
113 
114 void parasite_end_fidget(edict_t *self)
115 {
116  self->monsterinfo.currentmove = &parasite_move_end_fidget;
117 }
118 
119 void parasite_do_fidget(edict_t *self)
120 {
121  self->monsterinfo.currentmove = &parasite_move_fidget;
122 }
123 
124 void parasite_refidget(edict_t *self)
125 {
126  if (random() <= 0.8)
127  self->monsterinfo.currentmove = &parasite_move_fidget;
128  else
129  self->monsterinfo.currentmove = &parasite_move_end_fidget;
130 }
131 
132 void parasite_idle(edict_t *self)
133 {
134  self->monsterinfo.currentmove = &parasite_move_start_fidget;
135 }
136 
137 
139  { ai_stand, 0, NULL },
140  { ai_stand, 0, NULL },
141  { ai_stand, 0, parasite_tap },
142  { ai_stand, 0, NULL },
143  { ai_stand, 0, parasite_tap },
144  { ai_stand, 0, NULL },
145  { ai_stand, 0, NULL },
146  { ai_stand, 0, NULL },
147  { ai_stand, 0, parasite_tap },
148  { ai_stand, 0, NULL },
149  { ai_stand, 0, parasite_tap },
150  { ai_stand, 0, NULL },
151  { ai_stand, 0, NULL },
152  { ai_stand, 0, NULL },
153  { ai_stand, 0, parasite_tap },
154  { ai_stand, 0, NULL },
155  { ai_stand, 0, parasite_tap }
156 };
158 
159 void parasite_stand(edict_t *self)
160 {
161  self->monsterinfo.currentmove = &parasite_move_stand;
162 }
163 
164 
166  { ai_run, 30, NULL },
167  { ai_run, 30, NULL },
168  { ai_run, 22, NULL },
169  { ai_run, 19, NULL },
170  { ai_run, 24, NULL },
171  { ai_run, 28, NULL },
172  { ai_run, 25, NULL }
173 };
175 
177  { ai_run, 0, NULL },
178  { ai_run, 30, NULL },
179 };
181 
183  { ai_run, 20, NULL },
184  { ai_run, 20, NULL },
185  { ai_run, 12, NULL },
186  { ai_run, 10, NULL },
187  { ai_run, 0, NULL },
188  { ai_run, 0, NULL }
189 };
191 
192 void parasite_start_run(edict_t *self)
193 {
194  if (self->monsterinfo.aiflags & AI_STAND_GROUND)
195  self->monsterinfo.currentmove = &parasite_move_stand;
196  else
197  self->monsterinfo.currentmove = &parasite_move_start_run;
198 }
199 
200 void parasite_run(edict_t *self)
201 {
202  if (self->monsterinfo.aiflags & AI_STAND_GROUND)
203  self->monsterinfo.currentmove = &parasite_move_stand;
204  else
205  self->monsterinfo.currentmove = &parasite_move_run;
206 }
207 
208 
210  { ai_walk, 30, NULL },
211  { ai_walk, 30, NULL },
212  { ai_walk, 22, NULL },
213  { ai_walk, 19, NULL },
214  { ai_walk, 24, NULL },
215  { ai_walk, 28, NULL },
216  { ai_walk, 25, NULL }
217 };
219 
221  { ai_walk, 0, NULL },
222  { ai_walk, 30, parasite_walk }
223 };
225 
227  { ai_walk, 20, NULL },
228  { ai_walk, 20, NULL },
229  { ai_walk, 12, NULL },
230  { ai_walk, 10, NULL },
231  { ai_walk, 0, NULL },
232  { ai_walk, 0, NULL }
233 };
235 
236 void parasite_start_walk(edict_t *self)
237 {
238  self->monsterinfo.currentmove = &parasite_move_start_walk;
239 }
240 
241 void parasite_walk(edict_t *self)
242 {
243  self->monsterinfo.currentmove = &parasite_move_walk;
244 }
245 
246 
248  { ai_move, 0, NULL },
249  { ai_move, 0, NULL },
250  { ai_move, 0, NULL },
251  { ai_move, 0, NULL },
252  { ai_move, 0, NULL },
253  { ai_move, 0, NULL },
254  { ai_move, 6, NULL },
255  { ai_move, 16, NULL },
256  { ai_move, -6, NULL },
257  { ai_move, -7, NULL },
258  { ai_move, 0, NULL }
259 };
261 
262 void parasite_pain(edict_t *self, edict_t *other, float kick, int damage)
263 {
264  if (self->health < (self->max_health / 2))
265  self->s.skinnum = 1;
266 
267  if (level.time < self->pain_debounce_time)
268  return;
269 
270  self->pain_debounce_time = level.time + 3;
271 
272  if (skill->value == 3)
273  return; // no pain anims in nightmare
274 
275  if (random() < 0.5)
276  gi.sound(self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
277  else
278  gi.sound(self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
279 
280  self->monsterinfo.currentmove = &parasite_move_pain1;
281 }
282 
283 
284 static qboolean parasite_drain_attack_ok(vec3_t start, vec3_t end)
285 {
286  vec3_t dir, angles;
287 
288  // check for max distance
289  VectorSubtract(start, end, dir);
290  if (VectorLength(dir) > 256)
291  return qfalse;
292 
293  // check for min/max pitch
294  vectoangles(dir, angles);
295  if (angles[0] < -180)
296  angles[0] += 360;
297  if (fabs(angles[0]) > 30)
298  return qfalse;
299 
300  return qtrue;
301 }
302 
303 void parasite_drain_attack(edict_t *self)
304 {
305  vec3_t offset, start, f, r, end, dir;
306  trace_t tr;
307  int damage;
308 
309  AngleVectors(self->s.angles, f, r, NULL);
310  VectorSet(offset, 24, 0, 6);
311  G_ProjectSource(self->s.origin, offset, f, r, start);
312 
313  VectorCopy(self->enemy->s.origin, end);
314  if (!parasite_drain_attack_ok(start, end)) {
315  end[2] = self->enemy->s.origin[2] + self->enemy->maxs[2] - 8;
316  if (!parasite_drain_attack_ok(start, end)) {
317  end[2] = self->enemy->s.origin[2] + self->enemy->mins[2] + 8;
318  if (!parasite_drain_attack_ok(start, end))
319  return;
320  }
321  }
322  VectorCopy(self->enemy->s.origin, end);
323 
324  tr = gi.trace(start, NULL, NULL, end, self, MASK_SHOT);
325  if (tr.ent != self->enemy)
326  return;
327 
328  if (self->s.frame == FRAME_drain03) {
329  damage = 5;
330  gi.sound(self->enemy, CHAN_AUTO, sound_impact, 1, ATTN_NORM, 0);
331  } else {
332  if (self->s.frame == FRAME_drain04)
333  gi.sound(self, CHAN_WEAPON, sound_suck, 1, ATTN_NORM, 0);
334  damage = 2;
335  }
336 
337  gi.WriteByte(svc_temp_entity);
338  gi.WriteByte(TE_PARASITE_ATTACK);
339  gi.WriteShort(self - g_edicts);
340  gi.WritePosition(start);
341  gi.WritePosition(end);
342  gi.multicast(self->s.origin, MULTICAST_PVS);
343 
344  VectorSubtract(start, end, dir);
345  T_Damage(self->enemy, self, self, dir, self->enemy->s.origin, vec3_origin, damage, 0, DAMAGE_NO_KNOCKBACK, MOD_UNKNOWN);
346 }
347 
349  { ai_charge, 0, parasite_launch },
350  { ai_charge, 0, NULL },
351  { ai_charge, 15, parasite_drain_attack }, // Target hits
352  { ai_charge, 0, parasite_drain_attack }, // drain
353  { ai_charge, 0, parasite_drain_attack }, // drain
354  { ai_charge, 0, parasite_drain_attack }, // drain
355  { ai_charge, 0, parasite_drain_attack }, // drain
356  { ai_charge, -2, parasite_drain_attack }, // drain
357  { ai_charge, -2, parasite_drain_attack }, // drain
358  { ai_charge, -3, parasite_drain_attack }, // drain
359  { ai_charge, -2, parasite_drain_attack }, // drain
360  { ai_charge, 0, parasite_drain_attack }, // drain
361  { ai_charge, -1, parasite_drain_attack }, // drain
362  { ai_charge, 0, parasite_reel_in }, // let go
363  { ai_charge, -2, NULL },
364  { ai_charge, -2, NULL },
365  { ai_charge, -3, NULL },
366  { ai_charge, 0, NULL }
367 };
369 
370 #if 0
371 mframe_t parasite_frames_break [] = {
372  { ai_charge, 0, NULL },
373  { ai_charge, -3, NULL },
374  { ai_charge, 1, NULL },
375  { ai_charge, 2, NULL },
376  { ai_charge, -3, NULL },
377  { ai_charge, 1, NULL },
378  { ai_charge, 1, NULL },
379  { ai_charge, 3, NULL },
380  { ai_charge, 0, NULL },
381  { ai_charge, -18, NULL },
382  { ai_charge, 3, NULL },
383  { ai_charge, 9, NULL },
384  { ai_charge, 6, NULL },
385  { ai_charge, 0, NULL },
386  { ai_charge, -18, NULL },
387  { ai_charge, 0, NULL },
388  { ai_charge, 8, NULL },
389  { ai_charge, 9, NULL },
390  { ai_charge, 0, NULL },
391  { ai_charge, -18, NULL },
392  { ai_charge, 0, NULL },
393  { ai_charge, 0, NULL }, // airborne
394  { ai_charge, 0, NULL }, // airborne
395  { ai_charge, 0, NULL }, // slides
396  { ai_charge, 0, NULL }, // slides
397  { ai_charge, 0, NULL }, // slides
398  { ai_charge, 0, NULL }, // slides
399  { ai_charge, 4, NULL },
400  { ai_charge, 11, NULL },
401  { ai_charge, -2, NULL },
402  { ai_charge, -5, NULL },
403  { ai_charge, 1, NULL }
404 };
405 mmove_t parasite_move_break = {FRAME_break01, FRAME_break32, parasite_frames_break, parasite_start_run};
406 #endif
407 /*
408 ===
409 Break Stuff Ends
410 ===
411 */
412 
413 void parasite_attack(edict_t *self)
414 {
415 // if (random() <= 0.2)
416 // self->monsterinfo.currentmove = &parasite_move_break;
417 // else
418  self->monsterinfo.currentmove = &parasite_move_drain;
419 }
420 
421 
422 
423 /*
424 ===
425 Death Stuff Starts
426 ===
427 */
428 
429 void parasite_dead(edict_t *self)
430 {
431  VectorSet(self->mins, -16, -16, -24);
432  VectorSet(self->maxs, 16, 16, -8);
433  self->movetype = MOVETYPE_TOSS;
434  self->svflags |= SVF_DEADMONSTER;
435  self->nextthink = 0;
436  gi.linkentity(self);
437 }
438 
440  { ai_move, 0, NULL },
441  { ai_move, 0, NULL },
442  { ai_move, 0, NULL },
443  { ai_move, 0, NULL },
444  { ai_move, 0, NULL },
445  { ai_move, 0, NULL },
446  { ai_move, 0, NULL }
447 };
449 
450 void parasite_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
451 {
452  int n;
453 
454 // check for gib
455  if (self->health <= self->gib_health) {
456  gi.sound(self, CHAN_VOICE, gi.soundindex("misc/udeath.wav"), 1, ATTN_NORM, 0);
457  for (n = 0; n < 2; n++)
458  ThrowGib(self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
459  for (n = 0; n < 4; n++)
460  ThrowGib(self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
461  ThrowHead(self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
462  self->deadflag = DEAD_DEAD;
463  return;
464  }
465 
466  if (self->deadflag == DEAD_DEAD)
467  return;
468 
469 // regular death
470  gi.sound(self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0);
471  self->deadflag = DEAD_DEAD;
472  self->takedamage = DAMAGE_YES;
473  self->monsterinfo.currentmove = &parasite_move_death;
474 }
475 
476 /*
477 ===
478 End Death Stuff
479 ===
480 */
481 
482 /*QUAKED monster_parasite (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
483 */
484 void SP_monster_parasite(edict_t *self)
485 {
486  if (deathmatch->value) {
487  G_FreeEdict(self);
488  return;
489  }
490 
491  sound_pain1 = gi.soundindex("parasite/parpain1.wav");
492  sound_pain2 = gi.soundindex("parasite/parpain2.wav");
493  sound_die = gi.soundindex("parasite/pardeth1.wav");
494  sound_launch = gi.soundindex("parasite/paratck1.wav");
495  sound_impact = gi.soundindex("parasite/paratck2.wav");
496  sound_suck = gi.soundindex("parasite/paratck3.wav");
497  sound_reelin = gi.soundindex("parasite/paratck4.wav");
498  sound_sight = gi.soundindex("parasite/parsght1.wav");
499  sound_tap = gi.soundindex("parasite/paridle1.wav");
500  sound_scratch = gi.soundindex("parasite/paridle2.wav");
501  sound_search = gi.soundindex("parasite/parsrch1.wav");
502 
503  self->s.modelindex = gi.modelindex("models/monsters/parasite/tris.md2");
504  VectorSet(self->mins, -16, -16, -24);
505  VectorSet(self->maxs, 16, 16, 24);
506  self->movetype = MOVETYPE_STEP;
507  self->solid = SOLID_BBOX;
508 
509  self->health = 175;
510  self->gib_health = -50;
511  self->mass = 250;
512 
513  self->pain = parasite_pain;
514  self->die = parasite_die;
515 
516  self->monsterinfo.stand = parasite_stand;
517  self->monsterinfo.walk = parasite_start_walk;
518  self->monsterinfo.run = parasite_start_run;
519  self->monsterinfo.attack = parasite_attack;
520  self->monsterinfo.sight = parasite_sight;
521  self->monsterinfo.idle = parasite_idle;
522 
523  gi.linkentity(self);
524 
525  self->monsterinfo.currentmove = &parasite_move_stand;
526  self->monsterinfo.scale = MODEL_SCALE;
527 
528  walkmonster_start(self);
529 }
FRAME_run10
#define FRAME_run10
Definition: m_actor.h:123
parasite_walk
void parasite_walk(edict_t *self)
Definition: m_parasite.c:241
parasite_move_death
mmove_t parasite_move_death
Definition: m_parasite.c:448
gi
game_import_t gi
Definition: g_main.c:23
parasite_move_fidget
mmove_t parasite_move_fidget
Definition: m_parasite.c:100
deathmatch
cvar_t * deathmatch
Definition: g_main.c:33
FRAME_run15
#define FRAME_run15
Definition: m_parasite.h:104
parasite_move_stop_walk
mmove_t parasite_move_stop_walk
Definition: m_parasite.c:234
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
parasite_scratch
void parasite_scratch(edict_t *self)
Definition: m_parasite.c:73
ThrowGib
void ThrowGib(edict_t *self, char *gibname, int damage, int type)
Definition: g_misc.c:130
sound_reelin
static int sound_reelin
Definition: m_parasite.c:36
ai_charge
void ai_charge(edict_t *self, float dist)
Definition: g_ai.c:175
parasite_idle
void parasite_idle(edict_t *self)
Definition: m_parasite.c:132
FRAME_drain18
#define FRAME_drain18
Definition: m_parasite.h:78
parasite_frames_stand
mframe_t parasite_frames_stand[]
Definition: m_parasite.c:138
parasite_run
void parasite_run(edict_t *self)
Definition: m_parasite.c:200
FRAME_break32
#define FRAME_break32
Definition: m_parasite.h:53
sound_pain2
static int sound_pain2
Definition: m_parasite.c:31
FRAME_stand01
#define FRAME_stand01
Definition: m_boss31.h:134
FRAME_run09
#define FRAME_run09
Definition: m_actor.h:122
FRAME_drain04
#define FRAME_drain04
Definition: m_parasite.h:64
FRAME_stand21
#define FRAME_stand21
Definition: m_boss2.h:63
parasite_move_start_run
mmove_t parasite_move_start_run
Definition: m_parasite.c:180
FRAME_death101
#define FRAME_death101
Definition: m_actor.h:26
parasite_search
void parasite_search(edict_t *self)
Definition: m_parasite.c:78
AI_STAND_GROUND
#define AI_STAND_GROUND
Definition: g_local.h:126
FRAME_run01
#define FRAME_run01
Definition: m_actor.h:114
FRAME_stand17
#define FRAME_stand17
Definition: m_boss2.h:59
sound_launch
static int sound_launch
Definition: m_parasite.c:33
MODEL_SCALE
#define MODEL_SCALE
Definition: m_actor.h:504
parasite_frames_start_run
mframe_t parasite_frames_start_run[]
Definition: m_parasite.c:176
DAMAGE_YES
@ DAMAGE_YES
Definition: g_local.h:88
parasite_move_end_fidget
mmove_t parasite_move_end_fidget
Definition: m_parasite.c:112
parasite_move_stop_run
mmove_t parasite_move_stop_run
Definition: m_parasite.c:190
sound_impact
static int sound_impact
Definition: m_parasite.c:34
parasite_frames_stop_run
mframe_t parasite_frames_stop_run[]
Definition: m_parasite.c:182
FRAME_stand28
#define FRAME_stand28
Definition: m_boss2.h:70
parasite_sight
void parasite_sight(edict_t *self, edict_t *other)
Definition: m_parasite.c:63
parasite_frames_drain
mframe_t parasite_frames_drain[]
Definition: m_parasite.c:348
g_edicts
edict_t * g_edicts
Definition: g_main.c:31
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
FRAME_run02
#define FRAME_run02
Definition: m_actor.h:115
other
@ other
Definition: ogg.c:63
FRAME_pain101
#define FRAME_pain101
Definition: m_actor.h:96
walkmonster_start
void walkmonster_start(edict_t *self)
Definition: g_monster.c:630
MOVETYPE_STEP
@ MOVETYPE_STEP
Definition: g_local.h:192
DAMAGE_NO_KNOCKBACK
#define DAMAGE_NO_KNOCKBACK
Definition: g_local.h:650
parasite_refidget
void parasite_refidget(edict_t *self)
Definition: m_parasite.c:124
FRAME_drain03
#define FRAME_drain03
Definition: m_parasite.h:63
parasite_reel_in
void parasite_reel_in(edict_t *self)
Definition: m_parasite.c:58
vec3_origin
vec3_t vec3_origin
Definition: shared.c:21
vectoangles
void vectoangles(vec3_t vec, vec3_t angles)
Definition: g_utils.c:330
FRAME_break01
#define FRAME_break01
Definition: m_parasite.h:22
G_FreeEdict
void G_FreeEdict(edict_t *e)
Definition: g_utils.c:421
parasite_move_drain
mmove_t parasite_move_drain
Definition: m_parasite.c:368
parasite_move_walk
mmove_t parasite_move_walk
Definition: m_parasite.c:218
svc_temp_entity
#define svc_temp_entity
Definition: g_local.h:38
parasite_launch
void parasite_launch(edict_t *self)
Definition: m_parasite.c:53
FRAME_stand27
#define FRAME_stand27
Definition: m_boss2.h:69
parasite_drain_attack
void parasite_drain_attack(edict_t *self)
Definition: m_parasite.c:303
parasite_frames_end_fidget
mframe_t parasite_frames_end_fidget[]
Definition: m_parasite.c:102
mframe_t
Definition: g_local.h:394
parasite_frames_walk
mframe_t parasite_frames_walk[]
Definition: m_parasite.c:209
mmove_t
Definition: g_local.h:400
sound_die
static int sound_die
Definition: m_parasite.c:32
parasite_attack
void parasite_attack(edict_t *self)
Definition: m_parasite.c:413
parasite_move_stand
mmove_t parasite_move_stand
Definition: m_parasite.c:157
sound_scratch
static int sound_scratch
Definition: m_parasite.c:39
FRAME_stand22
#define FRAME_stand22
Definition: m_boss2.h:64
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
sound_pain1
static int sound_pain1
Definition: m_parasite.c:30
sound_sight
static int sound_sight
Definition: m_parasite.c:37
FRAME_stand35
#define FRAME_stand35
Definition: m_boss2.h:27
parasite_stand
void parasite_stand(edict_t *self)
Definition: m_parasite.c:159
sound_tap
static int sound_tap
Definition: m_parasite.c:38
parasite_start_walk
void parasite_start_walk(edict_t *self)
Definition: m_parasite.c:236
parasite_frames_pain1
mframe_t parasite_frames_pain1[]
Definition: m_parasite.c:247
skill
cvar_t * skill
Definition: g_main.c:36
parasite_end_fidget
void parasite_end_fidget(edict_t *self)
Definition: m_parasite.c:114
parasite_drain_attack_ok
static qboolean parasite_drain_attack_ok(vec3_t start, vec3_t end)
Definition: m_parasite.c:284
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
FRAME_drain01
#define FRAME_drain01
Definition: m_parasite.h:61
parasite_tap
void parasite_tap(edict_t *self)
Definition: m_parasite.c:68
parasite_frames_run
mframe_t parasite_frames_run[]
Definition: m_parasite.c:165
parasite_move_start_fidget
mmove_t parasite_move_start_fidget
Definition: m_parasite.c:90
parasite_frames_stop_walk
mframe_t parasite_frames_stop_walk[]
Definition: m_parasite.c:226
FRAME_death107
#define FRAME_death107
Definition: m_actor.h:32
ai_run
void ai_run(edict_t *self, float dist)
Definition: g_ai.c:821
parasite_frames_death
mframe_t parasite_frames_death[]
Definition: m_parasite.c:439
GIB_ORGANIC
#define GIB_ORGANIC
Definition: g_local.h:122
FRAME_run03
#define FRAME_run03
Definition: m_actor.h:116
level
level_locals_t level
Definition: g_main.c:22
parasite_frames_start_fidget
mframe_t parasite_frames_start_fidget[]
Definition: m_parasite.c:84
parasite_dead
void parasite_dead(edict_t *self)
Definition: m_parasite.c:429
parasite_frames_fidget
mframe_t parasite_frames_fidget[]
Definition: m_parasite.c:92
MOD_UNKNOWN
#define MOD_UNKNOWN
Definition: g_local.h:457
m_parasite.h
ThrowHead
void ThrowHead(edict_t *self, char *gibname, int damage, int type)
Definition: g_misc.c:175
parasite_die
void parasite_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
Definition: m_parasite.c:450
MOVETYPE_TOSS
@ MOVETYPE_TOSS
Definition: g_local.h:194
parasite_frames_start_walk
mframe_t parasite_frames_start_walk[]
Definition: m_parasite.c:220
parasite_move_pain1
mmove_t parasite_move_pain1
Definition: m_parasite.c:260
sound_search
static int sound_search
Definition: m_parasite.c:40
sound_suck
static int sound_suck
Definition: m_parasite.c:35
parasite_move_start_walk
mmove_t parasite_move_start_walk
Definition: m_parasite.c:224
parasite_move_run
mmove_t parasite_move_run
Definition: m_parasite.c:174
parasite_start_run
void parasite_start_run(edict_t *self)
Definition: m_parasite.c:192
ai_stand
void ai_stand(edict_t *self, float dist)
Definition: g_ai.c:100
FRAME_pain111
#define FRAME_pain111
Definition: m_brain.h:120
SP_monster_parasite
void SP_monster_parasite(edict_t *self)
Definition: m_parasite.c:484
parasite_do_fidget
void parasite_do_fidget(edict_t *self)
Definition: m_parasite.c:119
parasite_pain
void parasite_pain(edict_t *self, edict_t *other, float kick, int damage)
Definition: m_parasite.c:262
g_local.h
FRAME_stand18
#define FRAME_stand18
Definition: m_boss2.h:60