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

1.1     ! root        1: /*
        !             2: ==============================================================================
        !             3: 
        !             4: parasite
        !             5: 
        !             6: ==============================================================================
        !             7: */
        !             8: 
        !             9: #include "g_local.h"
        !            10: #include "m_parasite.h"
        !            11: 
        !            12: 
        !            13: static int     sound_pain1;
        !            14: static int     sound_pain2;
        !            15: static int     sound_die;
        !            16: static int     sound_launch;
        !            17: static int     sound_impact;
        !            18: static int     sound_suck;
        !            19: static int     sound_reelin;
        !            20: static int     sound_sight;
        !            21: static int     sound_tap;
        !            22: static int     sound_scratch;
        !            23: static int     sound_search;
        !            24: 
        !            25: 
        !            26: void parasite_stand (edict_t *self);
        !            27: void parasite_start_run (edict_t *self);
        !            28: void parasite_run (edict_t *self);
        !            29: void parasite_walk (edict_t *self);
        !            30: void parasite_start_walk (edict_t *self);
        !            31: void parasite_end_fidget (edict_t *self);
        !            32: void parasite_do_fidget (edict_t *self);
        !            33: void parasite_refidget (edict_t *self);
        !            34: 
        !            35: 
        !            36: void parasite_launch (edict_t *self)
        !            37: {
        !            38:        gi.sound (self, CHAN_WEAPON, sound_launch, 1, ATTN_NORM, 0);
        !            39: }
        !            40: 
        !            41: void parasite_reel_in (edict_t *self)
        !            42: {
        !            43:        gi.sound (self, CHAN_WEAPON, sound_reelin, 1, ATTN_NORM, 0);
        !            44: }
        !            45: 
        !            46: void parasite_sight (edict_t *self, edict_t *other)
        !            47: {
        !            48:        gi.sound (self, CHAN_WEAPON, sound_sight, 1, ATTN_NORM, 0);
        !            49: }
        !            50: 
        !            51: void parasite_tap (edict_t *self)
        !            52: {
        !            53:        gi.sound (self, CHAN_WEAPON, sound_tap, 1, ATTN_IDLE, 0);
        !            54: }
        !            55: 
        !            56: void parasite_scratch (edict_t *self)
        !            57: {
        !            58:        gi.sound (self, CHAN_WEAPON, sound_scratch, 1, ATTN_IDLE, 0);
        !            59: }
        !            60: 
        !            61: void parasite_search (edict_t *self)
        !            62: {
        !            63:        gi.sound (self, CHAN_WEAPON, sound_search, 1, ATTN_IDLE, 0);
        !            64: }
        !            65: 
        !            66: 
        !            67: mframe_t parasite_frames_start_fidget [] =
        !            68: {
        !            69:        ai_stand, 0, NULL,
        !            70:        ai_stand, 0, NULL,
        !            71:        ai_stand, 0, NULL,
        !            72:        ai_stand, 0, NULL
        !            73: };
        !            74: mmove_t parasite_move_start_fidget = {FRAME_stand18, FRAME_stand21, parasite_frames_start_fidget, parasite_do_fidget};
        !            75: 
        !            76: mframe_t parasite_frames_fidget [] =
        !            77: {      
        !            78:        ai_stand, 0, parasite_scratch,
        !            79:        ai_stand, 0, NULL,
        !            80:        ai_stand, 0, NULL,
        !            81:        ai_stand, 0, parasite_scratch,
        !            82:        ai_stand, 0, NULL,
        !            83:        ai_stand, 0, NULL
        !            84: };
        !            85: mmove_t parasite_move_fidget = {FRAME_stand22, FRAME_stand27, parasite_frames_fidget, parasite_refidget};
        !            86: 
        !            87: mframe_t parasite_frames_end_fidget [] =
        !            88: {
        !            89:        ai_stand, 0, parasite_scratch,
        !            90:        ai_stand, 0, NULL,
        !            91:        ai_stand, 0, NULL,
        !            92:        ai_stand, 0, NULL,
        !            93:        ai_stand, 0, NULL,
        !            94:        ai_stand, 0, NULL,
        !            95:        ai_stand, 0, NULL,
        !            96:        ai_stand, 0, NULL
        !            97: };
        !            98: mmove_t parasite_move_end_fidget = {FRAME_stand28, FRAME_stand35, parasite_frames_end_fidget, parasite_stand};
        !            99: 
        !           100: void parasite_end_fidget (edict_t *self)
        !           101: {
        !           102:        self->monsterinfo.currentmove = &parasite_move_end_fidget;
        !           103: }
        !           104: 
        !           105: void parasite_do_fidget (edict_t *self)
        !           106: {
        !           107:        self->monsterinfo.currentmove = &parasite_move_fidget;
        !           108: }
        !           109: 
        !           110: void parasite_refidget (edict_t *self)
        !           111: { 
        !           112:        if (random() <= 0.8)
        !           113:                self->monsterinfo.currentmove = &parasite_move_fidget;
        !           114:        else
        !           115:                self->monsterinfo.currentmove = &parasite_move_end_fidget;
        !           116: }
        !           117: 
        !           118: void parasite_idle (edict_t *self)
        !           119: { 
        !           120:        self->monsterinfo.currentmove = &parasite_move_start_fidget;
        !           121: }
        !           122: 
        !           123: 
        !           124: mframe_t parasite_frames_stand [] =
        !           125: {
        !           126:        ai_stand, 0, NULL,
        !           127:        ai_stand, 0, NULL,
        !           128:        ai_stand, 0, parasite_tap,
        !           129:        ai_stand, 0, NULL,
        !           130:        ai_stand, 0, parasite_tap,
        !           131:        ai_stand, 0, NULL,
        !           132:        ai_stand, 0, NULL,
        !           133:        ai_stand, 0, NULL,
        !           134:        ai_stand, 0, parasite_tap,
        !           135:        ai_stand, 0, NULL,
        !           136:        ai_stand, 0, parasite_tap,
        !           137:        ai_stand, 0, NULL,
        !           138:        ai_stand, 0, NULL,
        !           139:        ai_stand, 0, NULL,
        !           140:        ai_stand, 0, parasite_tap,
        !           141:        ai_stand, 0, NULL,
        !           142:        ai_stand, 0, parasite_tap
        !           143: };
        !           144: mmove_t        parasite_move_stand = {FRAME_stand01, FRAME_stand17, parasite_frames_stand, parasite_stand};
        !           145: 
        !           146: void parasite_stand (edict_t *self)
        !           147: {
        !           148:        self->monsterinfo.currentmove = &parasite_move_stand;
        !           149: }
        !           150: 
        !           151: 
        !           152: mframe_t parasite_frames_run [] =
        !           153: {
        !           154:        ai_run, 30, NULL,
        !           155:        ai_run, 30, NULL,
        !           156:        ai_run, 22, NULL,
        !           157:        ai_run, 19, NULL,
        !           158:        ai_run, 24, NULL,
        !           159:        ai_run, 28, NULL,
        !           160:        ai_run, 25, NULL
        !           161: };
        !           162: mmove_t parasite_move_run = {FRAME_run03, FRAME_run09, parasite_frames_run, NULL};
        !           163: 
        !           164: mframe_t parasite_frames_start_run [] =
        !           165: {
        !           166:        ai_run, 0,      NULL,
        !           167:        ai_run, 30, NULL,
        !           168: };
        !           169: mmove_t parasite_move_start_run = {FRAME_run01, FRAME_run02, parasite_frames_start_run, parasite_run};
        !           170: 
        !           171: mframe_t parasite_frames_stop_run [] =
        !           172: {      
        !           173:        ai_run, 20, NULL,
        !           174:        ai_run, 20,     NULL,
        !           175:        ai_run, 12, NULL,
        !           176:        ai_run, 10, NULL,
        !           177:        ai_run, 0,  NULL,
        !           178:        ai_run, 0,  NULL
        !           179: };
        !           180: mmove_t parasite_move_stop_run = {FRAME_run10, FRAME_run15, parasite_frames_stop_run, NULL};
        !           181: 
        !           182: void parasite_start_run (edict_t *self)
        !           183: {      
        !           184:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
        !           185:                self->monsterinfo.currentmove = &parasite_move_stand;
        !           186:        else
        !           187:                self->monsterinfo.currentmove = &parasite_move_start_run;
        !           188: }
        !           189: 
        !           190: void parasite_run (edict_t *self)
        !           191: {
        !           192:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
        !           193:                self->monsterinfo.currentmove = &parasite_move_stand;
        !           194:        else
        !           195:                self->monsterinfo.currentmove = &parasite_move_run;
        !           196: }
        !           197: 
        !           198: 
        !           199: mframe_t parasite_frames_walk [] =
        !           200: {
        !           201:        ai_walk, 30, NULL,
        !           202:        ai_walk, 30, NULL,
        !           203:        ai_walk, 22, NULL,
        !           204:        ai_walk, 19, NULL,
        !           205:        ai_walk, 24, NULL,
        !           206:        ai_walk, 28, NULL,
        !           207:        ai_walk, 25, NULL
        !           208: };
        !           209: mmove_t parasite_move_walk = {FRAME_run03, FRAME_run09, parasite_frames_walk, parasite_walk};
        !           210: 
        !           211: mframe_t parasite_frames_start_walk [] =
        !           212: {
        !           213:        ai_walk, 0,     NULL,
        !           214:        ai_walk, 30, parasite_walk
        !           215: };
        !           216: mmove_t parasite_move_start_walk = {FRAME_run01, FRAME_run02, parasite_frames_start_walk, NULL};
        !           217: 
        !           218: mframe_t parasite_frames_stop_walk [] =
        !           219: {      
        !           220:        ai_walk, 20, NULL,
        !           221:        ai_walk, 20,    NULL,
        !           222:        ai_walk, 12, NULL,
        !           223:        ai_walk, 10, NULL,
        !           224:        ai_walk, 0,  NULL,
        !           225:        ai_walk, 0,  NULL
        !           226: };
        !           227: mmove_t parasite_move_stop_walk = {FRAME_run10, FRAME_run15, parasite_frames_stop_walk, NULL};
        !           228: 
        !           229: void parasite_start_walk (edict_t *self)
        !           230: {      
        !           231:        self->monsterinfo.currentmove = &parasite_move_start_walk;
        !           232: }
        !           233: 
        !           234: void parasite_walk (edict_t *self)
        !           235: {
        !           236:        self->monsterinfo.currentmove = &parasite_move_walk;
        !           237: }
        !           238: 
        !           239: 
        !           240: mframe_t parasite_frames_pain1 [] =
        !           241: {
        !           242:        ai_move, 0, NULL,
        !           243:        ai_move, 0, NULL,
        !           244:        ai_move, 0,     NULL,
        !           245:        ai_move, 0,     NULL,
        !           246:        ai_move, 0,     NULL,
        !           247:        ai_move, 0,     NULL,
        !           248:        ai_move, 6,     NULL,
        !           249:        ai_move, 16, NULL,
        !           250:        ai_move, -6, NULL,
        !           251:        ai_move, -7, NULL,
        !           252:        ai_move, 0, NULL
        !           253: };
        !           254: mmove_t parasite_move_pain1 = {FRAME_pain101, FRAME_pain111, parasite_frames_pain1, parasite_start_run};
        !           255: 
        !           256: void parasite_pain (edict_t *self, edict_t *other, float kick, int damage)
        !           257: {
        !           258:        if (self->health < (self->max_health / 2))
        !           259:                self->s.skinnum = 1;
        !           260: 
        !           261:        if (level.time < self->pain_debounce_time)
        !           262:                return;
        !           263: 
        !           264:        self->pain_debounce_time = level.time + 3;
        !           265: 
        !           266:        if (skill->value == 3)
        !           267:                return;         // no pain anims in nightmare
        !           268: 
        !           269:        if (random() < 0.5)
        !           270:                gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
        !           271:        else
        !           272:                gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
        !           273: 
        !           274:        self->monsterinfo.currentmove = &parasite_move_pain1;
        !           275: }
        !           276: 
        !           277: 
        !           278: static qboolean parasite_drain_attack_ok (vec3_t start, vec3_t end)
        !           279: {
        !           280:        vec3_t  dir, angles;
        !           281: 
        !           282:        // check for max distance
        !           283:        VectorSubtract (start, end, dir);
        !           284:        if (VectorLength(dir) > 256)
        !           285:                return false;
        !           286: 
        !           287:        // check for min/max pitch
        !           288:        vectoangles (dir, angles);
        !           289:        if (angles[0] < -180)
        !           290:                angles[0] += 360;
        !           291:        if (fabs(angles[0]) > 30)
        !           292:                return false;
        !           293: 
        !           294:        return true;
        !           295: }
        !           296: 
        !           297: void parasite_drain_attack (edict_t *self)
        !           298: {
        !           299:        vec3_t  offset, start, f, r, end, dir;
        !           300:        trace_t tr;
        !           301:        int damage;
        !           302: 
        !           303:        AngleVectors (self->s.angles, f, r, NULL);
        !           304:        VectorSet (offset, 24, 0, 6);
        !           305:        G_ProjectSource (self->s.origin, offset, f, r, start);
        !           306: 
        !           307:        VectorCopy (self->enemy->s.origin, end);
        !           308:        if (!parasite_drain_attack_ok(start, end))
        !           309:        {
        !           310:                end[2] = self->enemy->s.origin[2] + self->enemy->maxs[2] - 8;
        !           311:                if (!parasite_drain_attack_ok(start, end))
        !           312:                {
        !           313:                        end[2] = self->enemy->s.origin[2] + self->enemy->mins[2] + 8;
        !           314:                        if (!parasite_drain_attack_ok(start, end))
        !           315:                                return;
        !           316:                }
        !           317:        }
        !           318:        VectorCopy (self->enemy->s.origin, end);
        !           319: 
        !           320:        tr = gi.trace (start, NULL, NULL, end, self, MASK_SHOT);
        !           321:        if (tr.ent != self->enemy)
        !           322:                return;
        !           323: 
        !           324:        if (self->s.frame == FRAME_drain03)
        !           325:        {
        !           326:                damage = 5;
        !           327:                gi.sound (self->enemy, CHAN_AUTO, sound_impact, 1, ATTN_NORM, 0);
        !           328:        }
        !           329:        else
        !           330:        {
        !           331:                if (self->s.frame == FRAME_drain04)
        !           332:                        gi.sound (self, CHAN_WEAPON, sound_suck, 1, ATTN_NORM, 0);
        !           333:                damage = 2;
        !           334:        }
        !           335: 
        !           336:        gi.WriteByte (svc_temp_entity);
        !           337:        gi.WriteByte (TE_PARASITE_ATTACK);
        !           338:        gi.WriteShort (self - g_edicts);
        !           339:        gi.WritePosition (start);
        !           340:        gi.WritePosition (end);
        !           341:        gi.multicast (self->s.origin, MULTICAST_PVS);
        !           342: 
        !           343:        VectorSubtract (start, end, dir);
        !           344:        T_Damage (self->enemy, self, self, dir, self->enemy->s.origin, vec3_origin, damage, 0, DAMAGE_NO_KNOCKBACK, MOD_UNKNOWN);
        !           345: }
        !           346: 
        !           347: mframe_t parasite_frames_drain [] =
        !           348: {
        !           349:        ai_charge, 0,   parasite_launch,
        !           350:        ai_charge, 0,   NULL,
        !           351:        ai_charge, 15,  parasite_drain_attack,                  // Target hits
        !           352:        ai_charge, 0,   parasite_drain_attack,                  // drain
        !           353:        ai_charge, 0,   parasite_drain_attack,                  // drain
        !           354:        ai_charge, 0,   parasite_drain_attack,                  // drain
        !           355:        ai_charge, 0,   parasite_drain_attack,                  // drain
        !           356:        ai_charge, -2,  parasite_drain_attack,                  // drain
        !           357:        ai_charge, -2,  parasite_drain_attack,                  // drain
        !           358:        ai_charge, -3,  parasite_drain_attack,                  // drain
        !           359:        ai_charge, -2,  parasite_drain_attack,                  // drain
        !           360:        ai_charge, 0,   parasite_drain_attack,                  // drain
        !           361:        ai_charge, -1,  parasite_drain_attack,                  // drain
        !           362:        ai_charge, 0,   parasite_reel_in,                               // let go
        !           363:        ai_charge, -2,  NULL,
        !           364:        ai_charge, -2,  NULL,
        !           365:        ai_charge, -3,  NULL,
        !           366:        ai_charge, 0,   NULL
        !           367: };
        !           368: mmove_t parasite_move_drain = {FRAME_drain01, FRAME_drain18, parasite_frames_drain, parasite_start_run};
        !           369: 
        !           370: 
        !           371: mframe_t parasite_frames_break [] =
        !           372: {
        !           373:        ai_charge, 0,   NULL,
        !           374:        ai_charge, -3,  NULL,
        !           375:        ai_charge, 1,   NULL,
        !           376:        ai_charge, 2,   NULL,
        !           377:        ai_charge, -3,  NULL,
        !           378:        ai_charge, 1,   NULL,
        !           379:        ai_charge, 1,   NULL,
        !           380:        ai_charge, 3,   NULL,
        !           381:        ai_charge, 0,   NULL,
        !           382:        ai_charge, -18, NULL,
        !           383:        ai_charge, 3,   NULL,
        !           384:        ai_charge, 9,   NULL,
        !           385:        ai_charge, 6,   NULL,
        !           386:        ai_charge, 0,   NULL,
        !           387:        ai_charge, -18, NULL,
        !           388:        ai_charge, 0,   NULL,
        !           389:        ai_charge, 8,   NULL,
        !           390:        ai_charge, 9,   NULL,
        !           391:        ai_charge, 0,   NULL,
        !           392:        ai_charge, -18, NULL,
        !           393:        ai_charge, 0,   NULL,
        !           394:        ai_charge, 0,   NULL,           // airborne
        !           395:        ai_charge, 0,   NULL,           // airborne
        !           396:        ai_charge, 0,   NULL,           // slides
        !           397:        ai_charge, 0,   NULL,           // slides
        !           398:        ai_charge, 0,   NULL,           // slides
        !           399:        ai_charge, 0,   NULL,           // slides
        !           400:        ai_charge, 4,   NULL,
        !           401:        ai_charge, 11,  NULL,           
        !           402:        ai_charge, -2,  NULL,
        !           403:        ai_charge, -5,  NULL,
        !           404:        ai_charge, 1,   NULL
        !           405: };
        !           406: mmove_t parasite_move_break = {FRAME_break01, FRAME_break32, parasite_frames_break, parasite_start_run};
        !           407: 
        !           408: /*
        !           409: === 
        !           410: Break Stuff Ends
        !           411: ===
        !           412: */
        !           413: 
        !           414: void parasite_attack (edict_t *self)
        !           415: {
        !           416: //     if (random() <= 0.2)
        !           417: //             self->monsterinfo.currentmove = &parasite_move_break;
        !           418: //     else
        !           419:                self->monsterinfo.currentmove = &parasite_move_drain;
        !           420: }
        !           421: 
        !           422: 
        !           423: //================
        !           424: //ROGUE
        !           425: void parasite_jump_down (edict_t *self)
        !           426: {
        !           427:        vec3_t  forward,up;
        !           428: 
        !           429:        AngleVectors (self->s.angles, forward, NULL, up);
        !           430:        VectorMA(self->velocity, 100, forward, self->velocity);
        !           431:        VectorMA(self->velocity, 300, up, self->velocity);
        !           432: }
        !           433: 
        !           434: void parasite_jump_up (edict_t *self)
        !           435: {
        !           436:        vec3_t  forward,up;
        !           437: 
        !           438:        AngleVectors (self->s.angles, forward, NULL, up);
        !           439:        VectorMA(self->velocity, 200, forward, self->velocity);
        !           440:        VectorMA(self->velocity, 450, up, self->velocity);
        !           441: }
        !           442: 
        !           443: void parasite_jump_wait_land (edict_t *self)
        !           444: {
        !           445:        if(self->groundentity == NULL)
        !           446:                self->monsterinfo.nextframe = self->s.frame;
        !           447:        else 
        !           448:                self->monsterinfo.nextframe = self->s.frame + 1;
        !           449: }
        !           450: 
        !           451: mframe_t parasite_frames_jump_up [] =
        !           452: {
        !           453:        ai_move, -8, NULL,
        !           454:        ai_move, -8, NULL,
        !           455:        ai_move, -8, NULL,
        !           456:        ai_move, -8, parasite_jump_up,
        !           457:        ai_move, 0, NULL,
        !           458:        ai_move, 0, NULL,
        !           459:        ai_move, 0, parasite_jump_wait_land,
        !           460:        ai_move, 0, NULL
        !           461: };
        !           462: mmove_t parasite_move_jump_up = { FRAME_jump01, FRAME_jump08, parasite_frames_jump_up, parasite_run };
        !           463: 
        !           464: mframe_t parasite_frames_jump_down [] =
        !           465: {
        !           466:        ai_move, 0, NULL,
        !           467:        ai_move, 0, NULL,
        !           468:        ai_move, 0, NULL,
        !           469:        ai_move, 0, parasite_jump_down,
        !           470:        ai_move, 0, NULL,
        !           471:        ai_move, 0, NULL,
        !           472:        ai_move, 0, parasite_jump_wait_land,
        !           473:        ai_move, 0, NULL
        !           474: };
        !           475: mmove_t parasite_move_jump_down = { FRAME_jump01, FRAME_jump08, parasite_frames_jump_down, parasite_run };
        !           476: 
        !           477: void parasite_jump (edict_t *self)
        !           478: {
        !           479:        if(!self->enemy)
        !           480:                return;
        !           481: 
        !           482:        if(self->enemy->s.origin[2] > self->s.origin[2])
        !           483:                self->monsterinfo.currentmove = &parasite_move_jump_up;
        !           484:        else
        !           485:                self->monsterinfo.currentmove = &parasite_move_jump_down;
        !           486: }
        !           487: 
        !           488: /*
        !           489: ===
        !           490: Blocked
        !           491: ===
        !           492: */
        !           493: qboolean parasite_blocked (edict_t *self, float dist)
        !           494: {
        !           495:        if(blocked_checkshot (self, 0.25 + (0.05 * skill->value) ))
        !           496:                return true;
        !           497: 
        !           498:        if(blocked_checkjump (self, dist, 256, 68))
        !           499:        {
        !           500:                parasite_jump (self);
        !           501:                return true;
        !           502:        }
        !           503: 
        !           504:        if(blocked_checkplat (self, dist))
        !           505:                return true;
        !           506: }
        !           507: //ROGUE
        !           508: //================
        !           509: 
        !           510: 
        !           511: 
        !           512: /*
        !           513: ===
        !           514: Death Stuff Starts
        !           515: ===
        !           516: */
        !           517: 
        !           518: void parasite_dead (edict_t *self)
        !           519: {
        !           520:        VectorSet (self->mins, -16, -16, -24);
        !           521:        VectorSet (self->maxs, 16, 16, -8);
        !           522:        self->movetype = MOVETYPE_TOSS;
        !           523:        self->svflags |= SVF_DEADMONSTER;
        !           524:        self->nextthink = 0;
        !           525:        gi.linkentity (self);
        !           526: }
        !           527: 
        !           528: mframe_t parasite_frames_death [] =
        !           529: {
        !           530:        ai_move, 0,      NULL,
        !           531:        ai_move, 0,      NULL,
        !           532:        ai_move, 0,      NULL,
        !           533:        ai_move, 0,      NULL,
        !           534:        ai_move, 0,      NULL,
        !           535:        ai_move, 0,      NULL,
        !           536:        ai_move, 0,      NULL
        !           537: };
        !           538: mmove_t parasite_move_death = {FRAME_death101, FRAME_death107, parasite_frames_death, parasite_dead};
        !           539: 
        !           540: void parasite_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
        !           541: {
        !           542:        int             n;
        !           543: 
        !           544: // check for gib
        !           545:        if (self->health <= self->gib_health)
        !           546:        {
        !           547:                gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
        !           548:                for (n= 0; n < 2; n++)
        !           549:                        ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
        !           550:                for (n= 0; n < 4; n++)
        !           551:                        ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
        !           552:                ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
        !           553:                self->deadflag = DEAD_DEAD;
        !           554:                return;
        !           555:        }
        !           556: 
        !           557:        if (self->deadflag == DEAD_DEAD)
        !           558:                return;
        !           559: 
        !           560: // regular death
        !           561:        gi.sound (self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0);
        !           562:        self->deadflag = DEAD_DEAD;
        !           563:        self->takedamage = DAMAGE_YES;
        !           564:        self->monsterinfo.currentmove = &parasite_move_death;
        !           565: }
        !           566: 
        !           567: /*
        !           568: ===
        !           569: End Death Stuff
        !           570: ===
        !           571: */
        !           572: 
        !           573: /*QUAKED monster_parasite (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
        !           574: */
        !           575: void SP_monster_parasite (edict_t *self)
        !           576: {
        !           577:        if (deathmatch->value)
        !           578:        {
        !           579:                G_FreeEdict (self);
        !           580:                return;
        !           581:        }
        !           582: 
        !           583:        sound_pain1 = gi.soundindex ("parasite/parpain1.wav");  
        !           584:        sound_pain2 = gi.soundindex ("parasite/parpain2.wav");  
        !           585:        sound_die = gi.soundindex ("parasite/pardeth1.wav");    
        !           586:        sound_launch = gi.soundindex("parasite/paratck1.wav");
        !           587:        sound_impact = gi.soundindex("parasite/paratck2.wav");
        !           588:        sound_suck = gi.soundindex("parasite/paratck3.wav");
        !           589:        sound_reelin = gi.soundindex("parasite/paratck4.wav");
        !           590:        sound_sight = gi.soundindex("parasite/parsght1.wav");
        !           591:        sound_tap = gi.soundindex("parasite/paridle1.wav");
        !           592:        sound_scratch = gi.soundindex("parasite/paridle2.wav");
        !           593:        sound_search = gi.soundindex("parasite/parsrch1.wav");
        !           594: 
        !           595:        self->s.modelindex = gi.modelindex ("models/monsters/parasite/tris.md2");
        !           596:        VectorSet (self->mins, -16, -16, -24);
        !           597:        VectorSet (self->maxs, 16, 16, 24);
        !           598:        self->movetype = MOVETYPE_STEP;
        !           599:        self->solid = SOLID_BBOX;
        !           600: 
        !           601:        self->health = 175;
        !           602:        self->gib_health = -50;
        !           603:        self->mass = 250;
        !           604: 
        !           605:        self->pain = parasite_pain;
        !           606:        self->die = parasite_die;
        !           607: 
        !           608:        self->monsterinfo.stand = parasite_stand;
        !           609:        self->monsterinfo.walk = parasite_start_walk;
        !           610:        self->monsterinfo.run = parasite_start_run;
        !           611:        self->monsterinfo.attack = parasite_attack;
        !           612:        self->monsterinfo.sight = parasite_sight;
        !           613:        self->monsterinfo.idle = parasite_idle;
        !           614:        self->monsterinfo.blocked = parasite_blocked;           // PGM
        !           615: 
        !           616:        gi.linkentity (self);
        !           617: 
        !           618:        self->monsterinfo.currentmove = &parasite_move_stand;   
        !           619:        self->monsterinfo.scale = MODEL_SCALE;
        !           620: 
        !           621:        walkmonster_start (self);
        !           622: }

unix.superglobalmegacorp.com

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