Annotation of quake2/rogue/m_brain.c, revision 1.1.1.1

1.1       root        1: /*
                      2: ==============================================================================
                      3: 
                      4: brain
                      5: 
                      6: ==============================================================================
                      7: */
                      8: 
                      9: #include "g_local.h"
                     10: #include "m_brain.h"
                     11: 
                     12: 
                     13: static int     sound_chest_open;
                     14: static int     sound_tentacles_extend;
                     15: static int     sound_tentacles_retract;
                     16: static int     sound_death;
                     17: static int     sound_idle1;
                     18: static int     sound_idle2;
                     19: static int     sound_idle3;
                     20: static int     sound_pain1;
                     21: static int     sound_pain2;
                     22: static int     sound_sight;
                     23: static int     sound_search;
                     24: static int     sound_melee1;
                     25: static int     sound_melee2;
                     26: static int     sound_melee3;
                     27: 
                     28: 
                     29: void brain_sight (edict_t *self, edict_t *other)
                     30: {
                     31:        gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
                     32: }
                     33: 
                     34: void brain_search (edict_t *self)
                     35: {
                     36:        gi.sound (self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
                     37: }
                     38: 
                     39: 
                     40: void brain_run (edict_t *self);
                     41: void brain_dead (edict_t *self);
                     42: 
                     43: 
                     44: //
                     45: // STAND
                     46: //
                     47: 
                     48: mframe_t brain_frames_stand [] =
                     49: {
                     50:        ai_stand,       0,      NULL,
                     51:        ai_stand,       0,      NULL,
                     52:        ai_stand,       0,      NULL,
                     53:        ai_stand,       0,      NULL,
                     54:        ai_stand,       0,      NULL,
                     55:        ai_stand,       0,      NULL,
                     56:        ai_stand,       0,      NULL,
                     57:        ai_stand,       0,      NULL,
                     58:        ai_stand,       0,      NULL,
                     59:        ai_stand,       0,      NULL,
                     60: 
                     61:        ai_stand,       0,      NULL,
                     62:        ai_stand,       0,      NULL,
                     63:        ai_stand,       0,      NULL,
                     64:        ai_stand,       0,      NULL,
                     65:        ai_stand,       0,      NULL,
                     66:        ai_stand,       0,      NULL,
                     67:        ai_stand,       0,      NULL,
                     68:        ai_stand,       0,      NULL,
                     69:        ai_stand,       0,      NULL,
                     70:        ai_stand,       0,      NULL,
                     71: 
                     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: };
                     83: mmove_t brain_move_stand = {FRAME_stand01, FRAME_stand30, brain_frames_stand, NULL};
                     84: 
                     85: void brain_stand (edict_t *self)
                     86: {
                     87:        self->monsterinfo.currentmove = &brain_move_stand;
                     88: }
                     89: 
                     90: 
                     91: //
                     92: // IDLE
                     93: //
                     94: 
                     95: mframe_t brain_frames_idle [] =
                     96: {
                     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: 
                    108:        ai_stand,       0,      NULL,
                    109:        ai_stand,       0,      NULL,
                    110:        ai_stand,       0,      NULL,
                    111:        ai_stand,       0,      NULL,
                    112:        ai_stand,       0,      NULL,
                    113:        ai_stand,       0,      NULL,
                    114:        ai_stand,       0,      NULL,
                    115:        ai_stand,       0,      NULL,
                    116:        ai_stand,       0,      NULL,
                    117:        ai_stand,       0,      NULL,
                    118: 
                    119:        ai_stand,       0,      NULL,
                    120:        ai_stand,       0,      NULL,
                    121:        ai_stand,       0,      NULL,
                    122:        ai_stand,       0,      NULL,
                    123:        ai_stand,       0,      NULL,
                    124:        ai_stand,       0,      NULL,
                    125:        ai_stand,       0,      NULL,
                    126:        ai_stand,       0,      NULL,
                    127:        ai_stand,       0,      NULL,
                    128:        ai_stand,       0,      NULL
                    129: };
                    130: mmove_t brain_move_idle = {FRAME_stand31, FRAME_stand60, brain_frames_idle, brain_stand};
                    131: 
                    132: void brain_idle (edict_t *self)
                    133: {
                    134:        gi.sound (self, CHAN_AUTO, sound_idle3, 1, ATTN_IDLE, 0);
                    135:        self->monsterinfo.currentmove = &brain_move_idle;
                    136: }
                    137: 
                    138: 
                    139: //
                    140: // WALK
                    141: //
                    142: mframe_t brain_frames_walk1 [] =
                    143: {
                    144:        ai_walk,        7,      NULL,
                    145:        ai_walk,        2,      NULL,
                    146:        ai_walk,        3,      NULL,
                    147:        ai_walk,        3,      NULL,
                    148:        ai_walk,        1,      NULL,
                    149:        ai_walk,        0,      NULL,
                    150:        ai_walk,        0,      NULL,
                    151:        ai_walk,        9,      NULL,
                    152:        ai_walk,        -4,     NULL,
                    153:        ai_walk,        -1,     NULL,
                    154:        ai_walk,        2,      NULL
                    155: };
                    156: mmove_t brain_move_walk1 = {FRAME_walk101, FRAME_walk111, brain_frames_walk1, NULL};
                    157: 
                    158: // walk2 is FUBAR, do not use
                    159: #if 0
                    160: void brain_walk2_cycle (edict_t *self)
                    161: {
                    162:        if (random() > 0.1)
                    163:                self->monsterinfo.nextframe = FRAME_walk220;
                    164: }
                    165: 
                    166: mframe_t brain_frames_walk2 [] =
                    167: {
                    168:        ai_walk,        3,      NULL,
                    169:        ai_walk,        -2,     NULL,
                    170:        ai_walk,        -4,     NULL,
                    171:        ai_walk,        -3,     NULL,
                    172:        ai_walk,        0,      NULL,
                    173:        ai_walk,        1,      NULL,
                    174:        ai_walk,        12,     NULL,
                    175:        ai_walk,        0,      NULL,
                    176:        ai_walk,        -3,     NULL,
                    177:        ai_walk,        0,      NULL,
                    178: 
                    179:        ai_walk,        -2,     NULL,
                    180:        ai_walk,        0,      NULL,
                    181:        ai_walk,        0,      NULL,
                    182:        ai_walk,        1,      NULL,
                    183:        ai_walk,        0,      NULL,
                    184:        ai_walk,        0,      NULL,
                    185:        ai_walk,        0,      NULL,
                    186:        ai_walk,        0,      NULL,
                    187:        ai_walk,        0,      NULL,
                    188:        ai_walk,        10,     NULL,           // Cycle Start
                    189: 
                    190:        ai_walk,        -1,     NULL,
                    191:        ai_walk,        7,      NULL,
                    192:        ai_walk,        0,      NULL,
                    193:        ai_walk,        3,      NULL,
                    194:        ai_walk,        -3,     NULL,
                    195:        ai_walk,        2,      NULL,
                    196:        ai_walk,        4,      NULL,
                    197:        ai_walk,        -3,     NULL,
                    198:        ai_walk,        2,      NULL,
                    199:        ai_walk,        0,      NULL,
                    200: 
                    201:        ai_walk,        4,      brain_walk2_cycle,
                    202:        ai_walk,        -1,     NULL,
                    203:        ai_walk,        -1,     NULL,
                    204:        ai_walk,        -8,     NULL,           
                    205:        ai_walk,        0,      NULL,
                    206:        ai_walk,        1,      NULL,
                    207:        ai_walk,        5,      NULL,
                    208:        ai_walk,        2,      NULL,
                    209:        ai_walk,        -1,     NULL,
                    210:        ai_walk,        -5,     NULL
                    211: };
                    212: mmove_t brain_move_walk2 = {FRAME_walk201, FRAME_walk240, brain_frames_walk2, NULL};
                    213: #endif
                    214: 
                    215: void brain_walk (edict_t *self)
                    216: {
                    217: //     if (random() <= 0.5)
                    218:                self->monsterinfo.currentmove = &brain_move_walk1;
                    219: //     else
                    220: //             self->monsterinfo.currentmove = &brain_move_walk2;
                    221: }
                    222: 
                    223: 
                    224: 
                    225: mframe_t brain_frames_defense [] =
                    226: {
                    227:        ai_move,        0,      NULL,
                    228:        ai_move,        0,      NULL,
                    229:        ai_move,        0,      NULL,
                    230:        ai_move,        0,      NULL,
                    231:        ai_move,        0,      NULL,
                    232:        ai_move,        0,      NULL,
                    233:        ai_move,        0,      NULL,
                    234:        ai_move,        0,      NULL,
                    235:        ai_move,        0,      NULL
                    236: };
                    237: mmove_t brain_move_defense = {FRAME_defens01, FRAME_defens08, brain_frames_defense, NULL};
                    238: 
                    239: mframe_t brain_frames_pain3 [] =
                    240: {
                    241:        ai_move,        -2,     NULL,
                    242:        ai_move,        2,      NULL,
                    243:        ai_move,        1,      NULL,
                    244:        ai_move,        3,      NULL,
                    245:        ai_move,        0,      NULL,
                    246:        ai_move,        -4,     NULL
                    247: };
                    248: mmove_t brain_move_pain3 = {FRAME_pain301, FRAME_pain306, brain_frames_pain3, brain_run};
                    249: 
                    250: mframe_t brain_frames_pain2 [] =
                    251: {
                    252:        ai_move,        -2,     NULL,
                    253:        ai_move,        0,      NULL,
                    254:        ai_move,        0,      NULL,
                    255:        ai_move,        0,      NULL,
                    256:        ai_move,        0,      NULL,
                    257:        ai_move,        3,      NULL,
                    258:        ai_move,        1,      NULL,
                    259:        ai_move,        -2,     NULL
                    260: };
                    261: mmove_t brain_move_pain2 = {FRAME_pain201, FRAME_pain208, brain_frames_pain2, brain_run};
                    262: 
                    263: mframe_t brain_frames_pain1 [] =
                    264: {
                    265:        ai_move,        -6,     NULL,
                    266:        ai_move,        -2,     NULL,
                    267:        ai_move,        -6,     NULL,
                    268:        ai_move,        0,      NULL,
                    269:        ai_move,        0,      NULL,
                    270:        ai_move,        0,      NULL,
                    271:        ai_move,        0,      NULL,
                    272:        ai_move,        0,      NULL,
                    273:        ai_move,        0,      NULL,
                    274:        ai_move,        0,      NULL,
                    275:        ai_move,        0,      NULL,
                    276:        ai_move,        0,      NULL,
                    277:        ai_move,        0,      NULL,
                    278:        ai_move,        2,      NULL,
                    279:        ai_move,        0,      NULL,
                    280:        ai_move,        2,      NULL,
                    281:        ai_move,        1,      NULL,
                    282:        ai_move,        7,      NULL,
                    283:        ai_move,        0,      NULL,
                    284:        ai_move,        3,      NULL,
                    285:        ai_move,        -1,     NULL
                    286: };
                    287: mmove_t brain_move_pain1 = {FRAME_pain101, FRAME_pain121, brain_frames_pain1, brain_run};
                    288: 
                    289: mframe_t brain_frames_duck [] =
                    290: {
                    291:        ai_move,        0,      NULL,
                    292:        ai_move,        -2,     monster_duck_down,
                    293:        ai_move,        17,     monster_duck_hold,
                    294:        ai_move,        -3,     NULL,
                    295:        ai_move,        -1,     monster_duck_up,
                    296:        ai_move,        -5,     NULL,
                    297:        ai_move,        -6,     NULL,
                    298:        ai_move,        -6,     NULL
                    299: };
                    300: mmove_t brain_move_duck = {FRAME_duck01, FRAME_duck08, brain_frames_duck, brain_run};
                    301: 
                    302: /*
                    303: void brain_dodge (edict_t *self, edict_t *attacker, float eta, trace_t *tr)
                    304: {
                    305:        //========
                    306:        //PMM - new dodge code
                    307:        float   r;
                    308:        float   height;
                    309: 
                    310:        if (!self->enemy)
                    311:        {
                    312:                self->enemy = attacker;
                    313:                FoundTarget (self);
                    314:        }
                    315: 
                    316:        // PMM - don't bother if it's going to hit anyway; fix for weird in-your-face etas (I was
                    317:        // seeing numbers like 13 and 14)
                    318:        if ((eta < 0.1) || (eta > 5))
                    319:                return;
                    320: 
                    321:        r = random();
                    322:        if (r > (0.25*((skill->value)+1)))
                    323:                return;
                    324: 
                    325:        if (self->monsterinfo.aiflags & AI_DODGING)
                    326:        {
                    327:                height = self->absmax[2];
                    328:        }
                    329:        else
                    330:        {
                    331:                height = self->absmax[2]-32-1;  // the -1 is because the absmax is s.origin + maxs + 1
                    332:        }
                    333: 
                    334:        // check to see if it makes sense to duck
                    335:        if (tr->endpos[2] <= height)
                    336:        {
                    337:                // if it doesn't sense to duck, try to strafe and shoot
                    338:                // FIXME - this guy is so slow, it's not worth it
                    339: 
                    340:                //vec3_t forward,right,up,diff;
                    341: 
                    342:                monster_done_dodge (self);
                    343:                return;
                    344:        }
                    345: 
                    346:        if (skill->value == 0)
                    347:        {
                    348:                self->monsterinfo.currentmove = &brain_move_duck;
                    349:                // PMM - stupid dodge
                    350:                self->monsterinfo.duck_wait_time = level.time + eta + 1;
                    351:                self->monsterinfo.aiflags |= AI_DODGING;
                    352:                return;
                    353:        }
                    354: 
                    355:        self->monsterinfo.currentmove = &brain_move_duck;
                    356:        self->monsterinfo.duck_wait_time = level.time + eta + (0.1 * (3 - skill->value));
                    357:        self->monsterinfo.aiflags |= AI_DODGING;
                    358:        return;
                    359:        //============
                    360:        //PMM
                    361: }
                    362: */
                    363: 
                    364: mframe_t brain_frames_death2 [] =
                    365: {
                    366:        ai_move,        0,      NULL,
                    367:        ai_move,        0,      NULL,
                    368:        ai_move,        0,      NULL,
                    369:        ai_move,        9,      NULL,
                    370:        ai_move,        0,      NULL
                    371: };
                    372: mmove_t brain_move_death2 = {FRAME_death201, FRAME_death205, brain_frames_death2, brain_dead};
                    373: 
                    374: mframe_t brain_frames_death1 [] =
                    375: {
                    376:        ai_move,        0,      NULL,
                    377:        ai_move,        0,      NULL,
                    378:        ai_move,        -2,     NULL,
                    379:        ai_move,        9,      NULL,
                    380:        ai_move,        0,      NULL,
                    381:        ai_move,        0,      NULL,
                    382:        ai_move,        0,      NULL,
                    383:        ai_move,        0,      NULL,
                    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:        ai_move,        0,      NULL,
                    392:        ai_move,        0,      NULL,
                    393:        ai_move,        0,      NULL
                    394: };
                    395: mmove_t brain_move_death1 = {FRAME_death101, FRAME_death118, brain_frames_death1, brain_dead};
                    396: 
                    397: 
                    398: //
                    399: // MELEE
                    400: //
                    401: 
                    402: void brain_swing_right (edict_t *self)
                    403: {
                    404:        gi.sound (self, CHAN_BODY, sound_melee1, 1, ATTN_NORM, 0);
                    405: }
                    406: 
                    407: void brain_hit_right (edict_t *self)
                    408: {
                    409:        vec3_t  aim;
                    410: 
                    411:        VectorSet (aim, MELEE_DISTANCE, self->maxs[0], 8);
                    412:        if (fire_hit (self, aim, (15 + (rand() %5)), 40))
                    413:                gi.sound (self, CHAN_WEAPON, sound_melee3, 1, ATTN_NORM, 0);
                    414: }
                    415: 
                    416: void brain_swing_left (edict_t *self)
                    417: {
                    418:        gi.sound (self, CHAN_BODY, sound_melee2, 1, ATTN_NORM, 0);
                    419: }
                    420: 
                    421: void brain_hit_left (edict_t *self)
                    422: {
                    423:        vec3_t  aim;
                    424: 
                    425:        VectorSet (aim, MELEE_DISTANCE, self->mins[0], 8);
                    426:        if (fire_hit (self, aim, (15 + (rand() %5)), 40))
                    427:                gi.sound (self, CHAN_WEAPON, sound_melee3, 1, ATTN_NORM, 0);
                    428: }
                    429: 
                    430: mframe_t brain_frames_attack1 [] =
                    431: {
                    432:        ai_charge,      8,      NULL,
                    433:        ai_charge,      3,      NULL,
                    434:        ai_charge,      5,      NULL,
                    435:        ai_charge,      0,      NULL,
                    436:        ai_charge,      -3,     brain_swing_right,
                    437:        ai_charge,      0,      NULL,
                    438:        ai_charge,      -5,     NULL,
                    439:        ai_charge,      -7,     brain_hit_right,
                    440:        ai_charge,      0,      NULL,
                    441:        ai_charge,      6,      brain_swing_left,
                    442:        ai_charge,      1,      NULL,
                    443:        ai_charge,      2,      brain_hit_left,
                    444:        ai_charge,      -3,     NULL,
                    445:        ai_charge,      6,      NULL,
                    446:        ai_charge,      -1,     NULL,
                    447:        ai_charge,      -3,     NULL,
                    448:        ai_charge,      2,      NULL,
                    449:        ai_charge,      -11,NULL
                    450: };
                    451: mmove_t brain_move_attack1 = {FRAME_attak101, FRAME_attak118, brain_frames_attack1, brain_run};
                    452: 
                    453: void brain_chest_open (edict_t *self)
                    454: {
                    455:        self->spawnflags &= ~65536;
                    456:        self->monsterinfo.power_armor_type = POWER_ARMOR_NONE;
                    457:        gi.sound (self, CHAN_BODY, sound_chest_open, 1, ATTN_NORM, 0);
                    458: }
                    459: 
                    460: void brain_tentacle_attack (edict_t *self)
                    461: {
                    462:        vec3_t  aim;
                    463: 
                    464:        VectorSet (aim, MELEE_DISTANCE, 0, 8);
                    465:        if (fire_hit (self, aim, (10 + (rand() %5)), -600) && skill->value > 0)
                    466:                self->spawnflags |= 65536;
                    467:        gi.sound (self, CHAN_WEAPON, sound_tentacles_retract, 1, ATTN_NORM, 0);
                    468: }
                    469: 
                    470: void brain_chest_closed (edict_t *self)
                    471: {
                    472:        self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
                    473:        if (self->spawnflags & 65536)
                    474:        {
                    475:                self->spawnflags &= ~65536;
                    476:                self->monsterinfo.currentmove = &brain_move_attack1;
                    477:        }
                    478: }
                    479: 
                    480: mframe_t brain_frames_attack2 [] =
                    481: {
                    482:        ai_charge,      5,      NULL,
                    483:        ai_charge,      -4,     NULL,
                    484:        ai_charge,      -4,     NULL,
                    485:        ai_charge,      -3,     NULL,
                    486:        ai_charge,      0,      brain_chest_open,
                    487:        ai_charge,      0,      NULL,
                    488:        ai_charge,      13,     brain_tentacle_attack,
                    489:        ai_charge,      0,      NULL,
                    490:        ai_charge,      2,      NULL,
                    491:        ai_charge,      0,      NULL,
                    492:        ai_charge,      -9,     brain_chest_closed,
                    493:        ai_charge,      0,      NULL,
                    494:        ai_charge,      4,      NULL,
                    495:        ai_charge,      3,      NULL,
                    496:        ai_charge,      2,      NULL,
                    497:        ai_charge,      -3,     NULL,
                    498:        ai_charge,      -6,     NULL
                    499: };
                    500: mmove_t brain_move_attack2 = {FRAME_attak201, FRAME_attak217, brain_frames_attack2, brain_run};
                    501: 
                    502: void brain_melee(edict_t *self)
                    503: {
                    504:        if (random() <= 0.5)
                    505:                self->monsterinfo.currentmove = &brain_move_attack1;
                    506:        else
                    507:                self->monsterinfo.currentmove = &brain_move_attack2;
                    508: }
                    509: 
                    510: 
                    511: //
                    512: // RUN
                    513: //
                    514: 
                    515: mframe_t brain_frames_run [] =
                    516: {
                    517:        ai_run, 9,      NULL,
                    518:        ai_run, 2,      NULL,
                    519:        ai_run, 3,      NULL,
                    520:        ai_run, 3,      NULL,
                    521:        ai_run, 1,      NULL,
                    522:        ai_run, 0,      NULL,
                    523:        ai_run, 0,      NULL,
                    524:        ai_run, 10,     NULL,
                    525:        ai_run, -4,     NULL,
                    526:        ai_run, -1,     NULL,
                    527:        ai_run, 2,      NULL
                    528: };
                    529: mmove_t brain_move_run = {FRAME_walk101, FRAME_walk111, brain_frames_run, NULL};
                    530: 
                    531: void brain_run (edict_t *self)
                    532: {
                    533:        self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
                    534:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
                    535:                self->monsterinfo.currentmove = &brain_move_stand;
                    536:        else
                    537:                self->monsterinfo.currentmove = &brain_move_run;
                    538: }
                    539: 
                    540: 
                    541: void brain_pain (edict_t *self, edict_t *other, float kick, int damage)
                    542: {
                    543:        float   r;
                    544: 
                    545:        if (self->health < (self->max_health / 2))
                    546:                self->s.skinnum = 1;
                    547: 
                    548:        if (level.time < self->pain_debounce_time)
                    549:                return;
                    550: 
                    551:        self->pain_debounce_time = level.time + 3;
                    552: 
                    553:        if (skill->value == 3)
                    554:                return;         // no pain anims in nightmare
                    555: 
                    556:        r = random();
                    557:        if (r < 0.33)
                    558:        {
                    559:                gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
                    560:                self->monsterinfo.currentmove = &brain_move_pain1;
                    561:        }
                    562:        else if (r < 0.66)
                    563:        {
                    564:                gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
                    565:                self->monsterinfo.currentmove = &brain_move_pain2;
                    566:        }
                    567:        else
                    568:        {
                    569:                gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
                    570:                self->monsterinfo.currentmove = &brain_move_pain3;
                    571:        }
                    572:        // PMM - clear duck flag
                    573:        if (self->monsterinfo.aiflags & AI_DUCKED)
                    574:                monster_duck_up(self);
                    575: }
                    576: 
                    577: void brain_dead (edict_t *self)
                    578: {
                    579:        VectorSet (self->mins, -16, -16, -24);
                    580:        VectorSet (self->maxs, 16, 16, -8);
                    581:        self->movetype = MOVETYPE_TOSS;
                    582:        self->svflags |= SVF_DEADMONSTER;
                    583:        self->nextthink = 0;
                    584:        gi.linkentity (self);
                    585: }
                    586: 
                    587: 
                    588: 
                    589: void brain_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
                    590: {
                    591:        int             n;
                    592: 
                    593:        self->s.effects = 0;
                    594:        self->monsterinfo.power_armor_type = POWER_ARMOR_NONE;
                    595: 
                    596: // check for gib
                    597:        if (self->health <= self->gib_health)
                    598:        {
                    599:                gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
                    600:                for (n= 0; n < 2; n++)
                    601:                        ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
                    602:                for (n= 0; n < 4; n++)
                    603:                        ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
                    604:                ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
                    605:                self->deadflag = DEAD_DEAD;
                    606:                return;
                    607:        }
                    608: 
                    609:        if (self->deadflag == DEAD_DEAD)
                    610:                return;
                    611: 
                    612: // regular death
                    613:        gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
                    614:        self->deadflag = DEAD_DEAD;
                    615:        self->takedamage = DAMAGE_YES;
                    616:        if (random() <= 0.5)
                    617:                self->monsterinfo.currentmove = &brain_move_death1;
                    618:        else
                    619:                self->monsterinfo.currentmove = &brain_move_death2;
                    620: }
                    621: 
                    622: void brain_duck (edict_t *self, float eta)
                    623: {
                    624:        // has to be done immediately otherwise he can get stuck
                    625:        monster_duck_down(self);
                    626: 
                    627:        if (skill->value == 0)
                    628:                // PMM - stupid dodge
                    629:                self->monsterinfo.duck_wait_time = level.time + eta + 1;
                    630:        else
                    631:                self->monsterinfo.duck_wait_time = level.time + eta + (0.1 * (3 - skill->value));
                    632: 
                    633:        self->monsterinfo.currentmove = &brain_move_duck;
                    634:        self->monsterinfo.nextframe = FRAME_duck01;
                    635:        return;
                    636: }
                    637: 
                    638: 
                    639: /*QUAKED monster_brain (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
                    640: */
                    641: void SP_monster_brain (edict_t *self)
                    642: {
                    643:        if (deathmatch->value)
                    644:        {
                    645:                G_FreeEdict (self);
                    646:                return;
                    647:        }
                    648: 
                    649:        sound_chest_open = gi.soundindex ("brain/brnatck1.wav");
                    650:        sound_tentacles_extend = gi.soundindex ("brain/brnatck2.wav");
                    651:        sound_tentacles_retract = gi.soundindex ("brain/brnatck3.wav");
                    652:        sound_death = gi.soundindex ("brain/brndeth1.wav");
                    653:        sound_idle1 = gi.soundindex ("brain/brnidle1.wav");
                    654:        sound_idle2 = gi.soundindex ("brain/brnidle2.wav");
                    655:        sound_idle3 = gi.soundindex ("brain/brnlens1.wav");
                    656:        sound_pain1 = gi.soundindex ("brain/brnpain1.wav");
                    657:        sound_pain2 = gi.soundindex ("brain/brnpain2.wav");
                    658:        sound_sight = gi.soundindex ("brain/brnsght1.wav");
                    659:        sound_search = gi.soundindex ("brain/brnsrch1.wav");
                    660:        sound_melee1 = gi.soundindex ("brain/melee1.wav");
                    661:        sound_melee2 = gi.soundindex ("brain/melee2.wav");
                    662:        sound_melee3 = gi.soundindex ("brain/melee3.wav");
                    663: 
                    664:        self->movetype = MOVETYPE_STEP;
                    665:        self->solid = SOLID_BBOX;
                    666:        self->s.modelindex = gi.modelindex ("models/monsters/brain/tris.md2");
                    667:        VectorSet (self->mins, -16, -16, -24);
                    668:        VectorSet (self->maxs, 16, 16, 32);
                    669: 
                    670:        self->health = 300;
                    671:        self->gib_health = -150;
                    672:        self->mass = 400;
                    673: 
                    674:        self->pain = brain_pain;
                    675:        self->die = brain_die;
                    676: 
                    677:        self->monsterinfo.stand = brain_stand;
                    678:        self->monsterinfo.walk = brain_walk;
                    679:        self->monsterinfo.run = brain_run;
                    680: // PMM
                    681:        self->monsterinfo.dodge = M_MonsterDodge;
                    682:        self->monsterinfo.duck = brain_duck;
                    683:        self->monsterinfo.unduck = monster_duck_up;
                    684: //     self->monsterinfo.dodge = brain_dodge;
                    685: // pmm
                    686: //     self->monsterinfo.attack = brain_attack;
                    687:        self->monsterinfo.melee = brain_melee;
                    688:        self->monsterinfo.sight = brain_sight;
                    689:        self->monsterinfo.search = brain_search;
                    690:        self->monsterinfo.idle = brain_idle;
                    691: 
                    692:        self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
                    693:        self->monsterinfo.power_armor_power = 100;
                    694: 
                    695:        gi.linkentity (self);
                    696: 
                    697:        self->monsterinfo.currentmove = &brain_move_stand;      
                    698:        self->monsterinfo.scale = MODEL_SCALE;
                    699: 
                    700:        walkmonster_start (self);
                    701: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.