Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

m_insane.c (17253B)


      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 }