Annotation of quake2/xatrix/m_supertank.c, revision 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->s.frame == FRAME_attak2_8)
        !           484:                flash_number = MZ2_SUPERTANK_ROCKET_1;
        !           485:        else if (self->s.frame == FRAME_attak2_11)
        !           486:                flash_number = MZ2_SUPERTANK_ROCKET_2;
        !           487:        else // (self->s.frame == FRAME_attak2_14)
        !           488:                flash_number = MZ2_SUPERTANK_ROCKET_3;
        !           489: 
        !           490:        AngleVectors (self->s.angles, forward, right, NULL);
        !           491:        G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
        !           492: 
        !           493:        VectorCopy (self->enemy->s.origin, vec);
        !           494:        vec[2] += self->enemy->viewheight;
        !           495:        VectorSubtract (vec, start, dir);
        !           496:        VectorNormalize (dir);
        !           497: 
        !           498:        monster_fire_rocket (self, start, dir, 50, 500, flash_number);
        !           499: }      
        !           500: 
        !           501: void supertankMachineGun (edict_t *self)
        !           502: {
        !           503:        vec3_t  dir;
        !           504:        vec3_t  vec;
        !           505:        vec3_t  start;
        !           506:        vec3_t  forward, right;
        !           507:        int             flash_number;
        !           508: 
        !           509:        flash_number = MZ2_SUPERTANK_MACHINEGUN_1 + (self->s.frame - FRAME_attak1_1);
        !           510: 
        !           511:        //FIXME!!!
        !           512:        dir[0] = 0;
        !           513:        dir[1] = self->s.angles[1];
        !           514:        dir[2] = 0;
        !           515: 
        !           516:        AngleVectors (dir, forward, right, NULL);
        !           517:        G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
        !           518: 
        !           519:        if (self->enemy)
        !           520:        {
        !           521:                VectorCopy (self->enemy->s.origin, vec);
        !           522:                VectorMA (vec, 0, self->enemy->velocity, vec);
        !           523:                vec[2] += self->enemy->viewheight;
        !           524:                VectorSubtract (vec, start, forward);
        !           525:                VectorNormalize (forward);
        !           526:   }
        !           527: 
        !           528:        monster_fire_bullet (self, start, forward, 6, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, flash_number);
        !           529: }      
        !           530: 
        !           531: 
        !           532: void supertank_attack(edict_t *self)
        !           533: {
        !           534:        vec3_t  vec;
        !           535:        float   range;
        !           536:        //float r;
        !           537: 
        !           538:        VectorSubtract (self->enemy->s.origin, self->s.origin, vec);
        !           539:        range = VectorLength (vec);
        !           540: 
        !           541:        //r = random();
        !           542: 
        !           543:        // Attack 1 == Chaingun
        !           544:        // Attack 2 == Rocket Launcher
        !           545: 
        !           546:        if (range <= 160)
        !           547:        {
        !           548:                self->monsterinfo.currentmove = &supertank_move_attack1;
        !           549:        }
        !           550:        else
        !           551:        {       // fire rockets more often at distance
        !           552:                if (random() < 0.3)
        !           553:                        self->monsterinfo.currentmove = &supertank_move_attack1;
        !           554:                else
        !           555:                        self->monsterinfo.currentmove = &supertank_move_attack2;
        !           556:        }
        !           557: }
        !           558: 
        !           559: 
        !           560: //
        !           561: // death
        !           562: //
        !           563: 
        !           564: void supertank_dead (edict_t *self)
        !           565: {
        !           566:        VectorSet (self->mins, -60, -60, 0);
        !           567:        VectorSet (self->maxs, 60, 60, 72);
        !           568:        self->movetype = MOVETYPE_TOSS;
        !           569:        self->svflags |= SVF_DEADMONSTER;
        !           570:        self->nextthink = 0;
        !           571:        gi.linkentity (self);
        !           572: }
        !           573: 
        !           574: 
        !           575: void BossExplode (edict_t *self)
        !           576: {
        !           577:        vec3_t  org;
        !           578:        int             n;
        !           579: 
        !           580:        self->think = BossExplode;
        !           581:        VectorCopy (self->s.origin, org);
        !           582:        org[2] += 24 + (rand()&15);
        !           583:        switch (self->count++)
        !           584:        {
        !           585:        case 0:
        !           586:                org[0] -= 24;
        !           587:                org[1] -= 24;
        !           588:                break;
        !           589:        case 1:
        !           590:                org[0] += 24;
        !           591:                org[1] += 24;
        !           592:                break;
        !           593:        case 2:
        !           594:                org[0] += 24;
        !           595:                org[1] -= 24;
        !           596:                break;
        !           597:        case 3:
        !           598:                org[0] -= 24;
        !           599:                org[1] += 24;
        !           600:                break;
        !           601:        case 4:
        !           602:                org[0] -= 48;
        !           603:                org[1] -= 48;
        !           604:                break;
        !           605:        case 5:
        !           606:                org[0] += 48;
        !           607:                org[1] += 48;
        !           608:                break;
        !           609:        case 6:
        !           610:                org[0] -= 48;
        !           611:                org[1] += 48;
        !           612:                break;
        !           613:        case 7:
        !           614:                org[0] += 48;
        !           615:                org[1] -= 48;
        !           616:                break;
        !           617:        case 8:
        !           618:                self->s.sound = 0;
        !           619:                for (n= 0; n < 4; n++)
        !           620:                        ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", 500, GIB_ORGANIC);
        !           621:                for (n= 0; n < 8; n++)
        !           622:                        ThrowGib (self, "models/objects/gibs/sm_metal/tris.md2", 500, GIB_METALLIC);
        !           623:                ThrowGib (self, "models/objects/gibs/chest/tris.md2", 500, GIB_ORGANIC);
        !           624:                ThrowHead (self, "models/objects/gibs/gear/tris.md2", 500, GIB_METALLIC);
        !           625:                self->deadflag = DEAD_DEAD;
        !           626:                return;
        !           627:        }
        !           628: 
        !           629:        gi.WriteByte (svc_temp_entity);
        !           630:        gi.WriteByte (TE_EXPLOSION1);
        !           631:        gi.WritePosition (org);
        !           632:        gi.multicast (self->s.origin, MULTICAST_PVS);
        !           633: 
        !           634:        self->nextthink = level.time + 0.1;
        !           635: }
        !           636: 
        !           637: 
        !           638: void supertank_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
        !           639: {
        !           640:        gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
        !           641:        self->deadflag = DEAD_DEAD;
        !           642:        self->takedamage = DAMAGE_NO;
        !           643:        self->count = 0;
        !           644:        self->monsterinfo.currentmove = &supertank_move_death;
        !           645: }
        !           646: 
        !           647: //
        !           648: // monster_supertank
        !           649: //
        !           650: 
        !           651: // RAFAEL (Powershield)
        !           652: 
        !           653: /*QUAKED monster_supertank (1 .5 0) (-64 -64 0) (64 64 72) Ambush Trigger_Spawn Sight Powershield
        !           654: */
        !           655: void SP_monster_supertank (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/boss1/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 = supertank_pain;
        !           684:        self->die = supertank_die;
        !           685:        self->monsterinfo.stand = supertank_stand;
        !           686:        self->monsterinfo.walk = supertank_walk;
        !           687:        self->monsterinfo.run = supertank_run;
        !           688:        self->monsterinfo.dodge = NULL;
        !           689:        self->monsterinfo.attack = supertank_attack;
        !           690:        self->monsterinfo.search = supertank_search;
        !           691:        self->monsterinfo.melee = NULL;
        !           692:        self->monsterinfo.sight = NULL;
        !           693: 
        !           694:        gi.linkentity (self);
        !           695:        
        !           696:        self->monsterinfo.currentmove = &supertank_move_stand;
        !           697:        self->monsterinfo.scale = MODEL_SCALE;
        !           698: 
        !           699:        if (self->spawnflags & 8)
        !           700:        {
        !           701:                self->monsterinfo.power_armor_type = POWER_ARMOR_SHIELD;
        !           702:                self->monsterinfo.power_armor_power = 400;
        !           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.