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

1.1       root        1: /*
                      2: ==============================================================================
                      3: 
                      4: jorg
                      5: 
                      6: ==============================================================================
                      7: */
                      8: 
                      9: #include "g_local.h"
                     10: #include "m_boss31.h"
                     11: 
                     12: extern SP_monster_makron (edict_t *self);
                     13: qboolean visible (edict_t *self, edict_t *other);
                     14: 
                     15: static int     sound_pain1;
                     16: static int     sound_pain2;
                     17: static int     sound_pain3;
                     18: static int     sound_idle;
                     19: static int     sound_death;
                     20: static int     sound_search1;
                     21: static int     sound_search2;
                     22: static int     sound_search3;
                     23: static int     sound_attack1;
                     24: static int     sound_attack2;
                     25: static int     sound_firegun;
                     26: static int     sound_step_left;
                     27: static int     sound_step_right;
                     28: static int     sound_death_hit;
                     29: 
                     30: void BossExplode (edict_t *self);
                     31: void MakronToss (edict_t *self);
                     32: 
                     33: 
                     34: void jorg_search (edict_t *self)
                     35: {
                     36:        float r;
                     37: 
                     38:        r = random();
                     39: 
                     40:        if (r <= 0.3)
                     41:                gi.sound (self, CHAN_VOICE, sound_search1, 1, ATTN_NORM, 0);
                     42:        else if (r <= 0.6)
                     43:                gi.sound (self, CHAN_VOICE, sound_search2, 1, ATTN_NORM, 0);
                     44:        else
                     45:                gi.sound (self, CHAN_VOICE, sound_search3, 1, ATTN_NORM, 0);
                     46: }
                     47: 
                     48: 
                     49: void jorg_dead (edict_t *self);
                     50: void jorgBFG (edict_t *self);
                     51: void jorgMachineGun (edict_t *self);
                     52: void jorg_firebullet (edict_t *self);
                     53: void jorg_reattack1(edict_t *self);
                     54: void jorg_attack1(edict_t *self);
                     55: void jorg_idle(edict_t *self);
                     56: void jorg_step_left(edict_t *self);
                     57: void jorg_step_right(edict_t *self);
                     58: void jorg_death_hit(edict_t *self);
                     59: 
                     60: //
                     61: // stand
                     62: //
                     63: 
                     64: mframe_t jorg_frames_stand []=
                     65: {
                     66:        ai_stand, 0, jorg_idle,
                     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,              // 10
                     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,              // 20
                     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,              // 30
                     96:        ai_stand, 0, NULL,
                     97:        ai_stand, 0, NULL,
                     98:        ai_stand, 0, NULL,
                     99:        ai_stand, 19, NULL,
                    100:        ai_stand, 11, jorg_step_left,
                    101:        ai_stand, 0, NULL,
                    102:        ai_stand, 0, NULL,
                    103:        ai_stand, 6, NULL,
                    104:        ai_stand, 9, jorg_step_right,
                    105:        ai_stand, 0, NULL,              // 40
                    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:        ai_stand, 0, NULL,
                    112:        ai_stand, -2, NULL,
                    113:        ai_stand, -17, jorg_step_left,
                    114:        ai_stand, 0, NULL,
                    115:        ai_stand, -12, NULL,            // 50
                    116:        ai_stand, -14, jorg_step_right  // 51
                    117: };
                    118: mmove_t        jorg_move_stand = {FRAME_stand01, FRAME_stand51, jorg_frames_stand, NULL};
                    119: 
                    120: void jorg_idle (edict_t *self)
                    121: {
                    122:        gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_NORM,0);
                    123: }
                    124: 
                    125: void jorg_death_hit (edict_t *self)
                    126: {
                    127:        gi.sound (self, CHAN_BODY, sound_death_hit, 1, ATTN_NORM,0);
                    128: }
                    129: 
                    130: 
                    131: void jorg_step_left (edict_t *self)
                    132: {
                    133:        gi.sound (self, CHAN_BODY, sound_step_left, 1, ATTN_NORM,0);
                    134: }
                    135: 
                    136: void jorg_step_right (edict_t *self)
                    137: {
                    138:        gi.sound (self, CHAN_BODY, sound_step_right, 1, ATTN_NORM,0);
                    139: }
                    140: 
                    141: 
                    142: void jorg_stand (edict_t *self)
                    143: {
                    144:        self->monsterinfo.currentmove = &jorg_move_stand;
                    145: }
                    146: 
                    147: mframe_t jorg_frames_run [] =
                    148: {
                    149:        ai_run, 17,     jorg_step_left,
                    150:        ai_run, 0,      NULL,
                    151:        ai_run, 0,      NULL,
                    152:        ai_run, 0,      NULL,
                    153:        ai_run, 12,     NULL,
                    154:        ai_run, 8,      NULL,
                    155:        ai_run, 10,     NULL,
                    156:        ai_run, 33,     jorg_step_right,
                    157:        ai_run, 0,      NULL,
                    158:        ai_run, 0,      NULL,
                    159:        ai_run, 0,      NULL,
                    160:        ai_run, 9,      NULL,
                    161:        ai_run, 9,      NULL,
                    162:        ai_run, 9,      NULL
                    163: };
                    164: mmove_t        jorg_move_run = {FRAME_walk06, FRAME_walk19, jorg_frames_run, NULL};
                    165: 
                    166: //
                    167: // walk
                    168: //
                    169: 
                    170: mframe_t jorg_frames_start_walk [] =
                    171: {
                    172:        ai_walk,        5,      NULL,
                    173:        ai_walk,        6,      NULL,
                    174:        ai_walk,        7,      NULL,
                    175:        ai_walk,        9,      NULL,
                    176:        ai_walk,        15,     NULL
                    177: };
                    178: mmove_t jorg_move_start_walk = {FRAME_walk01, FRAME_walk05, jorg_frames_start_walk, NULL};
                    179: 
                    180: mframe_t jorg_frames_walk [] =
                    181: {
                    182:        ai_walk, 17,    NULL,
                    183:        ai_walk, 0,     NULL,
                    184:        ai_walk, 0,     NULL,
                    185:        ai_walk, 0,     NULL,
                    186:        ai_walk, 12,    NULL,
                    187:        ai_walk, 8,     NULL,
                    188:        ai_walk, 10,    NULL,
                    189:        ai_walk, 33,    NULL,
                    190:        ai_walk, 0,     NULL,
                    191:        ai_walk, 0,     NULL,
                    192:        ai_walk, 0,     NULL,
                    193:        ai_walk, 9,     NULL,
                    194:        ai_walk, 9,     NULL,
                    195:        ai_walk, 9,     NULL
                    196: };
                    197: mmove_t        jorg_move_walk = {FRAME_walk06, FRAME_walk19, jorg_frames_walk, NULL};
                    198: 
                    199: mframe_t jorg_frames_end_walk [] =
                    200: {
                    201:        ai_walk,        11,     NULL,
                    202:        ai_walk,        0,      NULL,
                    203:        ai_walk,        0,      NULL,
                    204:        ai_walk,        0,      NULL,
                    205:        ai_walk,        8,      NULL,
                    206:        ai_walk,        -8,     NULL
                    207: };
                    208: mmove_t jorg_move_end_walk = {FRAME_walk20, FRAME_walk25, jorg_frames_end_walk, NULL};
                    209: 
                    210: void jorg_walk (edict_t *self)
                    211: {
                    212:                self->monsterinfo.currentmove = &jorg_move_walk;
                    213: }
                    214: 
                    215: void jorg_run (edict_t *self)
                    216: {
                    217:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
                    218:                self->monsterinfo.currentmove = &jorg_move_stand;
                    219:        else
                    220:                self->monsterinfo.currentmove = &jorg_move_run;
                    221: }
                    222: 
                    223: mframe_t jorg_frames_pain3 [] =
                    224: {
                    225:        ai_move,        -28,    NULL,
                    226:        ai_move,        -6,     NULL,
                    227:        ai_move,        -3,     jorg_step_left,
                    228:        ai_move,        -9,     NULL,
                    229:        ai_move,        0,      jorg_step_right,
                    230:        ai_move,        0,      NULL,
                    231:        ai_move,        0,      NULL,
                    232:        ai_move,        0,      NULL,
                    233:        ai_move,        -7,     NULL,
                    234:        ai_move,        1,      NULL,
                    235:        ai_move,        -11,    NULL,
                    236:        ai_move,        -4,     NULL,
                    237:        ai_move,        0,      NULL,
                    238:        ai_move,        0,      NULL,
                    239:        ai_move,        10,     NULL,
                    240:        ai_move,        11,     NULL,
                    241:        ai_move,        0,      NULL,
                    242:        ai_move,        10,     NULL,
                    243:        ai_move,        3,      NULL,
                    244:        ai_move,        10,     NULL,
                    245:        ai_move,        7,      jorg_step_left,
                    246:        ai_move,        17,     NULL,
                    247:        ai_move,        0,      NULL,
                    248:        ai_move,        0,      NULL,
                    249:        ai_move,        0,      jorg_step_right
                    250: };
                    251: mmove_t jorg_move_pain3 = {FRAME_pain301, FRAME_pain325, jorg_frames_pain3, jorg_run};
                    252: 
                    253: mframe_t jorg_frames_pain2 [] =
                    254: {
                    255:        ai_move,        0,      NULL,
                    256:        ai_move,        0,      NULL,
                    257:        ai_move,        0,      NULL
                    258: };
                    259: mmove_t jorg_move_pain2 = {FRAME_pain201, FRAME_pain203, jorg_frames_pain2, jorg_run};
                    260: 
                    261: mframe_t jorg_frames_pain1 [] =
                    262: {
                    263:        ai_move,        0,      NULL,
                    264:        ai_move,        0,      NULL,
                    265:        ai_move,        0,      NULL
                    266: };
                    267: mmove_t jorg_move_pain1 = {FRAME_pain101, FRAME_pain103, jorg_frames_pain1, jorg_run};
                    268: 
                    269: mframe_t jorg_frames_death1 [] =
                    270: {
                    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,           // 10
                    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,      NULL,
                    289:        ai_move,        0,      NULL,
                    290:        ai_move,        0,      NULL,           // 20
                    291:        ai_move,        0,      NULL,
                    292:        ai_move,        0,      NULL,
                    293:        ai_move,        0,      NULL,
                    294:        ai_move,        0,      NULL,                   
                    295:        ai_move,        0,      NULL,
                    296:        ai_move,        0,      NULL,
                    297:        ai_move,        0,      NULL,                   
                    298:        ai_move,        0,      NULL,
                    299:        ai_move,        0,      NULL,
                    300:        ai_move,        0,      NULL,           // 30
                    301:        ai_move,        0,      NULL,
                    302:        ai_move,        0,      NULL,
                    303:        ai_move,        0,      NULL,
                    304:        ai_move,        0,      NULL,
                    305:        ai_move,        0,      NULL,
                    306:        ai_move,        0,      NULL,
                    307:        ai_move,        0,      NULL,
                    308:        ai_move,        0,      NULL,
                    309:        ai_move,        0,      NULL,
                    310:        ai_move,        0,      NULL,           // 40
                    311:        ai_move,        0,      NULL,
                    312:        ai_move,        0,      NULL,
                    313:        ai_move,        0,      NULL,
                    314:        ai_move,        0,      NULL,                   
                    315:        ai_move,        0,      NULL,
                    316:        ai_move,        0,      NULL,
                    317:        ai_move,        0,      NULL,                   
                    318:        ai_move,        0,      NULL,
                    319:        ai_move,        0,      MakronToss,
                    320:        ai_move,        0,      BossExplode             // 50
                    321: };
                    322: mmove_t jorg_move_death = {FRAME_death01, FRAME_death50, jorg_frames_death1, jorg_dead};
                    323: 
                    324: mframe_t jorg_frames_attack2 []=
                    325: {
                    326:        ai_charge,      0,      NULL,
                    327:        ai_charge,      0,      NULL,
                    328:        ai_charge,      0,      NULL,
                    329:        ai_charge,      0,      NULL,
                    330:        ai_charge,      0,      NULL,
                    331:        ai_charge,      0,      NULL,
                    332:        ai_charge,      0,      jorgBFG,                
                    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: };
                    340: mmove_t jorg_move_attack2 = {FRAME_attak201, FRAME_attak213, jorg_frames_attack2, jorg_run};
                    341: 
                    342: mframe_t jorg_frames_start_attack1 [] =
                    343: {
                    344:        ai_charge,      0,      NULL,
                    345:        ai_charge,      0,      NULL,
                    346:        ai_charge,      0,      NULL,
                    347:        ai_charge,      0,      NULL,
                    348:        ai_charge,      0,      NULL,
                    349:        ai_charge,      0,      NULL,
                    350:        ai_charge,      0,      NULL,
                    351:        ai_charge,      0,      NULL
                    352: };
                    353: mmove_t jorg_move_start_attack1 = {FRAME_attak101, FRAME_attak108, jorg_frames_start_attack1, jorg_attack1};
                    354: 
                    355: mframe_t jorg_frames_attack1[]=
                    356: {
                    357:        ai_charge,      0,      jorg_firebullet,
                    358:        ai_charge,      0,      jorg_firebullet,
                    359:        ai_charge,      0,      jorg_firebullet,
                    360:        ai_charge,      0,      jorg_firebullet,
                    361:        ai_charge,      0,      jorg_firebullet,
                    362:        ai_charge,      0,      jorg_firebullet
                    363: };
                    364: mmove_t jorg_move_attack1 = {FRAME_attak109, FRAME_attak114, jorg_frames_attack1, jorg_reattack1};
                    365: 
                    366: mframe_t jorg_frames_end_attack1[]=
                    367: {
                    368:        ai_move,        0,      NULL,
                    369:        ai_move,        0,      NULL,
                    370:        ai_move,        0,      NULL,
                    371:        ai_move,        0,      NULL
                    372: };
                    373: mmove_t jorg_move_end_attack1 = {FRAME_attak115, FRAME_attak118, jorg_frames_end_attack1, jorg_run};
                    374: 
                    375: void jorg_reattack1(edict_t *self)
                    376: {
                    377:        if (visible(self, self->enemy))
                    378:                if (random() < 0.9)
                    379:                        self->monsterinfo.currentmove = &jorg_move_attack1;
                    380:                else
                    381:                {
                    382:                        self->s.sound = 0;
                    383:                        self->monsterinfo.currentmove = &jorg_move_end_attack1; 
                    384:                }
                    385:        else
                    386:        {
                    387:                self->s.sound = 0;
                    388:                self->monsterinfo.currentmove = &jorg_move_end_attack1; 
                    389:        }
                    390: }
                    391: 
                    392: void jorg_attack1(edict_t *self)
                    393: {
                    394:        self->monsterinfo.currentmove = &jorg_move_attack1;
                    395: }
                    396: 
                    397: void jorg_pain (edict_t *self, edict_t *other, float kick, int damage)
                    398: {
                    399: 
                    400:        if (self->health < (self->max_health / 2))
                    401:                        self->s.skinnum = 1;
                    402:        
                    403:        self->s.sound = 0;
                    404: 
                    405:        if (level.time < self->pain_debounce_time)
                    406:                        return;
                    407: 
                    408:        // Lessen the chance of him going into his pain frames if he takes little damage
                    409:        if (damage <= 40)
                    410:                if (random()<=0.6)
                    411:                        return;
                    412: 
                    413:        /* 
                    414:        If he's entering his attack1 or using attack1, lessen the chance of him
                    415:        going into pain
                    416:        */
                    417:        
                    418:        if ( (self->s.frame >= FRAME_attak101) && (self->s.frame <= FRAME_attak108) )
                    419:                if (random() <= 0.005)
                    420:                        return;
                    421: 
                    422:        if ( (self->s.frame >= FRAME_attak109) && (self->s.frame <= FRAME_attak114) )
                    423:                if (random() <= 0.00005)
                    424:                        return;
                    425: 
                    426: 
                    427:        if ( (self->s.frame >= FRAME_attak201) && (self->s.frame <= FRAME_attak208) )
                    428:                if (random() <= 0.005)
                    429:                        return;
                    430: 
                    431: 
                    432:        self->pain_debounce_time = level.time + 3;
                    433:        if (skill->value == 3)
                    434:                return;         // no pain anims in nightmare
                    435: 
                    436:        if (damage <= 50)
                    437:        {
                    438:                gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM,0);
                    439:                self->monsterinfo.currentmove = &jorg_move_pain1;
                    440:        }
                    441:        else if (damage <= 100)
                    442:        {
                    443:                gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM,0);
                    444:                self->monsterinfo.currentmove = &jorg_move_pain2;
                    445:        }
                    446:        else
                    447:        {
                    448:                if (random() <= 0.3)
                    449:                {
                    450:                        gi.sound (self, CHAN_VOICE, sound_pain3, 1, ATTN_NORM,0);
                    451:                        self->monsterinfo.currentmove = &jorg_move_pain3;
                    452:                }
                    453:        }
                    454: };
                    455: 
                    456: void jorgBFG (edict_t *self)
                    457: {
                    458:        vec3_t  forward, right;
                    459:        vec3_t  start;
                    460:        vec3_t  dir;
                    461:        vec3_t  vec;
                    462: 
                    463:        AngleVectors (self->s.angles, forward, right, NULL);
                    464:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_JORG_BFG_1], forward, right, start);
                    465: 
                    466:        VectorCopy (self->enemy->s.origin, vec);
                    467:        vec[2] += self->enemy->viewheight;
                    468:        VectorSubtract (vec, start, dir);
                    469:        VectorNormalize (dir);
                    470:        gi.sound (self, CHAN_VOICE, sound_attack2, 1, ATTN_NORM, 0);
                    471:        /*void monster_fire_bfg (edict_t *self, 
                    472:                                                         vec3_t start, 
                    473:                                                         vec3_t aimdir, 
                    474:                                                         int damage, 
                    475:                                                         int speed, 
                    476:                                                         int kick, 
                    477:                                                         float damage_radius, 
                    478:                                                         int flashtype)*/
                    479:        monster_fire_bfg (self, start, dir, 50, 300, 100, 200, MZ2_JORG_BFG_1);
                    480: }      
                    481: 
                    482: void jorg_firebullet_right (edict_t *self)
                    483: {
                    484:        vec3_t  forward, right, target;
                    485:        vec3_t  start;
                    486: 
                    487:        AngleVectors (self->s.angles, forward, right, NULL);
                    488:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_JORG_MACHINEGUN_R1], forward, right, start);
                    489: 
                    490:        VectorMA (self->enemy->s.origin, -0.2, self->enemy->velocity, target);
                    491:        target[2] += self->enemy->viewheight;
                    492:        VectorSubtract (target, start, forward);
                    493:        VectorNormalize (forward);
                    494: 
                    495:        monster_fire_bullet (self, start, forward, 6, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, MZ2_JORG_MACHINEGUN_R1);
                    496: }      
                    497: 
                    498: void jorg_firebullet_left (edict_t *self)
                    499: {
                    500:        vec3_t  forward, right, target;
                    501:        vec3_t  start;
                    502: 
                    503:        AngleVectors (self->s.angles, forward, right, NULL);
                    504:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_JORG_MACHINEGUN_L1], forward, right, start);
                    505: 
                    506:        VectorMA (self->enemy->s.origin, -0.2, self->enemy->velocity, target);
                    507:        target[2] += self->enemy->viewheight;
                    508:        VectorSubtract (target, start, forward);
                    509:        VectorNormalize (forward);
                    510: 
                    511:        monster_fire_bullet (self, start, forward, 6, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, MZ2_JORG_MACHINEGUN_L1);
                    512: }      
                    513: 
                    514: void jorg_firebullet (edict_t *self)
                    515: {
                    516:        jorg_firebullet_left(self);
                    517:        jorg_firebullet_right(self);
                    518: };
                    519: 
                    520: void jorg_attack(edict_t *self)
                    521: {
                    522:        vec3_t  vec;
                    523:        float   range;
                    524:        
                    525:        VectorSubtract (self->enemy->s.origin, self->s.origin, vec);
                    526:        range = VectorLength (vec);
                    527: 
                    528:        if (random() <= 0.75)
                    529:        {
                    530:                gi.sound (self, CHAN_VOICE, sound_attack1, 1, ATTN_NORM,0);
                    531:                self->s.sound = gi.soundindex ("boss3/w_loop.wav");
                    532:                self->monsterinfo.currentmove = &jorg_move_start_attack1;
                    533:        }
                    534:        else
                    535:        {
                    536:                gi.sound (self, CHAN_VOICE, sound_attack2, 1, ATTN_NORM,0);
                    537:                self->monsterinfo.currentmove = &jorg_move_attack2;
                    538:        }
                    539: }
                    540: 
                    541: void jorg_dead (edict_t *self)
                    542: {
                    543: #if 0
                    544:        edict_t *tempent;
                    545:        /*
                    546:        VectorSet (self->mins, -16, -16, -24);
                    547:        VectorSet (self->maxs, 16, 16, -8);
                    548:        */
                    549:        
                    550:        // Jorg is on modelindex2. Do not clear him.
                    551:        VectorSet (self->mins, -60, -60, 0);
                    552:        VectorSet (self->maxs, 60, 60, 72);
                    553:        self->movetype = MOVETYPE_TOSS;
                    554:        self->nextthink = 0;
                    555:        gi.linkentity (self);
                    556: 
                    557:        tempent = G_Spawn();
                    558:        VectorCopy (self->s.origin, tempent->s.origin);
                    559:        VectorCopy (self->s.angles, tempent->s.angles);
                    560:        tempent->killtarget = self->killtarget;
                    561:        tempent->target = self->target;
                    562:        tempent->activator = self->enemy;
                    563:        self->killtarget = 0;
                    564:        self->target = 0;
                    565:        SP_monster_makron (tempent);
                    566: #endif
                    567: }
                    568: 
                    569: 
                    570: void jorg_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
                    571: {
                    572:        gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
                    573:        self->deadflag = DEAD_DEAD;
                    574:        self->takedamage = DAMAGE_NO;
                    575:        self->s.sound = 0;
                    576:        self->count = 0;
                    577:        self->monsterinfo.currentmove = &jorg_move_death;
                    578: }
                    579: 
                    580: qboolean Jorg_CheckAttack (edict_t *self)
                    581: {
                    582:        vec3_t  spot1, spot2;
                    583:        vec3_t  temp;
                    584:        float   chance;
                    585:        trace_t tr;
                    586:        qboolean        enemy_infront;
                    587:        int                     enemy_range;
                    588:        float           enemy_yaw;
                    589: 
                    590:        if (self->enemy->health > 0)
                    591:        {
                    592:        // see if any entities are in the way of the shot
                    593:                VectorCopy (self->s.origin, spot1);
                    594:                spot1[2] += self->viewheight;
                    595:                VectorCopy (self->enemy->s.origin, spot2);
                    596:                spot2[2] += self->enemy->viewheight;
                    597: 
                    598:                tr = gi.trace (spot1, NULL, NULL, spot2, self, CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_SLIME|CONTENTS_LAVA);
                    599: 
                    600:                // do we have a clear shot?
                    601:                if (tr.ent != self->enemy)
                    602:                        return false;
                    603:        }
                    604:        
                    605:        enemy_infront = infront(self, self->enemy);
                    606:        enemy_range = range(self, self->enemy);
                    607:        VectorSubtract (self->enemy->s.origin, self->s.origin, temp);
                    608:        enemy_yaw = vectoyaw(temp);
                    609: 
                    610:        self->ideal_yaw = enemy_yaw;
                    611: 
                    612: 
                    613:        // melee attack
                    614:        if (enemy_range == RANGE_MELEE)
                    615:        {
                    616:                if (self->monsterinfo.melee)
                    617:                        self->monsterinfo.attack_state = AS_MELEE;
                    618:                else
                    619:                        self->monsterinfo.attack_state = AS_MISSILE;
                    620:                return true;
                    621:        }
                    622:        
                    623: // missile attack
                    624:        if (!self->monsterinfo.attack)
                    625:                return false;
                    626:                
                    627:        if (level.time < self->monsterinfo.attack_finished)
                    628:                return false;
                    629:                
                    630:        if (enemy_range == RANGE_FAR)
                    631:                return false;
                    632: 
                    633:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
                    634:        {
                    635:                chance = 0.4;
                    636:        }
                    637:        else if (enemy_range == RANGE_MELEE)
                    638:        {
                    639:                chance = 0.8;
                    640:        }
                    641:        else if (enemy_range == RANGE_NEAR)
                    642:        {
                    643:                chance = 0.4;
                    644:        }
                    645:        else if (enemy_range == RANGE_MID)
                    646:        {
                    647:                chance = 0.2;
                    648:        }
                    649:        else
                    650:        {
                    651:                return false;
                    652:        }
                    653: 
                    654:        if (random () < chance)
                    655:        {
                    656:                self->monsterinfo.attack_state = AS_MISSILE;
                    657:                self->monsterinfo.attack_finished = level.time + 2*random();
                    658:                return true;
                    659:        }
                    660: 
                    661:        if (self->flags & FL_FLY)
                    662:        {
                    663:                if (random() < 0.3)
                    664:                        self->monsterinfo.attack_state = AS_SLIDING;
                    665:                else
                    666:                        self->monsterinfo.attack_state = AS_STRAIGHT;
                    667:        }
                    668: 
                    669:        return false;
                    670: }
                    671: 
                    672: 
                    673: void MakronPrecache (void);
                    674: 
                    675: /*QUAKED monster_jorg (1 .5 0) (-80 -80 0) (90 90 140) Ambush Trigger_Spawn Sight
                    676: */
                    677: void SP_monster_jorg (edict_t *self)
                    678: {
                    679:        if (deathmatch->value)
                    680:        {
                    681:                G_FreeEdict (self);
                    682:                return;
                    683:        }
                    684: 
                    685:        sound_pain1 = gi.soundindex ("boss3/bs3pain1.wav");
                    686:        sound_pain2 = gi.soundindex ("boss3/bs3pain2.wav");
                    687:        sound_pain3 = gi.soundindex ("boss3/bs3pain3.wav");
                    688:        sound_death = gi.soundindex ("boss3/bs3deth1.wav");
                    689:        sound_attack1 = gi.soundindex ("boss3/bs3atck1.wav");
                    690:        sound_attack2 = gi.soundindex ("boss3/bs3atck2.wav");
                    691:        sound_search1 = gi.soundindex ("boss3/bs3srch1.wav");
                    692:        sound_search2 = gi.soundindex ("boss3/bs3srch2.wav");
                    693:        sound_search3 = gi.soundindex ("boss3/bs3srch3.wav");
                    694:        sound_idle = gi.soundindex ("boss3/bs3idle1.wav");
                    695:        sound_step_left = gi.soundindex ("boss3/step1.wav");
                    696:        sound_step_right = gi.soundindex ("boss3/step2.wav");
                    697:        sound_firegun = gi.soundindex ("boss3/xfire.wav");
                    698:        sound_death_hit = gi.soundindex ("boss3/d_hit.wav");
                    699: 
                    700:        MakronPrecache ();
                    701: 
                    702:        self->movetype = MOVETYPE_STEP;
                    703:        self->solid = SOLID_BBOX;
                    704:        self->s.modelindex = gi.modelindex ("models/monsters/boss3/rider/tris.md2");
                    705:        self->s.modelindex2 = gi.modelindex ("models/monsters/boss3/jorg/tris.md2");
                    706:        VectorSet (self->mins, -80, -80, 0);
                    707:        VectorSet (self->maxs, 80, 80, 140);
                    708: 
                    709:        self->health = 3000;
                    710:        self->gib_health = -2000;
                    711:        self->mass = 1000;
                    712: 
                    713:        self->pain = jorg_pain;
                    714:        self->die = jorg_die;
                    715:        self->monsterinfo.stand = jorg_stand;
                    716:        self->monsterinfo.walk = jorg_walk;
                    717:        self->monsterinfo.run = jorg_run;
                    718:        self->monsterinfo.dodge = NULL;
                    719:        self->monsterinfo.attack = jorg_attack;
                    720:        self->monsterinfo.search = jorg_search;
                    721:        self->monsterinfo.melee = NULL;
                    722:        self->monsterinfo.sight = NULL;
                    723:        self->monsterinfo.checkattack = Jorg_CheckAttack;
                    724:        gi.linkentity (self);
                    725:        
                    726:        self->monsterinfo.currentmove = &jorg_move_stand;
                    727:        self->monsterinfo.scale = MODEL_SCALE;
                    728: 
                    729:        walkmonster_start(self);
                    730:        //PMM
                    731:        self->monsterinfo.aiflags |= AI_IGNORE_SHOTS;
                    732:        //pmm
                    733: 
                    734: }

unix.superglobalmegacorp.com

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