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