File: game\m_insane.c
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 insane
24
25 ==============================================================================
26 */
27
28 #include "g_local.h"
29 #include "m_insane.h"
30
31
32 static int sound_fist;
33 static int sound_shake;
34 static int sound_moan;
35 static int sound_scream[8];
36
37 void insane_fist (edict_t *self)
38 {
39 gi.sound (self, CHAN_VOICE, sound_fist, 1, ATTN_IDLE, 0);
40 }
41
42 void insane_shake (edict_t *self)
43 {
44 gi.sound (self, CHAN_VOICE, sound_shake, 1, ATTN_IDLE, 0);
45 }
46
47 void insane_moan (edict_t *self)
48 {
49 gi.sound (self, CHAN_VOICE, sound_moan, 1, ATTN_IDLE, 0);
50 }
51
52 void insane_scream (edict_t *self)
53 {
54 gi.sound (self, CHAN_VOICE, sound_scream[rand()%8], 1, ATTN_IDLE, 0);
55 }
56
57
58 void insane_stand (edict_t *self);
59 void insane_dead (edict_t *self);
60 void insane_cross (edict_t *self);
61 void insane_walk (edict_t *self);
62 void insane_run (edict_t *self);
63 void insane_checkdown (edict_t *self);
64 void insane_checkup (edict_t *self);
65 void insane_onground (edict_t *self);
66
67
68 mframe_t insane_frames_stand_normal [] =
69 {
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, insane_checkdown
76 };
77 mmove_t insane_move_stand_normal = {FRAME_stand60, FRAME_stand65, insane_frames_stand_normal, insane_stand};
78
79 mframe_t insane_frames_stand_insane [] =
80 {
81 ai_stand, 0, insane_shake,
82 ai_stand, 0, NULL,
83 ai_stand, 0, NULL,
84 ai_stand, 0, NULL,
85 ai_stand, 0, NULL,
86 ai_stand, 0, NULL,
87 ai_stand, 0, NULL,
88 ai_stand, 0, NULL,
89 ai_stand, 0, NULL,
90 ai_stand, 0, NULL,
91 ai_stand, 0, NULL,
92 ai_stand, 0, NULL,
93 ai_stand, 0, NULL,
94 ai_stand, 0, NULL,
95 ai_stand, 0, NULL,
96 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,
102 ai_stand, 0, NULL,
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, insane_checkdown
111 };
112 mmove_t insane_move_stand_insane = {FRAME_stand65, FRAME_stand94, insane_frames_stand_insane, insane_stand};
113
114 mframe_t insane_frames_uptodown [] =
115 {
116 ai_move, 0, NULL,
117 ai_move, 0, NULL,
118 ai_move, 0, NULL,
119 ai_move, 0, NULL,
120 ai_move, 0, NULL,
121 ai_move, 0, NULL,
122 ai_move, 0, NULL,
123 ai_move, 0, insane_moan,
124 ai_move, 0, NULL,
125 ai_move, 0, NULL,
126
127 ai_move, 0, NULL,
128 ai_move, 0, NULL,
129 ai_move, 0, NULL,
130 ai_move, 0, NULL,
131 ai_move, 0, NULL,
132 ai_move, 0, NULL,
133 ai_move, 0, NULL,
134 ai_move, 0, NULL,
135 ai_move, 0, NULL,
136 ai_move, 0, NULL,
137
138 ai_move, 2.7, NULL,
139 ai_move, 4.1, NULL,
140 ai_move, 6, NULL,
141 ai_move, 7.6, NULL,
142 ai_move, 3.6, NULL,
143 ai_move, 0, NULL,
144 ai_move, 0, NULL,
145 ai_move, 0, insane_fist,
146 ai_move, 0, NULL,
147 ai_move, 0, NULL,
148
149 ai_move, 0, NULL,
150 ai_move, 0, NULL,
151 ai_move, 0, NULL,
152 ai_move, 0, insane_fist,
153 ai_move, 0, NULL,
154 ai_move, 0, NULL,
155 ai_move, 0, NULL,
156 ai_move, 0, NULL,
157 ai_move, 0, NULL,
158 ai_move, 0, NULL
159 };
160 mmove_t insane_move_uptodown = {FRAME_stand1, FRAME_stand40, insane_frames_uptodown, insane_onground};
161
162
163 mframe_t insane_frames_downtoup [] =
164 {
165 ai_move, -0.7, NULL, // 41
166 ai_move, -1.2, NULL, // 42
167 ai_move, -1.5, NULL, // 43
168 ai_move, -4.5, NULL, // 44
169 ai_move, -3.5, NULL, // 45
170 ai_move, -0.2, NULL, // 46
171 ai_move, 0, NULL, // 47
172 ai_move, -1.3, NULL, // 48
173 ai_move, -3, NULL, // 49
174 ai_move, -2, NULL, // 50
175 ai_move, 0, NULL, // 51
176 ai_move, 0, NULL, // 52
177 ai_move, 0, NULL, // 53
178 ai_move, -3.3, NULL, // 54
179 ai_move, -1.6, NULL, // 55
180 ai_move, -0.3, NULL, // 56
181 ai_move, 0, NULL, // 57
182 ai_move, 0, NULL, // 58
183 ai_move, 0, NULL // 59
184 };
185 mmove_t insane_move_downtoup = {FRAME_stand41, FRAME_stand59, insane_frames_downtoup, insane_stand};
186
187 mframe_t insane_frames_jumpdown [] =
188 {
189 ai_move, 0.2, NULL,
190 ai_move, 11.5, NULL,
191 ai_move, 5.1, NULL,
192 ai_move, 7.1, NULL,
193 ai_move, 0, NULL
194 };
195 mmove_t insane_move_jumpdown = {FRAME_stand96, FRAME_stand100, insane_frames_jumpdown, insane_onground};
196
197
198 mframe_t insane_frames_down [] =
199 {
200 ai_move, 0, NULL, // 100
201 ai_move, 0, NULL,
202 ai_move, 0, NULL,
203 ai_move, 0, NULL,
204 ai_move, 0, NULL,
205 ai_move, 0, NULL,
206 ai_move, 0, NULL,
207 ai_move, 0, NULL,
208 ai_move, 0, NULL,
209 ai_move, 0, NULL,
210 ai_move, 0, NULL, // 110
211 ai_move, -1.7, NULL,
212 ai_move, -1.6, NULL,
213 ai_move, 0, NULL,
214 ai_move, 0, NULL,
215 ai_move, 0, NULL,
216 ai_move, 0, insane_fist,
217 ai_move, 0, NULL,
218 ai_move, 0, NULL,
219 ai_move, 0, NULL,
220 ai_move, 0, NULL, // 120
221 ai_move, 0, NULL,
222 ai_move, 0, NULL,
223 ai_move, 0, NULL,
224 ai_move, 0, NULL,
225 ai_move, 0, NULL,
226 ai_move, 0, NULL,
227 ai_move, 0, NULL,
228 ai_move, 0, NULL,
229 ai_move, 0, NULL,
230 ai_move, 0, NULL, // 130
231 ai_move, 0, NULL,
232 ai_move, 0, NULL,
233 ai_move, 0, insane_moan,
234 ai_move, 0, NULL,
235 ai_move, 0, NULL,
236 ai_move, 0, NULL,
237 ai_move, 0, NULL,
238 ai_move, 0, NULL,
239 ai_move, 0, NULL,
240 ai_move, 0, NULL, // 140
241 ai_move, 0, NULL,
242 ai_move, 0, NULL,
243 ai_move, 0, NULL,
244 ai_move, 0, NULL,
245 ai_move, 0, NULL,
246 ai_move, 0, NULL,
247 ai_move, 0, NULL,
248 ai_move, 0, NULL,
249 ai_move, 0, NULL,
250 ai_move, 0, NULL, // 150
251 ai_move, 0.5, NULL,
252 ai_move, 0, NULL,
253 ai_move, -0.2, insane_scream,
254 ai_move, 0, NULL,
255 ai_move, 0.2, NULL,
256 ai_move, 0.4, NULL,
257 ai_move, 0.6, NULL,
258 ai_move, 0.8, NULL,
259 ai_move, 0.7, NULL,
260 ai_move, 0, insane_checkup // 160
261 };
262 mmove_t insane_move_down = {FRAME_stand100, FRAME_stand160, insane_frames_down, insane_onground};
263
264 mframe_t insane_frames_walk_normal [] =
265 {
266 ai_walk, 0, insane_scream,
267 ai_walk, 2.5, NULL,
268 ai_walk, 3.5, NULL,
269 ai_walk, 1.7, NULL,
270 ai_walk, 2.3, NULL,
271 ai_walk, 2.4, NULL,
272 ai_walk, 2.2, NULL,
273 ai_walk, 4.2, NULL,
274 ai_walk, 5.6, NULL,
275 ai_walk, 3.3, NULL,
276 ai_walk, 2.4, NULL,
277 ai_walk, 0.9, NULL,
278 ai_walk, 0, NULL
279 };
280 mmove_t insane_move_walk_normal = {FRAME_walk27, FRAME_walk39, insane_frames_walk_normal, insane_walk};
281 mmove_t insane_move_run_normal = {FRAME_walk27, FRAME_walk39, insane_frames_walk_normal, insane_run};
282
283 mframe_t insane_frames_walk_insane [] =
284 {
285 ai_walk, 0, insane_scream, // walk 1
286 ai_walk, 3.4, NULL, // walk 2
287 ai_walk, 3.6, NULL, // 3
288 ai_walk, 2.9, NULL, // 4
289 ai_walk, 2.2, NULL, // 5
290 ai_walk, 2.6, NULL, // 6
291 ai_walk, 0, NULL, // 7
292 ai_walk, 0.7, NULL, // 8
293 ai_walk, 4.8, NULL, // 9
294 ai_walk, 5.3, NULL, // 10
295 ai_walk, 1.1, NULL, // 11
296 ai_walk, 2, NULL, // 12
297 ai_walk, 0.5, NULL, // 13
298 ai_walk, 0, NULL, // 14
299 ai_walk, 0, NULL, // 15
300 ai_walk, 4.9, NULL, // 16
301 ai_walk, 6.7, NULL, // 17
302 ai_walk, 3.8, NULL, // 18
303 ai_walk, 2, NULL, // 19
304 ai_walk, 0.2, NULL, // 20
305 ai_walk, 0, NULL, // 21
306 ai_walk, 3.4, NULL, // 22
307 ai_walk, 6.4, NULL, // 23
308 ai_walk, 5, NULL, // 24
309 ai_walk, 1.8, NULL, // 25
310 ai_walk, 0, NULL // 26
311 };
312 mmove_t insane_move_walk_insane = {FRAME_walk1, FRAME_walk26, insane_frames_walk_insane, insane_walk};
313 mmove_t insane_move_run_insane = {FRAME_walk1, FRAME_walk26, insane_frames_walk_insane, insane_run};
314
315 mframe_t insane_frames_stand_pain [] =
316 {
317 ai_move, 0, NULL,
318 ai_move, 0, NULL,
319 ai_move, 0, NULL,
320 ai_move, 0, NULL,
321 ai_move, 0, NULL,
322 ai_move, 0, NULL,
323 ai_move, 0, NULL,
324 ai_move, 0, NULL,
325 ai_move, 0, NULL,
326 ai_move, 0, NULL,
327 ai_move, 0, NULL
328 };
329 mmove_t insane_move_stand_pain = {FRAME_st_pain2, FRAME_st_pain12, insane_frames_stand_pain, insane_run};
330
331 mframe_t insane_frames_stand_death [] =
332 {
333 ai_move, 0, NULL,
334 ai_move, 0, NULL,
335 ai_move, 0, NULL,
336 ai_move, 0, NULL,
337 ai_move, 0, NULL,
338 ai_move, 0, NULL,
339 ai_move, 0, NULL,
340 ai_move, 0, NULL,
341 ai_move, 0, NULL,
342 ai_move, 0, NULL,
343 ai_move, 0, NULL,
344 ai_move, 0, NULL,
345 ai_move, 0, NULL,
346 ai_move, 0, NULL,
347 ai_move, 0, NULL,
348 ai_move, 0, NULL,
349 ai_move, 0, NULL
350 };
351 mmove_t insane_move_stand_death = {FRAME_st_death2, FRAME_st_death18, insane_frames_stand_death, insane_dead};
352
353 mframe_t insane_frames_crawl [] =
354 {
355 ai_walk, 0, insane_scream,
356 ai_walk, 1.5, NULL,
357 ai_walk, 2.1, NULL,
358 ai_walk, 3.6, NULL,
359 ai_walk, 2, NULL,
360 ai_walk, 0.9, NULL,
361 ai_walk, 3, NULL,
362 ai_walk, 3.4, NULL,
363 ai_walk, 2.4, NULL
364 };
365 mmove_t insane_move_crawl = {FRAME_crawl1, FRAME_crawl9, insane_frames_crawl, NULL};
366 mmove_t insane_move_runcrawl = {FRAME_crawl1, FRAME_crawl9, insane_frames_crawl, NULL};
367
368 mframe_t insane_frames_crawl_pain [] =
369 {
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 ai_move, 0, NULL,
378 ai_move, 0, NULL
379 };
380 mmove_t insane_move_crawl_pain = {FRAME_cr_pain2, FRAME_cr_pain10, insane_frames_crawl_pain, insane_run};
381
382 mframe_t insane_frames_crawl_death [] =
383 {
384 ai_move, 0, NULL,
385 ai_move, 0, NULL,
386 ai_move, 0, NULL,
387 ai_move, 0, NULL,
388 ai_move, 0, NULL,
389 ai_move, 0, NULL,
390 ai_move, 0, NULL
391 };
392 mmove_t insane_move_crawl_death = {FRAME_cr_death10, FRAME_cr_death16, insane_frames_crawl_death, insane_dead};
393
394 mframe_t insane_frames_cross [] =
395 {
396 ai_move, 0, insane_moan,
397 ai_move, 0, NULL,
398 ai_move, 0, NULL,
399 ai_move, 0, NULL,
400 ai_move, 0, NULL,
401 ai_move, 0, NULL,
402 ai_move, 0, NULL,
403 ai_move, 0, NULL,
404 ai_move, 0, NULL,
405 ai_move, 0, NULL,
406 ai_move, 0, NULL,
407 ai_move, 0, NULL,
408 ai_move, 0, NULL,
409 ai_move, 0, NULL,
410 ai_move, 0, NULL
411 };
412 mmove_t insane_move_cross = {FRAME_cross1, FRAME_cross15, insane_frames_cross, insane_cross};
413
414 mframe_t insane_frames_struggle_cross [] =
415 {
416 ai_move, 0, insane_scream,
417 ai_move, 0, NULL,
418 ai_move, 0, NULL,
419 ai_move, 0, NULL,
420 ai_move, 0, NULL,
421 ai_move, 0, NULL,
422 ai_move, 0, NULL,
423 ai_move, 0, NULL,
424 ai_move, 0, NULL,
425 ai_move, 0, NULL,
426 ai_move, 0, NULL,
427 ai_move, 0, NULL,
428 ai_move, 0, NULL,
429 ai_move, 0, NULL,
430 ai_move, 0, NULL
431 };
432 mmove_t insane_move_struggle_cross = {FRAME_cross16, FRAME_cross30, insane_frames_struggle_cross, insane_cross};
433
434 void insane_cross (edict_t *self)
435 {
436 if (random() < 0.8)
437 self->monsterinfo.currentmove = &insane_move_cross;
438 else
439 self->monsterinfo.currentmove = &insane_move_struggle_cross;
440 }
441
442 void insane_walk (edict_t *self)
443 {
444 if ( self->spawnflags & 16 ) // Hold Ground?
445 if (self->s.frame == FRAME_cr_pain10)
446 {
447 self->monsterinfo.currentmove = &insane_move_down;
448 return;
449 }
450 if (self->spawnflags & 4)
451 self->monsterinfo.currentmove = &insane_move_crawl;
452 else
453 if (random() <= 0.5)
454 self->monsterinfo.currentmove = &insane_move_walk_normal;
455 else
456 self->monsterinfo.currentmove = &insane_move_walk_insane;
457 }
458
459 void insane_run (edict_t *self)
460 {
461 if ( self->spawnflags & 16 ) // Hold Ground?
462 if (self->s.frame == FRAME_cr_pain10)
463 {
464 self->monsterinfo.currentmove = &insane_move_down;
465 return;
466 }
467 if (self->spawnflags & 4) // Crawling?
468 self->monsterinfo.currentmove = &insane_move_runcrawl;
469 else
470 if (random() <= 0.5) // Else, mix it up
471 self->monsterinfo.currentmove = &insane_move_run_normal;
472 else
473 self->monsterinfo.currentmove = &insane_move_run_insane;
474 }
475
476
477 void insane_pain (edict_t *self, edict_t *other, float kick, int damage)
478 {
479 int l,r;
480
481 // if (self->health < (self->max_health / 2))
482 // self->s.skinnum = 1;
483
484 if (level.time < self->pain_debounce_time)
485 return;
486
487 self->pain_debounce_time = level.time + 3;
488
489 r = 1 + (rand()&1);
490 if (self->health < 25)
491 l = 25;
492 else if (self->health < 50)
493 l = 50;
494 else if (self->health < 75)
495 l = 75;
496 else
497 l = 100;
498 gi.sound (self, CHAN_VOICE, gi.soundindex (va("player/male/pain%i_%i.wav", l, r)), 1, ATTN_IDLE, 0);
499
500 if (skill->value == 3)
501 return; // no pain anims in nightmare
502
503 // Don't go into pain frames if crucified.
504 if (self->spawnflags & 8)
505 {
506 self->monsterinfo.currentmove = &insane_move_struggle_cross;
507 return;
508 }
509
510 if ( ((self->s.frame >= FRAME_crawl1) && (self->s.frame <= FRAME_crawl9)) || ((self->s.frame >= FRAME_stand99) && (self->s.frame <= FRAME_stand160)) )
511 {
512 self->monsterinfo.currentmove = &insane_move_crawl_pain;
513 }
514 else
515 self->monsterinfo.currentmove = &insane_move_stand_pain;
516
517 }
518
519 void insane_onground (edict_t *self)
520 {
521 self->monsterinfo.currentmove = &insane_move_down;
522 }
523
524 void insane_checkdown (edict_t *self)
525 {
526 // if ( (self->s.frame == FRAME_stand94) || (self->s.frame == FRAME_stand65) )
527 if (self->spawnflags & 32) // Always stand
528 return;
529 if (random() < 0.3)
530 if (random() < 0.5)
531 self->monsterinfo.currentmove = &insane_move_uptodown;
532 else
533 self->monsterinfo.currentmove = &insane_move_jumpdown;
534 }
535
536 void insane_checkup (edict_t *self)
537 {
538 // If Hold_Ground and Crawl are set
539 if ( (self->spawnflags & 4) && (self->spawnflags & 16) )
540 return;
541 if (random() < 0.5)
542 self->monsterinfo.currentmove = &insane_move_downtoup;
543
544 }
545
546 void insane_stand (edict_t *self)
547 {
548 if (self->spawnflags & 8) // If crucified
549 {
550 self->monsterinfo.currentmove = &insane_move_cross;
551 self->monsterinfo.aiflags |= AI_STAND_GROUND;
552 }
553 // If Hold_Ground and Crawl are set
554 else if ( (self->spawnflags & 4) && (self->spawnflags & 16) )
555 self->monsterinfo.currentmove = &insane_move_down;
556 else
557 if (random() < 0.5)
558 self->monsterinfo.currentmove = &insane_move_stand_normal;
559 else
560 self->monsterinfo.currentmove = &insane_move_stand_insane;
561 }
562
563 void insane_dead (edict_t *self)
564 {
565 if (self->spawnflags & 8)
566 {
567 self->flags |= FL_FLY;
568 }
569 else
570 {
571 VectorSet (self->mins, -16, -16, -24);
572 VectorSet (self->maxs, 16, 16, -8);
573 self->movetype = MOVETYPE_TOSS;
574 }
575 self->svflags |= SVF_DEADMONSTER;
576 self->nextthink = 0;
577 gi.linkentity (self);
578 }
579
580
581 void insane_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
582 {
583 int n;
584
585 if (self->health <= self->gib_health)
586 {
587 gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_IDLE, 0);
588 for (n= 0; n < 2; n++)
589 ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
590 for (n= 0; n < 4; n++)
591 ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
592 ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
593 self->deadflag = DEAD_DEAD;
594 return;
595 }
596
597 if (self->deadflag == DEAD_DEAD)
598 return;
599
600 gi.sound (self, CHAN_VOICE, gi.soundindex(va("player/male/death%i.wav", (rand()%4)+1)), 1, ATTN_IDLE, 0);
601
602 self->deadflag = DEAD_DEAD;
603 self->takedamage = DAMAGE_YES;
604
605 if (self->spawnflags & 8)
606 {
607 insane_dead (self);
608 }
609 else
610 {
611 if ( ((self->s.frame >= FRAME_crawl1) && (self->s.frame <= FRAME_crawl9)) || ((self->s.frame >= FRAME_stand99) && (self->s.frame <= FRAME_stand160)) )
612 self->monsterinfo.currentmove = &insane_move_crawl_death;
613 else
614 self->monsterinfo.currentmove = &insane_move_stand_death;
615 }
616 }
617
618
619 /*QUAKED misc_insane (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn CRAWL CRUCIFIED STAND_GROUND ALWAYS_STAND
620 */
621 void SP_misc_insane (edict_t *self)
622 {
623 // static int skin = 0; //@@
624
625 if (deathmatch->value)
626 {
627 G_FreeEdict (self);
628 return;
629 }
630
631 sound_fist = gi.soundindex ("insane/insane11.wav");
632 sound_shake = gi.soundindex ("insane/insane5.wav");
633 sound_moan = gi.soundindex ("insane/insane7.wav");
634 sound_scream[0] = gi.soundindex ("insane/insane1.wav");
635 sound_scream[1] = gi.soundindex ("insane/insane2.wav");
636 sound_scream[2] = gi.soundindex ("insane/insane3.wav");
637 sound_scream[3] = gi.soundindex ("insane/insane4.wav");
638 sound_scream[4] = gi.soundindex ("insane/insane6.wav");
639 sound_scream[5] = gi.soundindex ("insane/insane8.wav");
640 sound_scream[6] = gi.soundindex ("insane/insane9.wav");
641 sound_scream[7] = gi.soundindex ("insane/insane10.wav");
642
643 self->movetype = MOVETYPE_STEP;
644 self->solid = SOLID_BBOX;
645 self->s.modelindex = gi.modelindex("models/monsters/insane/tris.md2");
646
647 VectorSet (self->mins, -16, -16, -24);
648 VectorSet (self->maxs, 16, 16, 32);
649
650 self->health = 100;
651 self->gib_health = -50;
652 self->mass = 300;
653
654 self->pain = insane_pain;
655 self->die = insane_die;
656
657 self->monsterinfo.stand = insane_stand;
658 self->monsterinfo.walk = insane_walk;
659 self->monsterinfo.run = insane_run;
660 self->monsterinfo.dodge = NULL;
661 self->monsterinfo.attack = NULL;
662 self->monsterinfo.melee = NULL;
663 self->monsterinfo.sight = NULL;
664 self->monsterinfo.aiflags |= AI_GOOD_GUY;
665
666 //@@
667 // self->s.skinnum = skin;
668 // skin++;
669 // if (skin > 12)
670 // skin = 0;
671
672 gi.linkentity (self);
673
674 if (self->spawnflags & 16) // Stand Ground
675 self->monsterinfo.aiflags |= AI_STAND_GROUND;
676
677 self->monsterinfo.currentmove = &insane_move_stand_normal;
678
679 self->monsterinfo.scale = MODEL_SCALE;
680
681 if (self->spawnflags & 8) // Crucified ?
682 {
683 VectorSet (self->mins, -16, 0, 0);
684 VectorSet (self->maxs, 16, 8, 32);
685 self->flags |= FL_NO_KNOCKBACK;
686 flymonster_start (self);
687 }
688 else
689 {
690 walkmonster_start (self);
691 self->s.skinnum = rand()%3;
692 }
693 }
694