Annotation of quake2/rogue/m_hover.c, revision 1.1

1.1     ! root        1: /*
        !             2: ==============================================================================
        !             3: 
        !             4: hover
        !             5: 
        !             6: ==============================================================================
        !             7: */
        !             8: 
        !             9: #include "g_local.h"
        !            10: #include "m_hover.h"
        !            11: 
        !            12: qboolean visible (edict_t *self, edict_t *other);
        !            13: 
        !            14: 
        !            15: static int     sound_pain1;
        !            16: static int     sound_pain2;
        !            17: static int     sound_death1;
        !            18: static int     sound_death2;
        !            19: static int     sound_sight;
        !            20: static int     sound_search1;
        !            21: static int     sound_search2;
        !            22: 
        !            23: 
        !            24: void hover_sight (edict_t *self, edict_t *other)
        !            25: {
        !            26:        gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
        !            27: }
        !            28: 
        !            29: void hover_search (edict_t *self)
        !            30: {
        !            31:        if (random() < 0.5)
        !            32:                gi.sound (self, CHAN_VOICE, sound_search1, 1, ATTN_NORM, 0);
        !            33:        else
        !            34:                gi.sound (self, CHAN_VOICE, sound_search2, 1, ATTN_NORM, 0);
        !            35: }
        !            36: 
        !            37: 
        !            38: void hover_run (edict_t *self);
        !            39: void hover_stand (edict_t *self);
        !            40: void hover_dead (edict_t *self);
        !            41: void hover_attack (edict_t *self);
        !            42: void hover_reattack (edict_t *self);
        !            43: void hover_fire_blaster (edict_t *self);
        !            44: void hover_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
        !            45: 
        !            46: mframe_t hover_frames_stand [] =
        !            47: {
        !            48:        ai_stand, 0, NULL,
        !            49:        ai_stand, 0, NULL,
        !            50:        ai_stand, 0, NULL,
        !            51:        ai_stand, 0, NULL,
        !            52:        ai_stand, 0, NULL,
        !            53:        ai_stand, 0, NULL,
        !            54:        ai_stand, 0, NULL,
        !            55:        ai_stand, 0, NULL,
        !            56:        ai_stand, 0, NULL,
        !            57:        ai_stand, 0, NULL,
        !            58:        ai_stand, 0, NULL,
        !            59:        ai_stand, 0, NULL,
        !            60:        ai_stand, 0, NULL,
        !            61:        ai_stand, 0, NULL,
        !            62:        ai_stand, 0, NULL,
        !            63:        ai_stand, 0, NULL,
        !            64:        ai_stand, 0, NULL,
        !            65:        ai_stand, 0, NULL,
        !            66:        ai_stand, 0, NULL,
        !            67:        ai_stand, 0, NULL,
        !            68:        ai_stand, 0, NULL,
        !            69:        ai_stand, 0, NULL,
        !            70:        ai_stand, 0, NULL,
        !            71:        ai_stand, 0, NULL,
        !            72:        ai_stand, 0, NULL,
        !            73:        ai_stand, 0, NULL,
        !            74:        ai_stand, 0, NULL,
        !            75:        ai_stand, 0, NULL,
        !            76:        ai_stand, 0, NULL,
        !            77:        ai_stand, 0, NULL
        !            78: };
        !            79: mmove_t        hover_move_stand = {FRAME_stand01, FRAME_stand30, hover_frames_stand, NULL};
        !            80: /*
        !            81: mframe_t hover_frames_stop1 [] =
        !            82: {
        !            83:        ai_move,        0,      NULL,
        !            84:        ai_move,        0,      NULL,
        !            85:        ai_move,        0,      NULL,
        !            86:        ai_move,        0,      NULL,
        !            87:        ai_move,        0,      NULL,
        !            88:        ai_move,        0,      NULL,
        !            89:        ai_move,        0,      NULL,
        !            90:        ai_move,        0,      NULL,
        !            91:        ai_move,        0,      NULL
        !            92: };
        !            93: mmove_t hover_move_stop1 = {FRAME_stop101, FRAME_stop109, hover_frames_stop1, NULL};
        !            94: 
        !            95: mframe_t hover_frames_stop2 [] =
        !            96: {
        !            97:        ai_move,        0,      NULL,
        !            98:        ai_move,        0,      NULL,
        !            99:        ai_move,        0,      NULL,
        !           100:        ai_move,        0,      NULL,
        !           101:        ai_move,        0,      NULL,
        !           102:        ai_move,        0,      NULL,
        !           103:        ai_move,        0,      NULL,
        !           104:        ai_move,        0,      NULL
        !           105: };
        !           106: mmove_t hover_move_stop2 = {FRAME_stop201, FRAME_stop208, hover_frames_stop2, NULL};
        !           107: */
        !           108: /*
        !           109: mframe_t hover_frames_takeoff [] =
        !           110: {
        !           111:        ai_move,        0,      NULL,
        !           112:        ai_move,        -2,     NULL,
        !           113:        ai_move,        5,      NULL,
        !           114:        ai_move,        -1,     NULL,
        !           115:        ai_move,        1,      NULL,
        !           116:        ai_move,        0,      NULL,
        !           117:        ai_move,        0,      NULL,
        !           118:        ai_move,        -1,     NULL,
        !           119:        ai_move,        -1,     NULL,
        !           120:        ai_move,        -1,     NULL,
        !           121:        ai_move,        0,      NULL,
        !           122:        ai_move,        2,      NULL,
        !           123:        ai_move,        2,      NULL,
        !           124:        ai_move,        1,      NULL,
        !           125:        ai_move,        1,      NULL,
        !           126:        ai_move,        -6,     NULL,
        !           127:        ai_move,        -9,     NULL,
        !           128:        ai_move,        1,      NULL,
        !           129:        ai_move,        0,      NULL,
        !           130:        ai_move,        2,      NULL,
        !           131:        ai_move,        2,      NULL,
        !           132:        ai_move,        1,      NULL,
        !           133:        ai_move,        1,      NULL,
        !           134:        ai_move,        1,      NULL,
        !           135:        ai_move,        2,      NULL,
        !           136:        ai_move,        0,      NULL,
        !           137:        ai_move,        2,      NULL,
        !           138:        ai_move,        3,      NULL,
        !           139:        ai_move,        2,      NULL,
        !           140:        ai_move,        0,      NULL
        !           141: };
        !           142: mmove_t hover_move_takeoff = {FRAME_takeof01, FRAME_takeof30, hover_frames_takeoff, NULL};
        !           143: */
        !           144: mframe_t hover_frames_pain3 [] =
        !           145: {
        !           146:        ai_move,        0,      NULL,
        !           147:        ai_move,        0,      NULL,
        !           148:        ai_move,        0,      NULL,
        !           149:        ai_move,        0,      NULL,
        !           150:        ai_move,        0,      NULL,
        !           151:        ai_move,        0,      NULL,
        !           152:        ai_move,        0,      NULL,
        !           153:        ai_move,        0,      NULL,
        !           154:        ai_move,        0,      NULL
        !           155: };
        !           156: mmove_t hover_move_pain3 = {FRAME_pain301, FRAME_pain309, hover_frames_pain3, hover_run};
        !           157: 
        !           158: mframe_t hover_frames_pain2 [] =
        !           159: {
        !           160:        ai_move,        0,      NULL,
        !           161:        ai_move,        0,      NULL,
        !           162:        ai_move,        0,      NULL,
        !           163:        ai_move,        0,      NULL,
        !           164:        ai_move,        0,      NULL,
        !           165:        ai_move,        0,      NULL,
        !           166:        ai_move,        0,      NULL,
        !           167:        ai_move,        0,      NULL,
        !           168:        ai_move,        0,      NULL,
        !           169:        ai_move,        0,      NULL,
        !           170:        ai_move,        0,      NULL,
        !           171:        ai_move,        0,      NULL
        !           172: };
        !           173: mmove_t hover_move_pain2 = {FRAME_pain201, FRAME_pain212, hover_frames_pain2, hover_run};
        !           174: 
        !           175: mframe_t hover_frames_pain1 [] =
        !           176: {
        !           177:        ai_move,        0,      NULL,
        !           178:        ai_move,        0,      NULL,
        !           179:        ai_move,        2,      NULL,
        !           180:        ai_move,        -8,     NULL,
        !           181:        ai_move,        -4,     NULL,
        !           182:        ai_move,        -6,     NULL,
        !           183:        ai_move,        -4,     NULL,
        !           184:        ai_move,        -3,     NULL,
        !           185:        ai_move,        1,      NULL,
        !           186:        ai_move,        0,      NULL,
        !           187:        ai_move,        0,      NULL,
        !           188:        ai_move,        0,      NULL,
        !           189:        ai_move,        3,      NULL,
        !           190:        ai_move,        1,      NULL,
        !           191:        ai_move,        0,      NULL,
        !           192:        ai_move,        2,      NULL,
        !           193:        ai_move,        3,      NULL,
        !           194:        ai_move,        2,      NULL,
        !           195:        ai_move,        7,      NULL,
        !           196:        ai_move,        1,      NULL,
        !           197:        ai_move,        0,      NULL,
        !           198:        ai_move,        0,      NULL,
        !           199:        ai_move,        2,      NULL,
        !           200:        ai_move,        0,      NULL,
        !           201:        ai_move,        0,      NULL,
        !           202:        ai_move,        5,      NULL,
        !           203:        ai_move,        3,      NULL,
        !           204:        ai_move,        4,      NULL
        !           205: };
        !           206: mmove_t hover_move_pain1 = {FRAME_pain101, FRAME_pain128, hover_frames_pain1, hover_run};
        !           207: 
        !           208: /*
        !           209: mframe_t hover_frames_land [] =
        !           210: {
        !           211:        ai_move,        0,      NULL
        !           212: };
        !           213: mmove_t hover_move_land = {FRAME_land01, FRAME_land01, hover_frames_land, NULL};
        !           214: */
        !           215: /*
        !           216: mframe_t hover_frames_forward [] =
        !           217: {
        !           218:        ai_move,        0,      NULL,
        !           219:        ai_move,        0,      NULL,
        !           220:        ai_move,        0,      NULL,
        !           221:        ai_move,        0,      NULL,
        !           222:        ai_move,        0,      NULL,
        !           223:        ai_move,        0,      NULL,
        !           224:        ai_move,        0,      NULL,
        !           225:        ai_move,        0,      NULL,
        !           226:        ai_move,        0,      NULL,
        !           227:        ai_move,        0,      NULL,
        !           228:        ai_move,        0,      NULL,
        !           229:        ai_move,        0,      NULL,
        !           230:        ai_move,        0,      NULL,
        !           231:        ai_move,        0,      NULL,
        !           232:        ai_move,        0,      NULL,
        !           233:        ai_move,        0,      NULL,
        !           234:        ai_move,        0,      NULL,
        !           235:        ai_move,        0,      NULL,
        !           236:        ai_move,        0,      NULL,
        !           237:        ai_move,        0,      NULL,
        !           238:        ai_move,        0,      NULL,
        !           239:        ai_move,        0,      NULL,
        !           240:        ai_move,        0,      NULL,
        !           241:        ai_move,        0,      NULL,
        !           242:        ai_move,        0,      NULL,
        !           243:        ai_move,        0,      NULL,
        !           244:        ai_move,        0,      NULL,
        !           245:        ai_move,        0,      NULL,
        !           246:        ai_move,        0,      NULL,
        !           247:        ai_move,        0,      NULL,
        !           248:        ai_move,        0,      NULL,
        !           249:        ai_move,        0,      NULL,
        !           250:        ai_move,        0,      NULL,
        !           251:        ai_move,        0,      NULL,
        !           252:        ai_move,        0,      NULL
        !           253: };
        !           254: mmove_t hover_move_forward = {FRAME_forwrd01, FRAME_forwrd35, hover_frames_forward, NULL};
        !           255: */
        !           256: mframe_t hover_frames_walk [] =
        !           257: {
        !           258:        ai_walk,        4,      NULL,
        !           259:        ai_walk,        4,      NULL,
        !           260:        ai_walk,        4,      NULL,
        !           261:        ai_walk,        4,      NULL,
        !           262:        ai_walk,        4,      NULL,
        !           263:        ai_walk,        4,      NULL,
        !           264:        ai_walk,        4,      NULL,
        !           265:        ai_walk,        4,      NULL,
        !           266:        ai_walk,        4,      NULL,
        !           267:        ai_walk,        4,      NULL,
        !           268:        ai_walk,        4,      NULL,
        !           269:        ai_walk,        4,      NULL,
        !           270:        ai_walk,        4,      NULL,
        !           271:        ai_walk,        4,      NULL,
        !           272:        ai_walk,        4,      NULL,
        !           273:        ai_walk,        4,      NULL,
        !           274:        ai_walk,        4,      NULL,
        !           275:        ai_walk,        4,      NULL,
        !           276:        ai_walk,        4,      NULL,
        !           277:        ai_walk,        4,      NULL,
        !           278:        ai_walk,        4,      NULL,
        !           279:        ai_walk,        4,      NULL,
        !           280:        ai_walk,        4,      NULL,
        !           281:        ai_walk,        4,      NULL,
        !           282:        ai_walk,        4,      NULL,
        !           283:        ai_walk,        4,      NULL,
        !           284:        ai_walk,        4,      NULL,
        !           285:        ai_walk,        4,      NULL,
        !           286:        ai_walk,        4,      NULL,
        !           287:        ai_walk,        4,      NULL,
        !           288:        ai_walk,        4,      NULL,
        !           289:        ai_walk,        4,      NULL,
        !           290:        ai_walk,        4,      NULL,
        !           291:        ai_walk,        4,      NULL,
        !           292:        ai_walk,        4,      NULL
        !           293: };
        !           294: mmove_t hover_move_walk = {FRAME_forwrd01, FRAME_forwrd35, hover_frames_walk, NULL};
        !           295: 
        !           296: mframe_t hover_frames_run [] =
        !           297: {
        !           298:        ai_run, 10,     NULL,
        !           299:        ai_run, 10,     NULL,
        !           300:        ai_run, 10,     NULL,
        !           301:        ai_run, 10,     NULL,
        !           302:        ai_run, 10,     NULL,
        !           303:        ai_run, 10,     NULL,
        !           304:        ai_run, 10,     NULL,
        !           305:        ai_run, 10,     NULL,
        !           306:        ai_run, 10,     NULL,
        !           307:        ai_run, 10,     NULL,
        !           308:        ai_run, 10,     NULL,
        !           309:        ai_run, 10,     NULL,
        !           310:        ai_run, 10,     NULL,
        !           311:        ai_run, 10,     NULL,
        !           312:        ai_run, 10,     NULL,
        !           313:        ai_run, 10,     NULL,
        !           314:        ai_run, 10,     NULL,
        !           315:        ai_run, 10,     NULL,
        !           316:        ai_run, 10,     NULL,
        !           317:        ai_run, 10,     NULL,
        !           318:        ai_run, 10,     NULL,
        !           319:        ai_run, 10,     NULL,
        !           320:        ai_run, 10,     NULL,
        !           321:        ai_run, 10,     NULL,
        !           322:        ai_run, 10,     NULL,
        !           323:        ai_run, 10,     NULL,
        !           324:        ai_run, 10,     NULL,
        !           325:        ai_run, 10,     NULL,
        !           326:        ai_run, 10,     NULL,
        !           327:        ai_run, 10,     NULL,
        !           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: };
        !           334: mmove_t hover_move_run = {FRAME_forwrd01, FRAME_forwrd35, hover_frames_run, NULL};
        !           335: 
        !           336: mframe_t hover_frames_death1 [] =
        !           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,        -10,NULL,
        !           345:        ai_move,        3,      NULL,
        !           346:        ai_move,        5,      NULL,
        !           347:        ai_move,        4,      NULL,
        !           348:        ai_move,        7,      NULL
        !           349: };
        !           350: mmove_t hover_move_death1 = {FRAME_death101, FRAME_death111, hover_frames_death1, hover_dead};
        !           351: /*
        !           352: mframe_t hover_frames_backward [] =
        !           353: {
        !           354:        ai_move,        0,      NULL,
        !           355:        ai_move,        0,      NULL,
        !           356:        ai_move,        0,      NULL,
        !           357:        ai_move,        0,      NULL,
        !           358:        ai_move,        0,      NULL,
        !           359:        ai_move,        0,      NULL,
        !           360:        ai_move,        0,      NULL,
        !           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:        ai_move,        0,      NULL,
        !           371:        ai_move,        0,      NULL,
        !           372:        ai_move,        0,      NULL,
        !           373:        ai_move,        0,      NULL,
        !           374:        ai_move,        0,      NULL,
        !           375:        ai_move,        0,      NULL,
        !           376:        ai_move,        0,      NULL,
        !           377:        ai_move,        0,      NULL
        !           378: };
        !           379: mmove_t hover_move_backward = {FRAME_backwd01, FRAME_backwd24, hover_frames_backward, NULL};
        !           380: */
        !           381: mframe_t hover_frames_start_attack [] =
        !           382: {
        !           383:        ai_charge,      1,      NULL,
        !           384:        ai_charge,      1,      NULL,
        !           385:        ai_charge,      1,      NULL
        !           386: };
        !           387: mmove_t hover_move_start_attack = {FRAME_attak101, FRAME_attak103, hover_frames_start_attack, hover_attack};
        !           388: 
        !           389: mframe_t hover_frames_attack1 [] =
        !           390: {
        !           391:        ai_charge,      -10,    hover_fire_blaster,
        !           392:        ai_charge,      -10,    hover_fire_blaster,
        !           393:        ai_charge,      0,              hover_reattack,
        !           394: };
        !           395: mmove_t hover_move_attack1 = {FRAME_attak104, FRAME_attak106, hover_frames_attack1, NULL};
        !           396: 
        !           397: 
        !           398: mframe_t hover_frames_end_attack [] =
        !           399: {
        !           400:        ai_charge,      1,      NULL,
        !           401:        ai_charge,      1,      NULL
        !           402: };
        !           403: mmove_t hover_move_end_attack = {FRAME_attak107, FRAME_attak108, hover_frames_end_attack, hover_run};
        !           404: 
        !           405: /* PMM - circle strafing code */
        !           406: 
        !           407: mframe_t hover_frames_start_attack2 [] =
        !           408: {
        !           409:        ai_charge,      15,     NULL,
        !           410:        ai_charge,      15,     NULL,
        !           411:        ai_charge,      15,     NULL
        !           412: };
        !           413: mmove_t hover_move_start_attack2 = {FRAME_attak101, FRAME_attak103, hover_frames_start_attack2, hover_attack};
        !           414: 
        !           415: mframe_t hover_frames_attack2 [] =
        !           416: {
        !           417:        ai_charge,      10,     hover_fire_blaster,
        !           418:        ai_charge,      10,     hover_fire_blaster,
        !           419:        ai_charge,      10,             hover_reattack,
        !           420: };
        !           421: mmove_t hover_move_attack2 = {FRAME_attak104, FRAME_attak106, hover_frames_attack2, NULL};
        !           422: 
        !           423: 
        !           424: mframe_t hover_frames_end_attack2 [] =
        !           425: {
        !           426:        ai_charge,      15,     NULL,
        !           427:        ai_charge,      15,     NULL
        !           428: };
        !           429: mmove_t hover_move_end_attack2 = {FRAME_attak107, FRAME_attak108, hover_frames_end_attack2, hover_run};
        !           430: 
        !           431: // end of circle strafe
        !           432: 
        !           433: 
        !           434: void hover_reattack (edict_t *self)
        !           435: {
        !           436:        if (self->enemy->health > 0 )
        !           437:                if (visible (self, self->enemy) )
        !           438:                        if (random() <= 0.6)            
        !           439:                        {
        !           440:                                if (self->monsterinfo.attack_state == AS_STRAIGHT)
        !           441:                                {
        !           442:                                        self->monsterinfo.currentmove = &hover_move_attack1;
        !           443:                                        return;
        !           444:                                }
        !           445:                                else if (self->monsterinfo.attack_state == AS_SLIDING)
        !           446:                                {
        !           447:                                        self->monsterinfo.currentmove = &hover_move_attack2;
        !           448:                                        return;
        !           449:                                }
        !           450:                                else
        !           451:                                        gi.dprintf ("hover_reattack: unexpected state %d\n", self->monsterinfo.attack_state);
        !           452:                        }
        !           453:        self->monsterinfo.currentmove = &hover_move_end_attack;
        !           454: }
        !           455: 
        !           456: 
        !           457: void hover_fire_blaster (edict_t *self)
        !           458: {
        !           459:        vec3_t  start;
        !           460:        vec3_t  forward, right;
        !           461:        vec3_t  end;
        !           462:        vec3_t  dir;
        !           463:        int             effect;
        !           464: 
        !           465:        if(!self->enemy || !self->enemy->inuse)         //PGM
        !           466:                return;                                                                 //PGM
        !           467: 
        !           468:        if (self->s.frame == FRAME_attak104)
        !           469:                effect = EF_HYPERBLASTER;
        !           470:        else
        !           471:                effect = 0;
        !           472: 
        !           473:        AngleVectors (self->s.angles, forward, right, NULL);
        !           474:        G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_HOVER_BLASTER_1], forward, right, start);
        !           475: 
        !           476:        VectorCopy (self->enemy->s.origin, end);
        !           477:        end[2] += self->enemy->viewheight;
        !           478:        VectorSubtract (end, start, dir);
        !           479: 
        !           480: //PGM  - daedalus fires blaster2
        !           481:        if(self->mass < 200)
        !           482:                monster_fire_blaster (self, start, dir, 1, 1000, MZ2_HOVER_BLASTER_1, effect);
        !           483:        else
        !           484:                monster_fire_blaster2 (self, start, dir, 1, 1000, MZ2_DAEDALUS_BLASTER, EF_BLASTER);
        !           485:                // fixme - different muzzle flash
        !           486: //PGM
        !           487: }
        !           488: 
        !           489: 
        !           490: void hover_stand (edict_t *self)
        !           491: {
        !           492:                self->monsterinfo.currentmove = &hover_move_stand;
        !           493: }
        !           494: 
        !           495: void hover_run (edict_t *self)
        !           496: {
        !           497:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
        !           498:                self->monsterinfo.currentmove = &hover_move_stand;
        !           499:        else
        !           500:                self->monsterinfo.currentmove = &hover_move_run;
        !           501: }
        !           502: 
        !           503: void hover_walk (edict_t *self)
        !           504: {
        !           505:        self->monsterinfo.currentmove = &hover_move_walk;
        !           506: }
        !           507: 
        !           508: void hover_start_attack (edict_t *self)
        !           509: {
        !           510:        self->monsterinfo.currentmove = &hover_move_start_attack;
        !           511: }
        !           512: 
        !           513: void hover_attack(edict_t *self)
        !           514: {
        !           515:        float chance;
        !           516: /*     if (random() <= 0.5)    
        !           517:                self->monsterinfo.currentmove = &flyer_move_attack1;
        !           518:        else */
        !           519:        // 0% chance of circle in easy
        !           520:        // 50% chance in normal
        !           521:        // 75% chance in hard
        !           522:        // 86.67% chance in nightmare
        !           523:        if (!skill->value)
        !           524:                chance = 0;
        !           525:        else
        !           526:                chance = 1.0 - (0.5/(float)(skill->value));
        !           527: 
        !           528:        if (self->mass > 150)  // the daedalus strafes more
        !           529:                chance += 0.1;
        !           530: 
        !           531:        if (random() > chance)
        !           532:        {
        !           533:                self->monsterinfo.currentmove = &hover_move_attack1;
        !           534:                self->monsterinfo.attack_state = AS_STRAIGHT;
        !           535:        }
        !           536:        else // circle strafe
        !           537:        {
        !           538:                if (random () <= 0.5) // switch directions
        !           539:                        self->monsterinfo.lefty = 1 - self->monsterinfo.lefty;
        !           540:                self->monsterinfo.currentmove = &hover_move_attack2;
        !           541:                self->monsterinfo.attack_state = AS_SLIDING;
        !           542:        }
        !           543: }
        !           544: 
        !           545: 
        !           546: void hover_pain (edict_t *self, edict_t *other, float kick, int damage)
        !           547: {
        !           548:        if (self->health < (self->max_health / 2))
        !           549:                self->s.skinnum |= 1;   // PGM support for skins 2 & 3.
        !           550: 
        !           551:        if (level.time < self->pain_debounce_time)
        !           552:                return;
        !           553: 
        !           554:        self->pain_debounce_time = level.time + 3;
        !           555: 
        !           556:        if (skill->value == 3)
        !           557:                return;         // no pain anims in nightmare
        !           558: 
        !           559:        if (damage <= 25)
        !           560:        {
        !           561:                if (random() < 0.5)
        !           562:                {
        !           563:                        gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
        !           564:                        self->monsterinfo.currentmove = &hover_move_pain3;
        !           565:                }
        !           566:                else
        !           567:                {
        !           568:                        gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
        !           569:                        self->monsterinfo.currentmove = &hover_move_pain2;
        !           570:                }
        !           571:        }
        !           572:        else
        !           573:        {
        !           574: //====
        !           575: //PGM pain sequence is WAY too long
        !           576:                if (random() < (0.45 - (0.1 * skill->value)))
        !           577:                {
        !           578:                        gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
        !           579:                        self->monsterinfo.currentmove = &hover_move_pain1;
        !           580:                }
        !           581:                else
        !           582:                {
        !           583:                        gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
        !           584:                        self->monsterinfo.currentmove = &hover_move_pain2;
        !           585:                }
        !           586: //PGM
        !           587: //====
        !           588:        }
        !           589: }
        !           590: 
        !           591: void hover_deadthink (edict_t *self)
        !           592: {
        !           593:        if (!self->groundentity && level.time < self->timestamp)
        !           594:        {
        !           595:                self->nextthink = level.time + FRAMETIME;
        !           596:                return;
        !           597:        }
        !           598:        BecomeExplosion1(self);
        !           599: }
        !           600: 
        !           601: void hover_dead (edict_t *self)
        !           602: {
        !           603:        VectorSet (self->mins, -16, -16, -24);
        !           604:        VectorSet (self->maxs, 16, 16, -8);
        !           605:        self->movetype = MOVETYPE_TOSS;
        !           606:        self->think = hover_deadthink;
        !           607:        self->nextthink = level.time + FRAMETIME;
        !           608:        self->timestamp = level.time + 15;
        !           609:        gi.linkentity (self);
        !           610: }
        !           611: 
        !           612: void hover_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
        !           613: {
        !           614:        int             n;
        !           615: 
        !           616:        self->s.effects = 0;
        !           617:        self->monsterinfo.power_armor_type = POWER_ARMOR_NONE;
        !           618: 
        !           619: // check for gib
        !           620:        if (self->health <= self->gib_health)
        !           621:        {
        !           622:                gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
        !           623:                for (n= 0; n < 2; n++)
        !           624:                        ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
        !           625:                for (n= 0; n < 2; n++)
        !           626:                        ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
        !           627:                ThrowHead (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
        !           628:                self->deadflag = DEAD_DEAD;
        !           629:                return;
        !           630:        }
        !           631: 
        !           632:        if (self->deadflag == DEAD_DEAD)
        !           633:                return;
        !           634: 
        !           635: // regular death
        !           636:        if (random() < 0.5)
        !           637:                gi.sound (self, CHAN_VOICE, sound_death1, 1, ATTN_NORM, 0);
        !           638:        else
        !           639:                gi.sound (self, CHAN_VOICE, sound_death2, 1, ATTN_NORM, 0);
        !           640:        self->deadflag = DEAD_DEAD;
        !           641:        self->takedamage = DAMAGE_YES;
        !           642:        self->monsterinfo.currentmove = &hover_move_death1;
        !           643: }
        !           644: 
        !           645: //===========
        !           646: //PGM
        !           647: qboolean hover_blocked (edict_t *self, float dist)
        !           648: {
        !           649:        if(blocked_checkshot (self, 0.25 + (0.05 * skill->value) ))
        !           650:                return true;
        !           651: 
        !           652:        return false;
        !           653: }
        !           654: //PGM
        !           655: //===========
        !           656: 
        !           657: /*QUAKED monster_hover (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
        !           658: */
        !           659: /*QUAKED monster_daedalus (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
        !           660: This is the improved icarus monster.
        !           661: */
        !           662: void SP_monster_hover (edict_t *self)
        !           663: {
        !           664:        if (deathmatch->value)
        !           665:        {
        !           666:                G_FreeEdict (self);
        !           667:                return;
        !           668:        }
        !           669: 
        !           670:        sound_pain1 = gi.soundindex ("hover/hovpain1.wav");     
        !           671:        sound_pain2 = gi.soundindex ("hover/hovpain2.wav");     
        !           672:        sound_death1 = gi.soundindex ("hover/hovdeth1.wav");    
        !           673:        sound_death2 = gi.soundindex ("hover/hovdeth2.wav");    
        !           674:        sound_sight = gi.soundindex ("hover/hovsght1.wav");     
        !           675:        sound_search1 = gi.soundindex ("hover/hovsrch1.wav");   
        !           676:        sound_search2 = gi.soundindex ("hover/hovsrch2.wav");   
        !           677: 
        !           678:        gi.soundindex ("hover/hovatck1.wav");   
        !           679: 
        !           680:        self->s.sound = gi.soundindex ("hover/hovidle1.wav");
        !           681: 
        !           682:        self->movetype = MOVETYPE_STEP;
        !           683:        self->solid = SOLID_BBOX;
        !           684:        self->s.modelindex = gi.modelindex("models/monsters/hover/tris.md2");
        !           685:        VectorSet (self->mins, -24, -24, -24);
        !           686:        VectorSet (self->maxs, 24, 24, 32);
        !           687: 
        !           688:        self->health = 240;
        !           689:        self->gib_health = -100;
        !           690:        self->mass = 150;
        !           691: 
        !           692:        self->pain = hover_pain;
        !           693:        self->die = hover_die;
        !           694: 
        !           695:        self->monsterinfo.stand = hover_stand;
        !           696:        self->monsterinfo.walk = hover_walk;
        !           697:        self->monsterinfo.run = hover_run;
        !           698: //     self->monsterinfo.dodge = hover_dodge;
        !           699:        self->monsterinfo.attack = hover_start_attack;
        !           700:        self->monsterinfo.sight = hover_sight;
        !           701:        self->monsterinfo.search = hover_search;
        !           702:        self->monsterinfo.blocked = hover_blocked;              // PGM
        !           703: 
        !           704: //PGM
        !           705:        if (strcmp(self->classname, "monster_daedalus") == 0)
        !           706:        {
        !           707:                self->health = 450;
        !           708:                self->mass = 225;
        !           709:                self->yaw_speed = 25;
        !           710:                self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
        !           711:                self->monsterinfo.power_armor_power = 100;
        !           712:        }
        !           713: //PGM
        !           714: 
        !           715:        gi.linkentity (self);
        !           716: 
        !           717:        self->monsterinfo.currentmove = &hover_move_stand;      
        !           718:        self->monsterinfo.scale = MODEL_SCALE;
        !           719: 
        !           720:        flymonster_start (self);
        !           721: 
        !           722: //PGM
        !           723:        if (strcmp(self->classname, "monster_daedalus") == 0)
        !           724:                self->s.skinnum = 2;
        !           725: //PGM
        !           726: 
        !           727: }

unix.superglobalmegacorp.com

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