Annotation of quake2/xatrix/m_boss5.c, revision 1.1.1.1

1.1       root        1: /*
                      2: ==============================================================================
                      3: 
                      4: boss5
                      5: 
                      6: ==============================================================================
                      7: */
                      8: 
                      9: #include "g_local.h"
                     10: #include "m_supertank.h"
                     11: 
                     12: qboolean visible (edict_t *self, edict_t *other);
                     13: 
                     14: static int     sound_pain1;
                     15: static int     sound_pain2;
                     16: static int     sound_pain3;
                     17: static int     sound_death;
                     18: static int     sound_search1;
                     19: static int     sound_search2;
                     20: 
                     21: static int     tread_sound;
                     22: 
                     23: void BossExplode2 (edict_t *self);
                     24: 
                     25: void TreadSound2 (edict_t *self)
                     26: {
                     27:        gi.sound (self, CHAN_VOICE, tread_sound, 1, ATTN_NORM, 0);
                     28: }
                     29: 
                     30: void boss5_search (edict_t *self)
                     31: {
                     32:        if (random() < 0.5)
                     33:                gi.sound (self, CHAN_VOICE, sound_search1, 1, ATTN_NORM, 0);
                     34:        else
                     35:                gi.sound (self, CHAN_VOICE, sound_search2, 1, ATTN_NORM, 0);
                     36: }
                     37: 
                     38: 
                     39: void boss5_dead (edict_t *self);
                     40: void boss5Rocket (edict_t *self);
                     41: void boss5MachineGun (edict_t *self);
                     42: void boss5_reattack1(edict_t *self);
                     43: 
                     44: 
                     45: //
                     46: // stand
                     47: //
                     48: 
                     49: mframe_t boss5_frames_stand []=
                     50: {
                     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:        ai_stand, 0, NULL,
                     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:        ai_stand, 0, NULL,
                     72:        ai_stand, 0, NULL,
                     73:        ai_stand, 0, NULL,
                     74:        ai_stand, 0, NULL,
                     75:        ai_stand, 0, NULL,
                     76:        ai_stand, 0, NULL,
                     77:        ai_stand, 0, NULL,
                     78:        ai_stand, 0, NULL,
                     79:        ai_stand, 0, NULL,
                     80:        ai_stand, 0, NULL,
                     81:        ai_stand, 0, NULL,
                     82:        ai_stand, 0, NULL,
                     83:        ai_stand, 0, NULL,
                     84:        ai_stand, 0, NULL,
                     85:        ai_stand, 0, NULL,
                     86:        ai_stand, 0, NULL,
                     87:        ai_stand, 0, NULL,
                     88:        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, NULL
                    111: };
                    112: mmove_t        boss5_move_stand = {FRAME_stand_1, FRAME_stand_60, boss5_frames_stand, NULL};
                    113:        
                    114: void boss5_stand (edict_t *self)
                    115: {
                    116:        self->monsterinfo.currentmove = &boss5_move_stand;
                    117: }
                    118: 
                    119: 
                    120: mframe_t boss5_frames_run [] =
                    121: {
                    122:        ai_run, 12,     TreadSound2,
                    123:        ai_run, 12,     NULL,
                    124:        ai_run, 12,     NULL,
                    125:        ai_run, 12,     NULL,
                    126:        ai_run, 12,     NULL,
                    127:        ai_run, 12,     NULL,
                    128:        ai_run, 12,     NULL,
                    129:        ai_run, 12,     NULL,
                    130:        ai_run, 12,     NULL,
                    131:        ai_run, 12,     NULL,
                    132:        ai_run, 12,     NULL,
                    133:        ai_run, 12,     NULL,
                    134:        ai_run, 12,     NULL,
                    135:        ai_run, 12,     NULL,
                    136:        ai_run, 12,     NULL,
                    137:        ai_run, 12,     NULL,
                    138:        ai_run, 12,     NULL,
                    139:        ai_run, 12,     NULL
                    140: };
                    141: mmove_t        boss5_move_run = {FRAME_forwrd_1, FRAME_forwrd_18, boss5_frames_run, NULL};
                    142: 
                    143: //
                    144: // walk
                    145: //
                    146: 
                    147: 
                    148: mframe_t boss5_frames_forward [] =
                    149: {
                    150:        ai_walk, 4,     TreadSound2,
                    151:        ai_walk, 4,     NULL,
                    152:        ai_walk, 4,     NULL,
                    153:        ai_walk, 4,     NULL,
                    154:        ai_walk, 4,     NULL,
                    155:        ai_walk, 4,     NULL,
                    156:        ai_walk, 4,     NULL,
                    157:        ai_walk, 4,     NULL,
                    158:        ai_walk, 4,     NULL,
                    159:        ai_walk, 4,     NULL,
                    160:        ai_walk, 4,     NULL,
                    161:        ai_walk, 4,     NULL,
                    162:        ai_walk, 4,     NULL,
                    163:        ai_walk, 4,     NULL,
                    164:        ai_walk, 4,     NULL,
                    165:        ai_walk, 4,     NULL,
                    166:        ai_walk, 4,     NULL,
                    167:        ai_walk, 4,     NULL
                    168: };
                    169: mmove_t        boss5_move_forward = {FRAME_forwrd_1, FRAME_forwrd_18, boss5_frames_forward, NULL};
                    170: 
                    171: void boss5_forward (edict_t *self)
                    172: {
                    173:                self->monsterinfo.currentmove = &boss5_move_forward;
                    174: }
                    175: 
                    176: void boss5_walk (edict_t *self)
                    177: {
                    178:                self->monsterinfo.currentmove = &boss5_move_forward;
                    179: }
                    180: 
                    181: void boss5_run (edict_t *self)
                    182: {
                    183:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
                    184:                self->monsterinfo.currentmove = &boss5_move_stand;
                    185:        else
                    186:                self->monsterinfo.currentmove = &boss5_move_run;
                    187: }
                    188: 
                    189: mframe_t boss5_frames_turn_right [] =
                    190: {
                    191:        ai_move,        0,      TreadSound2,
                    192:        ai_move,        0,      NULL,
                    193:        ai_move,        0,      NULL,
                    194:        ai_move,        0,      NULL,
                    195:        ai_move,        0,      NULL,
                    196:        ai_move,        0,      NULL,
                    197:        ai_move,        0,      NULL,
                    198:        ai_move,        0,      NULL,
                    199:        ai_move,        0,      NULL,
                    200:        ai_move,        0,      NULL,
                    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: };
                    210: mmove_t boss5_move_turn_right = {FRAME_right_1, FRAME_right_18, boss5_frames_turn_right, boss5_run};
                    211: 
                    212: mframe_t boss5_frames_turn_left [] =
                    213: {
                    214:        ai_move,        0,      TreadSound2,
                    215:        ai_move,        0,      NULL,
                    216:        ai_move,        0,      NULL,
                    217:        ai_move,        0,      NULL,
                    218:        ai_move,        0,      NULL,
                    219:        ai_move,        0,      NULL,
                    220:        ai_move,        0,      NULL,
                    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,
                    231:        ai_move,        0,      NULL
                    232: };
                    233: mmove_t boss5_move_turn_left = {FRAME_left_1, FRAME_left_18, boss5_frames_turn_left, boss5_run};
                    234: 
                    235: 
                    236: mframe_t boss5_frames_pain3 [] =
                    237: {
                    238:        ai_move,        0,      NULL,
                    239:        ai_move,        0,      NULL,
                    240:        ai_move,        0,      NULL,
                    241:        ai_move,        0,      NULL
                    242: };
                    243: mmove_t boss5_move_pain3 = {FRAME_pain3_9, FRAME_pain3_12, boss5_frames_pain3, boss5_run};
                    244: 
                    245: mframe_t boss5_frames_pain2 [] =
                    246: {
                    247:        ai_move,        0,      NULL,
                    248:        ai_move,        0,      NULL,
                    249:        ai_move,        0,      NULL,
                    250:        ai_move,        0,      NULL
                    251: };
                    252: mmove_t boss5_move_pain2 = {FRAME_pain2_5, FRAME_pain2_8, boss5_frames_pain2, boss5_run};
                    253: 
                    254: mframe_t boss5_frames_pain1 [] =
                    255: {
                    256:        ai_move,        0,      NULL,
                    257:        ai_move,        0,      NULL,
                    258:        ai_move,        0,      NULL,
                    259:        ai_move,        0,      NULL
                    260: };
                    261: mmove_t boss5_move_pain1 = {FRAME_pain1_1, FRAME_pain1_4, boss5_frames_pain1, boss5_run};
                    262: 
                    263: mframe_t boss5_frames_death1 [] =
                    264: {
                    265:        ai_move,        0,      NULL,
                    266:        ai_move,        0,      NULL,
                    267:        ai_move,        0,      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,        0,      NULL,
                    279:        ai_move,        0,      NULL,
                    280:        ai_move,        0,      NULL,
                    281:        ai_move,        0,      NULL,
                    282:        ai_move,        0,      NULL,
                    283:        ai_move,        0,      NULL,
                    284:        ai_move,        0,      NULL,
                    285:        ai_move,        0,      NULL,
                    286:        ai_move,        0,      NULL,
                    287:        ai_move,        0,      NULL,
                    288:        ai_move,        0,      BossExplode2
                    289: };
                    290: mmove_t boss5_move_death = {FRAME_death_1, FRAME_death_24, boss5_frames_death1, boss5_dead};
                    291: 
                    292: mframe_t boss5_frames_backward[] =
                    293: {
                    294:        ai_walk, 0,     TreadSound2,
                    295:        ai_walk, 0,     NULL,
                    296:        ai_walk, 0,     NULL,
                    297:        ai_walk, 0,     NULL,
                    298:        ai_walk, 0,     NULL,
                    299:        ai_walk, 0,     NULL,
                    300:        ai_walk, 0,     NULL,
                    301:        ai_walk, 0,     NULL,
                    302:        ai_walk, 0,     NULL,
                    303:        ai_walk, 0,     NULL,
                    304:        ai_walk, 0,     NULL,
                    305:        ai_walk, 0,     NULL,
                    306:        ai_walk, 0,     NULL,
                    307:        ai_walk, 0,     NULL,
                    308:        ai_walk, 0,     NULL,
                    309:        ai_walk, 0,     NULL,
                    310:        ai_walk, 0,     NULL,
                    311:        ai_walk, 0,     NULL
                    312: };
                    313: mmove_t        boss5_move_backward = {FRAME_backwd_1, FRAME_backwd_18, boss5_frames_backward, NULL};
                    314: 
                    315: mframe_t boss5_frames_attack4[]=
                    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: };
                    324: mmove_t boss5_move_attack4 = {FRAME_attak4_1, FRAME_attak4_6, boss5_frames_attack4, boss5_run};
                    325: 
                    326: mframe_t boss5_frames_attack3[]=
                    327: {
                    328:        ai_move,        0,      NULL,
                    329:        ai_move,        0,      NULL,
                    330:        ai_move,        0,      NULL,
                    331:        ai_move,        0,      NULL,
                    332:        ai_move,        0,      NULL,
                    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:        ai_move,        0,      NULL,
                    351:        ai_move,        0,      NULL,
                    352:        ai_move,        0,      NULL,
                    353:        ai_move,        0,      NULL,
                    354:        ai_move,        0,      NULL
                    355: };
                    356: mmove_t boss5_move_attack3 = {FRAME_attak3_1, FRAME_attak3_27, boss5_frames_attack3, boss5_run};
                    357: 
                    358: mframe_t boss5_frames_attack2[]=
                    359: {
                    360:        ai_charge,      0,      NULL,
                    361:        ai_charge,      0,      NULL,
                    362:        ai_charge,      0,      NULL,
                    363:        ai_charge,      0,      NULL,
                    364:        ai_charge,      0,      NULL,
                    365:        ai_charge,      0,      NULL,
                    366:        ai_charge,      0,      NULL,
                    367:        ai_charge,      0,      boss5Rocket,
                    368:        ai_move,        0,      NULL,
                    369:        ai_move,        0,      NULL,
                    370:        ai_move,        0,      boss5Rocket,
                    371:        ai_move,        0,      NULL,
                    372:        ai_move,        0,      NULL,
                    373:        ai_move,        0,      boss5Rocket,
                    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:        ai_move,        0,      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: };
                    388: mmove_t boss5_move_attack2 = {FRAME_attak2_1, FRAME_attak2_27, boss5_frames_attack2, boss5_run};
                    389: 
                    390: mframe_t boss5_frames_attack1[]=
                    391: {
                    392:        ai_charge,      0,      boss5MachineGun,
                    393:        ai_charge,      0,      boss5MachineGun,
                    394:        ai_charge,      0,      boss5MachineGun,
                    395:        ai_charge,      0,      boss5MachineGun,
                    396:        ai_charge,      0,      boss5MachineGun,
                    397:        ai_charge,      0,      boss5MachineGun,
                    398: 
                    399: };
                    400: mmove_t boss5_move_attack1 = {FRAME_attak1_1, FRAME_attak1_6, boss5_frames_attack1, boss5_reattack1};
                    401: 
                    402: mframe_t boss5_frames_end_attack1[]=
                    403: {
                    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:        ai_move,        0,      NULL,
                    412:        ai_move,        0,      NULL,
                    413:        ai_move,        0,      NULL,
                    414:        ai_move,        0,      NULL,
                    415:        ai_move,        0,      NULL,
                    416:        ai_move,        0,      NULL,
                    417:        ai_move,        0,      NULL
                    418: };
                    419: mmove_t boss5_move_end_attack1 = {FRAME_attak1_7, FRAME_attak1_20, boss5_frames_end_attack1, boss5_run};
                    420: 
                    421: 
                    422: void boss5_reattack1(edict_t *self)
                    423: {
                    424:        if (visible(self, self->enemy))
                    425:                if (random() < 0.9)
                    426:                        self->monsterinfo.currentmove = &boss5_move_attack1;
                    427:                else
                    428:                        self->monsterinfo.currentmove = &boss5_move_end_attack1;        
                    429:        else
                    430:                self->monsterinfo.currentmove = &boss5_move_end_attack1;
                    431: }
                    432: 
                    433: void boss5_pain (edict_t *self, edict_t *other, float kick, int damage)
                    434: {
                    435: 
                    436:        if (self->health < (self->max_health / 2))
                    437:                        self->s.skinnum = 1;
                    438: 
                    439:        if (level.time < self->pain_debounce_time)
                    440:                        return;
                    441: 
                    442:        // Lessen the chance of him going into his pain frames
                    443:        if (damage <=25)
                    444:                if (random()<0.2)
                    445:                        return;
                    446: 
                    447:        // Don't go into pain if he's firing his rockets
                    448:        if (skill->value >= 2)
                    449:                if ( (self->s.frame >= FRAME_attak2_1) && (self->s.frame <= FRAME_attak2_14) )
                    450:                        return;
                    451: 
                    452:        self->pain_debounce_time = level.time + 3;
                    453: 
                    454:        if (damage <= 10)
                    455:        {
                    456:                gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM,0);
                    457:                self->monsterinfo.currentmove = &boss5_move_pain1;
                    458:        }
                    459:        else if (damage <= 25)
                    460:        {
                    461:                gi.sound (self, CHAN_VOICE, sound_pain3, 1, ATTN_NORM,0);
                    462:                self->monsterinfo.currentmove = &boss5_move_pain2;
                    463:        }
                    464:        else
                    465:        {
                    466:                gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM,0);
                    467:                self->monsterinfo.currentmove = &boss5_move_pain3;
                    468:        }
                    469: };
                    470: 
                    471: 
                    472: void boss5Rocket (edict_t *self)
                    473: {
                    474:        vec3_t  forward, right;
                    475:        vec3_t  start;
                    476:        vec3_t  dir;
                    477:        vec3_t  vec;
                    478:        int             flash_number;
                    479: 
                    480:        if (self->s.frame == FRAME_attak2_8)
                    481:                flash_number = MZ2_SUPERTANK_ROCKET_1;
                    482:        else if (self->s.frame == FRAME_attak2_11)
                    483:                flash_number = MZ2_SUPERTANK_ROCKET_2;
                    484:        else // (self->s.frame == FRAME_attak2_14)
                    485:                flash_number = MZ2_SUPERTANK_ROCKET_3;
                    486: 
                    487:        AngleVectors (self->s.angles, forward, right, NULL);
                    488:        G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
                    489: 
                    490:        VectorCopy (self->enemy->s.origin, vec);
                    491:        vec[2] += self->enemy->viewheight;
                    492:        VectorSubtract (vec, start, dir);
                    493:        VectorNormalize (dir);
                    494: 
                    495:        monster_fire_rocket (self, start, dir, 50, 500, flash_number);
                    496:        
                    497: }      
                    498: 
                    499: void boss5MachineGun (edict_t *self)
                    500: {
                    501:        vec3_t  dir;
                    502:        vec3_t  vec;
                    503:        vec3_t  start;
                    504:        vec3_t  forward, right;
                    505:        int             flash_number;
                    506: 
                    507:        flash_number = MZ2_SUPERTANK_MACHINEGUN_1 + (self->s.frame - FRAME_attak1_1);
                    508: 
                    509:        //FIXME!!!
                    510:        dir[0] = 0;
                    511:        dir[1] = self->s.angles[1];
                    512:        dir[2] = 0;
                    513: 
                    514:        AngleVectors (dir, forward, right, NULL);
                    515:        G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
                    516: 
                    517:        if (self->enemy)
                    518:        {
                    519:                VectorCopy (self->enemy->s.origin, vec);
                    520:                VectorMA (vec, 0, self->enemy->velocity, vec);
                    521:                vec[2] += self->enemy->viewheight;
                    522:                VectorSubtract (vec, start, forward);
                    523:                VectorNormalize (forward);
                    524:   }
                    525: 
                    526:        monster_fire_bullet (self, start, forward, 6, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, flash_number);
                    527: }      
                    528: 
                    529: 
                    530: void boss5_attack(edict_t *self)
                    531: {
                    532:        vec3_t  vec;
                    533:        float   range;
                    534:        //float r;
                    535: 
                    536:        VectorSubtract (self->enemy->s.origin, self->s.origin, vec);
                    537:        range = VectorLength (vec);
                    538: 
                    539:        //r = random();
                    540: 
                    541:        // Attack 1 == Chaingun
                    542:        // Attack 2 == Rocket Launcher
                    543: 
                    544:        if (range <= 160)
                    545:        {
                    546:                self->monsterinfo.currentmove = &boss5_move_attack1;
                    547:        }
                    548:        else
                    549:        {       // fire rockets more often at distance
                    550:                if (random() < 0.3)
                    551:                        self->monsterinfo.currentmove = &boss5_move_attack1;
                    552:                else
                    553:                        self->monsterinfo.currentmove = &boss5_move_attack2;
                    554:        }
                    555: }
                    556: 
                    557: 
                    558: //
                    559: // death
                    560: //
                    561: 
                    562: void boss5_dead (edict_t *self)
                    563: {
                    564:        /*
                    565:        VectorSet (self->mins, -16, -16, -24);
                    566:        VectorSet (self->maxs, 16, 16, -8);
                    567:        */
                    568:        VectorSet (self->mins, -60, -60, 0);
                    569:        VectorSet (self->maxs, 60, 60, 72);
                    570:        self->movetype = MOVETYPE_TOSS;
                    571:        self->svflags |= SVF_DEADMONSTER;
                    572:        self->nextthink = 0;
                    573:        gi.linkentity (self);
                    574: }
                    575: 
                    576: 
                    577: void BossExplode2 (edict_t *self)
                    578: {
                    579:        vec3_t  org;
                    580:        int             n;
                    581: 
                    582:        self->think = BossExplode2;
                    583:        VectorCopy (self->s.origin, org);
                    584:        org[2] += 24 + (rand()&15);
                    585:        switch (self->count++)
                    586:        {
                    587:        case 0:
                    588:                org[0] -= 24;
                    589:                org[1] -= 24;
                    590:                break;
                    591:        case 1:
                    592:                org[0] += 24;
                    593:                org[1] += 24;
                    594:                break;
                    595:        case 2:
                    596:                org[0] += 24;
                    597:                org[1] -= 24;
                    598:                break;
                    599:        case 3:
                    600:                org[0] -= 24;
                    601:                org[1] += 24;
                    602:                break;
                    603:        case 4:
                    604:                org[0] -= 48;
                    605:                org[1] -= 48;
                    606:                break;
                    607:        case 5:
                    608:                org[0] += 48;
                    609:                org[1] += 48;
                    610:                break;
                    611:        case 6:
                    612:                org[0] -= 48;
                    613:                org[1] += 48;
                    614:                break;
                    615:        case 7:
                    616:                org[0] += 48;
                    617:                org[1] -= 48;
                    618:                break;
                    619:        case 8:
                    620:                self->s.sound = 0;
                    621:                for (n= 0; n < 4; n++)
                    622:                        ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", 500, GIB_ORGANIC);
                    623:                for (n= 0; n < 8; n++)
                    624:                        ThrowGib (self, "models/objects/gibs/sm_metal/tris.md2", 500, GIB_METALLIC);
                    625:                ThrowGib (self, "models/objects/gibs/chest/tris.md2", 500, GIB_ORGANIC);
                    626:                ThrowHead (self, "models/objects/gibs/gear/tris.md2", 500, GIB_METALLIC);
                    627:                self->deadflag = DEAD_DEAD;
                    628:                return;
                    629:        }
                    630: 
                    631:        gi.WriteByte (svc_temp_entity);
                    632:        gi.WriteByte (TE_EXPLOSION1);
                    633:        gi.WritePosition (org);
                    634:        gi.multicast (self->s.origin, MULTICAST_PVS);
                    635: 
                    636:        self->nextthink = level.time + 0.1;
                    637: }
                    638: 
                    639: 
                    640: void boss5_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
                    641: {
                    642:        gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
                    643:        self->deadflag = DEAD_DEAD;
                    644:        self->takedamage = DAMAGE_NO;
                    645:        self->count = 0;
                    646:        self->monsterinfo.currentmove = &boss5_move_death;
                    647: }
                    648: 
                    649: //
                    650: // monster_boss5
                    651: //
                    652: 
                    653: /*QUAKED monster_boss5 (1 .5 0) (-64 -64 0) (64 64 72) Ambush Trigger_Spawn Sight 
                    654: */
                    655: void SP_monster_boss5 (edict_t *self)
                    656: {
                    657:        if (deathmatch->value)
                    658:        {
                    659:                G_FreeEdict (self);
                    660:                return;
                    661:        }
                    662: 
                    663:        sound_pain1 = gi.soundindex ("bosstank/btkpain1.wav");
                    664:        sound_pain2 = gi.soundindex ("bosstank/btkpain2.wav");
                    665:        sound_pain3 = gi.soundindex ("bosstank/btkpain3.wav");
                    666:        sound_death = gi.soundindex ("bosstank/btkdeth1.wav");
                    667:        sound_search1 = gi.soundindex ("bosstank/btkunqv1.wav");
                    668:        sound_search2 = gi.soundindex ("bosstank/btkunqv2.wav");
                    669: 
                    670: //     self->s.sound = gi.soundindex ("bosstank/btkengn1.wav");
                    671:        tread_sound = gi.soundindex ("bosstank/btkengn1.wav");
                    672: 
                    673:        self->movetype = MOVETYPE_STEP;
                    674:        self->solid = SOLID_BBOX;
                    675:        self->s.modelindex = gi.modelindex ("models/monsters/boss5/tris.md2");
                    676:        VectorSet (self->mins, -64, -64, 0);
                    677:        VectorSet (self->maxs, 64, 64, 112);
                    678: 
                    679:        self->health = 1500;
                    680:        self->gib_health = -500;
                    681:        self->mass = 800;
                    682: 
                    683:        self->pain = boss5_pain;
                    684:        self->die = boss5_die;
                    685:        self->monsterinfo.stand = boss5_stand;
                    686:        self->monsterinfo.walk = boss5_walk;
                    687:        self->monsterinfo.run = boss5_run;
                    688:        self->monsterinfo.dodge = NULL;
                    689:        self->monsterinfo.attack = boss5_attack;
                    690:        self->monsterinfo.search = boss5_search;
                    691:        self->monsterinfo.melee = NULL;
                    692:        self->monsterinfo.sight = NULL;
                    693: 
                    694:        gi.linkentity (self);
                    695:        
                    696:        self->monsterinfo.currentmove = &boss5_move_stand;
                    697:        self->monsterinfo.scale = MODEL_SCALE;
                    698: 
                    699:        // RAFAEL
                    700:        self->monsterinfo.power_armor_type = POWER_ARMOR_SHIELD;
                    701:        self->monsterinfo.power_armor_power = 400;
                    702:        
                    703: 
                    704:        walkmonster_start(self);
                    705: }

unix.superglobalmegacorp.com

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