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

1.1       root        1: /*
                      2: ==============================================================================
                      3: 
                      4: flyer
                      5: 
                      6: ==============================================================================
                      7: */
                      8: 
                      9: #include "g_local.h"
                     10: #include "m_flyer.h"
                     11: 
                     12: qboolean visible (edict_t *self, edict_t *other);
                     13: 
                     14: static int     nextmove;                       // Used for start/stop frames
                     15: 
                     16: static int     sound_sight;
                     17: static int     sound_idle;
                     18: static int     sound_pain1;
                     19: static int     sound_pain2;
                     20: static int     sound_slash;
                     21: static int     sound_sproing;
                     22: static int     sound_die;
                     23: 
                     24: 
                     25: void flyer_check_melee(edict_t *self);
                     26: void flyer_loop_melee (edict_t *self);
                     27: void flyer_melee (edict_t *self);
                     28: void flyer_setstart (edict_t *self);
                     29: void flyer_stand (edict_t *self);
                     30: void flyer_nextmove (edict_t *self);
                     31: 
                     32: // ROGUE - kamikaze stuff
                     33: void flyer_kamikaze (edict_t *self);
                     34: void flyer_kamikaze_check (edict_t *self);
                     35: void flyer_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
                     36: 
                     37: void showme1 (edict_t *self)
                     38: {
                     39:        if (!self->dmg)
                     40:        {
                     41:                gi.dprintf ("straight - %d\n", self->monsterinfo.lefty);
                     42:                self->dmg = 1;
                     43:        }
                     44: }
                     45: 
                     46: void showme2 (edict_t *self)
                     47: {
                     48:        if (!self->dmg)
                     49:        {
                     50:                gi.dprintf ("strafe - %d\n", self->monsterinfo.lefty);
                     51:                self->dmg = 1;
                     52:        }
                     53: }
                     54: 
                     55: 
                     56: void flyer_sight (edict_t *self, edict_t *other)
                     57: {
                     58:        gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
                     59: }
                     60: 
                     61: void flyer_idle (edict_t *self)
                     62: {
                     63:        gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0);
                     64: }
                     65: 
                     66: void flyer_pop_blades (edict_t *self)
                     67: {
                     68:        gi.sound (self, CHAN_VOICE, sound_sproing, 1, ATTN_NORM, 0);
                     69: }
                     70: 
                     71: 
                     72: mframe_t flyer_frames_stand [] =
                     73: {
                     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:        ai_stand, 0, NULL,
                    112:        ai_stand, 0, NULL,
                    113:        ai_stand, 0, NULL,
                    114:        ai_stand, 0, NULL,
                    115:        ai_stand, 0, NULL,
                    116:        ai_stand, 0, NULL,
                    117:        ai_stand, 0, NULL,
                    118:        ai_stand, 0, NULL
                    119: };
                    120: mmove_t        flyer_move_stand = {FRAME_stand01, FRAME_stand45, flyer_frames_stand, NULL};
                    121: 
                    122: 
                    123: mframe_t flyer_frames_walk [] =
                    124: {
                    125:        ai_walk, 5, NULL,
                    126:        ai_walk, 5, NULL,
                    127:        ai_walk, 5, NULL,
                    128:        ai_walk, 5, NULL,
                    129:        ai_walk, 5, NULL,
                    130:        ai_walk, 5, NULL,
                    131:        ai_walk, 5, NULL,
                    132:        ai_walk, 5, NULL,
                    133:        ai_walk, 5, NULL,
                    134:        ai_walk, 5, NULL,
                    135:        ai_walk, 5, NULL,
                    136:        ai_walk, 5, NULL,
                    137:        ai_walk, 5, NULL,
                    138:        ai_walk, 5, NULL,
                    139:        ai_walk, 5, NULL,
                    140:        ai_walk, 5, NULL,
                    141:        ai_walk, 5, NULL,
                    142:        ai_walk, 5, NULL,
                    143:        ai_walk, 5, NULL,
                    144:        ai_walk, 5, NULL,
                    145:        ai_walk, 5, NULL,
                    146:        ai_walk, 5, NULL,
                    147:        ai_walk, 5, NULL,
                    148:        ai_walk, 5, NULL,
                    149:        ai_walk, 5, NULL,
                    150:        ai_walk, 5, NULL,
                    151:        ai_walk, 5, NULL,
                    152:        ai_walk, 5, NULL,
                    153:        ai_walk, 5, NULL,
                    154:        ai_walk, 5, NULL,
                    155:        ai_walk, 5, NULL,
                    156:        ai_walk, 5, NULL,
                    157:        ai_walk, 5, NULL,
                    158:        ai_walk, 5, NULL,
                    159:        ai_walk, 5, NULL,
                    160:        ai_walk, 5, NULL,
                    161:        ai_walk, 5, NULL,
                    162:        ai_walk, 5, NULL,
                    163:        ai_walk, 5, NULL,
                    164:        ai_walk, 5, NULL,
                    165:        ai_walk, 5, NULL,
                    166:        ai_walk, 5, NULL,
                    167:        ai_walk, 5, NULL,
                    168:        ai_walk, 5, NULL,
                    169:        ai_walk, 5, NULL
                    170: };
                    171: mmove_t        flyer_move_walk = {FRAME_stand01, FRAME_stand45, flyer_frames_walk, NULL};
                    172: 
                    173: mframe_t flyer_frames_run [] =
                    174: {
                    175:        ai_run, 10, NULL,
                    176:        ai_run, 10, NULL,
                    177:        ai_run, 10, NULL,
                    178:        ai_run, 10, NULL,
                    179:        ai_run, 10, NULL,
                    180:        ai_run, 10, NULL,
                    181:        ai_run, 10, NULL,
                    182:        ai_run, 10, NULL,
                    183:        ai_run, 10, NULL,
                    184:        ai_run, 10, NULL,
                    185:        ai_run, 10, NULL,
                    186:        ai_run, 10, NULL,
                    187:        ai_run, 10, NULL,
                    188:        ai_run, 10, NULL,
                    189:        ai_run, 10, NULL,
                    190:        ai_run, 10, NULL,
                    191:        ai_run, 10, NULL,
                    192:        ai_run, 10, NULL,
                    193:        ai_run, 10, NULL,
                    194:        ai_run, 10, NULL,
                    195:        ai_run, 10, NULL,
                    196:        ai_run, 10, NULL,
                    197:        ai_run, 10, NULL,
                    198:        ai_run, 10, NULL,
                    199:        ai_run, 10, NULL,
                    200:        ai_run, 10, NULL,
                    201:        ai_run, 10, NULL,
                    202:        ai_run, 10, NULL,
                    203:        ai_run, 10, NULL,
                    204:        ai_run, 10, NULL,
                    205:        ai_run, 10, NULL,
                    206:        ai_run, 10, NULL,
                    207:        ai_run, 10, NULL,
                    208:        ai_run, 10, NULL,
                    209:        ai_run, 10, NULL,
                    210:        ai_run, 10, NULL,
                    211:        ai_run, 10, NULL,
                    212:        ai_run, 10, NULL,
                    213:        ai_run, 10, NULL,
                    214:        ai_run, 10, NULL,
                    215:        ai_run, 10, NULL,
                    216:        ai_run, 10, NULL,
                    217:        ai_run, 10, NULL,
                    218:        ai_run, 10, NULL,
                    219:        ai_run, 10, NULL
                    220: };
                    221: mmove_t        flyer_move_run = {FRAME_stand01, FRAME_stand45, flyer_frames_run, NULL};
                    222: 
                    223: mframe_t flyer_frames_kamizake [] =
                    224: {
                    225:        ai_charge, 40,  flyer_kamikaze_check,
                    226:        ai_charge, 40,  flyer_kamikaze_check,
                    227:        ai_charge, 40,  flyer_kamikaze_check,
                    228:        ai_charge, 40,  flyer_kamikaze_check,
                    229:        ai_charge, 40,  flyer_kamikaze_check
                    230: };
                    231: mmove_t flyer_move_kamikaze = {FRAME_rollr02, FRAME_rollr06, flyer_frames_kamizake, flyer_kamikaze};
                    232: 
                    233: void flyer_run (edict_t *self)
                    234: {
                    235:        if (self->mass > 50)
                    236:                self->monsterinfo.currentmove = &flyer_move_kamikaze;
                    237:        else
                    238:                if (self->monsterinfo.aiflags & AI_STAND_GROUND)
                    239:                        self->monsterinfo.currentmove = &flyer_move_stand;
                    240:                else
                    241:                        self->monsterinfo.currentmove = &flyer_move_run;
                    242: }
                    243: 
                    244: void flyer_walk (edict_t *self)
                    245: {
                    246:        if (self->mass > 50)
                    247:                flyer_run (self);
                    248:        else
                    249:                self->monsterinfo.currentmove = &flyer_move_walk;
                    250: }
                    251: 
                    252: void flyer_stand (edict_t *self)
                    253: {
                    254:        if (self->mass > 50)
                    255:                flyer_run (self);
                    256:        else
                    257:                self->monsterinfo.currentmove = &flyer_move_stand;
                    258: }
                    259: 
                    260: // ROGUE - kamikaze stuff
                    261: 
                    262: void flyer_kamikaze_explode (edict_t *self)
                    263: {
                    264:        vec3_t dir;
                    265: 
                    266:        if (self->monsterinfo.commander && self->monsterinfo.commander->inuse && 
                    267:                !strcmp(self->monsterinfo.commander->classname, "monster_carrier"))
                    268:        {
                    269:                self->monsterinfo.commander->monsterinfo.monster_slots++;
                    270:                if ((g_showlogic) && (g_showlogic->value))
                    271:                        gi.dprintf ("suicide hit!. %d slots left\n", self->monsterinfo.commander->monsterinfo.monster_slots);
                    272:        }
                    273: 
                    274: //     gi.dprintf ("boom!\n");
                    275: //     T_RadiusDamage(self, self->owner, 125, self, self->dmg_radius, MOD_NUKE);
                    276: //     T_RadiusDamage(self, self->owner, 125, self, 150, MOD_NUKE);
                    277:        if (self->enemy)
                    278:        {
                    279:                VectorSubtract (self->enemy->s.origin, self->s.origin, dir);
                    280: //void T_Damage (edict_t *targ, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, 
                    281: //                        vec3_t normal, int damage, int knockback, int dflags, int mod)
                    282:                T_Damage (self->enemy, self, self, dir, self->s.origin, vec3_origin, (int)50, (int)50, DAMAGE_RADIUS, MOD_UNKNOWN);
                    283:        }
                    284: 
                    285:        flyer_die (self, NULL, NULL, 0, dir);
                    286: /*     VectorMA (self->s.origin, -0.02, self->velocity, origin);
                    287:        gi.WriteByte (svc_temp_entity);
                    288:        gi.WriteByte (TE_ROCKET_EXPLOSION);
                    289:        gi.WritePosition (origin);
                    290:        gi.multicast (self->s.origin, MULTICAST_PHS);
                    291: 
                    292:        G_FreeEdict (self);
                    293: */
                    294: }
                    295: 
                    296: void flyer_kamikaze (edict_t *self)
                    297: {
                    298:        self->monsterinfo.currentmove = &flyer_move_kamikaze;
                    299: }
                    300: 
                    301: void flyer_kamikaze_check (edict_t *self)
                    302: {
                    303:        float   dist;
                    304: 
                    305:        // PMM - this needed because we could have gone away before we get here (blocked code)
                    306:        if (!self->inuse)
                    307:                return;
                    308: 
                    309:        if ((!self->enemy) || (!self->enemy->inuse))
                    310:        {
                    311:                flyer_kamikaze_explode (self);
                    312:                return;
                    313:        }
                    314: 
                    315:        self->goalentity = self->enemy;
                    316: 
                    317:        dist = realrange (self, self->enemy);
                    318: 
                    319:        if (dist < 90)
                    320:                flyer_kamikaze_explode (self);
                    321: }
                    322: 
                    323: // rogue - kamikaze
                    324: 
                    325: mframe_t flyer_frames_start [] =
                    326: {
                    327:                ai_move, 0,     NULL,
                    328:                ai_move, 0,     NULL,
                    329:                ai_move, 0,     NULL,
                    330:                ai_move, 0,     NULL,
                    331:                ai_move, 0,     NULL,
                    332:                ai_move, 0,     flyer_nextmove
                    333: };
                    334: mmove_t flyer_move_start = {FRAME_start01, FRAME_start06, flyer_frames_start, NULL};
                    335: 
                    336: mframe_t flyer_frames_stop [] =
                    337: {
                    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,     flyer_nextmove
                    345: };
                    346: mmove_t flyer_move_stop = {FRAME_stop01, FRAME_stop07, flyer_frames_stop, NULL};
                    347: 
                    348: void flyer_stop (edict_t *self)
                    349: {
                    350:                self->monsterinfo.currentmove = &flyer_move_stop;
                    351: }
                    352: 
                    353: void flyer_start (edict_t *self)
                    354: {
                    355:                self->monsterinfo.currentmove = &flyer_move_start;
                    356: }
                    357: 
                    358: 
                    359: mframe_t flyer_frames_rollright [] =
                    360: {
                    361:                ai_move, 0, NULL,
                    362:                ai_move, 0, NULL,
                    363:                ai_move, 0, NULL,
                    364:                ai_move, 0, NULL,
                    365:                ai_move, 0, NULL,
                    366:                ai_move, 0, NULL,
                    367:                ai_move, 0, NULL,
                    368:                ai_move, 0, NULL,
                    369:                ai_move, 0, NULL
                    370: };
                    371: mmove_t flyer_move_rollright = {FRAME_rollr01, FRAME_rollr09, flyer_frames_rollright, NULL};
                    372: 
                    373: mframe_t flyer_frames_rollleft [] =
                    374: {
                    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: };
                    385: mmove_t flyer_move_rollleft = {FRAME_rollf01, FRAME_rollf09, flyer_frames_rollleft, NULL};
                    386: 
                    387: mframe_t flyer_frames_pain3 [] =
                    388: {      
                    389:                ai_move, 0, NULL,
                    390:                ai_move, 0, NULL,
                    391:                ai_move, 0, NULL,
                    392:                ai_move, 0, NULL
                    393: };
                    394: mmove_t flyer_move_pain3 = {FRAME_pain301, FRAME_pain304, flyer_frames_pain3, flyer_run};
                    395: 
                    396: mframe_t flyer_frames_pain2 [] =
                    397: {
                    398:                ai_move, 0, NULL,
                    399:                ai_move, 0, NULL,
                    400:                ai_move, 0, NULL,
                    401:                ai_move, 0, NULL
                    402: };
                    403: mmove_t flyer_move_pain2 = {FRAME_pain201, FRAME_pain204, flyer_frames_pain2, flyer_run};
                    404: 
                    405: mframe_t flyer_frames_pain1 [] =
                    406: {
                    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: };
                    417: mmove_t flyer_move_pain1 = {FRAME_pain101, FRAME_pain109, flyer_frames_pain1, flyer_run};
                    418: 
                    419: mframe_t flyer_frames_defense [] = 
                    420: {
                    421:                ai_move, 0, NULL,
                    422:                ai_move, 0, NULL,
                    423:                ai_move, 0, NULL,               // Hold this frame
                    424:                ai_move, 0, NULL,
                    425:                ai_move, 0, NULL,
                    426:                ai_move, 0, NULL
                    427: };
                    428: mmove_t flyer_move_defense = {FRAME_defens01, FRAME_defens06, flyer_frames_defense, NULL};
                    429: 
                    430: mframe_t flyer_frames_bankright [] =
                    431: {
                    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:                ai_move, 0, NULL,
                    438:                ai_move, 0, NULL
                    439: };
                    440: mmove_t flyer_move_bankright = {FRAME_bankr01, FRAME_bankr07, flyer_frames_bankright, NULL};
                    441: 
                    442: mframe_t flyer_frames_bankleft [] =
                    443: {
                    444:                ai_move, 0, NULL,
                    445:                ai_move, 0, NULL,
                    446:                ai_move, 0, NULL,
                    447:                ai_move, 0, NULL,
                    448:                ai_move, 0, NULL,
                    449:                ai_move, 0, NULL,
                    450:                ai_move, 0, NULL
                    451: };
                    452: mmove_t flyer_move_bankleft = {FRAME_bankl01, FRAME_bankl07, flyer_frames_bankleft, NULL};             
                    453: 
                    454: 
                    455: void flyer_fire (edict_t *self, int flash_number)
                    456: {
                    457:        vec3_t  start;
                    458:        vec3_t  forward, right;
                    459:        vec3_t  end;
                    460:        vec3_t  dir;
                    461:        int             effect;
                    462: 
                    463:        if(!self->enemy || !self->enemy->inuse)         //PGM
                    464:                return;                                                                 //PGM
                    465: 
                    466:        if ((self->s.frame == FRAME_attak204) || (self->s.frame == FRAME_attak207) || (self->s.frame == FRAME_attak210))
                    467:                effect = EF_HYPERBLASTER;
                    468:        else
                    469:                effect = 0;
                    470:        AngleVectors (self->s.angles, forward, right, NULL);
                    471:        G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
                    472:        
                    473:        VectorCopy (self->enemy->s.origin, end);
                    474:        end[2] += self->enemy->viewheight;
                    475:        VectorSubtract (end, start, dir);
                    476: 
                    477:        monster_fire_blaster (self, start, dir, 1, 1000, flash_number, effect);
                    478: }
                    479: 
                    480: void flyer_fireleft (edict_t *self)
                    481: {
                    482:        flyer_fire (self, MZ2_FLYER_BLASTER_1);
                    483: }
                    484: 
                    485: void flyer_fireright (edict_t *self)
                    486: {
                    487:        flyer_fire (self, MZ2_FLYER_BLASTER_2);
                    488: }
                    489: 
                    490: 
                    491: mframe_t flyer_frames_attack2 [] =
                    492: {
                    493:                ai_charge, 0, NULL,
                    494:                ai_charge, 0, NULL,
                    495:                ai_charge, 0, NULL,
                    496:                ai_charge, -10, flyer_fireleft,                 // left gun
                    497:                ai_charge, -10, flyer_fireright,                // right gun
                    498:                ai_charge, -10, flyer_fireleft,                 // left gun
                    499:                ai_charge, -10, flyer_fireright,                // right gun
                    500:                ai_charge, -10, flyer_fireleft,                 // left gun
                    501:                ai_charge, -10, flyer_fireright,                // right gun
                    502:                ai_charge, -10, flyer_fireleft,                 // left gun
                    503:                ai_charge, -10, flyer_fireright,                // right gun
                    504:                ai_charge, 0, NULL,
                    505:                ai_charge, 0, NULL,
                    506:                ai_charge, 0, NULL,
                    507:                ai_charge, 0, NULL,
                    508:                ai_charge, 0, NULL,
                    509:                ai_charge, 0, NULL
                    510: };
                    511: mmove_t flyer_move_attack2 = {FRAME_attak201, FRAME_attak217, flyer_frames_attack2, flyer_run};
                    512: 
                    513: // PMM
                    514: // circle strafe frames
                    515: 
                    516: mframe_t flyer_frames_attack3 [] =
                    517: {
                    518:                ai_charge, 10, NULL,
                    519:                ai_charge, 10, NULL,
                    520:                ai_charge, 10, NULL,
                    521:                ai_charge, 10, flyer_fireleft,                  // left gun
                    522:                ai_charge, 10, flyer_fireright,         // right gun
                    523:                ai_charge, 10, flyer_fireleft,                  // left gun
                    524:                ai_charge, 10, flyer_fireright,         // right gun
                    525:                ai_charge, 10, flyer_fireleft,                  // left gun
                    526:                ai_charge, 10, flyer_fireright,         // right gun
                    527:                ai_charge, 10, flyer_fireleft,                  // left gun
                    528:                ai_charge, 10, flyer_fireright,         // right gun
                    529:                ai_charge, 10, NULL,
                    530:                ai_charge, 10, NULL,
                    531:                ai_charge, 10, NULL,
                    532:                ai_charge, 10, NULL,
                    533:                ai_charge, 10, NULL,
                    534:                ai_charge, 10, NULL
                    535: };
                    536: mmove_t flyer_move_attack3 = {FRAME_attak201, FRAME_attak217, flyer_frames_attack3, flyer_run};
                    537: // pmm
                    538: 
                    539: void flyer_slash_left (edict_t *self)
                    540: {
                    541:        vec3_t  aim;
                    542: 
                    543:        VectorSet (aim, MELEE_DISTANCE, self->mins[0], 0);
                    544:        fire_hit (self, aim, 5, 0);
                    545:        gi.sound (self, CHAN_WEAPON, sound_slash, 1, ATTN_NORM, 0);
                    546: }
                    547: 
                    548: void flyer_slash_right (edict_t *self)
                    549: {
                    550:        vec3_t  aim;
                    551: 
                    552:        VectorSet (aim, MELEE_DISTANCE, self->maxs[0], 0);
                    553:        fire_hit (self, aim, 5, 0);
                    554:        gi.sound (self, CHAN_WEAPON, sound_slash, 1, ATTN_NORM, 0);
                    555: }
                    556: 
                    557: mframe_t flyer_frames_start_melee [] =
                    558: {
                    559:                ai_charge, 0, flyer_pop_blades,
                    560:                ai_charge, 0, NULL,
                    561:                ai_charge, 0, NULL,
                    562:                ai_charge, 0, NULL,
                    563:                ai_charge, 0, NULL,
                    564:                ai_charge, 0, NULL
                    565: };
                    566: mmove_t flyer_move_start_melee = {FRAME_attak101, FRAME_attak106, flyer_frames_start_melee, flyer_loop_melee};
                    567: 
                    568: mframe_t flyer_frames_end_melee [] =
                    569: {
                    570:                ai_charge, 0, NULL,
                    571:                ai_charge, 0, NULL,
                    572:                ai_charge, 0, NULL
                    573: };
                    574: mmove_t flyer_move_end_melee = {FRAME_attak119, FRAME_attak121, flyer_frames_end_melee, flyer_run};
                    575: 
                    576: 
                    577: mframe_t flyer_frames_loop_melee [] =
                    578: {
                    579:                ai_charge, 0, NULL,             // Loop Start
                    580:                ai_charge, 0, NULL,
                    581:                ai_charge, 0, flyer_slash_left,         // Left Wing Strike
                    582:                ai_charge, 0, NULL,
                    583:                ai_charge, 0, NULL,
                    584:                ai_charge, 0, NULL,
                    585:                ai_charge, 0, NULL,
                    586:                ai_charge, 0, flyer_slash_right,        // Right Wing Strike
                    587:                ai_charge, 0, NULL,
                    588:                ai_charge, 0, NULL,
                    589:                ai_charge, 0, NULL,
                    590:                ai_charge, 0, NULL              // Loop Ends
                    591:                
                    592: };
                    593: mmove_t flyer_move_loop_melee = {FRAME_attak107, FRAME_attak118, flyer_frames_loop_melee, flyer_check_melee};
                    594: 
                    595: void flyer_loop_melee (edict_t *self)
                    596: {
                    597: /*     if (random() <= 0.5)    
                    598:                self->monsterinfo.currentmove = &flyer_move_attack1;
                    599:        else */
                    600:        self->monsterinfo.currentmove = &flyer_move_loop_melee;
                    601: }
                    602: 
                    603: 
                    604: 
                    605: void flyer_attack (edict_t *self)
                    606: {
                    607:        float chance;
                    608: /*     if (random() <= 0.5)    
                    609:                self->monsterinfo.currentmove = &flyer_move_attack1;
                    610:        else */
                    611:        // 0% chance of circle in easy
                    612:        // 50% chance in normal
                    613:        // 75% chance in hard
                    614:        // 86.67% chance in nightmare
                    615: 
                    616:        if (self->mass > 50)
                    617:        {
                    618:                flyer_run (self);
                    619:                return;
                    620:        }
                    621: 
                    622:        if (!skill->value)
                    623:                chance = 0;
                    624:        else
                    625:                chance = 1.0 - (0.5/(float)(skill->value));
                    626: 
                    627:        if (random() > chance)
                    628:        {
                    629:                self->monsterinfo.attack_state = AS_STRAIGHT;
                    630:                self->monsterinfo.currentmove = &flyer_move_attack2;
                    631:        }
                    632:        else // circle strafe
                    633:        {
                    634:                if (random () <= 0.5) // switch directions
                    635:                        self->monsterinfo.lefty = 1 - self->monsterinfo.lefty;
                    636:                self->monsterinfo.attack_state = AS_SLIDING;
                    637:                self->monsterinfo.currentmove = &flyer_move_attack3;
                    638:        }
                    639: }
                    640: 
                    641: void flyer_setstart (edict_t *self)
                    642: {
                    643:        nextmove = ACTION_run;
                    644:        self->monsterinfo.currentmove = &flyer_move_start;
                    645: }
                    646: 
                    647: void flyer_nextmove (edict_t *self)
                    648: {
                    649:        if (nextmove == ACTION_attack1)
                    650:                self->monsterinfo.currentmove = &flyer_move_start_melee;
                    651:        else if (nextmove == ACTION_attack2)
                    652:                self->monsterinfo.currentmove = &flyer_move_attack2;
                    653:        else if (nextmove == ACTION_run)
                    654:                self->monsterinfo.currentmove = &flyer_move_run;
                    655: }
                    656: 
                    657: void flyer_melee (edict_t *self)
                    658: {
                    659: //     flyer.nextmove = ACTION_attack1;
                    660: //     self->monsterinfo.currentmove = &flyer_move_stop;
                    661:        if (self->mass > 50)
                    662:                flyer_run (self);
                    663:        else
                    664:                self->monsterinfo.currentmove = &flyer_move_start_melee;
                    665: }
                    666: 
                    667: void flyer_check_melee(edict_t *self)
                    668: {
                    669:        if (range (self, self->enemy) == RANGE_MELEE)
                    670:                if (random() <= 0.8)
                    671:                        self->monsterinfo.currentmove = &flyer_move_loop_melee;
                    672:                else
                    673:                        self->monsterinfo.currentmove = &flyer_move_end_melee;
                    674:        else
                    675:                self->monsterinfo.currentmove = &flyer_move_end_melee;
                    676: }
                    677: 
                    678: void flyer_pain (edict_t *self, edict_t *other, float kick, int damage)
                    679: {
                    680:        int             n;
                    681: 
                    682:        //      pmm      - kamikaze's don't feel pain
                    683:        if (self->mass != 50)
                    684:                return;
                    685:        // pmm
                    686: 
                    687:        if (self->health < (self->max_health / 2))
                    688:                self->s.skinnum = 1;
                    689: 
                    690:        if (level.time < self->pain_debounce_time)
                    691:                return;
                    692: 
                    693:        self->pain_debounce_time = level.time + 3;
                    694:        if (skill->value == 3)
                    695:                return;         // no pain anims in nightmare
                    696: 
                    697:        n = rand() % 3;
                    698:        if (n == 0)
                    699:        {
                    700:                gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
                    701:                self->monsterinfo.currentmove = &flyer_move_pain1;
                    702:        }
                    703:        else if (n == 1)
                    704:        {
                    705:                gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
                    706:                self->monsterinfo.currentmove = &flyer_move_pain2;
                    707:        }
                    708:        else
                    709:        {
                    710:                gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
                    711:                self->monsterinfo.currentmove = &flyer_move_pain3;
                    712:        }
                    713: }
                    714: 
                    715: 
                    716: void flyer_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
                    717: {
                    718:        gi.sound (self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0);
                    719:        BecomeExplosion1(self);
                    720: }
                    721: 
                    722: // PMM - kamikaze code .. blow up if blocked   
                    723: int flyer_blocked (edict_t *self, float dist)
                    724: {
                    725:        vec3_t origin;
                    726: 
                    727:        // kamikaze = 100, normal = 50
                    728:        if (self->mass == 100)
                    729:        {
                    730:                flyer_kamikaze_check(self);
                    731: 
                    732:                // if the above didn't blow us up (i.e. I got blocked by the player)
                    733:                if (self->inuse)
                    734:                {
                    735:                        if (self->monsterinfo.commander && self->monsterinfo.commander->inuse && 
                    736:                                !strcmp(self->monsterinfo.commander->classname, "monster_carrier"))
                    737:                        {
                    738:                                self->monsterinfo.commander->monsterinfo.monster_slots++;
                    739:                                if ((g_showlogic) && (g_showlogic->value))
                    740:                                        gi.dprintf ("suicide blocked, exploding.  %d slots left\n", self->monsterinfo.commander->monsterinfo.monster_slots);
                    741:                        }
                    742: 
                    743:                        VectorMA (self->s.origin, -0.02, self->velocity, origin);
                    744:                        gi.WriteByte (svc_temp_entity);
                    745:                        gi.WriteByte (TE_ROCKET_EXPLOSION);
                    746:                        gi.WritePosition (origin);
                    747:                        gi.multicast (self->s.origin, MULTICAST_PHS);
                    748: 
                    749:                        G_FreeEdict (self);
                    750:                }
                    751:                return true;
                    752:        }
                    753:        // we're a normal flyer
                    754:        if(blocked_checkshot (self, 0.25 + (0.05 * skill->value) ))
                    755:                return true;
                    756: 
                    757:        return false;
                    758: }
                    759: 
                    760: /*QUAKED monster_flyer (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
                    761: */
                    762: void SP_monster_flyer (edict_t *self)
                    763: {
                    764:        if (deathmatch->value)
                    765:        {
                    766:                G_FreeEdict (self);
                    767:                return;
                    768:        }
                    769: 
                    770:        // fix a map bug in jail5.bsp
                    771:        if (!Q_stricmp(level.mapname, "jail5") && (self->s.origin[2] == -104))
                    772:        {
                    773:                self->targetname = self->target;
                    774:                self->target = NULL;
                    775:        }
                    776: 
                    777:        sound_sight = gi.soundindex ("flyer/flysght1.wav");
                    778:        sound_idle = gi.soundindex ("flyer/flysrch1.wav");
                    779:        sound_pain1 = gi.soundindex ("flyer/flypain1.wav");
                    780:        sound_pain2 = gi.soundindex ("flyer/flypain2.wav");
                    781:        sound_slash = gi.soundindex ("flyer/flyatck2.wav");
                    782:        sound_sproing = gi.soundindex ("flyer/flyatck1.wav");
                    783:        sound_die = gi.soundindex ("flyer/flydeth1.wav");
                    784: 
                    785:        gi.soundindex ("flyer/flyatck3.wav");
                    786: 
                    787:        self->s.modelindex = gi.modelindex ("models/monsters/flyer/tris.md2");
                    788:        VectorSet (self->mins, -16, -16, -24);
                    789:        // PMM - shortened to 16 from 32
                    790:        VectorSet (self->maxs, 16, 16, 16);
                    791:        self->movetype = MOVETYPE_STEP;
                    792:        self->solid = SOLID_BBOX;
                    793: 
                    794:        self->s.sound = gi.soundindex ("flyer/flyidle1.wav");
                    795: 
                    796:        self->health = 50;
                    797:        self->mass = 50;
                    798: 
                    799:        self->pain = flyer_pain;
                    800:        self->die = flyer_die;
                    801: 
                    802:        self->monsterinfo.stand = flyer_stand;
                    803:        self->monsterinfo.walk = flyer_walk;
                    804:        self->monsterinfo.run = flyer_run;
                    805:        self->monsterinfo.attack = flyer_attack;
                    806:        self->monsterinfo.melee = flyer_melee;
                    807:        self->monsterinfo.sight = flyer_sight;
                    808:        self->monsterinfo.idle = flyer_idle;
                    809:        self->monsterinfo.blocked = flyer_blocked;
                    810: 
                    811:        gi.linkentity (self);
                    812: 
                    813:        self->monsterinfo.currentmove = &flyer_move_stand;      
                    814:        self->monsterinfo.scale = MODEL_SCALE;
                    815: 
                    816:        flymonster_start (self);
                    817: }
                    818: 
                    819: // PMM - suicide fliers
                    820: void SP_monster_kamikaze (edict_t *self)
                    821: {
                    822:        if (deathmatch->value)
                    823:        {
                    824:                G_FreeEdict (self);
                    825:                return;
                    826:        }
                    827: 
                    828:        sound_sight = gi.soundindex ("flyer/flysght1.wav");
                    829:        sound_idle = gi.soundindex ("flyer/flysrch1.wav");
                    830:        sound_pain1 = gi.soundindex ("flyer/flypain1.wav");
                    831:        sound_pain2 = gi.soundindex ("flyer/flypain2.wav");
                    832:        sound_slash = gi.soundindex ("flyer/flyatck2.wav");
                    833:        sound_sproing = gi.soundindex ("flyer/flyatck1.wav");
                    834:        sound_die = gi.soundindex ("flyer/flydeth1.wav");
                    835: 
                    836:        gi.soundindex ("flyer/flyatck3.wav");
                    837: 
                    838:        self->s.modelindex = gi.modelindex ("models/monsters/flyer/tris.md2");
                    839:        VectorSet (self->mins, -16, -16, -24);
                    840:        // used to be 32 tall .. was WAY too big
                    841:        VectorSet (self->maxs, 16, 16, 16);
                    842:        self->movetype = MOVETYPE_STEP;
                    843:        self->solid = SOLID_BBOX;
                    844: 
                    845:        self->s.sound = gi.soundindex ("flyer/flyidle1.wav");
                    846:        
                    847:        self->s.effects |= EF_ROCKET;
                    848: 
                    849:        self->health = 50;
                    850:        // PMM - normal flyer has mass of 50
                    851:        self->mass = 100;
                    852: 
                    853:        self->pain = flyer_pain;
                    854:        self->die = flyer_die;
                    855: 
                    856:        self->monsterinfo.stand = flyer_stand;
                    857:        self->monsterinfo.walk = flyer_walk;
                    858:        self->monsterinfo.run = flyer_run;
                    859:        self->monsterinfo.attack = flyer_attack;
                    860:        self->monsterinfo.melee = flyer_melee;
                    861:        self->monsterinfo.sight = flyer_sight;
                    862:        self->monsterinfo.idle = flyer_idle;
                    863: 
                    864:        self->monsterinfo.blocked = flyer_blocked;
                    865: 
                    866:        gi.linkentity (self);
                    867: 
                    868:        self->monsterinfo.currentmove = &flyer_move_stand;      
                    869:        self->monsterinfo.scale = MODEL_SCALE;
                    870: 
                    871:        flymonster_start (self);
                    872: }

unix.superglobalmegacorp.com

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