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

1.1       root        1: /*
                      2: ==============================================================================
                      3: 
                      4: boss2
                      5: 
                      6: ==============================================================================
                      7: */
                      8: 
                      9: #include "g_local.h"
                     10: #include "m_boss2.h"
                     11: 
                     12: void BossExplode (edict_t *self);
                     13: 
                     14: qboolean infront (edict_t *self, edict_t *other);
                     15: 
                     16: static int     sound_pain1;
                     17: static int     sound_pain2;
                     18: static int     sound_pain3;
                     19: static int     sound_death;
                     20: static int     sound_search1;
                     21: 
                     22: void boss2_search (edict_t *self)
                     23: {
                     24:        if (random() < 0.5)
                     25:                gi.sound (self, CHAN_VOICE, sound_search1, 1, ATTN_NONE, 0);
                     26: }
                     27: 
                     28: void boss2_run (edict_t *self);
                     29: void boss2_stand (edict_t *self);
                     30: void boss2_dead (edict_t *self);
                     31: void boss2_attack (edict_t *self);
                     32: void boss2_attack_mg (edict_t *self);
                     33: void boss2_reattack_mg (edict_t *self);
                     34: void boss2_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
                     35: 
                     36: #define BOSS2_ROCKET_SPEED     750
                     37: 
                     38: void Boss2PredictiveRocket  (edict_t *self)
                     39: {
                     40:        vec3_t  forward, right;
                     41:        vec3_t  start;
                     42:        vec3_t  dir;
                     43:        vec3_t  vec;
                     44:        float   time, dist;
                     45: 
                     46: gi.dprintf("predictive fire\n");
                     47: 
                     48:        AngleVectors (self->s.angles, forward, right, NULL);
                     49: 
                     50: //1
                     51:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_BOSS2_ROCKET_1], forward, right, start);
                     52:                VectorSubtract(self->enemy->s.origin, start, dir);
                     53: //             dir[2] += self->enemy->viewheight;
                     54:                dist = VectorLength(dir);
                     55:                time = dist / BOSS2_ROCKET_SPEED;
                     56:                VectorMA(self->enemy->s.origin, time-0.3, self->enemy->velocity, vec);
                     57: 
                     58: //     VectorCopy (self->enemy->s.origin, vec);
                     59: //     vec[2] += self->enemy->viewheight;
                     60:        VectorSubtract (vec, start, dir);
                     61:        VectorNormalize (dir);
                     62:        monster_fire_rocket (self, start, dir, 50, BOSS2_ROCKET_SPEED, MZ2_BOSS2_ROCKET_1);
                     63: 
                     64: //2
                     65:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_BOSS2_ROCKET_2], forward, right, start);
                     66:                VectorSubtract(self->enemy->s.origin, start, dir);
                     67: //             dir[2] += self->enemy->viewheight;
                     68:                dist = VectorLength(dir);
                     69:                time = dist / BOSS2_ROCKET_SPEED;
                     70:                VectorMA(self->enemy->s.origin, time-0.15, self->enemy->velocity, vec);
                     71: 
                     72: //     VectorCopy (self->enemy->s.origin, vec);
                     73: //     vec[2] += self->enemy->viewheight;
                     74:        VectorSubtract (vec, start, dir);
                     75:        VectorNormalize (dir);
                     76:        monster_fire_rocket (self, start, dir, 50, BOSS2_ROCKET_SPEED, MZ2_BOSS2_ROCKET_2);
                     77: 
                     78: //3
                     79:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_BOSS2_ROCKET_3], forward, right, start);
                     80:                VectorSubtract(self->enemy->s.origin, start, dir);
                     81: //             dir[2] += self->enemy->viewheight;
                     82:                dist = VectorLength(dir);
                     83:                time = dist / BOSS2_ROCKET_SPEED;
                     84:                VectorMA(self->enemy->s.origin, time, self->enemy->velocity, vec);
                     85: 
                     86: //     VectorCopy (self->enemy->s.origin, vec);
                     87: //     vec[2] += self->enemy->viewheight;
                     88:        VectorSubtract (vec, start, dir);
                     89:        VectorNormalize (dir);
                     90:        monster_fire_rocket (self, start, dir, 50, BOSS2_ROCKET_SPEED, MZ2_BOSS2_ROCKET_3);
                     91: 
                     92: //4
                     93:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_BOSS2_ROCKET_4], forward, right, start);
                     94:                VectorSubtract(self->enemy->s.origin, start, dir);
                     95: //             dir[2] += self->enemy->viewheight;
                     96:                dist = VectorLength(dir);
                     97:                time = dist / BOSS2_ROCKET_SPEED;
                     98:                VectorMA(self->enemy->s.origin, time+0.15, self->enemy->velocity, vec);
                     99: 
                    100: //     VectorCopy (self->enemy->s.origin, vec);
                    101: //     vec[2] += self->enemy->viewheight;
                    102:        VectorSubtract (vec, start, dir);
                    103:        VectorNormalize (dir);
                    104:        monster_fire_rocket (self, start, dir, 50, BOSS2_ROCKET_SPEED, MZ2_BOSS2_ROCKET_4);
                    105: }      
                    106: 
                    107: void Boss2Rocket (edict_t *self)
                    108: {
                    109:        vec3_t  forward, right;
                    110:        vec3_t  start;
                    111:        vec3_t  dir;
                    112:        vec3_t  vec;
                    113: 
                    114:        if(self->enemy)
                    115:        {
                    116:                if(self->enemy->client && random() < 0.9)
                    117:                {
                    118:                        Boss2PredictiveRocket(self);
                    119:                        return;
                    120:                }
                    121:        }
                    122: 
                    123:        AngleVectors (self->s.angles, forward, right, NULL);
                    124: 
                    125: //1
                    126:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_BOSS2_ROCKET_1], forward, right, start);
                    127:        VectorCopy (self->enemy->s.origin, vec);
                    128: //     vec[2] += self->enemy->viewheight;
                    129:        vec[2] -= 15;
                    130:        VectorSubtract (vec, start, dir);
                    131:        VectorNormalize (dir);
                    132:        VectorMA (dir, 0.4, right, dir);
                    133:        VectorNormalize (dir);
                    134:        monster_fire_rocket (self, start, dir, 50, 500, MZ2_BOSS2_ROCKET_1);
                    135: 
                    136: //2
                    137:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_BOSS2_ROCKET_2], forward, right, start);
                    138:        VectorCopy (self->enemy->s.origin, vec);
                    139: //     vec[2] += self->enemy->viewheight;
                    140:        VectorSubtract (vec, start, dir);
                    141:        VectorNormalize (dir);
                    142:        VectorMA (dir, 0.025, right, dir);
                    143:        VectorNormalize (dir);
                    144:        monster_fire_rocket (self, start, dir, 50, 500, MZ2_BOSS2_ROCKET_2);
                    145: 
                    146: //3
                    147:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_BOSS2_ROCKET_3], forward, right, start);
                    148:        VectorCopy (self->enemy->s.origin, vec);
                    149: //     vec[2] += self->enemy->viewheight;
                    150:        VectorSubtract (vec, start, dir);
                    151:        VectorNormalize (dir);
                    152:        VectorMA (dir, -0.025, right, dir);
                    153:        VectorNormalize (dir);
                    154:        monster_fire_rocket (self, start, dir, 50, 500, MZ2_BOSS2_ROCKET_3);
                    155: 
                    156: //4
                    157:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_BOSS2_ROCKET_4], forward, right, start);
                    158:        VectorCopy (self->enemy->s.origin, vec);
                    159: //     vec[2] += self->enemy->viewheight;
                    160:        vec[2] -= 15;
                    161:        VectorSubtract (vec, start, dir);
                    162:        VectorNormalize (dir);
                    163:        VectorMA (dir, -0.4, right, dir);
                    164:        VectorNormalize (dir);
                    165:        monster_fire_rocket (self, start, dir, 50, 500, MZ2_BOSS2_ROCKET_4);
                    166: 
                    167: //5
                    168: //     G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_BOSS2_ROCKET_4], forward, right, start);
                    169: //     VectorCopy (self->enemy->s.origin, vec);
                    170: //     vec[2] += self->enemy->viewheight;
                    171: //     VectorSubtract (vec, start, dir);
                    172: //     VectorNormalize (dir);
                    173: //     monster_fire_rocket (self, start, dir, 50, 500, MZ2_BOSS2_ROCKET_2);
                    174: }      
                    175: 
                    176: void boss2_firebullet_right (edict_t *self)
                    177: {
                    178:        vec3_t  forward, right, target;
                    179:        vec3_t  start;
                    180: 
                    181:        AngleVectors (self->s.angles, forward, right, NULL);
                    182:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_BOSS2_MACHINEGUN_R1], forward, right, start);
                    183: 
                    184: //     VectorMA (self->enemy->s.origin, -0.2, self->enemy->velocity, target);
                    185:        VectorMA (self->enemy->s.origin, 0.2, self->enemy->velocity, target);
                    186:        target[2] += self->enemy->viewheight;
                    187:        VectorSubtract (target, start, forward);
                    188:        VectorNormalize (forward);
                    189: 
                    190:        monster_fire_bullet (self, start, forward, 6, 4, DEFAULT_BULLET_HSPREAD*3, DEFAULT_BULLET_VSPREAD, MZ2_BOSS2_MACHINEGUN_R1);
                    191: //     monster_fire_bullet (self, start, forward, 6, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, MZ2_BOSS2_MACHINEGUN_R1);
                    192: }      
                    193: 
                    194: void boss2_firebullet_left (edict_t *self)
                    195: {
                    196:        vec3_t  forward, right, target;
                    197:        vec3_t  start;
                    198:        
                    199:        AngleVectors (self->s.angles, forward, right, NULL);
                    200:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_BOSS2_MACHINEGUN_L1], forward, right, start);
                    201: 
                    202: //     VectorMA (self->enemy->s.origin, 0.2, self->enemy->velocity, target);
                    203:        VectorMA (self->enemy->s.origin, -0.2, self->enemy->velocity, target);
                    204: 
                    205:        target[2] += self->enemy->viewheight;
                    206:        VectorSubtract (target, start, forward);
                    207:        VectorNormalize (forward);
                    208: 
                    209:        monster_fire_bullet (self, start, forward, 6, 4, DEFAULT_BULLET_HSPREAD*3, DEFAULT_BULLET_VSPREAD, MZ2_BOSS2_MACHINEGUN_L1);
                    210: //     monster_fire_bullet (self, start, forward, 6, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, MZ2_BOSS2_MACHINEGUN_L1);
                    211: }      
                    212: 
                    213: void Boss2MachineGun (edict_t *self)
                    214: {
                    215: /*     vec3_t  forward, right;
                    216:        vec3_t  start;
                    217:        vec3_t  dir;
                    218:        vec3_t  vec;
                    219:        int             flash_number;
                    220: 
                    221:        AngleVectors (self->s.angles, forward, right, NULL);
                    222: 
                    223:        flash_number = MZ2_BOSS2_MACHINEGUN_1 + (self->s.frame - FRAME_attack10);
                    224:        G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
                    225: 
                    226:        VectorCopy (self->enemy->s.origin, vec);
                    227:        vec[2] += self->enemy->viewheight;
                    228:        VectorSubtract (vec, start, dir);
                    229:        VectorNormalize (dir);
                    230:        monster_fire_bullet (self, start, dir, 3, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, flash_number);
                    231: */
                    232:        boss2_firebullet_left(self);
                    233:        boss2_firebullet_right(self);
                    234: }      
                    235: 
                    236: 
                    237: mframe_t boss2_frames_stand [] =
                    238: {
                    239:        ai_stand, 0, NULL,
                    240:        ai_stand, 0, NULL,
                    241:        ai_stand, 0, NULL,
                    242:        ai_stand, 0, NULL,
                    243:        ai_stand, 0, NULL,
                    244:        ai_stand, 0, NULL,
                    245:        ai_stand, 0, NULL,
                    246:        ai_stand, 0, NULL,
                    247:        ai_stand, 0, NULL,
                    248:        ai_stand, 0, NULL,
                    249:        ai_stand, 0, NULL,
                    250:        ai_stand, 0, NULL,
                    251:        ai_stand, 0, NULL,
                    252:        ai_stand, 0, NULL,
                    253:        ai_stand, 0, NULL,
                    254:        ai_stand, 0, NULL,
                    255:        ai_stand, 0, NULL,
                    256:        ai_stand, 0, NULL,
                    257:        ai_stand, 0, NULL,
                    258:        ai_stand, 0, NULL,
                    259:        ai_stand, 0, NULL
                    260: };
                    261: mmove_t        boss2_move_stand = {FRAME_stand30, FRAME_stand50, boss2_frames_stand, NULL};
                    262: 
                    263: mframe_t boss2_frames_fidget [] =
                    264: {
                    265:        ai_stand, 0, NULL,
                    266:        ai_stand, 0, NULL,
                    267:        ai_stand, 0, NULL,
                    268:        ai_stand, 0, NULL,
                    269:        ai_stand, 0, NULL,
                    270:        ai_stand, 0, NULL,
                    271:        ai_stand, 0, NULL,
                    272:        ai_stand, 0, NULL,
                    273:        ai_stand, 0, NULL,
                    274:        ai_stand, 0, NULL,
                    275:        ai_stand, 0, NULL,
                    276:        ai_stand, 0, NULL,
                    277:        ai_stand, 0, NULL,
                    278:        ai_stand, 0, NULL,
                    279:        ai_stand, 0, NULL,
                    280:        ai_stand, 0, NULL,
                    281:        ai_stand, 0, NULL,
                    282:        ai_stand, 0, NULL,
                    283:        ai_stand, 0, NULL,
                    284:        ai_stand, 0, NULL,
                    285:        ai_stand, 0, NULL,
                    286:        ai_stand, 0, NULL,
                    287:        ai_stand, 0, NULL,
                    288:        ai_stand, 0, NULL,
                    289:        ai_stand, 0, NULL,
                    290:        ai_stand, 0, NULL,
                    291:        ai_stand, 0, NULL,
                    292:        ai_stand, 0, NULL,
                    293:        ai_stand, 0, NULL,
                    294:        ai_stand, 0, NULL
                    295: };
                    296: mmove_t boss2_move_fidget = {FRAME_stand1, FRAME_stand30, boss2_frames_fidget, NULL};
                    297: 
                    298: mframe_t boss2_frames_walk [] =
                    299: {
                    300:        /* PMM - normally, this is all 8's .. I upped it */
                    301:        ai_walk,        10,     NULL,
                    302:        ai_walk,        10,     NULL,
                    303:        ai_walk,        10,     NULL,
                    304:        ai_walk,        10,     NULL,
                    305:        ai_walk,        10,     NULL,
                    306:        ai_walk,        10,     NULL,
                    307:        ai_walk,        10,     NULL,
                    308:        ai_walk,        10,     NULL,
                    309:        ai_walk,        10,     NULL,
                    310:        ai_walk,        10,     NULL,
                    311:        ai_walk,        10,     NULL,
                    312:        ai_walk,        10,     NULL,
                    313:        ai_walk,        10,     NULL,
                    314:        ai_walk,        10,     NULL,
                    315:        ai_walk,        10,     NULL,
                    316:        ai_walk,        10,     NULL,
                    317:        ai_walk,        10,     NULL,
                    318:        ai_walk,        10,     NULL,
                    319:        ai_walk,        10,     NULL,
                    320:        ai_walk,        10,     NULL
                    321: };
                    322: mmove_t boss2_move_walk = {FRAME_walk1, FRAME_walk20, boss2_frames_walk, NULL};
                    323: 
                    324: 
                    325: mframe_t boss2_frames_run [] =
                    326: {
                    327:        /* PMM - normally, this is all 8's .. I upped it */
                    328:        ai_run, 10,     NULL,
                    329:        ai_run, 10,     NULL,
                    330:        ai_run, 10,     NULL,
                    331:        ai_run, 10,     NULL,
                    332:        ai_run, 10,     NULL,
                    333:        ai_run, 10,     NULL,
                    334:        ai_run, 10,     NULL,
                    335:        ai_run, 10,     NULL,
                    336:        ai_run, 10,     NULL,
                    337:        ai_run, 10,     NULL,
                    338:        ai_run, 10,     NULL,
                    339:        ai_run, 10,     NULL,
                    340:        ai_run, 10,     NULL,
                    341:        ai_run, 10,     NULL,
                    342:        ai_run, 10,     NULL,
                    343:        ai_run, 10,     NULL,
                    344:        ai_run, 10,     NULL,
                    345:        ai_run, 10,     NULL,
                    346:        ai_run, 10,     NULL,
                    347:        ai_run, 10,     NULL
                    348: };
                    349: mmove_t boss2_move_run = {FRAME_walk1, FRAME_walk20, boss2_frames_run, NULL};
                    350: 
                    351: mframe_t boss2_frames_attack_pre_mg [] =
                    352: {
                    353:        /* used to be all 1's .. what a slow guy */
                    354:        ai_charge,      2,      NULL,
                    355:        ai_charge,      2,      NULL,
                    356:        ai_charge,      2,      NULL,
                    357:        ai_charge,      2,      NULL,
                    358:        ai_charge,      2,      NULL,
                    359:        ai_charge,      2,      NULL,
                    360:        ai_charge,      2,      NULL,
                    361:        ai_charge,      2,      NULL,
                    362:        ai_charge,      2,      boss2_attack_mg
                    363: };
                    364: mmove_t boss2_move_attack_pre_mg = {FRAME_attack1, FRAME_attack9, boss2_frames_attack_pre_mg, NULL};
                    365: 
                    366: 
                    367: // Loop this
                    368: mframe_t boss2_frames_attack_mg [] =
                    369: {
                    370:        /* used to be all 1's .. what a slow guy */
                    371:        ai_charge,      2,      Boss2MachineGun,
                    372:        ai_charge,      2,      Boss2MachineGun,
                    373:        ai_charge,      2,      Boss2MachineGun,
                    374:        ai_charge,      2,      Boss2MachineGun,
                    375:        ai_charge,      2,      Boss2MachineGun,
                    376:        ai_charge,      2,      boss2_reattack_mg
                    377: };
                    378: mmove_t boss2_move_attack_mg = {FRAME_attack10, FRAME_attack15, boss2_frames_attack_mg, NULL};
                    379: 
                    380: mframe_t boss2_frames_attack_post_mg [] =
                    381: {
                    382:        /* used to be all 1's .. what a slow guy */
                    383:        ai_charge,      2,      NULL,
                    384:        ai_charge,      2,      NULL,
                    385:        ai_charge,      2,      NULL,
                    386:        ai_charge,      2,      NULL
                    387: };
                    388: mmove_t boss2_move_attack_post_mg = {FRAME_attack16, FRAME_attack19, boss2_frames_attack_post_mg, boss2_run};
                    389: 
                    390: mframe_t boss2_frames_attack_rocket [] =
                    391: {
                    392:        /* used to be all 1's .. except the Boss2Rocket frame, which was -20(!) */
                    393:        ai_charge,      2,      NULL,
                    394:        ai_charge,      2,      NULL,
                    395:        ai_charge,      2,      NULL,
                    396:        ai_charge,      2,      NULL,
                    397:        ai_charge,      2,      NULL,
                    398:        ai_charge,      2,      NULL,
                    399:        ai_charge,      2,      NULL,
                    400:        ai_charge,      2,      NULL,
                    401:        ai_charge,      2,      NULL,
                    402:        ai_charge,      2,      NULL,
                    403:        ai_charge,      2,      NULL,
                    404:        ai_charge,      2,      NULL,
                    405:        ai_move,        -5,     Boss2Rocket,
                    406:        ai_charge,      2,      NULL,
                    407:        ai_charge,      2,      NULL,
                    408:        ai_charge,      2,      NULL,
                    409:        ai_charge,      2,      NULL,
                    410:        ai_charge,      2,      NULL,
                    411:        ai_charge,      2,      NULL,
                    412:        ai_charge,      2,      NULL,
                    413:        ai_charge,      2,      NULL
                    414: };
                    415: mmove_t boss2_move_attack_rocket = {FRAME_attack20, FRAME_attack40, boss2_frames_attack_rocket, boss2_run};
                    416: 
                    417: mframe_t boss2_frames_pain_heavy [] =
                    418: {
                    419:        ai_move,        0,      NULL,
                    420:        ai_move,        0,      NULL,
                    421:        ai_move,        0,      NULL,
                    422:        ai_move,        0,      NULL,
                    423:        ai_move,        0,      NULL,
                    424:        ai_move,        0,      NULL,
                    425:        ai_move,        0,      NULL,
                    426:        ai_move,        0,      NULL,
                    427:        ai_move,        0,      NULL,
                    428:        ai_move,        0,      NULL,
                    429:        ai_move,        0,      NULL,
                    430:        ai_move,        0,      NULL,
                    431:        ai_move,        0,      NULL,
                    432:        ai_move,        0,      NULL,
                    433:        ai_move,        0,      NULL,
                    434:        ai_move,        0,      NULL,
                    435:        ai_move,        0,      NULL,
                    436:        ai_move,        0,      NULL
                    437: };
                    438: mmove_t boss2_move_pain_heavy = {FRAME_pain2, FRAME_pain19, boss2_frames_pain_heavy, boss2_run};
                    439: 
                    440: mframe_t boss2_frames_pain_light [] =
                    441: {
                    442:        ai_move,        0,      NULL,
                    443:        ai_move,        0,      NULL,
                    444:        ai_move,        0,      NULL,
                    445:        ai_move,        0,      NULL
                    446: };
                    447: mmove_t boss2_move_pain_light = {FRAME_pain20, FRAME_pain23, boss2_frames_pain_light, boss2_run};
                    448: 
                    449: mframe_t boss2_frames_death [] =
                    450: {
                    451:        ai_move,        0,      NULL,
                    452:        ai_move,        0,      NULL,
                    453:        ai_move,        0,      NULL,
                    454:        ai_move,        0,      NULL,
                    455:        ai_move,        0,      NULL,
                    456:        ai_move,        0,      NULL,
                    457:        ai_move,        0,      NULL,
                    458:        ai_move,        0,      NULL,
                    459:        ai_move,        0,      NULL,
                    460:        ai_move,        0,      NULL,
                    461:        ai_move,        0,      NULL,
                    462:        ai_move,        0,      NULL,
                    463:        ai_move,        0,      NULL,
                    464:        ai_move,        0,      NULL,
                    465:        ai_move,        0,      NULL,
                    466:        ai_move,        0,      NULL,
                    467:        ai_move,        0,      NULL,
                    468:        ai_move,        0,      NULL,
                    469:        ai_move,        0,      NULL,
                    470:        ai_move,        0,      NULL,
                    471:        ai_move,        0,      NULL,
                    472:        ai_move,        0,      NULL,
                    473:        ai_move,        0,      NULL,
                    474:        ai_move,        0,      NULL,
                    475:        ai_move,        0,      NULL,
                    476:        ai_move,        0,      NULL,
                    477:        ai_move,        0,      NULL,
                    478:        ai_move,        0,      NULL,
                    479:        ai_move,        0,      NULL,
                    480:        ai_move,        0,      NULL,
                    481:        ai_move,        0,      NULL,
                    482:        ai_move,        0,      NULL,
                    483:        ai_move,        0,      NULL,
                    484:        ai_move,        0,      NULL,
                    485:        ai_move,        0,      NULL,
                    486:        ai_move,        0,      NULL,
                    487:        ai_move,        0,      NULL,
                    488:        ai_move,        0,      NULL,
                    489:        ai_move,        0,      NULL,
                    490:        ai_move,        0,      NULL,
                    491:        ai_move,        0,      NULL,
                    492:        ai_move,        0,      NULL,
                    493:        ai_move,        0,      NULL,
                    494:        ai_move,        0,      NULL,
                    495:        ai_move,        0,      NULL,
                    496:        ai_move,        0,      NULL,
                    497:        ai_move,        0,      NULL,
                    498:        ai_move,        0,      NULL,
                    499:        ai_move,        0,      BossExplode
                    500: };
                    501: mmove_t boss2_move_death = {FRAME_death2, FRAME_death50, boss2_frames_death, boss2_dead};
                    502: 
                    503: void boss2_stand (edict_t *self)
                    504: {
                    505:                self->monsterinfo.currentmove = &boss2_move_stand;
                    506: }
                    507: 
                    508: void boss2_run (edict_t *self)
                    509: {
                    510:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
                    511:                self->monsterinfo.currentmove = &boss2_move_stand;
                    512:        else
                    513:                self->monsterinfo.currentmove = &boss2_move_run;
                    514: }
                    515: 
                    516: void boss2_walk (edict_t *self)
                    517: {
                    518:        self->monsterinfo.currentmove = &boss2_move_walk;
                    519: }
                    520: 
                    521: void boss2_attack (edict_t *self)
                    522: {
                    523:        vec3_t  vec;
                    524:        float   range;
                    525: 
                    526:        VectorSubtract (self->enemy->s.origin, self->s.origin, vec);
                    527:        range = VectorLength (vec);
                    528:        
                    529:        if (range <= 125)
                    530:        {
                    531:                self->monsterinfo.currentmove = &boss2_move_attack_pre_mg;
                    532:        }
                    533:        else 
                    534:        {
                    535:                if (random() <= 0.6)
                    536:                        self->monsterinfo.currentmove = &boss2_move_attack_pre_mg;
                    537:                else
                    538:                        self->monsterinfo.currentmove = &boss2_move_attack_rocket;
                    539:        }
                    540: }
                    541: 
                    542: void boss2_attack_mg (edict_t *self)
                    543: {
                    544:        self->monsterinfo.currentmove = &boss2_move_attack_mg;
                    545: }
                    546: 
                    547: void boss2_reattack_mg (edict_t *self)
                    548: {
                    549:        if ( infront(self, self->enemy) )
                    550:                if (random() <= 0.7)
                    551:                        self->monsterinfo.currentmove = &boss2_move_attack_mg;
                    552:                else
                    553:                        self->monsterinfo.currentmove = &boss2_move_attack_post_mg;
                    554:        else
                    555:                self->monsterinfo.currentmove = &boss2_move_attack_post_mg;
                    556: }
                    557: 
                    558: 
                    559: void boss2_pain (edict_t *self, edict_t *other, float kick, int damage)
                    560: {
                    561:        if (self->health < (self->max_health / 2))
                    562:                self->s.skinnum = 1;
                    563: 
                    564:        if (level.time < self->pain_debounce_time)
                    565:                return;
                    566: 
                    567:        self->pain_debounce_time = level.time + 3;
                    568: // American wanted these at no attenuation
                    569:        if (damage < 10)
                    570:        {
                    571:                gi.sound (self, CHAN_VOICE, sound_pain3, 1, ATTN_NONE, 0);
                    572:                self->monsterinfo.currentmove = &boss2_move_pain_light;
                    573:        }
                    574:        else if (damage < 30)
                    575:        {
                    576:                gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NONE, 0);
                    577:                self->monsterinfo.currentmove = &boss2_move_pain_light;
                    578:        }
                    579:        else 
                    580:        {
                    581:                gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NONE, 0);
                    582:                self->monsterinfo.currentmove = &boss2_move_pain_heavy;
                    583:        }
                    584: }
                    585: 
                    586: void boss2_dead (edict_t *self)
                    587: {
                    588:        VectorSet (self->mins, -56, -56, 0);
                    589:        VectorSet (self->maxs, 56, 56, 80);
                    590:        self->movetype = MOVETYPE_TOSS;
                    591:        self->svflags |= SVF_DEADMONSTER;
                    592:        self->nextthink = 0;
                    593:        gi.linkentity (self);
                    594: }
                    595: 
                    596: void boss2_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
                    597: {
                    598:        gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NONE, 0);
                    599:        self->deadflag = DEAD_DEAD;
                    600:        self->takedamage = DAMAGE_NO;
                    601:        self->count = 0;
                    602:        self->monsterinfo.currentmove = &boss2_move_death;
                    603: #if 0
                    604:        int             n;
                    605: 
                    606:        self->s.sound = 0;
                    607:        // check for gib
                    608:        if (self->health <= self->gib_health)
                    609:        {
                    610:                gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
                    611:                for (n= 0; n < 2; n++)
                    612:                        ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
                    613:                for (n= 0; n < 4; n++)
                    614:                        ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
                    615:                ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
                    616:                self->deadflag = DEAD_DEAD;
                    617:                return;
                    618:        }
                    619: 
                    620:        if (self->deadflag == DEAD_DEAD)
                    621:                return;
                    622: 
                    623:        self->deadflag = DEAD_DEAD;
                    624:        self->takedamage = DAMAGE_YES;
                    625:        self->monsterinfo.currentmove = &boss2_move_death;
                    626: #endif
                    627: }
                    628: 
                    629: qboolean Boss2_CheckAttack (edict_t *self)
                    630: {
                    631:        vec3_t  spot1, spot2;
                    632:        vec3_t  temp;
                    633:        float   chance;
                    634:        trace_t tr;
                    635:        qboolean        enemy_infront;
                    636:        int                     enemy_range;
                    637:        float           enemy_yaw;
                    638: 
                    639:        if (self->enemy->health > 0)
                    640:        {
                    641:        // see if any entities are in the way of the shot
                    642:                VectorCopy (self->s.origin, spot1);
                    643:                spot1[2] += self->viewheight;
                    644:                VectorCopy (self->enemy->s.origin, spot2);
                    645:                spot2[2] += self->enemy->viewheight;
                    646: 
                    647:                tr = gi.trace (spot1, NULL, NULL, spot2, self, CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_SLIME|CONTENTS_LAVA);
                    648: 
                    649:                // do we have a clear shot?
                    650:                if (tr.ent != self->enemy)
                    651:                {       
                    652:                        // PGM - we want them to go ahead and shoot at info_notnulls if they can.
                    653:                        if(self->enemy->solid != SOLID_NOT || tr.fraction < 1.0)                //PGM
                    654:                                return false;
                    655:                }
                    656:        }
                    657:        
                    658:        enemy_infront = infront(self, self->enemy);
                    659:        enemy_range = range(self, self->enemy);
                    660:        VectorSubtract (self->enemy->s.origin, self->s.origin, temp);
                    661:        enemy_yaw = vectoyaw(temp);
                    662: 
                    663:        self->ideal_yaw = enemy_yaw;
                    664: 
                    665: 
                    666:        // melee attack
                    667:        if (enemy_range == RANGE_MELEE)
                    668:        {
                    669:                if (self->monsterinfo.melee)
                    670:                        self->monsterinfo.attack_state = AS_MELEE;
                    671:                else
                    672:                        self->monsterinfo.attack_state = AS_MISSILE;
                    673:                return true;
                    674:        }
                    675:        
                    676: // missile attack
                    677:        if (!self->monsterinfo.attack)
                    678:                return false;
                    679:                
                    680:        if (level.time < self->monsterinfo.attack_finished)
                    681:                return false;
                    682:                
                    683:        if (enemy_range == RANGE_FAR)
                    684:                return false;
                    685: 
                    686:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
                    687:        {
                    688:                chance = 0.4;
                    689:        }
                    690:        else if (enemy_range == RANGE_MELEE)
                    691:        {
                    692:                chance = 0.8;
                    693:        }
                    694:        else if (enemy_range == RANGE_NEAR)
                    695:        {
                    696:                chance = 0.8;
                    697:        }
                    698:        else if (enemy_range == RANGE_MID)
                    699:        {
                    700:                chance = 0.8;
                    701:        }
                    702:        else
                    703:        {
                    704:                return false;
                    705:        }
                    706: 
                    707:        // PGM - go ahead and shoot every time if it's a info_notnull
                    708:        if ((random () < chance) || (self->enemy->solid == SOLID_NOT))
                    709:        {
                    710:                self->monsterinfo.attack_state = AS_MISSILE;
                    711:                self->monsterinfo.attack_finished = level.time + 2*random();
                    712:                return true;
                    713:        }
                    714: 
                    715:        if (self->flags & FL_FLY)
                    716:        {
                    717:                if (random() < 0.3)
                    718:                        self->monsterinfo.attack_state = AS_SLIDING;
                    719:                else
                    720:                        self->monsterinfo.attack_state = AS_STRAIGHT;
                    721:        }
                    722: 
                    723:        return false;
                    724: }
                    725: 
                    726: 
                    727: 
                    728: /*QUAKED monster_boss2 (1 .5 0) (-56 -56 0) (56 56 80) Ambush Trigger_Spawn Sight
                    729: */
                    730: void SP_monster_boss2 (edict_t *self)
                    731: {
                    732:        if (deathmatch->value)
                    733:        {
                    734:                G_FreeEdict (self);
                    735:                return;
                    736:        }
                    737: 
                    738:        sound_pain1 = gi.soundindex ("bosshovr/bhvpain1.wav");
                    739:        sound_pain2 = gi.soundindex ("bosshovr/bhvpain2.wav");
                    740:        sound_pain3 = gi.soundindex ("bosshovr/bhvpain3.wav");
                    741:        sound_death = gi.soundindex ("bosshovr/bhvdeth1.wav");
                    742:        sound_search1 = gi.soundindex ("bosshovr/bhvunqv1.wav");
                    743: 
                    744:        self->s.sound = gi.soundindex ("bosshovr/bhvengn1.wav");
                    745: 
                    746:        self->movetype = MOVETYPE_STEP;
                    747:        self->solid = SOLID_BBOX;
                    748:        self->s.modelindex = gi.modelindex ("models/monsters/boss2/tris.md2");
                    749:        VectorSet (self->mins, -56, -56, 0);
                    750:        VectorSet (self->maxs, 56, 56, 80);
                    751: 
                    752:        self->health = 2000;
                    753:        self->gib_health = -200;
                    754:        self->mass = 1000;
                    755: 
                    756:        self->yaw_speed = 50;
                    757: 
                    758:        self->flags |= FL_IMMUNE_LASER;
                    759: 
                    760:        self->pain = boss2_pain;
                    761:        self->die = boss2_die;
                    762: 
                    763:        self->monsterinfo.stand = boss2_stand;
                    764:        self->monsterinfo.walk = boss2_walk;
                    765:        self->monsterinfo.run = boss2_run;
                    766:        self->monsterinfo.attack = boss2_attack;
                    767:        self->monsterinfo.search = boss2_search;
                    768:        self->monsterinfo.checkattack = Boss2_CheckAttack;
                    769:        gi.linkentity (self);
                    770: 
                    771:        self->monsterinfo.currentmove = &boss2_move_stand;      
                    772:        self->monsterinfo.scale = MODEL_SCALE;
                    773: 
                    774:        flymonster_start (self);
                    775: }

unix.superglobalmegacorp.com

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