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

1.1       root        1: /*
                      2: ==============================================================================
                      3: 
                      4: BERSERK
                      5: 
                      6: ==============================================================================
                      7: */
                      8: 
                      9: #include "g_local.h"
                     10: #include "m_berserk.h"
                     11: 
                     12: 
                     13: static int sound_pain;
                     14: static int sound_die;
                     15: static int sound_idle;
                     16: static int sound_punch;
                     17: static int sound_sight;
                     18: static int sound_search;
                     19: 
                     20: void berserk_sight (edict_t *self, edict_t *other)
                     21: {
                     22:        gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
                     23: }
                     24: 
                     25: void berserk_search (edict_t *self)
                     26: {
                     27:        gi.sound (self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
                     28: }
                     29: 
                     30: 
                     31: void berserk_fidget (edict_t *self);
                     32: mframe_t berserk_frames_stand [] =
                     33: {
                     34:        ai_stand, 0, berserk_fidget,
                     35:        ai_stand, 0, NULL,
                     36:        ai_stand, 0, NULL,
                     37:        ai_stand, 0, NULL,
                     38:        ai_stand, 0, NULL
                     39: };
                     40: mmove_t berserk_move_stand = {FRAME_stand1, FRAME_stand5, berserk_frames_stand, NULL};
                     41: 
                     42: void berserk_stand (edict_t *self)
                     43: {
                     44:        self->monsterinfo.currentmove = &berserk_move_stand;
                     45: }
                     46: 
                     47: mframe_t berserk_frames_stand_fidget [] =
                     48: {
                     49:        ai_stand, 0, NULL,
                     50:        ai_stand, 0, NULL,
                     51:        ai_stand, 0, NULL,
                     52:        ai_stand, 0, NULL,
                     53:        ai_stand, 0, NULL,
                     54:        ai_stand, 0, NULL,
                     55:        ai_stand, 0, NULL,
                     56:        ai_stand, 0, NULL,
                     57:        ai_stand, 0, NULL,
                     58:        ai_stand, 0, NULL,
                     59:        ai_stand, 0, NULL,
                     60:        ai_stand, 0, NULL,
                     61:        ai_stand, 0, NULL,
                     62:        ai_stand, 0, NULL,
                     63:        ai_stand, 0, NULL,
                     64:        ai_stand, 0, NULL,
                     65:        ai_stand, 0, NULL,
                     66:        ai_stand, 0, NULL,
                     67:        ai_stand, 0, NULL,
                     68:        ai_stand, 0, NULL
                     69: };
                     70: mmove_t berserk_move_stand_fidget = {FRAME_standb1, FRAME_standb20, berserk_frames_stand_fidget, berserk_stand};
                     71: 
                     72: void berserk_fidget (edict_t *self)
                     73: {
                     74:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
                     75:                return;
                     76:        if (random() > 0.15)
                     77:                return;
                     78: 
                     79:        self->monsterinfo.currentmove = &berserk_move_stand_fidget;
                     80:        gi.sound (self, CHAN_WEAPON, sound_idle, 1, ATTN_IDLE, 0);
                     81: }
                     82: 
                     83: 
                     84: mframe_t berserk_frames_walk [] =
                     85: {
                     86:        ai_walk, 9.1, NULL,
                     87:        ai_walk, 6.3, NULL,
                     88:        ai_walk, 4.9, NULL,
                     89:        ai_walk, 6.7, NULL,
                     90:        ai_walk, 6.0, NULL,
                     91:        ai_walk, 8.2, NULL,
                     92:        ai_walk, 7.2, NULL,
                     93:        ai_walk, 6.1, NULL,
                     94:        ai_walk, 4.9, NULL,
                     95:        ai_walk, 4.7, NULL,
                     96:        ai_walk, 4.7, NULL,
                     97:        ai_walk, 4.8, NULL
                     98: };
                     99: mmove_t berserk_move_walk = {FRAME_walkc1, FRAME_walkc11, berserk_frames_walk, NULL};
                    100: 
                    101: void berserk_walk (edict_t *self)
                    102: {
                    103:        self->monsterinfo.currentmove = &berserk_move_walk;
                    104: }
                    105: 
                    106: /*
                    107: 
                    108:   *****************************
                    109:   SKIPPED THIS FOR NOW!
                    110:   *****************************
                    111: 
                    112:    Running -> Arm raised in air
                    113: 
                    114: void() berserk_runb1   =[      $r_att1 ,       berserk_runb2   ] {ai_run(21);};
                    115: void() berserk_runb2   =[      $r_att2 ,       berserk_runb3   ] {ai_run(11);};
                    116: void() berserk_runb3   =[      $r_att3 ,       berserk_runb4   ] {ai_run(21);};
                    117: void() berserk_runb4   =[      $r_att4 ,       berserk_runb5   ] {ai_run(25);};
                    118: void() berserk_runb5   =[      $r_att5 ,       berserk_runb6   ] {ai_run(18);};
                    119: void() berserk_runb6   =[      $r_att6 ,       berserk_runb7   ] {ai_run(19);};
                    120: // running with arm in air : start loop
                    121: void() berserk_runb7   =[      $r_att7 ,       berserk_runb8   ] {ai_run(21);};
                    122: void() berserk_runb8   =[      $r_att8 ,       berserk_runb9   ] {ai_run(11);};
                    123: void() berserk_runb9   =[      $r_att9 ,       berserk_runb10  ] {ai_run(21);};
                    124: void() berserk_runb10  =[      $r_att10 ,      berserk_runb11  ] {ai_run(25);};
                    125: void() berserk_runb11  =[      $r_att11 ,      berserk_runb12  ] {ai_run(18);};
                    126: void() berserk_runb12  =[      $r_att12 ,      berserk_runb7   ] {ai_run(19);};
                    127: // running with arm in air : end loop
                    128: */
                    129: 
                    130: 
                    131: mframe_t berserk_frames_run1 [] =
                    132: {
                    133:        ai_run, 21, NULL,
                    134:        ai_run, 11, NULL,
                    135:        ai_run, 21, NULL,
                    136:        // PMM .. from NULL
                    137:        ai_run, 25, monster_done_dodge,
                    138:        ai_run, 18, NULL,
                    139:        ai_run, 19, NULL
                    140: };
                    141: mmove_t berserk_move_run1 = {FRAME_run1, FRAME_run6, berserk_frames_run1, NULL};
                    142: 
                    143: void berserk_run (edict_t *self)
                    144: {
                    145:        monster_done_dodge (self);
                    146:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
                    147:                self->monsterinfo.currentmove = &berserk_move_stand;
                    148:        else
                    149:                self->monsterinfo.currentmove = &berserk_move_run1;
                    150: }
                    151: 
                    152: 
                    153: void berserk_attack_spike (edict_t *self)
                    154: {
                    155:        static  vec3_t  aim = {MELEE_DISTANCE, 0, -24};
                    156:        fire_hit (self, aim, (15 + (rand() % 6)), 400);         //      Faster attack -- upwards and backwards
                    157: }
                    158: 
                    159: 
                    160: void berserk_swing (edict_t *self)
                    161: {
                    162:        gi.sound (self, CHAN_WEAPON, sound_punch, 1, ATTN_NORM, 0);
                    163: }
                    164: 
                    165: mframe_t berserk_frames_attack_spike [] =
                    166: {
                    167:                ai_charge, 0, NULL,
                    168:                ai_charge, 0, NULL,
                    169:                ai_charge, 0, berserk_swing,
                    170:                ai_charge, 0, berserk_attack_spike,
                    171:                ai_charge, 0, NULL,
                    172:                ai_charge, 0, NULL,
                    173:                ai_charge, 0, NULL,
                    174:                ai_charge, 0, NULL
                    175: };
                    176: mmove_t berserk_move_attack_spike = {FRAME_att_c1, FRAME_att_c8, berserk_frames_attack_spike, berserk_run};
                    177: 
                    178: 
                    179: void berserk_attack_club (edict_t *self)
                    180: {
                    181:        vec3_t  aim;
                    182: 
                    183:        VectorSet (aim, MELEE_DISTANCE, self->mins[0], -4);
                    184:        fire_hit (self, aim, (5 + (rand() % 6)), 400);          // Slower attack
                    185: }
                    186: 
                    187: mframe_t berserk_frames_attack_club [] =
                    188: {      
                    189:        ai_charge, 0, NULL,
                    190:        ai_charge, 0, NULL,
                    191:        ai_charge, 0, NULL,
                    192:        ai_charge, 0, NULL,
                    193:        ai_charge, 0, berserk_swing,
                    194:        ai_charge, 0, NULL,
                    195:        ai_charge, 0, NULL,
                    196:        ai_charge, 0, NULL,
                    197:        ai_charge, 0, berserk_attack_club,
                    198:        ai_charge, 0, NULL,
                    199:        ai_charge, 0, NULL,
                    200:        ai_charge, 0, NULL
                    201: };
                    202: mmove_t berserk_move_attack_club = {FRAME_att_c9, FRAME_att_c20, berserk_frames_attack_club, berserk_run};
                    203: 
                    204: 
                    205: void berserk_strike (edict_t *self)
                    206: {
                    207:        //FIXME play impact sound
                    208: }
                    209: 
                    210: 
                    211: mframe_t berserk_frames_attack_strike [] =
                    212: {
                    213:        ai_move, 0, NULL,
                    214:        ai_move, 0, NULL,
                    215:        ai_move, 0, NULL,
                    216:        ai_move, 0, berserk_swing,
                    217:        ai_move, 0, NULL,
                    218:        ai_move, 0, NULL,
                    219:        ai_move, 0, NULL,
                    220:        ai_move, 0, berserk_strike,
                    221:        ai_move, 0, NULL,
                    222:        ai_move, 0, NULL,
                    223:        ai_move, 0, NULL,
                    224:        ai_move, 0, NULL,
                    225:        ai_move, 9.7, NULL,
                    226:        ai_move, 13.6, NULL
                    227: };
                    228:        
                    229: mmove_t berserk_move_attack_strike = {FRAME_att_c21, FRAME_att_c34, berserk_frames_attack_strike, berserk_run};
                    230: 
                    231: 
                    232: void berserk_melee (edict_t *self)
                    233: {
                    234:        monster_done_dodge (self);
                    235: 
                    236:        if ((rand() % 2) == 0)
                    237:                self->monsterinfo.currentmove = &berserk_move_attack_spike;
                    238:        else
                    239:                self->monsterinfo.currentmove = &berserk_move_attack_club;
                    240: }
                    241: 
                    242: 
                    243: /*
                    244: void()         berserk_atke1   =[      $r_attb1,       berserk_atke2   ] {ai_run(9);};
                    245: void()         berserk_atke2   =[      $r_attb2,       berserk_atke3   ] {ai_run(6);};
                    246: void()         berserk_atke3   =[      $r_attb3,       berserk_atke4   ] {ai_run(18.4);};
                    247: void()         berserk_atke4   =[      $r_attb4,       berserk_atke5   ] {ai_run(25);};
                    248: void()         berserk_atke5   =[      $r_attb5,       berserk_atke6   ] {ai_run(14);};
                    249: void()         berserk_atke6   =[      $r_attb6,       berserk_atke7   ] {ai_run(20);};
                    250: void()         berserk_atke7   =[      $r_attb7,       berserk_atke8   ] {ai_run(8.5);};
                    251: void()         berserk_atke8   =[      $r_attb8,       berserk_atke9   ] {ai_run(3);};
                    252: void()         berserk_atke9   =[      $r_attb9,       berserk_atke10  ] {ai_run(17.5);};
                    253: void()         berserk_atke10  =[      $r_attb10,      berserk_atke11  ] {ai_run(17);};
                    254: void()         berserk_atke11  =[      $r_attb11,      berserk_atke12  ] {ai_run(9);};
                    255: void()         berserk_atke12  =[      $r_attb12,      berserk_atke13  ] {ai_run(25);};
                    256: void()         berserk_atke13  =[      $r_attb13,      berserk_atke14  ] {ai_run(3.7);};
                    257: void()         berserk_atke14  =[      $r_attb14,      berserk_atke15  ] {ai_run(2.6);};
                    258: void()         berserk_atke15  =[      $r_attb15,      berserk_atke16  ] {ai_run(19);};
                    259: void()         berserk_atke16  =[      $r_attb16,      berserk_atke17  ] {ai_run(25);};
                    260: void()         berserk_atke17  =[      $r_attb17,      berserk_atke18  ] {ai_run(19.6);};
                    261: void()         berserk_atke18  =[      $r_attb18,      berserk_run1    ] {ai_run(7.8);};
                    262: */
                    263: 
                    264: 
                    265: mframe_t berserk_frames_pain1 [] =
                    266: {
                    267:        ai_move, 0, NULL,
                    268:        ai_move, 0, NULL,
                    269:        ai_move, 0, NULL,
                    270:        ai_move, 0, NULL
                    271: };
                    272: mmove_t berserk_move_pain1 = {FRAME_painc1, FRAME_painc4, berserk_frames_pain1, berserk_run};
                    273: 
                    274: 
                    275: mframe_t berserk_frames_pain2 [] =
                    276: {
                    277:        ai_move, 0, NULL,
                    278:        ai_move, 0, NULL,
                    279:        ai_move, 0, NULL,
                    280:        ai_move, 0, NULL,
                    281:        ai_move, 0, NULL,
                    282:        ai_move, 0, NULL,
                    283:        ai_move, 0, NULL,
                    284:        ai_move, 0, NULL,
                    285:        ai_move, 0, NULL,
                    286:        ai_move, 0, NULL,
                    287:        ai_move, 0, NULL,
                    288:        ai_move, 0, NULL,
                    289:        ai_move, 0, NULL,
                    290:        ai_move, 0, NULL,
                    291:        ai_move, 0, NULL,
                    292:        ai_move, 0, NULL,
                    293:        ai_move, 0, NULL,
                    294:        ai_move, 0, NULL,
                    295:        ai_move, 0, NULL,
                    296:        ai_move, 0, NULL
                    297: };
                    298: mmove_t berserk_move_pain2 = {FRAME_painb1, FRAME_painb20, berserk_frames_pain2, berserk_run};
                    299: 
                    300: void berserk_pain (edict_t *self, edict_t *other, float kick, int damage)
                    301: {
                    302:        if (self->health < (self->max_health / 2))
                    303:                self->s.skinnum = 1;
                    304: 
                    305:        if (level.time < self->pain_debounce_time)
                    306:                return;
                    307: 
                    308:        self->pain_debounce_time = level.time + 3;
                    309:        gi.sound (self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0);
                    310: 
                    311:        if (skill->value == 3)
                    312:                return;         // no pain anims in nightmare
                    313: 
                    314:        monster_done_dodge (self);
                    315: 
                    316:        if ((damage < 20) || (random() < 0.5))
                    317:                self->monsterinfo.currentmove = &berserk_move_pain1;
                    318:        else
                    319:                self->monsterinfo.currentmove = &berserk_move_pain2;
                    320: }
                    321: 
                    322: 
                    323: void berserk_dead (edict_t *self)
                    324: {
                    325:        VectorSet (self->mins, -16, -16, -24);
                    326:        VectorSet (self->maxs, 16, 16, -8);
                    327:        self->movetype = MOVETYPE_TOSS;
                    328:        self->svflags |= SVF_DEADMONSTER;
                    329:        self->nextthink = 0;
                    330:        gi.linkentity (self);
                    331: }
                    332: 
                    333: 
                    334: mframe_t berserk_frames_death1 [] =
                    335: {
                    336:        ai_move, 0, NULL,
                    337:        ai_move, 0, NULL,
                    338:        ai_move, 0, NULL,
                    339:        ai_move, 0, NULL,
                    340:        ai_move, 0, NULL,
                    341:        ai_move, 0, NULL,
                    342:        ai_move, 0, NULL,
                    343:        ai_move, 0, NULL,
                    344:        ai_move, 0, NULL,
                    345:        ai_move, 0, NULL,
                    346:        ai_move, 0, NULL,
                    347:        ai_move, 0, NULL,
                    348:        ai_move, 0, NULL
                    349:        
                    350: };
                    351: mmove_t berserk_move_death1 = {FRAME_death1, FRAME_death13, berserk_frames_death1, berserk_dead};
                    352: 
                    353: 
                    354: mframe_t berserk_frames_death2 [] =
                    355: {
                    356:        ai_move, 0, NULL,
                    357:        ai_move, 0, NULL,
                    358:        ai_move, 0, NULL,
                    359:        ai_move, 0, NULL,
                    360:        ai_move, 0, NULL,
                    361:        ai_move, 0, NULL,
                    362:        ai_move, 0, NULL,
                    363:        ai_move, 0, NULL
                    364: };
                    365: mmove_t berserk_move_death2 = {FRAME_deathc1, FRAME_deathc8, berserk_frames_death2, berserk_dead};
                    366: 
                    367: 
                    368: void berserk_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
                    369: {
                    370:        int             n;
                    371: 
                    372:        if (self->health <= self->gib_health)
                    373:        {
                    374:                gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
                    375:                for (n= 0; n < 2; n++)
                    376:                        ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
                    377:                for (n= 0; n < 4; n++)
                    378:                        ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
                    379:                ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
                    380:                self->deadflag = DEAD_DEAD;
                    381:                return;
                    382:        }
                    383: 
                    384:        if (self->deadflag == DEAD_DEAD)
                    385:                return;
                    386: 
                    387:        gi.sound (self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0);
                    388:        self->deadflag = DEAD_DEAD;
                    389:        self->takedamage = DAMAGE_YES;
                    390: 
                    391:        if (damage >= 50)
                    392:                self->monsterinfo.currentmove = &berserk_move_death1;
                    393:        else
                    394:                self->monsterinfo.currentmove = &berserk_move_death2;
                    395: }
                    396: 
                    397: //===========
                    398: //PGM
                    399: void berserk_jump_now (edict_t *self)
                    400: {
                    401:        vec3_t  forward,up;
                    402: 
                    403:        AngleVectors (self->s.angles, forward, NULL, up);
                    404:        VectorMA(self->velocity, 100, forward, self->velocity);
                    405:        VectorMA(self->velocity, 300, up, self->velocity);
                    406: }
                    407: 
                    408: void berserk_jump2_now (edict_t *self)
                    409: {
                    410:        vec3_t  forward,up;
                    411: 
                    412:        AngleVectors (self->s.angles, forward, NULL, up);
                    413:        VectorMA(self->velocity, 150, forward, self->velocity);
                    414:        VectorMA(self->velocity, 400, up, self->velocity);
                    415: }
                    416: 
                    417: void berserk_jump_wait_land (edict_t *self)
                    418: {
                    419:        if(self->groundentity == NULL)
                    420:                self->monsterinfo.nextframe = self->s.frame;
                    421:        else 
                    422:                self->monsterinfo.nextframe = self->s.frame + 1;
                    423: }
                    424: 
                    425: mframe_t berserk_frames_jump [] =
                    426: {
                    427:        ai_move, 0, NULL,
                    428:        ai_move, 0, NULL,
                    429:        ai_move, 0, NULL,
                    430:        ai_move, 0, berserk_jump_now,
                    431:        ai_move, 0, NULL,
                    432:        ai_move, 0, NULL,
                    433:        ai_move, 0, berserk_jump_wait_land,
                    434:        ai_move, 0, NULL,
                    435:        ai_move, 0, NULL
                    436: };
                    437: mmove_t berserk_move_jump = { FRAME_jump1, FRAME_jump9, berserk_frames_jump, berserk_run };
                    438: 
                    439: mframe_t berserk_frames_jump2 [] =
                    440: {
                    441:        ai_move, -8, NULL,
                    442:        ai_move, -4, NULL,
                    443:        ai_move, -4, NULL,
                    444:        ai_move, 0, berserk_jump_now,
                    445:        ai_move, 0, NULL,
                    446:        ai_move, 0, NULL,
                    447:        ai_move, 0, berserk_jump_wait_land,
                    448:        ai_move, 0, NULL,
                    449:        ai_move, 0, NULL
                    450: };
                    451: mmove_t berserk_move_jump2 = { FRAME_jump1, FRAME_jump9, berserk_frames_jump2, berserk_run };
                    452: 
                    453: void berserk_jump (edict_t *self)
                    454: {
                    455:        if(!self->enemy)
                    456:                return;
                    457: 
                    458:        monster_done_dodge (self);
                    459: 
                    460:        if(self->enemy->s.origin[2] > self->s.origin[2])
                    461:                self->monsterinfo.currentmove = &berserk_move_jump2;
                    462:        else
                    463:                self->monsterinfo.currentmove = &berserk_move_jump;
                    464: }
                    465: 
                    466: qboolean berserk_blocked (edict_t *self, float dist)
                    467: {
                    468:        if(blocked_checkjump (self, dist, 256, 40))
                    469:        {
                    470:                berserk_jump(self);
                    471:                return true;
                    472:        }
                    473: 
                    474:        if(blocked_checkplat (self, dist))
                    475:                return true;
                    476: 
                    477:        return false;
                    478: }
                    479: //PGM
                    480: //===========
                    481: 
                    482: void berserk_sidestep (edict_t *self)
                    483: {
                    484:        // if we're jumping, don't dodge
                    485:        if ((self->monsterinfo.currentmove == &berserk_move_jump) ||
                    486:                (self->monsterinfo.currentmove == &berserk_move_jump2))
                    487:        {
                    488:                return;
                    489:        }
                    490: 
                    491:        // don't check for attack; the eta should suffice for melee monsters
                    492: 
                    493:        if (self->monsterinfo.currentmove != &berserk_move_run1)
                    494:                self->monsterinfo.currentmove = &berserk_move_run1;
                    495: }
                    496: 
                    497: 
                    498: /*QUAKED monster_berserk (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
                    499: */
                    500: void SP_monster_berserk (edict_t *self)
                    501: {
                    502:        if (deathmatch->value)
                    503:        {
                    504:                G_FreeEdict (self);
                    505:                return;
                    506:        }
                    507: 
                    508:        // pre-caches
                    509:        sound_pain  = gi.soundindex ("berserk/berpain2.wav");
                    510:        sound_die   = gi.soundindex ("berserk/berdeth2.wav");
                    511:        sound_idle  = gi.soundindex ("berserk/beridle1.wav");
                    512:        sound_punch = gi.soundindex ("berserk/attack.wav");
                    513:        sound_search = gi.soundindex ("berserk/bersrch1.wav");
                    514:        sound_sight = gi.soundindex ("berserk/sight.wav");
                    515: 
                    516:        self->s.modelindex = gi.modelindex("models/monsters/berserk/tris.md2");
                    517:        VectorSet (self->mins, -16, -16, -24);
                    518:        VectorSet (self->maxs, 16, 16, 32);
                    519:        self->movetype = MOVETYPE_STEP;
                    520:        self->solid = SOLID_BBOX;
                    521: 
                    522:        self->health = 240;
                    523:        self->gib_health = -60;
                    524:        self->mass = 250;
                    525: 
                    526:        self->pain = berserk_pain;
                    527:        self->die = berserk_die;
                    528: 
                    529:        self->monsterinfo.stand = berserk_stand;
                    530:        self->monsterinfo.walk = berserk_walk;
                    531:        self->monsterinfo.run = berserk_run;
                    532:        // pmm
                    533: //     self->monsterinfo.dodge = NULL;
                    534:        self->monsterinfo.dodge = M_MonsterDodge;
                    535:        self->monsterinfo.sidestep = berserk_sidestep;
                    536:        // pmm
                    537:        self->monsterinfo.attack = NULL;
                    538:        self->monsterinfo.melee = berserk_melee;
                    539:        self->monsterinfo.sight = berserk_sight;
                    540:        self->monsterinfo.search = berserk_search;
                    541:        self->monsterinfo.blocked = berserk_blocked;            //PGM
                    542: 
                    543:        self->monsterinfo.currentmove = &berserk_move_stand;
                    544:        self->monsterinfo.scale = MODEL_SCALE;
                    545: 
                    546:        gi.linkentity (self);
                    547: 
                    548:        walkmonster_start (self);
                    549: }

unix.superglobalmegacorp.com

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