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

1.1     ! root        1: /*
        !             2: ==============================================================================
        !             3: 
        !             4: SOLDIER
        !             5: 
        !             6: ==============================================================================
        !             7: */
        !             8: 
        !             9: #include "g_local.h"
        !            10: #include "m_soldier.h"
        !            11: 
        !            12: //ROGUE
        !            13: #define RUN_SHOOT              1
        !            14: #define CHECK_TARGET   1
        !            15: //ROGUE
        !            16: 
        !            17: static int     sound_idle;
        !            18: static int     sound_sight1;
        !            19: static int     sound_sight2;
        !            20: static int     sound_pain_light;
        !            21: static int     sound_pain;
        !            22: static int     sound_pain_ss;
        !            23: static int     sound_death_light;
        !            24: static int     sound_death;
        !            25: static int     sound_death_ss;
        !            26: static int     sound_cock;
        !            27: 
        !            28: void soldier_duck_up (edict_t *self);
        !            29: 
        !            30: void soldier_start_charge (edict_t *self)
        !            31: {
        !            32:        self->monsterinfo.aiflags |= AI_CHARGING;
        !            33: }
        !            34: 
        !            35: void soldier_stop_charge (edict_t *self)
        !            36: {
        !            37:        self->monsterinfo.aiflags &= ~AI_CHARGING;
        !            38: }
        !            39: 
        !            40: void soldier_idle (edict_t *self)
        !            41: {
        !            42:        if (random() > 0.8)
        !            43:                gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0);
        !            44: }
        !            45: 
        !            46: void soldier_cock (edict_t *self)
        !            47: {
        !            48:        if (self->s.frame == FRAME_stand322)
        !            49:                gi.sound (self, CHAN_WEAPON, sound_cock, 1, ATTN_IDLE, 0);
        !            50:        else
        !            51:                gi.sound (self, CHAN_WEAPON, sound_cock, 1, ATTN_NORM, 0);
        !            52: }
        !            53: 
        !            54: 
        !            55: // STAND
        !            56: 
        !            57: void soldier_stand (edict_t *self);
        !            58: 
        !            59: mframe_t soldier_frames_stand1 [] =
        !            60: {
        !            61:        ai_stand, 0, soldier_idle,
        !            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: 
        !            72:        ai_stand, 0, NULL,
        !            73:        ai_stand, 0, NULL,
        !            74:        ai_stand, 0, NULL,
        !            75:        ai_stand, 0, NULL,
        !            76:        ai_stand, 0, NULL,
        !            77:        ai_stand, 0, NULL,
        !            78:        ai_stand, 0, NULL,
        !            79:        ai_stand, 0, NULL,
        !            80:        ai_stand, 0, NULL,
        !            81:        ai_stand, 0, NULL,
        !            82: 
        !            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: };
        !            94: mmove_t soldier_move_stand1 = {FRAME_stand101, FRAME_stand130, soldier_frames_stand1, soldier_stand};
        !            95: 
        !            96: mframe_t soldier_frames_stand3 [] =
        !            97: {
        !            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: 
        !           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:        ai_stand, 0, NULL,
        !           121:        ai_stand, 0, soldier_cock,
        !           122:        ai_stand, 0, NULL,
        !           123:        ai_stand, 0, NULL,
        !           124:        ai_stand, 0, NULL,
        !           125:        ai_stand, 0, NULL,
        !           126:        ai_stand, 0, NULL,
        !           127:        ai_stand, 0, NULL,
        !           128:        ai_stand, 0, NULL,
        !           129:        ai_stand, 0, NULL,
        !           130: 
        !           131:        ai_stand, 0, NULL,
        !           132:        ai_stand, 0, NULL,
        !           133:        ai_stand, 0, NULL,
        !           134:        ai_stand, 0, NULL,
        !           135:        ai_stand, 0, NULL,
        !           136:        ai_stand, 0, NULL,
        !           137:        ai_stand, 0, NULL,
        !           138:        ai_stand, 0, NULL,
        !           139:        ai_stand, 0, NULL
        !           140: };
        !           141: mmove_t soldier_move_stand3 = {FRAME_stand301, FRAME_stand339, soldier_frames_stand3, soldier_stand};
        !           142: 
        !           143: #if 0
        !           144: mframe_t soldier_frames_stand4 [] =
        !           145: {
        !           146:        ai_stand, 0, NULL,
        !           147:        ai_stand, 0, NULL,
        !           148:        ai_stand, 0, NULL,
        !           149:        ai_stand, 0, NULL,
        !           150:        ai_stand, 0, NULL,
        !           151:        ai_stand, 0, NULL,
        !           152:        ai_stand, 0, NULL,
        !           153:        ai_stand, 0, NULL,
        !           154:        ai_stand, 0, NULL,
        !           155:        ai_stand, 0, NULL,
        !           156: 
        !           157:        ai_stand, 0, NULL,
        !           158:        ai_stand, 0, NULL,
        !           159:        ai_stand, 0, NULL,
        !           160:        ai_stand, 0, NULL,
        !           161:        ai_stand, 0, NULL,
        !           162:        ai_stand, 0, NULL,
        !           163:        ai_stand, 0, NULL,
        !           164:        ai_stand, 0, NULL,
        !           165:        ai_stand, 0, NULL,
        !           166:        ai_stand, 0, NULL,
        !           167: 
        !           168:        ai_stand, 0, NULL,
        !           169:        ai_stand, 0, NULL,
        !           170:        ai_stand, 0, NULL,
        !           171:        ai_stand, 0, NULL,
        !           172:        ai_stand, 0, NULL,
        !           173:        ai_stand, 0, NULL,
        !           174:        ai_stand, 0, NULL,
        !           175:        ai_stand, 0, NULL,
        !           176:        ai_stand, 0, NULL,
        !           177:        ai_stand, 0, NULL,
        !           178: 
        !           179:        ai_stand, 0, NULL,
        !           180:        ai_stand, 0, NULL,
        !           181:        ai_stand, 0, NULL,
        !           182:        ai_stand, 0, NULL,
        !           183:        ai_stand, 0, NULL,
        !           184:        ai_stand, 0, NULL,
        !           185:        ai_stand, 0, NULL,
        !           186:        ai_stand, 0, NULL,
        !           187:        ai_stand, 0, NULL,
        !           188:        ai_stand, 0, NULL,
        !           189: 
        !           190:        ai_stand, 0, NULL,
        !           191:        ai_stand, 0, NULL,
        !           192:        ai_stand, 0, NULL,
        !           193:        ai_stand, 0, NULL,
        !           194:        ai_stand, 0, NULL,
        !           195:        ai_stand, 0, NULL,
        !           196:        ai_stand, 4, NULL,
        !           197:        ai_stand, 1, NULL,
        !           198:        ai_stand, -1, NULL,
        !           199:        ai_stand, -2, NULL,
        !           200: 
        !           201:        ai_stand, 0, NULL,
        !           202:        ai_stand, 0, NULL
        !           203: };
        !           204: mmove_t soldier_move_stand4 = {FRAME_stand401, FRAME_stand452, soldier_frames_stand4, NULL};
        !           205: #endif
        !           206: 
        !           207: void soldier_stand (edict_t *self)
        !           208: {
        !           209:        if ((self->monsterinfo.currentmove == &soldier_move_stand3) || (random() < 0.8))
        !           210:                self->monsterinfo.currentmove = &soldier_move_stand1;
        !           211:        else
        !           212:                self->monsterinfo.currentmove = &soldier_move_stand3;
        !           213: }
        !           214: 
        !           215: 
        !           216: //
        !           217: // WALK
        !           218: //
        !           219: 
        !           220: void soldier_walk1_random (edict_t *self)
        !           221: {
        !           222:        if (random() > 0.1)
        !           223:                self->monsterinfo.nextframe = FRAME_walk101;
        !           224: }
        !           225: 
        !           226: mframe_t soldier_frames_walk1 [] =
        !           227: {
        !           228:        ai_walk, 3,  NULL,
        !           229:        ai_walk, 6,  NULL,
        !           230:        ai_walk, 2,  NULL,
        !           231:        ai_walk, 2,  NULL,
        !           232:        ai_walk, 2,  NULL,
        !           233:        ai_walk, 1,  NULL,
        !           234:        ai_walk, 6,  NULL,
        !           235:        ai_walk, 5,  NULL,
        !           236:        ai_walk, 3,  NULL,
        !           237:        ai_walk, -1, soldier_walk1_random,
        !           238:        ai_walk, 0,  NULL,
        !           239:        ai_walk, 0,  NULL,
        !           240:        ai_walk, 0,  NULL,
        !           241:        ai_walk, 0,  NULL,
        !           242:        ai_walk, 0,  NULL,
        !           243:        ai_walk, 0,  NULL,
        !           244:        ai_walk, 0,  NULL,
        !           245:        ai_walk, 0,  NULL,
        !           246:        ai_walk, 0,  NULL,
        !           247:        ai_walk, 0,  NULL,
        !           248:        ai_walk, 0,  NULL,
        !           249:        ai_walk, 0,  NULL,
        !           250:        ai_walk, 0,  NULL,
        !           251:        ai_walk, 0,  NULL,
        !           252:        ai_walk, 0,  NULL,
        !           253:        ai_walk, 0,  NULL,
        !           254:        ai_walk, 0,  NULL,
        !           255:        ai_walk, 0,  NULL,
        !           256:        ai_walk, 0,  NULL,
        !           257:        ai_walk, 0,  NULL,
        !           258:        ai_walk, 0,  NULL,
        !           259:        ai_walk, 0,  NULL,
        !           260:        ai_walk, 0,  NULL
        !           261: };
        !           262: mmove_t soldier_move_walk1 = {FRAME_walk101, FRAME_walk133, soldier_frames_walk1, NULL};
        !           263: 
        !           264: mframe_t soldier_frames_walk2 [] =
        !           265: {
        !           266:        ai_walk, 4,  NULL,
        !           267:        ai_walk, 4,  NULL,
        !           268:        ai_walk, 9,  NULL,
        !           269:        ai_walk, 8,  NULL,
        !           270:        ai_walk, 5,  NULL,
        !           271:        ai_walk, 1,  NULL,
        !           272:        ai_walk, 3,  NULL,
        !           273:        ai_walk, 7,  NULL,
        !           274:        ai_walk, 6,  NULL,
        !           275:        ai_walk, 7,  NULL
        !           276: };
        !           277: mmove_t soldier_move_walk2 = {FRAME_walk209, FRAME_walk218, soldier_frames_walk2, NULL};
        !           278: 
        !           279: void soldier_walk (edict_t *self)
        !           280: {
        !           281:        if (random() < 0.5)
        !           282:                self->monsterinfo.currentmove = &soldier_move_walk1;
        !           283:        else
        !           284:                self->monsterinfo.currentmove = &soldier_move_walk2;
        !           285: }
        !           286: 
        !           287: 
        !           288: //
        !           289: // RUN
        !           290: //
        !           291: 
        !           292: void soldier_run (edict_t *self);
        !           293: 
        !           294: mframe_t soldier_frames_start_run [] =
        !           295: {
        !           296:        ai_run, 7,  NULL,
        !           297:        ai_run, 5,  NULL
        !           298: };
        !           299: mmove_t soldier_move_start_run = {FRAME_run01, FRAME_run02, soldier_frames_start_run, soldier_run};
        !           300: 
        !           301: #ifdef RUN_SHOOT
        !           302: void soldier_fire (edict_t *self, int);
        !           303: 
        !           304: void soldier_fire_run (edict_t *self) {
        !           305:        if ((self->s.skinnum <= 1) && (self->enemy) && visible(self, self->enemy)) {
        !           306:                soldier_fire(self, 0);
        !           307:        }
        !           308: }
        !           309: #endif
        !           310: 
        !           311: mframe_t soldier_frames_run [] =
        !           312: {
        !           313:        ai_run, 10, NULL,
        !           314:        ai_run, 11, monster_done_dodge,
        !           315:        ai_run, 11, NULL,
        !           316:        ai_run, 16, NULL,
        !           317:        ai_run, 10, NULL,
        !           318:        ai_run, 15, monster_done_dodge
        !           319: };
        !           320: 
        !           321: mmove_t soldier_move_run = {FRAME_run03, FRAME_run08, soldier_frames_run, NULL};
        !           322: 
        !           323: void soldier_run (edict_t *self)
        !           324: {
        !           325:        monster_done_dodge (self);
        !           326: 
        !           327:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
        !           328:        {
        !           329:                self->monsterinfo.currentmove = &soldier_move_stand1;
        !           330:                return;
        !           331:        }
        !           332: 
        !           333:        if (self->monsterinfo.currentmove == &soldier_move_walk1 ||
        !           334:                self->monsterinfo.currentmove == &soldier_move_walk2 ||
        !           335:                self->monsterinfo.currentmove == &soldier_move_start_run)
        !           336:        {
        !           337:                self->monsterinfo.currentmove = &soldier_move_run;
        !           338:        }
        !           339:        else
        !           340:        {
        !           341:                self->monsterinfo.currentmove = &soldier_move_start_run;
        !           342:        }
        !           343: }
        !           344: 
        !           345: 
        !           346: //
        !           347: // PAIN
        !           348: //
        !           349: 
        !           350: mframe_t soldier_frames_pain1 [] =
        !           351: {
        !           352:        ai_move, -3, NULL,
        !           353:        ai_move, 4,  NULL,
        !           354:        ai_move, 1,  NULL,
        !           355:        ai_move, 1,  NULL,
        !           356:        ai_move, 0,  NULL
        !           357: };
        !           358: mmove_t soldier_move_pain1 = {FRAME_pain101, FRAME_pain105, soldier_frames_pain1, soldier_run};
        !           359: 
        !           360: mframe_t soldier_frames_pain2 [] =
        !           361: {
        !           362:        ai_move, -13, NULL,
        !           363:        ai_move, -1,  NULL,
        !           364:        ai_move, 2,   NULL,
        !           365:        ai_move, 4,   NULL,
        !           366:        ai_move, 2,   NULL,
        !           367:        ai_move, 3,   NULL,
        !           368:        ai_move, 2,   NULL
        !           369: };
        !           370: mmove_t soldier_move_pain2 = {FRAME_pain201, FRAME_pain207, soldier_frames_pain2, soldier_run};
        !           371: 
        !           372: mframe_t soldier_frames_pain3 [] =
        !           373: {
        !           374:        ai_move, -8, NULL,
        !           375:        ai_move, 10, NULL,
        !           376:        ai_move, -4, NULL,
        !           377:        ai_move, -1, NULL,
        !           378:        ai_move, -3, NULL,
        !           379:        ai_move, 0,  NULL,
        !           380:        ai_move, 3,  NULL,
        !           381:        ai_move, 0,  NULL,
        !           382:        ai_move, 0,  NULL,
        !           383:        ai_move, 0,  NULL,
        !           384:        ai_move, 0,  NULL,
        !           385:        ai_move, 1,  NULL,
        !           386:        ai_move, 0,  NULL,
        !           387:        ai_move, 1,  NULL,
        !           388:        ai_move, 2,  NULL,
        !           389:        ai_move, 4,  NULL,
        !           390:        ai_move, 3,  NULL,
        !           391:        ai_move, 2,  NULL
        !           392: };
        !           393: mmove_t soldier_move_pain3 = {FRAME_pain301, FRAME_pain318, soldier_frames_pain3, soldier_run};
        !           394: 
        !           395: mframe_t soldier_frames_pain4 [] =
        !           396: {
        !           397:        ai_move, 0,   NULL,
        !           398:        ai_move, 0,   NULL,
        !           399:        ai_move, 0,   NULL,
        !           400:        ai_move, -10, NULL,
        !           401:        ai_move, -6,  NULL,
        !           402:        ai_move, 8,   NULL,
        !           403:        ai_move, 4,   NULL,
        !           404:        ai_move, 1,   NULL,
        !           405:        ai_move, 0,   NULL,
        !           406:        ai_move, 2,   NULL,
        !           407:        ai_move, 5,   NULL,
        !           408:        ai_move, 2,   NULL,
        !           409:        ai_move, -1,  NULL,
        !           410:        ai_move, -1,  NULL,
        !           411:        ai_move, 3,   NULL,
        !           412:        ai_move, 2,   NULL,
        !           413:        ai_move, 0,   NULL
        !           414: };
        !           415: mmove_t soldier_move_pain4 = {FRAME_pain401, FRAME_pain417, soldier_frames_pain4, soldier_run};
        !           416: 
        !           417: 
        !           418: void soldier_pain (edict_t *self, edict_t *other, float kick, int damage)
        !           419: {
        !           420:        float   r;
        !           421:        int             n;
        !           422: 
        !           423:        if (self->health < (self->max_health / 2))
        !           424:                        self->s.skinnum |= 1;
        !           425: 
        !           426:        monster_done_dodge (self);
        !           427:        soldier_stop_charge(self);
        !           428: 
        !           429:        // if we're blind firing, this needs to be turned off here
        !           430:        self->monsterinfo.aiflags &= ~AI_MANUAL_STEERING;
        !           431: 
        !           432:        if (level.time < self->pain_debounce_time)
        !           433:        {
        !           434:                if ((self->velocity[2] > 100) && ( (self->monsterinfo.currentmove == &soldier_move_pain1) || (self->monsterinfo.currentmove == &soldier_move_pain2) || (self->monsterinfo.currentmove == &soldier_move_pain3)))
        !           435:                {
        !           436:                        // PMM - clear duck flag
        !           437:                        if (self->monsterinfo.aiflags & AI_DUCKED)
        !           438:                                monster_duck_up(self);
        !           439:                        self->monsterinfo.currentmove = &soldier_move_pain4;
        !           440:                }
        !           441:                return;
        !           442:        }
        !           443: 
        !           444:        self->pain_debounce_time = level.time + 3;
        !           445: 
        !           446:        n = self->s.skinnum | 1;
        !           447:        if (n == 1)
        !           448:                gi.sound (self, CHAN_VOICE, sound_pain_light, 1, ATTN_NORM, 0);
        !           449:        else if (n == 3)
        !           450:                gi.sound (self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0);
        !           451:        else
        !           452:                gi.sound (self, CHAN_VOICE, sound_pain_ss, 1, ATTN_NORM, 0);
        !           453: 
        !           454:        if (self->velocity[2] > 100)
        !           455:        {
        !           456:                // PMM - clear duck flag
        !           457:                if (self->monsterinfo.aiflags & AI_DUCKED)
        !           458:                        monster_duck_up(self);
        !           459:                self->monsterinfo.currentmove = &soldier_move_pain4;
        !           460:                self->monsterinfo.pausetime = 0;
        !           461:                return;
        !           462:        }
        !           463: 
        !           464:        if (skill->value == 3)
        !           465:                return;         // no pain anims in nightmare
        !           466: 
        !           467:        r = random();
        !           468: 
        !           469:        if (r < 0.33)
        !           470:                self->monsterinfo.currentmove = &soldier_move_pain1;
        !           471:        else if (r < 0.66)
        !           472:                self->monsterinfo.currentmove = &soldier_move_pain2;
        !           473:        else
        !           474:                self->monsterinfo.currentmove = &soldier_move_pain3;
        !           475: 
        !           476:        // PMM - clear duck flag
        !           477:        if (self->monsterinfo.aiflags & AI_DUCKED)
        !           478:                monster_duck_up(self);
        !           479:        self->monsterinfo.pausetime = 0;
        !           480: 
        !           481: }
        !           482: 
        !           483: 
        !           484: //
        !           485: // ATTACK
        !           486: //
        !           487: 
        !           488: static int blaster_flash [] = {MZ2_SOLDIER_BLASTER_1, MZ2_SOLDIER_BLASTER_2, MZ2_SOLDIER_BLASTER_3, MZ2_SOLDIER_BLASTER_4, MZ2_SOLDIER_BLASTER_5, MZ2_SOLDIER_BLASTER_6, MZ2_SOLDIER_BLASTER_7, MZ2_SOLDIER_BLASTER_8};
        !           489: static int shotgun_flash [] = {MZ2_SOLDIER_SHOTGUN_1, MZ2_SOLDIER_SHOTGUN_2, MZ2_SOLDIER_SHOTGUN_3, MZ2_SOLDIER_SHOTGUN_4, MZ2_SOLDIER_SHOTGUN_5, MZ2_SOLDIER_SHOTGUN_6, MZ2_SOLDIER_SHOTGUN_7, MZ2_SOLDIER_SHOTGUN_8};
        !           490: static int machinegun_flash [] = {MZ2_SOLDIER_MACHINEGUN_1, MZ2_SOLDIER_MACHINEGUN_2, MZ2_SOLDIER_MACHINEGUN_3, MZ2_SOLDIER_MACHINEGUN_4, MZ2_SOLDIER_MACHINEGUN_5, MZ2_SOLDIER_MACHINEGUN_6, MZ2_SOLDIER_MACHINEGUN_7, MZ2_SOLDIER_MACHINEGUN_8};
        !           491: 
        !           492: //void soldier_fire (edict_t *self, int flash_number)  PMM
        !           493: void soldier_fire (edict_t *self, int in_flash_number)
        !           494: {
        !           495:        vec3_t  start;
        !           496:        vec3_t  forward, right, up;
        !           497:        vec3_t  aim;
        !           498:        vec3_t  dir;
        !           499:        vec3_t  end;
        !           500:        float   r, u;
        !           501:        int             flash_index;
        !           502:        int             flash_number;
        !           503: #ifdef RUN_SHOOT
        !           504:        vec3_t  aim_norm;
        !           505:        float   angle;
        !           506: #endif
        !           507: #ifdef CHECK_TARGET
        !           508:        trace_t tr;
        !           509:        vec3_t aim_good;
        !           510: #endif
        !           511: 
        !           512:        if ((!self->enemy) || (!self->enemy->inuse))
        !           513:                return;
        !           514: 
        !           515:        if (in_flash_number < 0)
        !           516:        {
        !           517:                flash_number = -1 * in_flash_number;
        !           518:        }
        !           519:        else
        !           520:                flash_number = in_flash_number;
        !           521: 
        !           522:        if (self->s.skinnum < 2)
        !           523:                flash_index = blaster_flash[flash_number];
        !           524:        else if (self->s.skinnum < 4)
        !           525:                flash_index = shotgun_flash[flash_number];
        !           526:        else
        !           527:                flash_index = machinegun_flash[flash_number];
        !           528: 
        !           529:        AngleVectors (self->s.angles, forward, right, NULL);
        !           530:        G_ProjectSource (self->s.origin, monster_flash_offset[flash_index], forward, right, start);
        !           531: 
        !           532:        if (flash_number == 5 || flash_number == 6) // he's dead
        !           533:        {
        !           534:                VectorCopy (forward, aim);
        !           535:        }
        !           536:        else
        !           537:        {
        !           538:                VectorCopy (self->enemy->s.origin, end);
        !           539:                end[2] += self->enemy->viewheight;
        !           540:                VectorSubtract (end, start, aim);
        !           541: #ifdef CHECK_TARGET
        !           542:                VectorCopy (end, aim_good);
        !           543: #endif
        !           544: #ifdef RUN_SHOOT
        !           545:                //PMM
        !           546:                if (in_flash_number < 0)
        !           547:                {
        !           548:                        VectorCopy (aim, aim_norm);
        !           549:                        VectorNormalize (aim_norm);
        !           550:                        angle = DotProduct (aim_norm, forward);
        !           551:                        //gi.dprintf ("Dot Product:  %f", DotProduct (aim_norm, forward));
        !           552:                        if (angle < 0.9)  // ~25 degree angle
        !           553:                        {
        !           554: //                             if(g_showlogic && g_showlogic->value)
        !           555: //                                     gi.dprintf (" not firing due to bad dotprod %f\n", angle);
        !           556:                                return;
        !           557:                        } else {
        !           558: //                             if(g_showlogic && g_showlogic->value)
        !           559: //                                     gi.dprintf (" firing:  dotprod = %f\n", angle);
        !           560:                        }
        !           561:                }
        !           562:                //-PMM
        !           563: #endif
        !           564:                vectoangles (aim, dir);
        !           565:                AngleVectors (dir, forward, right, up);
        !           566:                
        !           567:                if (skill->value < 2)
        !           568:                {
        !           569:                        r = crandom()*1000;
        !           570:                        u = crandom()*500;
        !           571:                }
        !           572:                else
        !           573:                {
        !           574:                        r = crandom()*500;
        !           575:                        u = crandom()*250;
        !           576:                }
        !           577:                VectorMA (start, 8192, forward, end);
        !           578:                VectorMA (end, r, right, end);
        !           579:                VectorMA (end, u, up, end);
        !           580: 
        !           581:                VectorSubtract (end, start, aim);
        !           582:                VectorNormalize (aim);
        !           583:        }
        !           584: #ifdef CHECK_TARGET
        !           585:        if (!(flash_number == 5 || flash_number == 6)) // he's dead
        !           586:        {
        !           587:                tr = gi.trace (start, NULL, NULL, aim_good, self, MASK_SHOT);
        !           588:                if ((tr.ent != self->enemy) && (tr.ent != world)) {
        !           589:                        if(g_showlogic && g_showlogic->value)
        !           590:                                gi.dprintf ("infantry shot aborted due to bad target\n");
        !           591:                        return;
        !           592:                }
        !           593:        }
        !           594: #endif
        !           595:        if (self->s.skinnum <= 1)
        !           596:        {
        !           597:                monster_fire_blaster (self, start, aim, 5, 600, flash_index, EF_BLASTER);
        !           598:        }
        !           599:        else if (self->s.skinnum <= 3)
        !           600:        {
        !           601:                monster_fire_shotgun (self, start, aim, 2, 1, DEFAULT_SHOTGUN_HSPREAD, DEFAULT_SHOTGUN_VSPREAD, DEFAULT_SHOTGUN_COUNT, flash_index);
        !           602:        }
        !           603:        else
        !           604:        {
        !           605:                // PMM - changed to wait from pausetime to not interfere with dodge code
        !           606:                if (!(self->monsterinfo.aiflags & AI_HOLD_FRAME))
        !           607:                        self->wait = level.time + (3 + rand() % 8) * FRAMETIME;
        !           608: 
        !           609:                monster_fire_bullet (self, start, aim, 2, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, flash_index);
        !           610: 
        !           611:                if (level.time >= self->wait)
        !           612:                        self->monsterinfo.aiflags &= ~AI_HOLD_FRAME;
        !           613:                else
        !           614:                        self->monsterinfo.aiflags |= AI_HOLD_FRAME;
        !           615:        }
        !           616: }
        !           617: 
        !           618: // ATTACK1 (blaster/shotgun)
        !           619: 
        !           620: void soldier_fire1 (edict_t *self)
        !           621: {
        !           622:        soldier_fire (self, 0);
        !           623: }
        !           624: 
        !           625: void soldier_attack1_refire1 (edict_t *self)
        !           626: {
        !           627:        // PMM - blindfire
        !           628:        if (self->monsterinfo.aiflags & AI_MANUAL_STEERING)
        !           629:        {
        !           630:                self->monsterinfo.aiflags &= ~AI_MANUAL_STEERING;
        !           631:                return;
        !           632:        }
        !           633:        // pmm
        !           634: 
        !           635:        if (!self->enemy)
        !           636:                return;
        !           637: 
        !           638:        if (self->s.skinnum > 1)
        !           639:                return;
        !           640: 
        !           641:        if (self->enemy->health <= 0)
        !           642:                return;
        !           643: 
        !           644:        if ( ((skill->value == 3) && (random() < 0.5)) || (range(self, self->enemy) == RANGE_MELEE) )
        !           645:                self->monsterinfo.nextframe = FRAME_attak102;
        !           646:        else
        !           647:                self->monsterinfo.nextframe = FRAME_attak110;
        !           648: }
        !           649: 
        !           650: void soldier_attack1_refire2 (edict_t *self)
        !           651: {
        !           652:        if (!self->enemy)
        !           653:                return;
        !           654: 
        !           655:        if (self->s.skinnum < 2)
        !           656:                return;
        !           657: 
        !           658:        if (self->enemy->health <= 0)
        !           659:                return;
        !           660: 
        !           661:        if ( ((skill->value == 3) && (random() < 0.5)) || (range(self, self->enemy) == RANGE_MELEE) )
        !           662:                self->monsterinfo.nextframe = FRAME_attak102;
        !           663: }
        !           664: 
        !           665: mframe_t soldier_frames_attack1 [] =
        !           666: {
        !           667:        ai_charge, 0,  NULL,
        !           668:        ai_charge, 0,  NULL,
        !           669:        ai_charge, 0,  soldier_fire1,
        !           670:        ai_charge, 0,  NULL,
        !           671:        ai_charge, 0,  NULL,
        !           672:        ai_charge, 0,  soldier_attack1_refire1,
        !           673:        ai_charge, 0,  NULL,
        !           674:        ai_charge, 0,  soldier_cock,
        !           675:        ai_charge, 0,  soldier_attack1_refire2,
        !           676:        ai_charge, 0,  NULL,
        !           677:        ai_charge, 0,  NULL,
        !           678:        ai_charge, 0,  NULL
        !           679: };
        !           680: mmove_t soldier_move_attack1 = {FRAME_attak101, FRAME_attak112, soldier_frames_attack1, soldier_run};
        !           681: 
        !           682: // ATTACK2 (blaster/shotgun)
        !           683: 
        !           684: void soldier_fire2 (edict_t *self)
        !           685: {
        !           686:        soldier_fire (self, 1);
        !           687: }
        !           688: 
        !           689: void soldier_attack2_refire1 (edict_t *self)
        !           690: {
        !           691:        if (!self->enemy)
        !           692:                return;
        !           693: 
        !           694:        if (self->s.skinnum > 1)
        !           695:                return;
        !           696: 
        !           697:        if (self->enemy->health <= 0)
        !           698:                return;
        !           699: 
        !           700:        if ( ((skill->value == 3) && (random() < 0.5)) || (range(self, self->enemy) == RANGE_MELEE) )
        !           701:                self->monsterinfo.nextframe = FRAME_attak204;
        !           702:        else
        !           703:                self->monsterinfo.nextframe = FRAME_attak216;
        !           704: }
        !           705: 
        !           706: void soldier_attack2_refire2 (edict_t *self)
        !           707: {
        !           708:        if (!self->enemy)
        !           709:                return;
        !           710: 
        !           711:        if (self->s.skinnum < 2)
        !           712:                return;
        !           713: 
        !           714:        if (self->enemy->health <= 0)
        !           715:                return;
        !           716: 
        !           717:        if ( ((skill->value == 3) && (random() < 0.5)) || (range(self, self->enemy) == RANGE_MELEE) )
        !           718:                self->monsterinfo.nextframe = FRAME_attak204;
        !           719: }
        !           720: 
        !           721: mframe_t soldier_frames_attack2 [] =
        !           722: {
        !           723:        ai_charge, 0, NULL,
        !           724:        ai_charge, 0, NULL,
        !           725:        ai_charge, 0, NULL,
        !           726:        ai_charge, 0, NULL,
        !           727:        ai_charge, 0, soldier_fire2,
        !           728:        ai_charge, 0, NULL,
        !           729:        ai_charge, 0, NULL,
        !           730:        ai_charge, 0, soldier_attack2_refire1,
        !           731:        ai_charge, 0, NULL,
        !           732:        ai_charge, 0, NULL,
        !           733:        ai_charge, 0, NULL,
        !           734:        ai_charge, 0, NULL,
        !           735:        ai_charge, 0, soldier_cock,
        !           736:        ai_charge, 0, NULL,
        !           737:        ai_charge, 0, soldier_attack2_refire2,
        !           738:        ai_charge, 0, NULL,
        !           739:        ai_charge, 0, NULL,
        !           740:        ai_charge, 0, NULL
        !           741: };
        !           742: mmove_t soldier_move_attack2 = {FRAME_attak201, FRAME_attak218, soldier_frames_attack2, soldier_run};
        !           743: 
        !           744: // ATTACK3 (duck and shoot)
        !           745: /*
        !           746: void soldier_duck_down (edict_t *self)
        !           747: {
        !           748:        if ((g_showlogic) && (g_showlogic->value))
        !           749:                gi.dprintf ("duck down - %d!\n", self->s.frame);
        !           750: 
        !           751:        self->monsterinfo.aiflags |= AI_DUCKED;
        !           752: //     self->maxs[2] -= 32;
        !           753:        self->maxs[2] =  self->monsterinfo.base_height - 32;
        !           754:        self->takedamage = DAMAGE_YES;
        !           755:        if (self->monsterinfo.duck_wait_time < level.time)
        !           756:        {
        !           757:                if ((g_showlogic) && (g_showlogic->value))
        !           758:                        gi.dprintf ("soldier duck with no time!\n");
        !           759:                self->monsterinfo.duck_wait_time = level.time + 1;
        !           760:        }
        !           761:        gi.linkentity (self);
        !           762: }
        !           763: 
        !           764: void soldier_duck_up (edict_t *self)
        !           765: {
        !           766:        if ((g_showlogic) && (g_showlogic->value))
        !           767:                gi.dprintf ("duck up - %d!\n", self->s.frame);
        !           768:        self->monsterinfo.aiflags &= ~AI_DUCKED;
        !           769: //     self->maxs[2] += 32;
        !           770:        self->maxs[2] = self->monsterinfo.base_height;
        !           771:        self->takedamage = DAMAGE_AIM;
        !           772:        gi.linkentity (self);
        !           773: }
        !           774: */
        !           775: void soldier_fire3 (edict_t *self)
        !           776: {
        !           777:        monster_duck_down (self);
        !           778:        soldier_fire (self, 2);
        !           779: }
        !           780: 
        !           781: void soldier_attack3_refire (edict_t *self)
        !           782: {
        !           783:        if ((level.time + 0.4) < self->monsterinfo.duck_wait_time)
        !           784:                self->monsterinfo.nextframe = FRAME_attak303;
        !           785: }
        !           786: 
        !           787: mframe_t soldier_frames_attack3 [] =
        !           788: {
        !           789:        ai_charge, 0, NULL,
        !           790:        ai_charge, 0, NULL,
        !           791:        ai_charge, 0, soldier_fire3,
        !           792:        ai_charge, 0, NULL,
        !           793:        ai_charge, 0, NULL,
        !           794:        ai_charge, 0, soldier_attack3_refire,
        !           795:        ai_charge, 0, monster_duck_up,
        !           796:        ai_charge, 0, NULL,
        !           797:        ai_charge, 0, NULL
        !           798: };
        !           799: mmove_t soldier_move_attack3 = {FRAME_attak301, FRAME_attak309, soldier_frames_attack3, soldier_run};
        !           800: 
        !           801: // ATTACK4 (machinegun)
        !           802: 
        !           803: void soldier_fire4 (edict_t *self)
        !           804: {
        !           805:        soldier_fire (self, 3);
        !           806: //
        !           807: //     if (self->enemy->health <= 0)
        !           808: //             return;
        !           809: //
        !           810: //     if ( ((skill->value == 3) && (random() < 0.5)) || (range(self, self->enemy) == RANGE_MELEE) )
        !           811: //             self->monsterinfo.nextframe = FRAME_attak402;
        !           812: }
        !           813: 
        !           814: mframe_t soldier_frames_attack4 [] =
        !           815: {
        !           816:        ai_charge, 0, NULL,
        !           817:        ai_charge, 0, NULL,
        !           818:        ai_charge, 0, soldier_fire4,
        !           819:        ai_charge, 0, NULL,
        !           820:        ai_charge, 0, NULL,
        !           821:        ai_charge, 0, NULL
        !           822: };
        !           823: mmove_t soldier_move_attack4 = {FRAME_attak401, FRAME_attak406, soldier_frames_attack4, soldier_run};
        !           824: 
        !           825: #if 0
        !           826: // ATTACK5 (prone)
        !           827: 
        !           828: void soldier_fire5 (edict_t *self)
        !           829: {
        !           830:        soldier_fire (self, 4);
        !           831: }
        !           832: 
        !           833: void soldier_attack5_refire (edict_t *self)
        !           834: {
        !           835:        if (!self->enemy)
        !           836:                return;
        !           837: 
        !           838:        if (self->enemy->health <= 0)
        !           839:                return;
        !           840: 
        !           841:        if ( ((skill->value == 3) && (random() < 0.5)) || (range(self, self->enemy) == RANGE_MELEE) )
        !           842:                self->monsterinfo.nextframe = FRAME_attak505;
        !           843: }
        !           844: 
        !           845: mframe_t soldier_frames_attack5 [] =
        !           846: {
        !           847:        ai_charge, 8, NULL,
        !           848:        ai_charge, 8, NULL,
        !           849:        ai_charge, 0, NULL,
        !           850:        ai_charge, 0, NULL,
        !           851:        ai_charge, 0, soldier_fire5,
        !           852:        ai_charge, 0, NULL,
        !           853:        ai_charge, 0, NULL,
        !           854:        ai_charge, 0, soldier_attack5_refire
        !           855: };
        !           856: mmove_t soldier_move_attack5 = {FRAME_attak501, FRAME_attak508, soldier_frames_attack5, soldier_run};
        !           857: #endif
        !           858: 
        !           859: // ATTACK6 (run & shoot)
        !           860: 
        !           861: void soldier_fire8 (edict_t *self)
        !           862: {
        !           863:        soldier_fire (self, -7);
        !           864: //     self->monsterinfo.aiflags |= AI_HOLD_FRAME;
        !           865: //     self->monsterinfo.pausetime = level.time + 1000000;
        !           866: }
        !           867: 
        !           868: void soldier_attack6_refire (edict_t *self)
        !           869: {
        !           870:        // PMM - make sure dodge & charge bits are cleared
        !           871:        monster_done_dodge (self);
        !           872:        soldier_stop_charge (self);
        !           873: 
        !           874:        if (!self->enemy)
        !           875:                return;
        !           876: 
        !           877:        if (self->enemy->health <= 0)
        !           878:                return;
        !           879: 
        !           880: //     if (range(self, self->enemy) < RANGE_MID)
        !           881:        if (range(self, self->enemy) < RANGE_NEAR)
        !           882:                return;
        !           883: 
        !           884:        if ((skill->value == 3) || ((random() < (0.25*((float)skill->value)))))
        !           885:                self->monsterinfo.nextframe = FRAME_runs03;
        !           886: }
        !           887: 
        !           888: mframe_t soldier_frames_attack6 [] =
        !           889: {
        !           890: //     PMM
        !           891: //     ai_run, 10, NULL,
        !           892:        ai_run, 10, soldier_start_charge,
        !           893:        ai_run,  4, NULL,
        !           894:        ai_run, 12, soldier_fire8,
        !           895:        ai_run, 11, NULL,
        !           896:        ai_run, 13, monster_done_dodge,
        !           897:        ai_run, 18, NULL,
        !           898:        ai_run, 15, NULL,
        !           899:        ai_run, 14, NULL,
        !           900:        ai_run, 11, NULL,
        !           901:        ai_run,  8, NULL,
        !           902:        ai_run, 11, NULL,
        !           903:        ai_run, 12, NULL,
        !           904:        ai_run, 12, NULL,
        !           905:        ai_run, 17, soldier_attack6_refire
        !           906: };
        !           907: mmove_t soldier_move_attack6 = {FRAME_runs01, FRAME_runs14, soldier_frames_attack6, soldier_run};
        !           908: 
        !           909: void soldier_attack(edict_t *self)
        !           910: {
        !           911:        float r, chance;
        !           912: 
        !           913:        monster_done_dodge (self);
        !           914: 
        !           915:        // PMM - blindfire!
        !           916:        if (self->monsterinfo.attack_state == AS_BLIND)
        !           917:        {
        !           918:                // setup shot probabilities
        !           919:                if (self->monsterinfo.blind_fire_delay < 1.0)
        !           920:                        chance = 1.0;
        !           921:                else if (self->monsterinfo.blind_fire_delay < 7.5)
        !           922:                        chance = 0.4;
        !           923:                else
        !           924:                        chance = 0.1;
        !           925: 
        !           926:                r = random();
        !           927: 
        !           928: //             gi.dprintf ("chance = %2.2f, roll = %2.2f\n", chance, r);
        !           929: 
        !           930:                // minimum of 2 seconds, plus 0-3, after the shots are done
        !           931:                self->monsterinfo.blind_fire_delay += 2.1 + 2.0 + random()*3.0;
        !           932: 
        !           933:                // don't shoot at the origin
        !           934:                if (VectorCompare (self->monsterinfo.blind_fire_target, vec3_origin))
        !           935:                        return;
        !           936: 
        !           937:                // don't shoot if the dice say not to
        !           938:                if (r > chance)
        !           939:                {
        !           940: //                     if ((g_showlogic) && (g_showlogic->value))
        !           941: //                             gi.dprintf ("blindfire - NO SHOT\n");
        !           942:                        return;
        !           943:                }
        !           944: 
        !           945:                // turn on manual steering to signal both manual steering and blindfire
        !           946:                self->monsterinfo.aiflags |= AI_MANUAL_STEERING;
        !           947:                self->monsterinfo.currentmove = &soldier_move_attack1;
        !           948:                self->monsterinfo.attack_finished = level.time + 1.5 + random();
        !           949:                return;
        !           950:        }
        !           951:        // pmm
        !           952: 
        !           953: // PMM - added this so the soldiers now run toward you and shoot instead of just stopping and shooting
        !           954: //     if ((range(self, self->enemy) >= RANGE_MID) && (r < (skill->value*0.25) && (self->s.skinnum <= 3)))
        !           955: 
        !           956:        r = random();
        !           957: 
        !           958:        if ((!(self->monsterinfo.aiflags & AI_BLOCKED)) && (range(self, self->enemy) >= RANGE_NEAR) && (r < (skill->value*0.25) && (self->s.skinnum <= 3)))
        !           959:        {
        !           960:                self->monsterinfo.currentmove = &soldier_move_attack6;
        !           961:        }
        !           962:        else
        !           963:        {
        !           964:                if (self->s.skinnum < 4)
        !           965:                {
        !           966:                        if (random() < 0.5)
        !           967:                                self->monsterinfo.currentmove = &soldier_move_attack1;
        !           968:                        else
        !           969:                                self->monsterinfo.currentmove = &soldier_move_attack2;
        !           970:                }
        !           971:                else
        !           972:                {
        !           973:                        self->monsterinfo.currentmove = &soldier_move_attack4;
        !           974:                }
        !           975:        }
        !           976: }
        !           977: 
        !           978: 
        !           979: //
        !           980: // SIGHT
        !           981: //
        !           982: 
        !           983: void soldier_sight(edict_t *self, edict_t *other)
        !           984: {
        !           985:        if (random() < 0.5)
        !           986:                gi.sound (self, CHAN_VOICE, sound_sight1, 1, ATTN_NORM, 0);
        !           987:        else
        !           988:                gi.sound (self, CHAN_VOICE, sound_sight2, 1, ATTN_NORM, 0);
        !           989: 
        !           990: //     if ((skill->value > 0) && (self->enemy) && (range(self, self->enemy) >= RANGE_MID))
        !           991:        if ((skill->value > 0) && (self->enemy) && (range(self, self->enemy) >= RANGE_NEAR))
        !           992:        {
        !           993: //     PMM - don't let machinegunners run & shoot
        !           994:                if ((random() > 0.75) && (self->s.skinnum <= 3))
        !           995:                        self->monsterinfo.currentmove = &soldier_move_attack6;
        !           996:        }
        !           997: }
        !           998: 
        !           999: //
        !          1000: // DUCK
        !          1001: //
        !          1002: /*
        !          1003: void soldier_duck_hold (edict_t *self)
        !          1004: {
        !          1005:        if (level.time >= self->monsterinfo.duck_wait_time)
        !          1006:                self->monsterinfo.aiflags &= ~AI_HOLD_FRAME;
        !          1007:        else
        !          1008:                self->monsterinfo.aiflags |= AI_HOLD_FRAME;
        !          1009: }
        !          1010: */
        !          1011: mframe_t soldier_frames_duck [] =
        !          1012: {
        !          1013:        ai_move, 5, monster_duck_down,
        !          1014:        ai_move, -1, monster_duck_hold,
        !          1015:        ai_move, 1,  NULL,
        !          1016:        ai_move, 0,  monster_duck_up,
        !          1017:        ai_move, 5,  NULL
        !          1018: };
        !          1019: mmove_t soldier_move_duck = {FRAME_duck01, FRAME_duck05, soldier_frames_duck, soldier_run};
        !          1020: 
        !          1021: /*
        !          1022: void soldier_dodge (edict_t *self, edict_t *attacker, float eta, trace_t *tr)
        !          1023: {
        !          1024: //===========
        !          1025: //PMM - rogue rewrite of dodge code.
        !          1026: // lots o' changes in here.  Basically, they now check the tr and see if ducking would help,
        !          1027: // and if it doesn't, they dodge like mad
        !          1028:        float   r = random();
        !          1029:        float   height;
        !          1030: 
        !          1031:        if ((g_showlogic) && (g_showlogic->value))
        !          1032:        {
        !          1033:                if (self->monsterinfo.aiflags & AI_DODGING)
        !          1034:                        gi.dprintf ("dodging - ");
        !          1035:                if (self->monsterinfo.aiflags & AI_DUCKED)
        !          1036:                        gi.dprintf ("ducked - ");
        !          1037:        }
        !          1038:        if (!self->enemy)
        !          1039:        {
        !          1040:                self->enemy = attacker;
        !          1041:                FoundTarget (self);
        !          1042:        }
        !          1043: 
        !          1044:        // PMM - don't bother if it's going to hit anyway; fix for weird in-your-face etas (I was
        !          1045:        // seeing numbers like 13 and 14)
        !          1046:        if ((eta < 0.1) || (eta > 5))
        !          1047:        {
        !          1048:                if ((g_showlogic) && (g_showlogic->value))
        !          1049:                        gi.dprintf ("timeout\n");
        !          1050:                return;
        !          1051:        }
        !          1052: 
        !          1053:        // skill level determination..
        !          1054:        if (r > (0.25*((skill->value)+1)))
        !          1055:        {
        !          1056:                if ((g_showlogic) && (g_showlogic->value))
        !          1057:                        gi.dprintf ("skillout\n");
        !          1058:                return;
        !          1059:        }
        !          1060: 
        !          1061:        // stop charging, since we're going to dodge (somehow) instead
        !          1062:        soldier_stop_charge (self);
        !          1063: 
        !          1064:        height = self->absmax[2]-32-1;  // the -1 is because the absmax is s.origin + maxs + 1
        !          1065: 
        !          1066:        // if we're ducking already, or the shot is at our knees
        !          1067:        if ((tr->endpos[2] <= height) || (self->monsterinfo.aiflags & AI_DUCKED))
        !          1068:        {
        !          1069:                vec3_t right, diff;
        !          1070: 
        !          1071:                // if we're already dodging, just finish the sequence, i.e. don't do anything else
        !          1072:                if (self->monsterinfo.aiflags & AI_DODGING)
        !          1073:                {
        !          1074:                        if ((g_showlogic) && (g_showlogic->value))
        !          1075:                                gi.dprintf ("already dodging\n");
        !          1076:                        return;
        !          1077:                }
        !          1078: 
        !          1079:                AngleVectors (self->s.angles, NULL, right, NULL);
        !          1080:                VectorSubtract (tr->endpos, self->s.origin, diff);
        !          1081: 
        !          1082:                if (DotProduct (right, diff) < 0)
        !          1083:                {
        !          1084:                        self->monsterinfo.lefty = 1;
        !          1085: //                     gi.dprintf ("left\n");
        !          1086:                } else {
        !          1087: //                     gi.dprintf ("right\n");
        !          1088:                }
        !          1089:                // if it doesn't sense to duck, try to strafe and shoot
        !          1090:                // we don't want the machine gun guys running & shooting (looks bad)
        !          1091: 
        !          1092:                // if we are currently ducked, unduck
        !          1093:                if (self->monsterinfo.aiflags & AI_DUCKED)
        !          1094:                {
        !          1095:                        if ((g_showlogic) && (g_showlogic->value))
        !          1096:                                gi.dprintf ("unducking - ");
        !          1097:                        soldier_duck_up(self);
        !          1098:                }
        !          1099: 
        !          1100:                self->monsterinfo.aiflags |= AI_DODGING;
        !          1101:                self->monsterinfo.attack_state = AS_SLIDING;
        !          1102: 
        !          1103:                if (self->s.skinnum <= 3)
        !          1104:                {
        !          1105:                        if ((g_showlogic) && (g_showlogic->value))
        !          1106:                                gi.dprintf ("shooting back!\n");
        !          1107:                        self->monsterinfo.currentmove = &soldier_move_attack6;
        !          1108:                }
        !          1109:                else
        !          1110:                {
        !          1111:                        if ((g_showlogic) && (g_showlogic->value))
        !          1112:                                gi.dprintf ("strafing away!\n");
        !          1113:                        self->monsterinfo.currentmove = &soldier_move_start_run;
        !          1114:                }
        !          1115:                return;
        !          1116:        }
        !          1117: 
        !          1118:        // if we're here, we're ducking, so clear the dodge bit if it's set
        !          1119: 
        !          1120:        if ((g_showlogic) && (g_showlogic->value))
        !          1121:                gi.dprintf ("ducking!\n");
        !          1122:        if (skill->value == 0)
        !          1123:        {
        !          1124:                // set this prematurely; it doesn't hurt, and prevents extra iterations
        !          1125:                self->monsterinfo.aiflags |= AI_DUCKED;
        !          1126:                monster_done_dodge (self);
        !          1127:                self->monsterinfo.currentmove = &soldier_move_duck;
        !          1128:                // PMM - stupid dodge
        !          1129:                self->monsterinfo.duck_wait_time = level.time + eta + 1;
        !          1130:                return;
        !          1131:        }
        !          1132: // PMM - since we're only ducking some of the time, this needs to be moved down below
        !          1133: //     self->monsterinfo.duck_wait_time = level.time + eta + 0.3;
        !          1134: 
        !          1135:        r = random();
        !          1136: 
        !          1137:        // set this prematurely; it doesn't hurt, and prevents extra iterations
        !          1138:        self->monsterinfo.aiflags |= AI_DUCKED;
        !          1139:        monster_done_dodge (self);
        !          1140: 
        !          1141:        if (r > (skill->value * 0.33))
        !          1142:        {
        !          1143:                self->monsterinfo.currentmove = &soldier_move_duck;
        !          1144:                self->monsterinfo.duck_wait_time = level.time + eta + (0.1 * (3 - skill->value));
        !          1145:                // has to be done immediately otherwise he can get stuck
        !          1146:                soldier_duck_down(self);
        !          1147:        }
        !          1148:        else
        !          1149:        {
        !          1150:                // has to be done immediately otherwise he can get stuck
        !          1151:                soldier_duck_down(self);
        !          1152:                self->monsterinfo.duck_wait_time = level.time + eta + 1;
        !          1153:                self->monsterinfo.currentmove = &soldier_move_attack3;
        !          1154:                self->monsterinfo.nextframe = FRAME_attak301;
        !          1155:        }
        !          1156:        return;
        !          1157: //PMM
        !          1158: //===========
        !          1159: 
        !          1160: }
        !          1161: */
        !          1162: // pmm - blocking code
        !          1163: 
        !          1164: qboolean soldier_blocked (edict_t *self, float dist)
        !          1165: {
        !          1166:        // don't do anything if you're dodging
        !          1167:        if ((self->monsterinfo.aiflags & AI_DODGING) || (self->monsterinfo.aiflags & AI_DUCKED))
        !          1168:                return false;
        !          1169: 
        !          1170:        if(blocked_checkshot (self, 0.25 + (0.05 * skill->value) ))
        !          1171:                return true;
        !          1172: 
        !          1173: //     if(blocked_checkjump (self, dist, 192, 40))
        !          1174: //     {
        !          1175: //             soldier_jump(self);
        !          1176: //             return true;
        !          1177: //     }
        !          1178: 
        !          1179:        if(blocked_checkplat (self, dist))
        !          1180:                return true;
        !          1181: 
        !          1182:        return false;
        !          1183: }
        !          1184: 
        !          1185: //
        !          1186: // DEATH
        !          1187: //
        !          1188: 
        !          1189: void soldier_fire6 (edict_t *self)
        !          1190: {
        !          1191:        soldier_fire (self, 5);
        !          1192: }
        !          1193: 
        !          1194: void soldier_fire7 (edict_t *self)
        !          1195: {
        !          1196:        soldier_fire (self, 6);
        !          1197: }
        !          1198: 
        !          1199: void soldier_dead (edict_t *self)
        !          1200: {
        !          1201:        VectorSet (self->mins, -16, -16, -24);
        !          1202:        VectorSet (self->maxs, 16, 16, -8);
        !          1203:        self->movetype = MOVETYPE_TOSS;
        !          1204:        self->svflags |= SVF_DEADMONSTER;
        !          1205:        self->nextthink = 0;
        !          1206:        gi.linkentity (self);
        !          1207: }
        !          1208: 
        !          1209: // pmm - this quickie does a location trace to try to grow the bounding box
        !          1210: //
        !          1211: // this is because the frames are off; the origin is at the guy's feet.
        !          1212: void soldier_dead2 (edict_t *self)
        !          1213: {
        !          1214:        vec3_t  tempmins, tempmaxs, temporg;
        !          1215:        trace_t tr;
        !          1216: 
        !          1217:        VectorCopy (self->s.origin, temporg);
        !          1218:        // this is because location traces done at the floor are guaranteed to hit the floor
        !          1219:        // (inside the sv_trace code it grows the bbox by 1 in all directions)
        !          1220:        temporg[2] += 1;
        !          1221: 
        !          1222:        VectorSet (tempmins, -32, -32, -24);
        !          1223:        VectorSet (tempmaxs, 32, 32, -8);
        !          1224: 
        !          1225:        tr = gi.trace (temporg, tempmins, tempmaxs, temporg, self, MASK_SOLID);
        !          1226:        if (tr.startsolid || tr.allsolid)
        !          1227:        {
        !          1228:                VectorSet (self->mins, -16, -16, -24);
        !          1229:                VectorSet (self->maxs, 16, 16, -8);
        !          1230:        }
        !          1231:        else
        !          1232:        {
        !          1233:                VectorCopy (tempmins, self->mins);
        !          1234:                VectorCopy (tempmaxs, self->maxs);
        !          1235:        }
        !          1236:        self->movetype = MOVETYPE_TOSS;
        !          1237:        self->svflags |= SVF_DEADMONSTER;
        !          1238:        self->nextthink = 0;
        !          1239:        gi.linkentity (self);
        !          1240: }
        !          1241: 
        !          1242: mframe_t soldier_frames_death1 [] =
        !          1243: {
        !          1244:        ai_move, 0,   NULL,
        !          1245:        ai_move, -10, NULL,
        !          1246:        ai_move, -10, NULL,
        !          1247:        ai_move, -10, NULL,
        !          1248:        ai_move, -5,  NULL,
        !          1249:        ai_move, 0,   NULL,
        !          1250:        ai_move, 0,   NULL,
        !          1251:        ai_move, 0,   NULL,
        !          1252:        ai_move, 0,   NULL,
        !          1253:        ai_move, 0,   NULL,
        !          1254: 
        !          1255:        ai_move, 0,   NULL,
        !          1256:        ai_move, 0,   NULL,
        !          1257:        ai_move, 0,   NULL,
        !          1258:        ai_move, 0,   NULL,
        !          1259:        ai_move, 0,   NULL,
        !          1260:        ai_move, 0,   NULL,
        !          1261:        ai_move, 0,   NULL,
        !          1262:        ai_move, 0,   NULL,
        !          1263:        ai_move, 0,   NULL,
        !          1264:        ai_move, 0,   NULL,
        !          1265: 
        !          1266:        ai_move, 0,   NULL,
        !          1267:        ai_move, 0,   soldier_fire6,
        !          1268:        ai_move, 0,   NULL,
        !          1269:        ai_move, 0,   NULL,
        !          1270:        ai_move, 0,   soldier_fire7,
        !          1271:        ai_move, 0,   NULL,
        !          1272:        ai_move, 0,   NULL,
        !          1273:        ai_move, 0,   NULL,
        !          1274:        ai_move, 0,   NULL,
        !          1275:        ai_move, 0,   NULL,
        !          1276: 
        !          1277:        ai_move, 0,   NULL,
        !          1278:        ai_move, 0,   NULL,
        !          1279:        ai_move, 0,   NULL,
        !          1280:        ai_move, 0,   NULL,
        !          1281:        ai_move, 0,   NULL,
        !          1282:        ai_move, 0,   NULL
        !          1283: };
        !          1284: mmove_t soldier_move_death1 = {FRAME_death101, FRAME_death136, soldier_frames_death1, soldier_dead};
        !          1285: 
        !          1286: mframe_t soldier_frames_death2 [] =
        !          1287: {
        !          1288:        ai_move, -5,  NULL,
        !          1289:        ai_move, -5,  NULL,
        !          1290:        ai_move, -5,  NULL,
        !          1291:        ai_move, 0,   NULL,
        !          1292:        ai_move, 0,   NULL,
        !          1293:        ai_move, 0,   NULL,
        !          1294:        ai_move, 0,   NULL,
        !          1295:        ai_move, 0,   NULL,
        !          1296:        ai_move, 0,   NULL,
        !          1297:        ai_move, 0,   NULL,
        !          1298: 
        !          1299:        ai_move, 0,   NULL,
        !          1300:        ai_move, 0,   NULL,
        !          1301:        ai_move, 0,   NULL,
        !          1302:        ai_move, 0,   NULL,
        !          1303:        ai_move, 0,   NULL,
        !          1304:        ai_move, 0,   NULL,
        !          1305:        ai_move, 0,   NULL,
        !          1306:        ai_move, 0,   NULL,
        !          1307:        ai_move, 0,   NULL,
        !          1308:        ai_move, 0,   NULL,
        !          1309: 
        !          1310:        ai_move, 0,   NULL,
        !          1311:        ai_move, 0,   NULL,
        !          1312:        ai_move, 0,   NULL,
        !          1313:        ai_move, 0,   NULL,
        !          1314:        ai_move, 0,   NULL,
        !          1315:        ai_move, 0,   NULL,
        !          1316:        ai_move, 0,   NULL,
        !          1317:        ai_move, 0,   NULL,
        !          1318:        ai_move, 0,   NULL,
        !          1319:        ai_move, 0,   NULL,
        !          1320: 
        !          1321:        ai_move, 0,   NULL,
        !          1322:        ai_move, 0,   NULL,
        !          1323:        ai_move, 0,   NULL,
        !          1324:        ai_move, 0,   NULL,
        !          1325:        ai_move, 0,   NULL
        !          1326: };
        !          1327: mmove_t soldier_move_death2 = {FRAME_death201, FRAME_death235, soldier_frames_death2, soldier_dead};
        !          1328: 
        !          1329: mframe_t soldier_frames_death3 [] =
        !          1330: {
        !          1331:        ai_move, -5,  NULL,
        !          1332:        ai_move, -5,  NULL,
        !          1333:        ai_move, -5,  NULL,
        !          1334:        ai_move, 0,   NULL,
        !          1335:        ai_move, 0,   NULL,
        !          1336:        ai_move, 0,   NULL,
        !          1337:        ai_move, 0,   NULL,
        !          1338:        ai_move, 0,   NULL,
        !          1339:        ai_move, 0,   NULL,
        !          1340:        ai_move, 0,   NULL,
        !          1341: 
        !          1342:        ai_move, 0,   NULL,
        !          1343:        ai_move, 0,   NULL,
        !          1344:        ai_move, 0,   NULL,
        !          1345:        ai_move, 0,   NULL,
        !          1346:        ai_move, 0,   NULL,
        !          1347:        ai_move, 0,   NULL,
        !          1348:        ai_move, 0,   NULL,
        !          1349:        ai_move, 0,   NULL,
        !          1350:        ai_move, 0,   NULL,
        !          1351:        ai_move, 0,   NULL,
        !          1352: 
        !          1353:        ai_move, 0,   NULL,
        !          1354:        ai_move, 0,   NULL,
        !          1355:        ai_move, 0,   NULL,
        !          1356:        ai_move, 0,   NULL,
        !          1357:        ai_move, 0,   NULL,
        !          1358:        ai_move, 0,   NULL,
        !          1359:        ai_move, 0,   NULL,
        !          1360:        ai_move, 0,   NULL,
        !          1361:        ai_move, 0,   NULL,
        !          1362:        ai_move, 0,   NULL,
        !          1363: 
        !          1364:        ai_move, 0,   NULL,
        !          1365:        ai_move, 0,   NULL,
        !          1366:        ai_move, 0,   NULL,
        !          1367:        ai_move, 0,   NULL,
        !          1368:        ai_move, 0,   NULL,
        !          1369:        ai_move, 0,   NULL,
        !          1370:        ai_move, 0,   NULL,
        !          1371:        ai_move, 0,   NULL,
        !          1372:        ai_move, 0,   NULL,
        !          1373:        ai_move, 0,   NULL,
        !          1374: 
        !          1375:        ai_move, 0,   NULL,
        !          1376:        ai_move, 0,   NULL,
        !          1377:        ai_move, 0,   NULL,
        !          1378:        ai_move, 0,   NULL,
        !          1379:        ai_move, 0,   NULL,
        !          1380: };
        !          1381: mmove_t soldier_move_death3 = {FRAME_death301, FRAME_death345, soldier_frames_death3, soldier_dead};
        !          1382: 
        !          1383: mframe_t soldier_frames_death4 [] =
        !          1384: {
        !          1385:        ai_move, 0,   NULL,
        !          1386:        ai_move, 0,   NULL,
        !          1387:        ai_move, 0,   NULL,
        !          1388:        ai_move, 0,   NULL,
        !          1389:        ai_move, 0,   NULL,
        !          1390:        ai_move, 0,   NULL,
        !          1391:        ai_move, 0,   NULL,
        !          1392:        ai_move, 0,   NULL,
        !          1393:        ai_move, 0,   NULL,
        !          1394:        ai_move, 0,   NULL,
        !          1395: 
        !          1396:        ai_move, 0,   NULL,
        !          1397:        ai_move, 0,   NULL,
        !          1398:        ai_move, 0,   NULL,
        !          1399:        ai_move, 0,   NULL,
        !          1400:        ai_move, 0,   NULL,
        !          1401:        ai_move, 0,   NULL,
        !          1402:        ai_move, 0,   NULL,
        !          1403:        ai_move, 0,   NULL,
        !          1404:        ai_move, 0,   NULL,
        !          1405:        ai_move, 0,   NULL,
        !          1406: 
        !          1407:        ai_move, 0,   NULL,
        !          1408:        ai_move, 0,   NULL,
        !          1409:        ai_move, 0,   NULL,
        !          1410:        ai_move, 0,   NULL,
        !          1411:        ai_move, 0,   NULL,
        !          1412:        ai_move, 0,   NULL,
        !          1413:        ai_move, 0,   NULL,
        !          1414:        ai_move, 0,   NULL,
        !          1415:        ai_move, 0,   NULL,
        !          1416:        ai_move, 0,   NULL,
        !          1417: 
        !          1418:        ai_move, 0,   NULL,
        !          1419:        ai_move, 0,   NULL,
        !          1420:        ai_move, 0,   NULL,
        !          1421:        ai_move, 0,   NULL,
        !          1422:        ai_move, 0,   NULL,
        !          1423:        ai_move, 0,   NULL,
        !          1424:        ai_move, 0,   NULL,
        !          1425:        ai_move, 0,   NULL,
        !          1426:        ai_move, 0,   NULL,
        !          1427:        ai_move, 0,   NULL,
        !          1428: 
        !          1429:        ai_move, 0,   NULL,
        !          1430:        ai_move, 0,   NULL,
        !          1431:        ai_move, 0,   NULL,
        !          1432:        ai_move, 0,   NULL,
        !          1433:        ai_move, 0,   NULL,
        !          1434:        ai_move, 0,   NULL,
        !          1435:        ai_move, 0,   NULL,
        !          1436:        ai_move, 0,   NULL,
        !          1437:        ai_move, 0,   NULL,
        !          1438:        ai_move, 0,   NULL,
        !          1439: 
        !          1440:        ai_move, 0,   NULL,
        !          1441:        ai_move, 0,   NULL,
        !          1442:        ai_move, 0,   NULL
        !          1443: };
        !          1444: // PMM -changed to soldier_dead2 to get a larger bounding box
        !          1445: mmove_t soldier_move_death4 = {FRAME_death401, FRAME_death453, soldier_frames_death4, soldier_dead2};
        !          1446: 
        !          1447: mframe_t soldier_frames_death5 [] =
        !          1448: {
        !          1449:        ai_move, -5,  NULL,
        !          1450:        ai_move, -5,  NULL,
        !          1451:        ai_move, -5,  NULL,
        !          1452:        ai_move, 0,   NULL,
        !          1453:        ai_move, 0,   NULL,
        !          1454:        ai_move, 0,   NULL,
        !          1455:        ai_move, 0,   NULL,
        !          1456:        ai_move, 0,   NULL,
        !          1457:        ai_move, 0,   NULL,
        !          1458:        ai_move, 0,   NULL,
        !          1459: 
        !          1460:        ai_move, 0,   NULL,
        !          1461:        ai_move, 0,   NULL,
        !          1462:        ai_move, 0,   NULL,
        !          1463:        ai_move, 0,   NULL,
        !          1464:        ai_move, 0,   NULL,
        !          1465:        ai_move, 0,   NULL,
        !          1466:        ai_move, 0,   NULL,
        !          1467:        ai_move, 0,   NULL,
        !          1468:        ai_move, 0,   NULL,
        !          1469:        ai_move, 0,   NULL,
        !          1470: 
        !          1471:        ai_move, 0,   NULL,
        !          1472:        ai_move, 0,   NULL,
        !          1473:        ai_move, 0,   NULL,
        !          1474:        ai_move, 0,   NULL
        !          1475: };
        !          1476: mmove_t soldier_move_death5 = {FRAME_death501, FRAME_death524, soldier_frames_death5, soldier_dead};
        !          1477: 
        !          1478: mframe_t soldier_frames_death6 [] =
        !          1479: {
        !          1480:        ai_move, 0,   NULL,
        !          1481:        ai_move, 0,   NULL,
        !          1482:        ai_move, 0,   NULL,
        !          1483:        ai_move, 0,   NULL,
        !          1484:        ai_move, 0,   NULL,
        !          1485:        ai_move, 0,   NULL,
        !          1486:        ai_move, 0,   NULL,
        !          1487:        ai_move, 0,   NULL,
        !          1488:        ai_move, 0,   NULL,
        !          1489:        ai_move, 0,   NULL
        !          1490: };
        !          1491: mmove_t soldier_move_death6 = {FRAME_death601, FRAME_death610, soldier_frames_death6, soldier_dead};
        !          1492: 
        !          1493: void soldier_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
        !          1494: {
        !          1495:        int             n;
        !          1496: 
        !          1497: // check for gib
        !          1498:        if (self->health <= self->gib_health)
        !          1499:        {
        !          1500:                gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
        !          1501:                for (n= 0; n < 3; n++)
        !          1502:                        ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
        !          1503:                ThrowGib (self, "models/objects/gibs/chest/tris.md2", damage, GIB_ORGANIC);
        !          1504:                ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
        !          1505:                self->deadflag = DEAD_DEAD;
        !          1506:                return;
        !          1507:        }
        !          1508: 
        !          1509:        if (self->deadflag == DEAD_DEAD)
        !          1510:                return;
        !          1511: 
        !          1512: // regular death
        !          1513:        self->deadflag = DEAD_DEAD;
        !          1514:        self->takedamage = DAMAGE_YES;
        !          1515:        self->s.skinnum |= 1;
        !          1516: 
        !          1517:        if (self->s.skinnum == 1)
        !          1518:                gi.sound (self, CHAN_VOICE, sound_death_light, 1, ATTN_NORM, 0);
        !          1519:        else if (self->s.skinnum == 3)
        !          1520:                gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
        !          1521:        else // (self->s.skinnum == 5)
        !          1522:                gi.sound (self, CHAN_VOICE, sound_death_ss, 1, ATTN_NORM, 0);
        !          1523: 
        !          1524:        if (fabs((self->s.origin[2] + self->viewheight) - point[2]) <= 4)
        !          1525:        {
        !          1526:                // head shot
        !          1527:                self->monsterinfo.currentmove = &soldier_move_death3;
        !          1528:                return;
        !          1529:        }
        !          1530: 
        !          1531:        n = rand() % 5;
        !          1532:        if (n == 0)
        !          1533:                self->monsterinfo.currentmove = &soldier_move_death1;
        !          1534:        else if (n == 1)
        !          1535:                self->monsterinfo.currentmove = &soldier_move_death2;
        !          1536:        else if (n == 2)
        !          1537:                self->monsterinfo.currentmove = &soldier_move_death4;
        !          1538:        else if (n == 3)
        !          1539:                self->monsterinfo.currentmove = &soldier_move_death5;
        !          1540:        else
        !          1541:                self->monsterinfo.currentmove = &soldier_move_death6;
        !          1542: }
        !          1543: 
        !          1544: //
        !          1545: // NEW DODGE CODE
        !          1546: //
        !          1547: 
        !          1548: void soldier_sidestep (edict_t *self)
        !          1549: {
        !          1550:        if (self->s.skinnum <= 3)
        !          1551:        {
        !          1552:                if ((g_showlogic) && (g_showlogic->value))
        !          1553:                        gi.dprintf ("shooting back!\n");
        !          1554:                if (self->monsterinfo.currentmove != &soldier_move_attack6)
        !          1555:                        self->monsterinfo.currentmove = &soldier_move_attack6;
        !          1556:        }
        !          1557:        else
        !          1558:        {
        !          1559:                if ((g_showlogic) && (g_showlogic->value))
        !          1560:                        gi.dprintf ("strafing away!\n");
        !          1561:                if (self->monsterinfo.currentmove != &soldier_move_start_run)
        !          1562:                        self->monsterinfo.currentmove = &soldier_move_start_run;
        !          1563:        }
        !          1564: }
        !          1565: 
        !          1566: void soldier_duck (edict_t *self, float eta)
        !          1567: {
        !          1568:        float r;
        !          1569: 
        !          1570:        // has to be done immediately otherwise he can get stuck
        !          1571:        monster_duck_down(self);
        !          1572: 
        !          1573:        if (skill->value == 0)
        !          1574:        {
        !          1575:                // PMM - stupid dodge
        !          1576:                self->monsterinfo.nextframe = FRAME_duck01;
        !          1577:                self->monsterinfo.currentmove = &soldier_move_duck;
        !          1578:                self->monsterinfo.duck_wait_time = level.time + eta + 1;
        !          1579:                return;
        !          1580:        }
        !          1581: 
        !          1582:        r = random();
        !          1583: 
        !          1584:        if (r > (skill->value * 0.3))
        !          1585:        {
        !          1586:                self->monsterinfo.nextframe = FRAME_duck01;
        !          1587:                self->monsterinfo.currentmove = &soldier_move_duck;
        !          1588:                self->monsterinfo.duck_wait_time = level.time + eta + (0.1 * (3 - skill->value));
        !          1589:        }
        !          1590:        else
        !          1591:        {
        !          1592:                self->monsterinfo.nextframe = FRAME_attak301;
        !          1593:                self->monsterinfo.currentmove = &soldier_move_attack3;
        !          1594:                self->monsterinfo.duck_wait_time = level.time + eta + 1;
        !          1595:        }
        !          1596:        return;
        !          1597: }
        !          1598: 
        !          1599: //=========
        !          1600: //ROGUE
        !          1601: void soldier_blind (edict_t *self);
        !          1602: 
        !          1603: mframe_t soldier_frames_blind [] =
        !          1604: {
        !          1605:        ai_move, 0, soldier_idle,
        !          1606:        ai_move, 0, NULL,
        !          1607:        ai_move, 0, NULL,
        !          1608:        ai_move, 0, NULL,
        !          1609:        ai_move, 0, NULL,
        !          1610:        ai_move, 0, NULL,
        !          1611:        ai_move, 0, NULL,
        !          1612:        ai_move, 0, NULL,
        !          1613:        ai_move, 0, NULL,
        !          1614:        ai_move, 0, NULL,
        !          1615: 
        !          1616:        ai_move, 0, NULL,
        !          1617:        ai_move, 0, NULL,
        !          1618:        ai_move, 0, NULL,
        !          1619:        ai_move, 0, NULL,
        !          1620:        ai_move, 0, NULL,
        !          1621:        ai_move, 0, NULL,
        !          1622:        ai_move, 0, NULL,
        !          1623:        ai_move, 0, NULL,
        !          1624:        ai_move, 0, NULL,
        !          1625:        ai_move, 0, NULL,
        !          1626: 
        !          1627:        ai_move, 0, NULL,
        !          1628:        ai_move, 0, NULL,
        !          1629:        ai_move, 0, NULL,
        !          1630:        ai_move, 0, NULL,
        !          1631:        ai_move, 0, NULL,
        !          1632:        ai_move, 0, NULL,
        !          1633:        ai_move, 0, NULL,
        !          1634:        ai_move, 0, NULL,
        !          1635:        ai_move, 0, NULL,
        !          1636:        ai_move, 0, NULL
        !          1637: };
        !          1638: mmove_t soldier_move_blind = {FRAME_stand101, FRAME_stand130, soldier_frames_blind, soldier_blind};
        !          1639: 
        !          1640: void soldier_blind (edict_t *self)
        !          1641: {
        !          1642:        self->monsterinfo.currentmove = &soldier_move_blind;
        !          1643: }
        !          1644: //ROGUE
        !          1645: //=========
        !          1646: 
        !          1647: //
        !          1648: // SPAWN
        !          1649: //
        !          1650: 
        !          1651: void SP_monster_soldier_x (edict_t *self)
        !          1652: {
        !          1653: 
        !          1654:        self->s.modelindex = gi.modelindex ("models/monsters/soldier/tris.md2");
        !          1655:        //PMM
        !          1656: //     self->s.effects |= EF_SPLATTER;
        !          1657:        //PMM
        !          1658:        self->monsterinfo.scale = MODEL_SCALE;
        !          1659:        VectorSet (self->mins, -16, -16, -24);
        !          1660:        VectorSet (self->maxs, 16, 16, 32);
        !          1661:        self->movetype = MOVETYPE_STEP;
        !          1662:        self->solid = SOLID_BBOX;
        !          1663: 
        !          1664:        sound_idle =    gi.soundindex ("soldier/solidle1.wav");
        !          1665:        sound_sight1 =  gi.soundindex ("soldier/solsght1.wav");
        !          1666:        sound_sight2 =  gi.soundindex ("soldier/solsrch1.wav");
        !          1667:        sound_cock =    gi.soundindex ("infantry/infatck3.wav");
        !          1668: 
        !          1669:        self->mass = 100;
        !          1670: 
        !          1671:        self->pain = soldier_pain;
        !          1672:        self->die = soldier_die;
        !          1673: 
        !          1674:        self->monsterinfo.stand = soldier_stand;
        !          1675:        self->monsterinfo.walk = soldier_walk;
        !          1676:        self->monsterinfo.run = soldier_run;
        !          1677:        self->monsterinfo.dodge = M_MonsterDodge;
        !          1678:        self->monsterinfo.attack = soldier_attack;
        !          1679:        self->monsterinfo.melee = NULL;
        !          1680:        self->monsterinfo.sight = soldier_sight;
        !          1681: 
        !          1682: //=====
        !          1683: //ROGUE
        !          1684:        self->monsterinfo.blocked = soldier_blocked;
        !          1685:        self->monsterinfo.duck = soldier_duck;
        !          1686:        self->monsterinfo.unduck = monster_duck_up;
        !          1687:        self->monsterinfo.sidestep = soldier_sidestep;
        !          1688: 
        !          1689:        if(self->spawnflags & 8)        // blind
        !          1690:                self->monsterinfo.stand = soldier_blind;
        !          1691: //ROGUE
        !          1692: //=====
        !          1693: 
        !          1694:        gi.linkentity (self);
        !          1695: 
        !          1696:        self->monsterinfo.stand (self);
        !          1697: 
        !          1698:        walkmonster_start (self);
        !          1699: }
        !          1700: 
        !          1701: 
        !          1702: /*QUAKED monster_soldier_light (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight Blind
        !          1703: 
        !          1704: Blind - monster will just stand there until triggered
        !          1705: */
        !          1706: void SP_monster_soldier_light (edict_t *self)
        !          1707: {
        !          1708:        if (deathmatch->value)
        !          1709:        {
        !          1710:                G_FreeEdict (self);
        !          1711:                return;
        !          1712:        }
        !          1713: 
        !          1714:        SP_monster_soldier_x (self);
        !          1715: 
        !          1716:        sound_pain_light = gi.soundindex ("soldier/solpain2.wav");
        !          1717:        sound_death_light =     gi.soundindex ("soldier/soldeth2.wav");
        !          1718:        gi.modelindex ("models/objects/laser/tris.md2");
        !          1719:        gi.soundindex ("misc/lasfly.wav");
        !          1720:        gi.soundindex ("soldier/solatck2.wav");
        !          1721: 
        !          1722:        self->s.skinnum = 0;
        !          1723:        self->health = 20;
        !          1724:        self->gib_health = -30;
        !          1725: 
        !          1726:        // PMM - blindfire
        !          1727:        self->monsterinfo.blindfire = true;
        !          1728: }
        !          1729: 
        !          1730: /*QUAKED monster_soldier (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight Blind
        !          1731: 
        !          1732: Blind - monster will just stand there until triggered
        !          1733: */
        !          1734: void SP_monster_soldier (edict_t *self)
        !          1735: {
        !          1736:        if (deathmatch->value)
        !          1737:        {
        !          1738:                G_FreeEdict (self);
        !          1739:                return;
        !          1740:        }
        !          1741: 
        !          1742:        SP_monster_soldier_x (self);
        !          1743: 
        !          1744:        sound_pain = gi.soundindex ("soldier/solpain1.wav");
        !          1745:        sound_death = gi.soundindex ("soldier/soldeth1.wav");
        !          1746:        gi.soundindex ("soldier/solatck1.wav");
        !          1747: 
        !          1748:        self->s.skinnum = 2;
        !          1749:        self->health = 30;
        !          1750:        self->gib_health = -30;
        !          1751: }
        !          1752: 
        !          1753: /*QUAKED monster_soldier_ss (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight Blind
        !          1754: 
        !          1755: Blind - monster will just stand there until triggered
        !          1756: */
        !          1757: void SP_monster_soldier_ss (edict_t *self)
        !          1758: {
        !          1759:        if (deathmatch->value)
        !          1760:        {
        !          1761:                G_FreeEdict (self);
        !          1762:                return;
        !          1763:        }
        !          1764: 
        !          1765:        SP_monster_soldier_x (self);
        !          1766: 
        !          1767:        sound_pain_ss = gi.soundindex ("soldier/solpain3.wav");
        !          1768:        sound_death_ss = gi.soundindex ("soldier/soldeth3.wav");
        !          1769:        gi.soundindex ("soldier/solatck3.wav");
        !          1770: 
        !          1771:        self->s.skinnum = 4;
        !          1772:        self->health = 40;
        !          1773:        self->gib_health = -30;
        !          1774: }

unix.superglobalmegacorp.com

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