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

1.1       root        1: /*
                      2: ==============================================================================
                      3: 
                      4: SUPERTANK
                      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 BossExplode (edict_t *self);
                     24: 
                     25: void TreadSound (edict_t *self)
                     26: {
                     27:        gi.sound (self, CHAN_VOICE, tread_sound, 1, ATTN_NORM, 0);
                     28: }
                     29: 
                     30: void supertank_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 supertank_dead (edict_t *self);
                     40: void supertankRocket (edict_t *self);
                     41: void supertankMachineGun (edict_t *self);
                     42: void supertank_reattack1(edict_t *self);
                     43: 
                     44: 
                     45: //
                     46: // stand
                     47: //
                     48: 
                     49: mframe_t supertank_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        supertank_move_stand = {FRAME_stand_1, FRAME_stand_60, supertank_frames_stand, NULL};
                    113:        
                    114: void supertank_stand (edict_t *self)
                    115: {
                    116:        self->monsterinfo.currentmove = &supertank_move_stand;
                    117: }
                    118: 
                    119: 
                    120: mframe_t supertank_frames_run [] =
                    121: {
                    122:        ai_run, 12,     TreadSound,
                    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        supertank_move_run = {FRAME_forwrd_1, FRAME_forwrd_18, supertank_frames_run, NULL};
                    142: 
                    143: //
                    144: // walk
                    145: //
                    146: 
                    147: 
                    148: mframe_t supertank_frames_forward [] =
                    149: {
                    150:        ai_walk, 4,     TreadSound,
                    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        supertank_move_forward = {FRAME_forwrd_1, FRAME_forwrd_18, supertank_frames_forward, NULL};
                    170: 
                    171: void supertank_forward (edict_t *self)
                    172: {
                    173:                self->monsterinfo.currentmove = &supertank_move_forward;
                    174: }
                    175: 
                    176: void supertank_walk (edict_t *self)
                    177: {
                    178:                self->monsterinfo.currentmove = &supertank_move_forward;
                    179: }
                    180: 
                    181: void supertank_run (edict_t *self)
                    182: {
                    183:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
                    184:                self->monsterinfo.currentmove = &supertank_move_stand;
                    185:        else
                    186:                self->monsterinfo.currentmove = &supertank_move_run;
                    187: }
                    188: 
                    189: mframe_t supertank_frames_turn_right [] =
                    190: {
                    191:        ai_move,        0,      TreadSound,
                    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 supertank_move_turn_right = {FRAME_right_1, FRAME_right_18, supertank_frames_turn_right, supertank_run};
                    211: 
                    212: mframe_t supertank_frames_turn_left [] =
                    213: {
                    214:        ai_move,        0,      TreadSound,
                    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 supertank_move_turn_left = {FRAME_left_1, FRAME_left_18, supertank_frames_turn_left, supertank_run};
                    234: 
                    235: 
                    236: mframe_t supertank_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 supertank_move_pain3 = {FRAME_pain3_9, FRAME_pain3_12, supertank_frames_pain3, supertank_run};
                    244: 
                    245: mframe_t supertank_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 supertank_move_pain2 = {FRAME_pain2_5, FRAME_pain2_8, supertank_frames_pain2, supertank_run};
                    253: 
                    254: mframe_t supertank_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 supertank_move_pain1 = {FRAME_pain1_1, FRAME_pain1_4, supertank_frames_pain1, supertank_run};
                    262: 
                    263: mframe_t supertank_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,      BossExplode
                    289: };
                    290: mmove_t supertank_move_death = {FRAME_death_1, FRAME_death_24, supertank_frames_death1, supertank_dead};
                    291: 
                    292: mframe_t supertank_frames_backward[] =
                    293: {
                    294:        ai_walk, 0,     TreadSound,
                    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        supertank_move_backward = {FRAME_backwd_1, FRAME_backwd_18, supertank_frames_backward, NULL};
                    314: 
                    315: mframe_t supertank_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 supertank_move_attack4 = {FRAME_attak4_1, FRAME_attak4_6, supertank_frames_attack4, supertank_run};
                    325: 
                    326: mframe_t supertank_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 supertank_move_attack3 = {FRAME_attak3_1, FRAME_attak3_27, supertank_frames_attack3, supertank_run};
                    357: 
                    358: mframe_t supertank_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,      supertankRocket,
                    368:        ai_move,        0,      NULL,
                    369:        ai_move,        0,      NULL,
                    370:        ai_move,        0,      supertankRocket,
                    371:        ai_move,        0,      NULL,
                    372:        ai_move,        0,      NULL,
                    373:        ai_move,        0,      supertankRocket,
                    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 supertank_move_attack2 = {FRAME_attak2_1, FRAME_attak2_27, supertank_frames_attack2, supertank_run};
                    389: 
                    390: mframe_t supertank_frames_attack1[]=
                    391: {
                    392:        ai_charge,      0,      supertankMachineGun,
                    393:        ai_charge,      0,      supertankMachineGun,
                    394:        ai_charge,      0,      supertankMachineGun,
                    395:        ai_charge,      0,      supertankMachineGun,
                    396:        ai_charge,      0,      supertankMachineGun,
                    397:        ai_charge,      0,      supertankMachineGun,
                    398: 
                    399: };
                    400: mmove_t supertank_move_attack1 = {FRAME_attak1_1, FRAME_attak1_6, supertank_frames_attack1, supertank_reattack1};
                    401: 
                    402: mframe_t supertank_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 supertank_move_end_attack1 = {FRAME_attak1_7, FRAME_attak1_20, supertank_frames_end_attack1, supertank_run};
                    420: 
                    421: 
                    422: void supertank_reattack1(edict_t *self)
                    423: {
                    424:        if (visible(self, self->enemy))
                    425:                if (random() < 0.9)
                    426:                        self->monsterinfo.currentmove = &supertank_move_attack1;
                    427:                else
                    428:                        self->monsterinfo.currentmove = &supertank_move_end_attack1;    
                    429:        else
                    430:                self->monsterinfo.currentmove = &supertank_move_end_attack1;
                    431: }
                    432: 
                    433: void supertank_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 (skill->value == 3)
                    455:                return;         // no pain anims in nightmare
                    456: 
                    457:        if (damage <= 10)
                    458:        {
                    459:                gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM,0);
                    460:                self->monsterinfo.currentmove = &supertank_move_pain1;
                    461:        }
                    462:        else if (damage <= 25)
                    463:        {
                    464:                gi.sound (self, CHAN_VOICE, sound_pain3, 1, ATTN_NORM,0);
                    465:                self->monsterinfo.currentmove = &supertank_move_pain2;
                    466:        }
                    467:        else
                    468:        {
                    469:                gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM,0);
                    470:                self->monsterinfo.currentmove = &supertank_move_pain3;
                    471:        }
                    472: };
                    473: 
                    474: 
                    475: void supertankRocket (edict_t *self)
                    476: {
                    477:        vec3_t  forward, right;
                    478:        vec3_t  start;
                    479:        vec3_t  dir;
                    480:        vec3_t  vec;
                    481:        int             flash_number;
                    482: 
                    483:        if(!self->enemy || !self->enemy->inuse)         //PGM
                    484:                return;                                                                 //PGM
                    485: 
                    486:        if (self->s.frame == FRAME_attak2_8)
                    487:                flash_number = MZ2_SUPERTANK_ROCKET_1;
                    488:        else if (self->s.frame == FRAME_attak2_11)
                    489:                flash_number = MZ2_SUPERTANK_ROCKET_2;
                    490:        else // (self->s.frame == FRAME_attak2_14)
                    491:                flash_number = MZ2_SUPERTANK_ROCKET_3;
                    492: 
                    493:        AngleVectors (self->s.angles, forward, right, NULL);
                    494:        G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
                    495: 
                    496:        VectorCopy (self->enemy->s.origin, vec);
                    497:        vec[2] += self->enemy->viewheight;
                    498:        VectorSubtract (vec, start, dir);
                    499:        VectorNormalize (dir);
                    500: 
                    501:        monster_fire_rocket (self, start, dir, 50, 500, flash_number);
                    502: }      
                    503: 
                    504: void supertankMachineGun (edict_t *self)
                    505: {
                    506:        vec3_t  dir;
                    507:        vec3_t  vec;
                    508:        vec3_t  start;
                    509:        vec3_t  forward, right;
                    510:        int             flash_number;
                    511: 
                    512:        if(!self->enemy || !self->enemy->inuse)         //PGM
                    513:                return;                                                                 //PGM
                    514: 
                    515:        flash_number = MZ2_SUPERTANK_MACHINEGUN_1 + (self->s.frame - FRAME_attak1_1);
                    516: 
                    517:        //FIXME!!!
                    518:        dir[0] = 0;
                    519:        dir[1] = self->s.angles[1];
                    520:        dir[2] = 0;
                    521: 
                    522:        AngleVectors (dir, forward, right, NULL);
                    523:        G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
                    524: 
                    525:        if (self->enemy)
                    526:        {
                    527:                VectorCopy (self->enemy->s.origin, vec);
                    528:                VectorMA (vec, 0, self->enemy->velocity, vec);
                    529:                vec[2] += self->enemy->viewheight;
                    530:                VectorSubtract (vec, start, forward);
                    531:                VectorNormalize (forward);
                    532:   }
                    533: 
                    534:        monster_fire_bullet (self, start, forward, 6, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, flash_number);
                    535: }      
                    536: 
                    537: 
                    538: void supertank_attack(edict_t *self)
                    539: {
                    540:        vec3_t  vec;
                    541:        float   range;
                    542:        //float r;
                    543: 
                    544:        VectorSubtract (self->enemy->s.origin, self->s.origin, vec);
                    545:        range = VectorLength (vec);
                    546: 
                    547:        //r = random();
                    548: 
                    549:        // Attack 1 == Chaingun
                    550:        // Attack 2 == Rocket Launcher
                    551: 
                    552:        if (range <= 160)
                    553:        {
                    554:                self->monsterinfo.currentmove = &supertank_move_attack1;
                    555:        }
                    556:        else
                    557:        {       // fire rockets more often at distance
                    558:                if (random() < 0.3)
                    559:                        self->monsterinfo.currentmove = &supertank_move_attack1;
                    560:                else
                    561:                        self->monsterinfo.currentmove = &supertank_move_attack2;
                    562:        }
                    563: }
                    564: 
                    565: 
                    566: //
                    567: // death
                    568: //
                    569: 
                    570: void supertank_dead (edict_t *self)
                    571: {
                    572:        VectorSet (self->mins, -60, -60, 0);
                    573:        VectorSet (self->maxs, 60, 60, 72);
                    574:        self->movetype = MOVETYPE_TOSS;
                    575:        self->svflags |= SVF_DEADMONSTER;
                    576:        self->nextthink = 0;
                    577:        gi.linkentity (self);
                    578: }
                    579: 
                    580: 
                    581: void BossExplode (edict_t *self)
                    582: {
                    583:        vec3_t  org;
                    584:        int             n;
                    585: 
                    586:        self->think = BossExplode;
                    587:        VectorCopy (self->s.origin, org);
                    588:        org[2] += 24 + (rand()&15);
                    589:        switch (self->count++)
                    590:        {
                    591:        case 0:
                    592:                org[0] -= 24;
                    593:                org[1] -= 24;
                    594:                break;
                    595:        case 1:
                    596:                org[0] += 24;
                    597:                org[1] += 24;
                    598:                break;
                    599:        case 2:
                    600:                org[0] += 24;
                    601:                org[1] -= 24;
                    602:                break;
                    603:        case 3:
                    604:                org[0] -= 24;
                    605:                org[1] += 24;
                    606:                break;
                    607:        case 4:
                    608:                org[0] -= 48;
                    609:                org[1] -= 48;
                    610:                break;
                    611:        case 5:
                    612:                org[0] += 48;
                    613:                org[1] += 48;
                    614:                break;
                    615:        case 6:
                    616:                org[0] -= 48;
                    617:                org[1] += 48;
                    618:                break;
                    619:        case 7:
                    620:                org[0] += 48;
                    621:                org[1] -= 48;
                    622:                break;
                    623:        case 8:
                    624:                self->s.sound = 0;
                    625:                for (n= 0; n < 4; n++)
                    626:                        ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", 500, GIB_ORGANIC);
                    627:                for (n= 0; n < 8; n++)
                    628:                        ThrowGib (self, "models/objects/gibs/sm_metal/tris.md2", 500, GIB_METALLIC);
                    629:                ThrowGib (self, "models/objects/gibs/chest/tris.md2", 500, GIB_ORGANIC);
                    630:                ThrowHead (self, "models/objects/gibs/gear/tris.md2", 500, GIB_METALLIC);
                    631:                self->deadflag = DEAD_DEAD;
                    632:                return;
                    633:        }
                    634: 
                    635:        gi.WriteByte (svc_temp_entity);
                    636:        gi.WriteByte (TE_EXPLOSION1);
                    637:        gi.WritePosition (org);
                    638:        gi.multicast (self->s.origin, MULTICAST_PVS);
                    639: 
                    640:        self->nextthink = level.time + 0.1;
                    641: }
                    642: 
                    643: 
                    644: void supertank_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
                    645: {
                    646:        gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
                    647:        self->deadflag = DEAD_DEAD;
                    648:        self->takedamage = DAMAGE_NO;
                    649:        self->count = 0;
                    650:        self->monsterinfo.currentmove = &supertank_move_death;
                    651: }
                    652: 
                    653: 
                    654: //===========
                    655: //PGM
                    656: qboolean supertank_blocked (edict_t *self, float dist)
                    657: {
                    658:        if(blocked_checkshot (self, 0.25 + (0.05 * skill->value) ))
                    659:                return true;
                    660: 
                    661:        if(blocked_checkplat (self, dist))
                    662:                return true;
                    663: 
                    664:        return false;
                    665: }
                    666: //PGM
                    667: //===========
                    668: 
                    669: //
                    670: // monster_supertank
                    671: //
                    672: 
                    673: /*QUAKED monster_supertank (1 .5 0) (-64 -64 0) (64 64 72) Ambush Trigger_Spawn Sight
                    674: */
                    675: void SP_monster_supertank (edict_t *self)
                    676: {
                    677:        if (deathmatch->value)
                    678:        {
                    679:                G_FreeEdict (self);
                    680:                return;
                    681:        }
                    682: 
                    683:        sound_pain1 = gi.soundindex ("bosstank/btkpain1.wav");
                    684:        sound_pain2 = gi.soundindex ("bosstank/btkpain2.wav");
                    685:        sound_pain3 = gi.soundindex ("bosstank/btkpain3.wav");
                    686:        sound_death = gi.soundindex ("bosstank/btkdeth1.wav");
                    687:        sound_search1 = gi.soundindex ("bosstank/btkunqv1.wav");
                    688:        sound_search2 = gi.soundindex ("bosstank/btkunqv2.wav");
                    689: 
                    690: //     self->s.sound = gi.soundindex ("bosstank/btkengn1.wav");
                    691:        tread_sound = gi.soundindex ("bosstank/btkengn1.wav");
                    692: 
                    693:        self->movetype = MOVETYPE_STEP;
                    694:        self->solid = SOLID_BBOX;
                    695:        self->s.modelindex = gi.modelindex ("models/monsters/boss1/tris.md2");
                    696:        VectorSet (self->mins, -64, -64, 0);
                    697:        VectorSet (self->maxs, 64, 64, 112);
                    698: 
                    699:        self->health = 1500;
                    700:        self->gib_health = -500;
                    701:        self->mass = 800;
                    702: 
                    703:        self->pain = supertank_pain;
                    704:        self->die = supertank_die;
                    705:        self->monsterinfo.stand = supertank_stand;
                    706:        self->monsterinfo.walk = supertank_walk;
                    707:        self->monsterinfo.run = supertank_run;
                    708:        self->monsterinfo.dodge = NULL;
                    709:        self->monsterinfo.attack = supertank_attack;
                    710:        self->monsterinfo.search = supertank_search;
                    711:        self->monsterinfo.melee = NULL;
                    712:        self->monsterinfo.sight = NULL;
                    713:        self->monsterinfo.blocked = supertank_blocked;          //PGM
                    714: 
                    715:        gi.linkentity (self);
                    716:        
                    717:        self->monsterinfo.currentmove = &supertank_move_stand;
                    718:        self->monsterinfo.scale = MODEL_SCALE;
                    719: 
                    720:        walkmonster_start(self);
                    721: 
                    722:        //PMM
                    723:        self->monsterinfo.aiflags |= AI_IGNORE_SHOTS;
                    724:        //pmm
                    725: }

unix.superglobalmegacorp.com

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