icculus quake2 doxygen  1.0 dev
m_berserk.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
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 BERSERK
24 
25 ==============================================================================
26 */
27 
28 #include "g_local.h"
29 #include "m_berserk.h"
30 
31 
32 static int sound_pain;
33 static int sound_die;
34 static int sound_idle;
35 static int sound_punch;
36 static int sound_sight;
37 static int sound_search;
38 
39 void berserk_sight (edict_t *self, edict_t *other)
40 {
41  gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
42 }
43 
44 void berserk_search (edict_t *self)
45 {
46  gi.sound (self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
47 }
48 
49 
50 void berserk_fidget (edict_t *self);
52 {
54  {ai_stand, 0, NULL},
55  {ai_stand, 0, NULL},
56  {ai_stand, 0, NULL},
57  {ai_stand, 0, NULL}
58 };
60 
61 void berserk_stand (edict_t *self)
62 {
63  self->monsterinfo.currentmove = &berserk_move_stand;
64 }
65 
67 {
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, 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 };
90 
91 void berserk_fidget (edict_t *self)
92 {
93  if (self->monsterinfo.aiflags & AI_STAND_GROUND)
94  return;
95  if (random() > 0.15)
96  return;
97 
98  self->monsterinfo.currentmove = &berserk_move_stand_fidget;
99  gi.sound (self, CHAN_WEAPON, sound_idle, 1, ATTN_IDLE, 0);
100 }
101 
102 
104 {
105  {ai_walk, 9.1, NULL},
106  {ai_walk, 6.3, NULL},
107  {ai_walk, 4.9, NULL},
108  {ai_walk, 6.7, NULL},
109  {ai_walk, 6.0, NULL},
110  {ai_walk, 8.2, NULL},
111  {ai_walk, 7.2, NULL},
112  {ai_walk, 6.1, NULL},
113  {ai_walk, 4.9, NULL},
114  {ai_walk, 4.7, NULL},
115  {ai_walk, 4.7, NULL},
116  {ai_walk, 4.8, NULL}
117 };
119 
120 void berserk_walk (edict_t *self)
121 {
122  self->monsterinfo.currentmove = &berserk_move_walk;
123 }
124 
125 /*
126 
127  *****************************
128  SKIPPED THIS FOR NOW!
129  *****************************
130 
131  Running -> Arm raised in air
132 
133 void() berserk_runb1 =[ $r_att1 , berserk_runb2 ] {ai_run(21);};
134 void() berserk_runb2 =[ $r_att2 , berserk_runb3 ] {ai_run(11);};
135 void() berserk_runb3 =[ $r_att3 , berserk_runb4 ] {ai_run(21);};
136 void() berserk_runb4 =[ $r_att4 , berserk_runb5 ] {ai_run(25);};
137 void() berserk_runb5 =[ $r_att5 , berserk_runb6 ] {ai_run(18);};
138 void() berserk_runb6 =[ $r_att6 , berserk_runb7 ] {ai_run(19);};
139 // running with arm in air : start loop
140 void() berserk_runb7 =[ $r_att7 , berserk_runb8 ] {ai_run(21);};
141 void() berserk_runb8 =[ $r_att8 , berserk_runb9 ] {ai_run(11);};
142 void() berserk_runb9 =[ $r_att9 , berserk_runb10 ] {ai_run(21);};
143 void() berserk_runb10 =[ $r_att10 , berserk_runb11 ] {ai_run(25);};
144 void() berserk_runb11 =[ $r_att11 , berserk_runb12 ] {ai_run(18);};
145 void() berserk_runb12 =[ $r_att12 , berserk_runb7 ] {ai_run(19);};
146 // running with arm in air : end loop
147 */
148 
149 
151 {
152  {ai_run, 21, NULL},
153  {ai_run, 11, NULL},
154  {ai_run, 21, NULL},
155  {ai_run, 25, NULL},
156  {ai_run, 18, NULL},
157  {ai_run, 19, NULL}
158 };
160 
161 void berserk_run (edict_t *self)
162 {
163  if (self->monsterinfo.aiflags & AI_STAND_GROUND)
164  self->monsterinfo.currentmove = &berserk_move_stand;
165  else
166  self->monsterinfo.currentmove = &berserk_move_run1;
167 }
168 
169 
171 {
172  static vec3_t aim = {MELEE_DISTANCE, 0, -24};
173  fire_hit (self, aim, (15 + (rand() % 6)), 400); // Faster attack -- upwards and backwards
174 }
175 
176 
177 void berserk_swing (edict_t *self)
178 {
179  gi.sound (self, CHAN_WEAPON, sound_punch, 1, ATTN_NORM, 0);
180 }
181 
183 {
184  {ai_charge, 0, NULL},
185  {ai_charge, 0, NULL},
186  {ai_charge, 0, berserk_swing},
188  {ai_charge, 0, NULL},
189  {ai_charge, 0, NULL},
190  {ai_charge, 0, NULL},
191  {ai_charge, 0, NULL}
192 };
194 
195 
197 {
198  vec3_t aim;
199 
200  VectorSet (aim, MELEE_DISTANCE, self->mins[0], -4);
201  fire_hit (self, aim, (5 + (rand() % 6)), 400); // Slower attack
202 }
203 
205 {
206  {ai_charge, 0, NULL},
207  {ai_charge, 0, NULL},
208  {ai_charge, 0, NULL},
209  {ai_charge, 0, NULL},
210  {ai_charge, 0, berserk_swing},
211  {ai_charge, 0, NULL},
212  {ai_charge, 0, NULL},
213  {ai_charge, 0, NULL},
215  {ai_charge, 0, NULL},
216  {ai_charge, 0, NULL},
217  {ai_charge, 0, NULL}
218 };
220 
221 
223 {
224  //FIXME play impact sound
225 }
226 
227 
229 {
230  {ai_move, 0, NULL},
231  {ai_move, 0, NULL},
232  {ai_move, 0, NULL},
233  {ai_move, 0, berserk_swing},
234  {ai_move, 0, NULL},
235  {ai_move, 0, NULL},
236  {ai_move, 0, NULL},
237  {ai_move, 0, berserk_strike},
238  {ai_move, 0, NULL},
239  {ai_move, 0, NULL},
240  {ai_move, 0, NULL},
241  {ai_move, 0, NULL},
242  {ai_move, 9.7, NULL},
243  {ai_move, 13.6, NULL}
244 };
245 
247 
248 
249 void berserk_melee (edict_t *self)
250 {
251  if ((rand() % 2) == 0)
252  self->monsterinfo.currentmove = &berserk_move_attack_spike;
253  else
254  self->monsterinfo.currentmove = &berserk_move_attack_club;
255 }
256 
257 
258 /*
259 void() berserk_atke1 =[ $r_attb1, berserk_atke2 ] {ai_run(9);};
260 void() berserk_atke2 =[ $r_attb2, berserk_atke3 ] {ai_run(6);};
261 void() berserk_atke3 =[ $r_attb3, berserk_atke4 ] {ai_run(18.4);};
262 void() berserk_atke4 =[ $r_attb4, berserk_atke5 ] {ai_run(25);};
263 void() berserk_atke5 =[ $r_attb5, berserk_atke6 ] {ai_run(14);};
264 void() berserk_atke6 =[ $r_attb6, berserk_atke7 ] {ai_run(20);};
265 void() berserk_atke7 =[ $r_attb7, berserk_atke8 ] {ai_run(8.5);};
266 void() berserk_atke8 =[ $r_attb8, berserk_atke9 ] {ai_run(3);};
267 void() berserk_atke9 =[ $r_attb9, berserk_atke10 ] {ai_run(17.5);};
268 void() berserk_atke10 =[ $r_attb10, berserk_atke11 ] {ai_run(17);};
269 void() berserk_atke11 =[ $r_attb11, berserk_atke12 ] {ai_run(9);};
270 void() berserk_atke12 =[ $r_attb12, berserk_atke13 ] {ai_run(25);};
271 void() berserk_atke13 =[ $r_attb13, berserk_atke14 ] {ai_run(3.7);};
272 void() berserk_atke14 =[ $r_attb14, berserk_atke15 ] {ai_run(2.6);};
273 void() berserk_atke15 =[ $r_attb15, berserk_atke16 ] {ai_run(19);};
274 void() berserk_atke16 =[ $r_attb16, berserk_atke17 ] {ai_run(25);};
275 void() berserk_atke17 =[ $r_attb17, berserk_atke18 ] {ai_run(19.6);};
276 void() berserk_atke18 =[ $r_attb18, berserk_run1 ] {ai_run(7.8);};
277 */
278 
279 
281 {
282  {ai_move, 0, NULL},
283  {ai_move, 0, NULL},
284  {ai_move, 0, NULL},
285  {ai_move, 0, NULL}
286 };
288 
289 
291 {
292  {ai_move, 0, NULL},
293  {ai_move, 0, NULL},
294  {ai_move, 0, NULL},
295  {ai_move, 0, NULL},
296  {ai_move, 0, NULL},
297  {ai_move, 0, NULL},
298  {ai_move, 0, NULL},
299  {ai_move, 0, NULL},
300  {ai_move, 0, NULL},
301  {ai_move, 0, NULL},
302  {ai_move, 0, NULL},
303  {ai_move, 0, NULL},
304  {ai_move, 0, NULL},
305  {ai_move, 0, NULL},
306  {ai_move, 0, NULL},
307  {ai_move, 0, NULL},
308  {ai_move, 0, NULL},
309  {ai_move, 0, NULL},
310  {ai_move, 0, NULL},
311  {ai_move, 0, NULL}
312 };
314 
315 void berserk_pain (edict_t *self, edict_t *other, float kick, int damage)
316 {
317  if (self->health < (self->max_health / 2))
318  self->s.skinnum = 1;
319 
320  if (level.time < self->pain_debounce_time)
321  return;
322 
323  self->pain_debounce_time = level.time + 3;
324  gi.sound (self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0);
325 
326  if (skill->value == 3)
327  return; // no pain anims in nightmare
328 
329  if ((damage < 20) || (random() < 0.5))
330  self->monsterinfo.currentmove = &berserk_move_pain1;
331  else
332  self->monsterinfo.currentmove = &berserk_move_pain2;
333 }
334 
335 
336 void berserk_dead (edict_t *self)
337 {
338  VectorSet (self->mins, -16, -16, -24);
339  VectorSet (self->maxs, 16, 16, -8);
340  self->movetype = MOVETYPE_TOSS;
341  self->svflags |= SVF_DEADMONSTER;
342  self->nextthink = 0;
343  gi.linkentity (self);
344 }
345 
346 
348 {
349  {ai_move, 0, NULL},
350  {ai_move, 0, NULL},
351  {ai_move, 0, NULL},
352  {ai_move, 0, NULL},
353  {ai_move, 0, NULL},
354  {ai_move, 0, NULL},
355  {ai_move, 0, NULL},
356  {ai_move, 0, NULL},
357  {ai_move, 0, NULL},
358  {ai_move, 0, NULL},
359  {ai_move, 0, NULL},
360  {ai_move, 0, NULL},
361  {ai_move, 0, NULL}
362 
363 };
365 
366 
368 {
369  {ai_move, 0, NULL},
370  {ai_move, 0, NULL},
371  {ai_move, 0, NULL},
372  {ai_move, 0, NULL},
373  {ai_move, 0, NULL},
374  {ai_move, 0, NULL},
375  {ai_move, 0, NULL},
376  {ai_move, 0, NULL}
377 };
379 
380 
381 void berserk_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
382 {
383  int n;
384 
385  if (self->health <= self->gib_health)
386  {
387  gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
388  for (n= 0; n < 2; n++)
389  ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
390  for (n= 0; n < 4; n++)
391  ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
392  ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
393  self->deadflag = DEAD_DEAD;
394  return;
395  }
396 
397  if (self->deadflag == DEAD_DEAD)
398  return;
399 
400  gi.sound (self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0);
401  self->deadflag = DEAD_DEAD;
402  self->takedamage = DAMAGE_YES;
403 
404  if (damage >= 50)
405  self->monsterinfo.currentmove = &berserk_move_death1;
406  else
407  self->monsterinfo.currentmove = &berserk_move_death2;
408 }
409 
410 
411 /*QUAKED monster_berserk (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
412 */
414 {
415  if (deathmatch->value)
416  {
417  G_FreeEdict (self);
418  return;
419  }
420 
421  // pre-caches
422  sound_pain = gi.soundindex ("berserk/berpain2.wav");
423  sound_die = gi.soundindex ("berserk/berdeth2.wav");
424  sound_idle = gi.soundindex ("berserk/beridle1.wav");
425  sound_punch = gi.soundindex ("berserk/attack.wav");
426  sound_search = gi.soundindex ("berserk/bersrch1.wav");
427  sound_sight = gi.soundindex ("berserk/sight.wav");
428 
429  self->s.modelindex = gi.modelindex("models/monsters/berserk/tris.md2");
430  VectorSet (self->mins, -16, -16, -24);
431  VectorSet (self->maxs, 16, 16, 32);
432  self->movetype = MOVETYPE_STEP;
433  self->solid = SOLID_BBOX;
434 
435  self->health = 240;
436  self->gib_health = -60;
437  self->mass = 250;
438 
439  self->pain = berserk_pain;
440  self->die = berserk_die;
441 
442  self->monsterinfo.stand = berserk_stand;
443  self->monsterinfo.walk = berserk_walk;
444  self->monsterinfo.run = berserk_run;
445  self->monsterinfo.dodge = NULL;
446  self->monsterinfo.attack = NULL;
447  self->monsterinfo.melee = berserk_melee;
448  self->monsterinfo.sight = berserk_sight;
449  self->monsterinfo.search = berserk_search;
450 
451  self->monsterinfo.currentmove = &berserk_move_stand;
452  self->monsterinfo.scale = MODEL_SCALE;
453 
454  gi.linkentity (self);
455 
456  walkmonster_start (self);
457 }
gi
game_import_t gi
Definition: g_main.c:25
sound_sight
static int sound_sight
Definition: m_berserk.c:36
deathmatch
cvar_t * deathmatch
Definition: g_main.c:35
DEAD_DEAD
#define DEAD_DEAD
Definition: g_local.h:113
berserk_frames_stand
mframe_t berserk_frames_stand[]
Definition: m_berserk.c:51
ThrowGib
void ThrowGib(edict_t *self, char *gibname, int damage, int type)
Definition: g_misc.c:135
MELEE_DISTANCE
#define MELEE_DISTANCE
Definition: g_local.h:80
berserk_move_run1
mmove_t berserk_move_run1
Definition: m_berserk.c:159
ai_charge
void ai_charge(edict_t *self, float dist)
Definition: g_ai.c:194
SOLID_BBOX
@ SOLID_BBOX
Definition: game.h:37
FRAME_run6
#define FRAME_run6
Definition: m_berserk.h:65
berserk_frames_stand_fidget
mframe_t berserk_frames_stand_fidget[]
Definition: m_berserk.c:66
berserk_strike
void berserk_strike(edict_t *self)
Definition: m_berserk.c:222
AI_STAND_GROUND
#define AI_STAND_GROUND
Definition: g_local.h:127
berserk_frames_pain1
mframe_t berserk_frames_pain1[]
Definition: m_berserk.c:280
berserk_frames_run1
mframe_t berserk_frames_run1[]
Definition: m_berserk.c:150
MODEL_SCALE
#define MODEL_SCALE
Definition: m_actor.h:506
berserk_frames_attack_spike
mframe_t berserk_frames_attack_spike[]
Definition: m_berserk.c:182
DAMAGE_YES
@ DAMAGE_YES
Definition: g_local.h:87
game_import_t::sound
void(* sound)(edict_t *ent, int channel, int soundindex, float volume, float attenuation, float timeofs)
Definition: game.h:109
ATTN_IDLE
#define ATTN_IDLE
Definition: q_shared.h:1020
berserk_frames_attack_strike
mframe_t berserk_frames_attack_strike[]
Definition: m_berserk.c:228
fire_hit
qboolean fire_hit(edict_t *self, vec3_t aim, int damage, int kick)
Definition: g_weapon.c:63
ATTN_NORM
#define ATTN_NORM
Definition: q_shared.h:1019
berserk_attack_spike
void berserk_attack_spike(edict_t *self)
Definition: m_berserk.c:170
walkmonster_start
void walkmonster_start(edict_t *self)
Definition: g_monster.c:692
MOVETYPE_STEP
@ MOVETYPE_STEP
Definition: g_local.h:194
FRAME_standb20
#define FRAME_standb20
Definition: m_berserk.h:48
berserk_move_stand
mmove_t berserk_move_stand
Definition: m_berserk.c:59
berserk_move_attack_spike
mmove_t berserk_move_attack_spike
Definition: m_berserk.c:193
SVF_DEADMONSTER
#define SVF_DEADMONSTER
Definition: game.h:28
berserk_move_death2
mmove_t berserk_move_death2
Definition: m_berserk.c:378
berserk_stand
void berserk_stand(edict_t *self)
Definition: m_berserk.c:61
CHAN_VOICE
#define CHAN_VOICE
Definition: q_shared.h:1009
edict_s
Definition: g_local.h:962
FRAME_death1
#define FRAME_death1
Definition: m_berserk.h:247
berserk_frames_death2
mframe_t berserk_frames_death2[]
Definition: m_berserk.c:367
G_FreeEdict
void G_FreeEdict(edict_t *e)
Definition: g_utils.c:452
FRAME_deathc8
#define FRAME_deathc8
Definition: m_berserk.h:267
berserk_move_walk
mmove_t berserk_move_walk
Definition: m_berserk.c:118
berserk_move_pain1
mmove_t berserk_move_pain1
Definition: m_berserk.c:287
berserk_melee
void berserk_melee(edict_t *self)
Definition: m_berserk.c:249
berserk_frames_walk
mframe_t berserk_frames_walk[]
Definition: m_berserk.c:103
game_import_t::soundindex
int(* soundindex)(char *name)
Definition: game.h:122
berserk_fidget
void berserk_fidget(edict_t *self)
Definition: m_berserk.c:91
FRAME_att_c34
#define FRAME_att_c34
Definition: m_berserk.h:133
game_import_t::modelindex
int(* modelindex)(char *name)
Definition: game.h:121
berserk_attack_club
void berserk_attack_club(edict_t *self)
Definition: m_berserk.c:196
FRAME_standb1
#define FRAME_standb1
Definition: m_berserk.h:29
mframe_t
Definition: g_local.h:401
mmove_t
Definition: g_local.h:408
sound_die
static int sound_die
Definition: m_berserk.c:33
sound_punch
static int sound_punch
Definition: m_berserk.c:35
berserk_frames_death1
mframe_t berserk_frames_death1[]
Definition: m_berserk.c:347
berserk_walk
void berserk_walk(edict_t *self)
Definition: m_berserk.c:120
cvar_s::value
float value
Definition: q_shared.h:324
FRAME_deathc1
#define FRAME_deathc1
Definition: m_berserk.h:260
FRAME_walkc1
#define FRAME_walkc1
Definition: m_berserk.h:49
ai_walk
void ai_walk(edict_t *self, float dist)
Definition: g_ai.c:163
random
#define random()
Definition: g_local.h:509
FRAME_stand1
#define FRAME_stand1
Definition: m_berserk.h:24
NULL
#define NULL
Definition: q_shared.h:60
FRAME_att_c9
#define FRAME_att_c9
Definition: m_berserk.h:108
berserk_dead
void berserk_dead(edict_t *self)
Definition: m_berserk.c:336
FRAME_att_c1
#define FRAME_att_c1
Definition: m_berserk.h:100
berserk_search
void berserk_search(edict_t *self)
Definition: m_berserk.c:44
FRAME_painb20
#define FRAME_painb20
Definition: m_berserk.h:246
FRAME_painc4
#define FRAME_painc4
Definition: m_berserk.h:226
FRAME_painb1
#define FRAME_painb1
Definition: m_berserk.h:227
m_berserk.h
skill
cvar_t * skill
Definition: g_main.c:38
FRAME_death13
#define FRAME_death13
Definition: m_berserk.h:259
berserk_move_attack_club
mmove_t berserk_move_attack_club
Definition: m_berserk.c:219
ai_move
void ai_move(edict_t *self, float dist)
Definition: g_ai.c:92
FRAME_painc1
#define FRAME_painc1
Definition: m_berserk.h:223
berserk_frames_pain2
mframe_t berserk_frames_pain2[]
Definition: m_berserk.c:290
sound_search
static int sound_search
Definition: m_berserk.c:37
CHAN_WEAPON
#define CHAN_WEAPON
Definition: q_shared.h:1008
berserk_move_death1
mmove_t berserk_move_death1
Definition: m_berserk.c:364
level
GLint level
Definition: qgl_win.c:116
ai_run
void ai_run(edict_t *self, float dist)
Definition: g_ai.c:915
GIB_ORGANIC
#define GIB_ORGANIC
Definition: g_local.h:123
FRAME_run1
#define FRAME_run1
Definition: m_berserk.h:60
FRAME_att_c20
#define FRAME_att_c20
Definition: m_berserk.h:119
SP_monster_berserk
void SP_monster_berserk(edict_t *self)
Definition: m_berserk.c:413
berserk_move_attack_strike
mmove_t berserk_move_attack_strike
Definition: m_berserk.c:246
FRAME_att_c8
#define FRAME_att_c8
Definition: m_berserk.h:107
berserk_move_pain2
mmove_t berserk_move_pain2
Definition: m_berserk.c:313
ThrowHead
void ThrowHead(edict_t *self, char *gibname, int damage, int type)
Definition: g_misc.c:183
sound_idle
static int sound_idle
Definition: m_berserk.c:34
berserk_swing
void berserk_swing(edict_t *self)
Definition: m_berserk.c:177
berserk_move_stand_fidget
mmove_t berserk_move_stand_fidget
Definition: m_berserk.c:89
FRAME_att_c21
#define FRAME_att_c21
Definition: m_berserk.h:120
MOVETYPE_TOSS
@ MOVETYPE_TOSS
Definition: g_local.h:196
VectorSet
#define VectorSet(v, x, y, z)
Definition: q_shared.h:161
FRAME_walkc11
#define FRAME_walkc11
Definition: m_berserk.h:59
berserk_sight
void berserk_sight(edict_t *self, edict_t *other)
Definition: m_berserk.c:39
berserk_pain
void berserk_pain(edict_t *self, edict_t *other, float kick, int damage)
Definition: m_berserk.c:315
FRAME_stand5
#define FRAME_stand5
Definition: m_berserk.h:28
berserk_frames_attack_club
mframe_t berserk_frames_attack_club[]
Definition: m_berserk.c:204
game_import_t::linkentity
void(* linkentity)(edict_t *ent)
Definition: game.h:138
berserk_die
void berserk_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
Definition: m_berserk.c:381
vec3_t
vec_t vec3_t[3]
Definition: q_shared.h:127
sound_pain
static int sound_pain
Definition: m_berserk.c:32
ai_stand
void ai_stand(edict_t *self, float dist)
Definition: g_ai.c:106
g_local.h
berserk_run
void berserk_run(edict_t *self)
Definition: m_berserk.c:161