Annotation of quake2/xatrix/m_brain.c, revision 1.1.1.1

1.1       root        1: /*
                      2: ==============================================================================
                      3: 
                      4: brain
                      5: 
                      6: ==============================================================================
                      7: */
                      8: 
                      9: #include "g_local.h"
                     10: #include "m_brain.h"
                     11: 
                     12: 
                     13: static int     sound_chest_open;
                     14: static int     sound_tentacles_extend;
                     15: static int     sound_tentacles_retract;
                     16: static int     sound_death;
                     17: static int     sound_idle1;
                     18: static int     sound_idle2;
                     19: static int     sound_idle3;
                     20: static int     sound_pain1;
                     21: static int     sound_pain2;
                     22: static int     sound_sight;
                     23: static int     sound_search;
                     24: static int     sound_melee1;
                     25: static int     sound_melee2;
                     26: static int     sound_melee3;
                     27: 
                     28: 
                     29: void brain_sight (edict_t *self, edict_t *other)
                     30: {
                     31:        gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
                     32: }
                     33: 
                     34: void brain_search (edict_t *self)
                     35: {
                     36:        gi.sound (self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
                     37: }
                     38: 
                     39: 
                     40: void brain_run (edict_t *self);
                     41: void brain_dead (edict_t *self);
                     42: 
                     43: 
                     44: //
                     45: // STAND
                     46: //
                     47: 
                     48: mframe_t brain_frames_stand [] =
                     49: {
                     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: 
                     61:        ai_stand,       0,      NULL,
                     62:        ai_stand,       0,      NULL,
                     63:        ai_stand,       0,      NULL,
                     64:        ai_stand,       0,      NULL,
                     65:        ai_stand,       0,      NULL,
                     66:        ai_stand,       0,      NULL,
                     67:        ai_stand,       0,      NULL,
                     68:        ai_stand,       0,      NULL,
                     69:        ai_stand,       0,      NULL,
                     70:        ai_stand,       0,      NULL,
                     71: 
                     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: mmove_t brain_move_stand = {FRAME_stand01, FRAME_stand30, brain_frames_stand, NULL};
                     84: 
                     85: void brain_stand (edict_t *self)
                     86: {
                     87:        self->monsterinfo.currentmove = &brain_move_stand;
                     88: }
                     89: 
                     90: 
                     91: //
                     92: // IDLE
                     93: //
                     94: 
                     95: mframe_t brain_frames_idle [] =
                     96: {
                     97:        ai_stand,       0,      NULL,
                     98:        ai_stand,       0,      NULL,
                     99:        ai_stand,       0,      NULL,
                    100:        ai_stand,       0,      NULL,
                    101:        ai_stand,       0,      NULL,
                    102:        ai_stand,       0,      NULL,
                    103:        ai_stand,       0,      NULL,
                    104:        ai_stand,       0,      NULL,
                    105:        ai_stand,       0,      NULL,
                    106:        ai_stand,       0,      NULL,
                    107: 
                    108:        ai_stand,       0,      NULL,
                    109:        ai_stand,       0,      NULL,
                    110:        ai_stand,       0,      NULL,
                    111:        ai_stand,       0,      NULL,
                    112:        ai_stand,       0,      NULL,
                    113:        ai_stand,       0,      NULL,
                    114:        ai_stand,       0,      NULL,
                    115:        ai_stand,       0,      NULL,
                    116:        ai_stand,       0,      NULL,
                    117:        ai_stand,       0,      NULL,
                    118: 
                    119:        ai_stand,       0,      NULL,
                    120:        ai_stand,       0,      NULL,
                    121:        ai_stand,       0,      NULL,
                    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: };
                    130: mmove_t brain_move_idle = {FRAME_stand31, FRAME_stand60, brain_frames_idle, brain_stand};
                    131: 
                    132: void brain_idle (edict_t *self)
                    133: {
                    134:        gi.sound (self, CHAN_AUTO, sound_idle3, 1, ATTN_IDLE, 0);
                    135:        self->monsterinfo.currentmove = &brain_move_idle;
                    136: }
                    137: 
                    138: 
                    139: //
                    140: // WALK
                    141: //
                    142: mframe_t brain_frames_walk1 [] =
                    143: {
                    144:        ai_walk,        7,      NULL,
                    145:        ai_walk,        2,      NULL,
                    146:        ai_walk,        3,      NULL,
                    147:        ai_walk,        3,      NULL,
                    148:        ai_walk,        1,      NULL,
                    149:        ai_walk,        0,      NULL,
                    150:        ai_walk,        0,      NULL,
                    151:        ai_walk,        9,      NULL,
                    152:        ai_walk,        -4,     NULL,
                    153:        ai_walk,        -1,     NULL,
                    154:        ai_walk,        2,      NULL
                    155: };
                    156: mmove_t brain_move_walk1 = {FRAME_walk101, FRAME_walk111, brain_frames_walk1, NULL};
                    157: 
                    158: // walk2 is FUBAR, do not use
                    159: #if 0
                    160: void brain_walk2_cycle (edict_t *self)
                    161: {
                    162:        if (random() > 0.1)
                    163:                self->monsterinfo.nextframe = FRAME_walk220;
                    164: }
                    165: 
                    166: mframe_t brain_frames_walk2 [] =
                    167: {
                    168:        ai_walk,        3,      NULL,
                    169:        ai_walk,        -2,     NULL,
                    170:        ai_walk,        -4,     NULL,
                    171:        ai_walk,        -3,     NULL,
                    172:        ai_walk,        0,      NULL,
                    173:        ai_walk,        1,      NULL,
                    174:        ai_walk,        12,     NULL,
                    175:        ai_walk,        0,      NULL,
                    176:        ai_walk,        -3,     NULL,
                    177:        ai_walk,        0,      NULL,
                    178: 
                    179:        ai_walk,        -2,     NULL,
                    180:        ai_walk,        0,      NULL,
                    181:        ai_walk,        0,      NULL,
                    182:        ai_walk,        1,      NULL,
                    183:        ai_walk,        0,      NULL,
                    184:        ai_walk,        0,      NULL,
                    185:        ai_walk,        0,      NULL,
                    186:        ai_walk,        0,      NULL,
                    187:        ai_walk,        0,      NULL,
                    188:        ai_walk,        10,     NULL,           // Cycle Start
                    189: 
                    190:        ai_walk,        -1,     NULL,
                    191:        ai_walk,        7,      NULL,
                    192:        ai_walk,        0,      NULL,
                    193:        ai_walk,        3,      NULL,
                    194:        ai_walk,        -3,     NULL,
                    195:        ai_walk,        2,      NULL,
                    196:        ai_walk,        4,      NULL,
                    197:        ai_walk,        -3,     NULL,
                    198:        ai_walk,        2,      NULL,
                    199:        ai_walk,        0,      NULL,
                    200: 
                    201:        ai_walk,        4,      brain_walk2_cycle,
                    202:        ai_walk,        -1,     NULL,
                    203:        ai_walk,        -1,     NULL,
                    204:        ai_walk,        -8,     NULL,           
                    205:        ai_walk,        0,      NULL,
                    206:        ai_walk,        1,      NULL,
                    207:        ai_walk,        5,      NULL,
                    208:        ai_walk,        2,      NULL,
                    209:        ai_walk,        -1,     NULL,
                    210:        ai_walk,        -5,     NULL
                    211: };
                    212: mmove_t brain_move_walk2 = {FRAME_walk201, FRAME_walk240, brain_frames_walk2, NULL};
                    213: #endif
                    214: 
                    215: void brain_walk (edict_t *self)
                    216: {
                    217: //     if (random() <= 0.5)
                    218:                self->monsterinfo.currentmove = &brain_move_walk1;
                    219: //     else
                    220: //             self->monsterinfo.currentmove = &brain_move_walk2;
                    221: }
                    222: 
                    223: 
                    224: 
                    225: mframe_t brain_frames_defense [] =
                    226: {
                    227:        ai_move,        0,      NULL,
                    228:        ai_move,        0,      NULL,
                    229:        ai_move,        0,      NULL,
                    230:        ai_move,        0,      NULL,
                    231:        ai_move,        0,      NULL,
                    232:        ai_move,        0,      NULL,
                    233:        ai_move,        0,      NULL,
                    234:        ai_move,        0,      NULL,
                    235:        ai_move,        0,      NULL
                    236: };
                    237: mmove_t brain_move_defense = {FRAME_defens01, FRAME_defens08, brain_frames_defense, NULL};
                    238: 
                    239: mframe_t brain_frames_pain3 [] =
                    240: {
                    241:        ai_move,        -2,     NULL,
                    242:        ai_move,        2,      NULL,
                    243:        ai_move,        1,      NULL,
                    244:        ai_move,        3,      NULL,
                    245:        ai_move,        0,      NULL,
                    246:        ai_move,        -4,     NULL
                    247: };
                    248: mmove_t brain_move_pain3 = {FRAME_pain301, FRAME_pain306, brain_frames_pain3, brain_run};
                    249: 
                    250: mframe_t brain_frames_pain2 [] =
                    251: {
                    252:        ai_move,        -2,     NULL,
                    253:        ai_move,        0,      NULL,
                    254:        ai_move,        0,      NULL,
                    255:        ai_move,        0,      NULL,
                    256:        ai_move,        0,      NULL,
                    257:        ai_move,        3,      NULL,
                    258:        ai_move,        1,      NULL,
                    259:        ai_move,        -2,     NULL
                    260: };
                    261: mmove_t brain_move_pain2 = {FRAME_pain201, FRAME_pain208, brain_frames_pain2, brain_run};
                    262: 
                    263: mframe_t brain_frames_pain1 [] =
                    264: {
                    265:        ai_move,        -6,     NULL,
                    266:        ai_move,        -2,     NULL,
                    267:        ai_move,        -6,     NULL,
                    268:        ai_move,        0,      NULL,
                    269:        ai_move,        0,      NULL,
                    270:        ai_move,        0,      NULL,
                    271:        ai_move,        0,      NULL,
                    272:        ai_move,        0,      NULL,
                    273:        ai_move,        0,      NULL,
                    274:        ai_move,        0,      NULL,
                    275:        ai_move,        0,      NULL,
                    276:        ai_move,        0,      NULL,
                    277:        ai_move,        0,      NULL,
                    278:        ai_move,        2,      NULL,
                    279:        ai_move,        0,      NULL,
                    280:        ai_move,        2,      NULL,
                    281:        ai_move,        1,      NULL,
                    282:        ai_move,        7,      NULL,
                    283:        ai_move,        0,      NULL,
                    284:        ai_move,        3,      NULL,
                    285:        ai_move,        -1,     NULL
                    286: };
                    287: mmove_t brain_move_pain1 = {FRAME_pain101, FRAME_pain121, brain_frames_pain1, brain_run};
                    288: 
                    289: 
                    290: //
                    291: // DUCK
                    292: //
                    293: 
                    294: void brain_duck_down (edict_t *self)
                    295: {
                    296:        if (self->monsterinfo.aiflags & AI_DUCKED)
                    297:                return;
                    298:        self->monsterinfo.aiflags |= AI_DUCKED;
                    299:        self->maxs[2] -= 32;
                    300:        self->takedamage = DAMAGE_YES;
                    301:        gi.linkentity (self);
                    302: }
                    303: 
                    304: void brain_duck_hold (edict_t *self)
                    305: {
                    306:        if (level.time >= self->monsterinfo.pausetime)
                    307:                self->monsterinfo.aiflags &= ~AI_HOLD_FRAME;
                    308:        else
                    309:                self->monsterinfo.aiflags |= AI_HOLD_FRAME;
                    310: }
                    311: 
                    312: void brain_duck_up (edict_t *self)
                    313: {
                    314:        self->monsterinfo.aiflags &= ~AI_DUCKED;
                    315:        self->maxs[2] += 32;
                    316:        self->takedamage = DAMAGE_AIM;
                    317:        gi.linkentity (self);
                    318: }
                    319: 
                    320: mframe_t brain_frames_duck [] =
                    321: {
                    322:        ai_move,        0,      NULL,
                    323:        ai_move,        -2,     brain_duck_down,
                    324:        ai_move,        17,     brain_duck_hold,
                    325:        ai_move,        -3,     NULL,
                    326:        ai_move,        -1,     brain_duck_up,
                    327:        ai_move,        -5,     NULL,
                    328:        ai_move,        -6,     NULL,
                    329:        ai_move,        -6,     NULL
                    330: };
                    331: mmove_t brain_move_duck = {FRAME_duck01, FRAME_duck08, brain_frames_duck, brain_run};
                    332: 
                    333: void brain_dodge (edict_t *self, edict_t *attacker, float eta)
                    334: {
                    335:        if (random() > 0.25)
                    336:                return;
                    337: 
                    338:        if (!self->enemy)
                    339:                self->enemy = attacker;
                    340: 
                    341:        self->monsterinfo.pausetime = level.time + eta + 0.5;
                    342:        self->monsterinfo.currentmove = &brain_move_duck;
                    343: }
                    344: 
                    345: 
                    346: mframe_t brain_frames_death2 [] =
                    347: {
                    348:        ai_move,        0,      NULL,
                    349:        ai_move,        0,      NULL,
                    350:        ai_move,        0,      NULL,
                    351:        ai_move,        9,      NULL,
                    352:        ai_move,        0,      NULL
                    353: };
                    354: mmove_t brain_move_death2 = {FRAME_death201, FRAME_death205, brain_frames_death2, brain_dead};
                    355: 
                    356: mframe_t brain_frames_death1 [] =
                    357: {
                    358:        ai_move,        0,      NULL,
                    359:        ai_move,        0,      NULL,
                    360:        ai_move,        -2,     NULL,
                    361:        ai_move,        9,      NULL,
                    362:        ai_move,        0,      NULL,
                    363:        ai_move,        0,      NULL,
                    364:        ai_move,        0,      NULL,
                    365:        ai_move,        0,      NULL,
                    366:        ai_move,        0,      NULL,
                    367:        ai_move,        0,      NULL,
                    368:        ai_move,        0,      NULL,
                    369:        ai_move,        0,      NULL,
                    370:        ai_move,        0,      NULL,
                    371:        ai_move,        0,      NULL,
                    372:        ai_move,        0,      NULL,
                    373:        ai_move,        0,      NULL,
                    374:        ai_move,        0,      NULL,
                    375:        ai_move,        0,      NULL
                    376: };
                    377: mmove_t brain_move_death1 = {FRAME_death101, FRAME_death118, brain_frames_death1, brain_dead};
                    378: 
                    379: 
                    380: //
                    381: // MELEE
                    382: //
                    383: 
                    384: void brain_swing_right (edict_t *self)
                    385: {
                    386:        gi.sound (self, CHAN_BODY, sound_melee1, 1, ATTN_NORM, 0);
                    387: }
                    388: 
                    389: void brain_hit_right (edict_t *self)
                    390: {
                    391:        vec3_t  aim;
                    392: 
                    393:        VectorSet (aim, MELEE_DISTANCE, self->maxs[0], 8);
                    394:        if (fire_hit (self, aim, (15 + (rand() %5)), 40))
                    395:                gi.sound (self, CHAN_WEAPON, sound_melee3, 1, ATTN_NORM, 0);
                    396: }
                    397: 
                    398: void brain_swing_left (edict_t *self)
                    399: {
                    400:        gi.sound (self, CHAN_BODY, sound_melee2, 1, ATTN_NORM, 0);
                    401: }
                    402: 
                    403: void brain_hit_left (edict_t *self)
                    404: {
                    405:        vec3_t  aim;
                    406: 
                    407:        VectorSet (aim, MELEE_DISTANCE, self->mins[0], 8);
                    408:        if (fire_hit (self, aim, (15 + (rand() %5)), 40))
                    409:                gi.sound (self, CHAN_WEAPON, sound_melee3, 1, ATTN_NORM, 0);
                    410: }
                    411: 
                    412: mframe_t brain_frames_attack1 [] =
                    413: {
                    414:        ai_charge,      8,      NULL,
                    415:        ai_charge,      3,      NULL,
                    416:        ai_charge,      5,      NULL,
                    417:        ai_charge,      0,      NULL,
                    418:        ai_charge,      -3,     brain_swing_right,
                    419:        ai_charge,      0,      NULL,
                    420:        ai_charge,      -5,     NULL,
                    421:        ai_charge,      -7,     brain_hit_right,
                    422:        ai_charge,      0,      NULL,
                    423:        ai_charge,      6,      brain_swing_left,
                    424:        ai_charge,      1,      NULL,
                    425:        ai_charge,      2,      brain_hit_left,
                    426:        ai_charge,      -3,     NULL,
                    427:        ai_charge,      6,      NULL,
                    428:        ai_charge,      -1,     NULL,
                    429:        ai_charge,      -3,     NULL,
                    430:        ai_charge,      2,      NULL,
                    431:        ai_charge,      -11,NULL
                    432: };
                    433: mmove_t brain_move_attack1 = {FRAME_attak101, FRAME_attak118, brain_frames_attack1, brain_run};
                    434: 
                    435: void brain_chest_open (edict_t *self)
                    436: {
                    437:        self->spawnflags &= ~65536;
                    438:        self->monsterinfo.power_armor_type = POWER_ARMOR_NONE;
                    439:        gi.sound (self, CHAN_BODY, sound_chest_open, 1, ATTN_NORM, 0);
                    440: }
                    441: 
                    442: void brain_tentacle_attack (edict_t *self)
                    443: {
                    444:        vec3_t  aim;
                    445: 
                    446:        VectorSet (aim, MELEE_DISTANCE, 0, 8);
                    447:        if (fire_hit (self, aim, (10 + (rand() %5)), -600) && skill->value > 0)
                    448:                self->spawnflags |= 65536;
                    449:        gi.sound (self, CHAN_WEAPON, sound_tentacles_retract, 1, ATTN_NORM, 0);
                    450: }
                    451: 
                    452: void brain_chest_closed (edict_t *self)
                    453: {
                    454:        self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
                    455:        if (self->spawnflags & 65536)
                    456:        {
                    457:                self->spawnflags &= ~65536;
                    458:                self->monsterinfo.currentmove = &brain_move_attack1;
                    459:        }
                    460: }
                    461: 
                    462: mframe_t brain_frames_attack2 [] =
                    463: {
                    464:        ai_charge,      5,      NULL,
                    465:        ai_charge,      -4,     NULL,
                    466:        ai_charge,      -4,     NULL,
                    467:        ai_charge,      -3,     NULL,
                    468:        ai_charge,      0,      brain_chest_open,
                    469:        ai_charge,      0,      NULL,
                    470:        ai_charge,      13,     brain_tentacle_attack,
                    471:        ai_charge,      0,      NULL,
                    472:        ai_charge,      2,      NULL,
                    473:        ai_charge,      0,      NULL,
                    474:        ai_charge,      -9,     brain_chest_closed,
                    475:        ai_charge,      0,      NULL,
                    476:        ai_charge,      4,      NULL,
                    477:        ai_charge,      3,      NULL,
                    478:        ai_charge,      2,      NULL,
                    479:        ai_charge,      -3,     NULL,
                    480:        ai_charge,      -6,     NULL
                    481: };
                    482: mmove_t brain_move_attack2 = {FRAME_attak201, FRAME_attak217, brain_frames_attack2, brain_run};
                    483: 
                    484: void brain_melee(edict_t *self)
                    485: {
                    486:        if (random() <= 0.5)
                    487:                self->monsterinfo.currentmove = &brain_move_attack1;
                    488:        else
                    489:                self->monsterinfo.currentmove = &brain_move_attack2;
                    490: }
                    491: 
                    492: static qboolean brain_tounge_attack_ok (vec3_t start, vec3_t end)
                    493: {
                    494:        vec3_t  dir, angles;
                    495: 
                    496:        // check for max distance
                    497:        VectorSubtract (start, end, dir);
                    498:        if (VectorLength(dir) > 512)
                    499:                return false;
                    500: 
                    501:        // check for min/max pitch
                    502:        vectoangles (dir, angles);
                    503:        if (angles[0] < -180)
                    504:                angles[0] += 360;
                    505:        if (fabs(angles[0]) > 30)
                    506:                return false;
                    507: 
                    508:        return true;
                    509: }
                    510: 
                    511: void brain_tounge_attack (edict_t *self)
                    512: {
                    513:        vec3_t  offset, start, f, r, end, dir;
                    514:        trace_t tr;
                    515:        int damage;
                    516: 
                    517:        AngleVectors (self->s.angles, f, r, NULL);
                    518:        // VectorSet (offset, 24, 0, 6);
                    519:        VectorSet (offset, 24, 0, 16);
                    520:        G_ProjectSource (self->s.origin, offset, f, r, start);
                    521: 
                    522:        VectorCopy (self->enemy->s.origin, end);
                    523:        if (!brain_tounge_attack_ok(start, end))
                    524:        {
                    525:                end[2] = self->enemy->s.origin[2] + self->enemy->maxs[2] - 8;
                    526:                if (!brain_tounge_attack_ok(start, end))
                    527:                {
                    528:                        end[2] = self->enemy->s.origin[2] + self->enemy->mins[2] + 8;
                    529:                        if (!brain_tounge_attack_ok(start, end))
                    530:                                return;
                    531:                }
                    532:        }
                    533:        VectorCopy (self->enemy->s.origin, end);
                    534: 
                    535:        tr = gi.trace (start, NULL, NULL, end, self, MASK_SHOT);
                    536:        if (tr.ent != self->enemy)
                    537:                return;
                    538: 
                    539:        damage = 5;
                    540:        gi.sound (self, CHAN_WEAPON, sound_tentacles_retract, 1, ATTN_NORM, 0);
                    541: 
                    542:        gi.WriteByte (svc_temp_entity);
                    543:        gi.WriteByte (TE_PARASITE_ATTACK);
                    544:        gi.WriteShort (self - g_edicts);
                    545:        gi.WritePosition (start);
                    546:        gi.WritePosition (end);
                    547:        gi.multicast (self->s.origin, MULTICAST_PVS);
                    548: 
                    549:        VectorSubtract (start, end, dir);
                    550:        T_Damage (self->enemy, self, self, dir, self->enemy->s.origin, vec3_origin, damage, 0, DAMAGE_NO_KNOCKBACK, MOD_BRAINTENTACLE);
                    551: 
                    552:        // pull the enemy in
                    553:        {
                    554:                vec3_t  forward;
                    555:                self->s.origin[2] += 1;
                    556:                AngleVectors (self->s.angles, forward, NULL, NULL);
                    557:                VectorScale (forward, -1200, self->enemy->velocity);
                    558:        }
                    559:        
                    560: }
                    561: 
                    562: // Brian right eye center
                    563: 
                    564: struct r_eyeball 
                    565: {
                    566:        float x;
                    567:        float y;
                    568:        float z;
                    569: } brain_reye [11] = {
                    570:                {  0.746700, 0.238370, 34.167690 },
                    571:         {  -1.076390, 0.238370, 33.386372 },
                    572:         {  -1.335500, 5.334300, 32.177170 },
                    573:         {  -0.175360, 8.846370, 30.635479 },
                    574:         {  -2.757590, 7.804610, 30.150860 },
                    575:         {  -5.575090, 5.152840, 30.056160 },
                    576:         {  -7.017550, 3.262470, 30.552521 },
                    577:         {  -7.915740, 0.638800, 33.176189 },
                    578:         {  -3.915390, 8.285730, 33.976349 },
                    579:         {  -0.913540, 10.933030, 34.141811 },
                    580:         {  -0.369900, 8.923900, 34.189079 }
                    581: };
                    582: 
                    583: 
                    584: 
                    585: // Brain left eye center
                    586: struct l_eyeball
                    587: {
                    588:        float x;
                    589:        float y;
                    590:        float z;
                    591: } brain_leye [11] = {
                    592:         {  -3.364710, 0.327750, 33.938381 },
                    593:         {  -5.140450, 0.493480, 32.659851 },
                    594:         {  -5.341980, 5.646980, 31.277901 },
                    595:         {  -4.134480, 9.277440, 29.925621 },
                    596:         {  -6.598340, 6.815090, 29.322620 },
                    597:         {  -8.610840, 2.529650, 29.251591 },
                    598:         {  -9.231360, 0.093280, 29.747959 },
                    599:         {  -11.004110, 1.936930, 32.395260 },
                    600:         {  -7.878310, 7.648190, 33.148151 },
                    601:         {  -4.947370, 11.430050, 33.313610 },
                    602:         {  -4.332820, 9.444570, 33.526340 }
                    603: };
                    604: 
                    605: // note to self
                    606: // need to get an x,y,z offset for
                    607: // each frame of the run cycle
                    608: void brain_laserbeam (edict_t *self)
                    609: {
                    610:  
                    611:        vec3_t forward, right, up;
                    612:        vec3_t tempang, start;
                    613:        vec3_t  dir, angles, end;
                    614:        edict_t *ent;
                    615: 
                    616:        // RAFAEL
                    617:        // cant call sound this frequent
                    618:        if (random() > 0.8)
                    619:                gi.sound(self, CHAN_AUTO, gi.soundindex("misc/lasfly.wav"), 1, ATTN_STATIC, 0);
                    620: 
                    621:        // check for max distance
                    622:        
                    623:        VectorCopy (self->s.origin, start);
                    624:        VectorCopy (self->enemy->s.origin, end);
                    625:        VectorSubtract (end, start, dir);
                    626:        vectoangles (dir, angles);
                    627:        
                    628:        // dis is my right eye
                    629:        ent = G_Spawn ();
                    630:        VectorCopy (self->s.origin, ent->s.origin);
                    631:        VectorCopy (angles, tempang);
                    632:        AngleVectors (tempang, forward, right, up);
                    633:        VectorCopy (tempang, ent->s.angles);
                    634:        VectorCopy (ent->s.origin, start);
                    635:        VectorMA (start, brain_reye[self->s.frame - FRAME_walk101].x, right, start);
                    636:        VectorMA (start, brain_reye[self->s.frame - FRAME_walk101].y, forward, start);
                    637:        VectorMA (start, brain_reye[self->s.frame - FRAME_walk101].z, up, start);
                    638:        VectorCopy (start, ent->s.origin);
                    639:        ent->enemy = self->enemy;
                    640:        ent->owner = self;
                    641:        ent->dmg = 1;
                    642:        monster_dabeam (ent);
                    643:    
                    644:        // dis is me left eye
                    645:        ent = G_Spawn ();  
                    646:        VectorCopy (self->s.origin, ent->s.origin);
                    647:        VectorCopy (angles, tempang);
                    648:        AngleVectors (tempang, forward, right, up);
                    649:        VectorCopy (tempang, ent->s.angles);
                    650:        VectorCopy (ent->s.origin, start);
                    651:        VectorMA (start, brain_leye[self->s.frame - FRAME_walk101].x, right, start);
                    652:        VectorMA (start, brain_leye[self->s.frame - FRAME_walk101].y, forward, start);
                    653:        VectorMA (start, brain_leye[self->s.frame - FRAME_walk101].z, up, start);
                    654:        VectorCopy (start, ent->s.origin);
                    655:        ent->enemy = self->enemy;
                    656:        ent->owner = self;
                    657:        ent->dmg = 1;
                    658:        monster_dabeam (ent);
                    659:        
                    660: }
                    661: 
                    662: void brain_laserbeam_reattack (edict_t *self)
                    663: {
                    664:        if (random() < 0.5)
                    665:                if (visible (self, self->enemy))
                    666:                        if (self->enemy->health > 0)
                    667:                                self->s.frame = FRAME_walk101;
                    668: }
                    669: 
                    670: 
                    671: mframe_t brain_frames_attack3 [] =
                    672: {
                    673:        ai_charge,      5,      NULL,
                    674:        ai_charge,      -4,     NULL,
                    675:        ai_charge,      -4,     NULL,
                    676:        ai_charge,      -3,     NULL,
                    677:        ai_charge,      0,      brain_chest_open,
                    678:        ai_charge,      0,      brain_tounge_attack,
                    679:        ai_charge,      13,     NULL,
                    680:        ai_charge,      0,      brain_tentacle_attack,
                    681:        ai_charge,      2,      NULL,
                    682:        ai_charge,      0,      brain_tounge_attack,
                    683:        ai_charge,      -9,     brain_chest_closed,
                    684:        ai_charge,      0,      NULL,
                    685:        ai_charge,      4,      NULL,
                    686:        ai_charge,      3,      NULL,
                    687:        ai_charge,      2,      NULL,
                    688:        ai_charge,      -3,     NULL,
                    689:        ai_charge,      -6,     NULL
                    690: };
                    691: mmove_t brain_move_attack3 = {FRAME_attak201, FRAME_attak217, brain_frames_attack3, brain_run};
                    692: 
                    693: mframe_t brain_frames_attack4 [] =
                    694: {
                    695:        ai_charge,      9,      brain_laserbeam,
                    696:        ai_charge,      2,      brain_laserbeam,
                    697:        ai_charge,      3,      brain_laserbeam,
                    698:        ai_charge,      3,      brain_laserbeam,
                    699:        ai_charge,      1,      brain_laserbeam,
                    700:        ai_charge,      0,      brain_laserbeam,
                    701:        ai_charge,      0,      brain_laserbeam,
                    702:        ai_charge,      10,     brain_laserbeam,
                    703:        ai_charge,      -4,     brain_laserbeam,
                    704:        ai_charge,      -1,     brain_laserbeam,
                    705:        ai_charge,      2,      brain_laserbeam_reattack
                    706: };
                    707: mmove_t brain_move_attack4 = {FRAME_walk101, FRAME_walk111, brain_frames_attack4, brain_run};
                    708: 
                    709: 
                    710: // RAFAEL
                    711: void brain_attack (edict_t *self)
                    712: {
                    713:        int r;
                    714:        
                    715:        if (random() < 0.8)
                    716:        {
                    717:                r = range (self, self->enemy);
                    718:                if (r == RANGE_NEAR)
                    719:                {
                    720:                        if (random() < 0.5)
                    721:                                self->monsterinfo.currentmove = &brain_move_attack3;
                    722:                        else 
                    723:                                self->monsterinfo.currentmove = &brain_move_attack4;
                    724:                }
                    725:                else if (r > RANGE_NEAR)
                    726:                        self->monsterinfo.currentmove = &brain_move_attack4;
                    727:        }
                    728:        
                    729: }
                    730: 
                    731: //
                    732: // RUN
                    733: //
                    734: 
                    735: mframe_t brain_frames_run [] =
                    736: {
                    737:        ai_run, 9,      NULL,
                    738:        ai_run, 2,      NULL,
                    739:        ai_run, 3,      NULL,
                    740:        ai_run, 3,      NULL,
                    741:        ai_run, 1,      NULL,
                    742:        ai_run, 0,      NULL,
                    743:        ai_run, 0,      NULL,
                    744:        ai_run, 10,     NULL,
                    745:        ai_run, -4,     NULL,
                    746:        ai_run, -1,     NULL,
                    747:        ai_run, 2,      NULL
                    748: };
                    749: mmove_t brain_move_run = {FRAME_walk101, FRAME_walk111, brain_frames_run, NULL};
                    750: 
                    751: void brain_run (edict_t *self)
                    752: {
                    753:        self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
                    754:        if (self->monsterinfo.aiflags & AI_STAND_GROUND)
                    755:                self->monsterinfo.currentmove = &brain_move_stand;
                    756:        else
                    757:                self->monsterinfo.currentmove = &brain_move_run;
                    758: }
                    759: 
                    760: 
                    761: void brain_pain (edict_t *self, edict_t *other, float kick, int damage)
                    762: {
                    763:        float   r;
                    764: 
                    765:        if (self->health < (self->max_health / 2))
                    766:                self->s.skinnum = 1;
                    767: 
                    768:        if (level.time < self->pain_debounce_time)
                    769:                return;
                    770: 
                    771:        self->pain_debounce_time = level.time + 3;
                    772: 
                    773:        r = random();
                    774:        if (r < 0.33)
                    775:        {
                    776:                gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
                    777:                self->monsterinfo.currentmove = &brain_move_pain1;
                    778:        }
                    779:        else if (r < 0.66)
                    780:        {
                    781:                gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
                    782:                self->monsterinfo.currentmove = &brain_move_pain2;
                    783:        }
                    784:        else
                    785:        {
                    786:                gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
                    787:                self->monsterinfo.currentmove = &brain_move_pain3;
                    788:        }
                    789: }
                    790: 
                    791: void brain_dead (edict_t *self)
                    792: {
                    793:        VectorSet (self->mins, -16, -16, -24);
                    794:        VectorSet (self->maxs, 16, 16, -8);
                    795:        self->movetype = MOVETYPE_TOSS;
                    796:        self->svflags |= SVF_DEADMONSTER;
                    797:        self->nextthink = 0;
                    798:        gi.linkentity (self);
                    799: }
                    800: 
                    801: 
                    802: 
                    803: void brain_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
                    804: {
                    805:        int             n;
                    806: 
                    807:        self->s.effects = 0;
                    808:        self->monsterinfo.power_armor_type = POWER_ARMOR_NONE;
                    809: 
                    810: // check for gib
                    811:        if (self->health <= self->gib_health)
                    812:        {
                    813:                gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
                    814:                for (n= 0; n < 2; n++)
                    815:                        ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
                    816:                for (n= 0; n < 4; n++)
                    817:                        ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
                    818:                ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
                    819:                self->deadflag = DEAD_DEAD;
                    820:                return;
                    821:        }
                    822: 
                    823:        if (self->deadflag == DEAD_DEAD)
                    824:                return;
                    825: 
                    826: // regular death
                    827:        gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
                    828:        self->deadflag = DEAD_DEAD;
                    829:        self->takedamage = DAMAGE_YES;
                    830:        if (random() <= 0.5)
                    831:                self->monsterinfo.currentmove = &brain_move_death1;
                    832:        else
                    833:                self->monsterinfo.currentmove = &brain_move_death2;
                    834: }
                    835: 
                    836: /*QUAKED monster_brain (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
                    837: */
                    838: void SP_monster_brain (edict_t *self)
                    839: {
                    840:        if (deathmatch->value)
                    841:        {
                    842:                G_FreeEdict (self);
                    843:                return;
                    844:        }
                    845: 
                    846:        sound_chest_open = gi.soundindex ("brain/brnatck1.wav");
                    847:        sound_tentacles_extend = gi.soundindex ("brain/brnatck2.wav");
                    848:        sound_tentacles_retract = gi.soundindex ("brain/brnatck3.wav");
                    849:        sound_death = gi.soundindex ("brain/brndeth1.wav");
                    850:        sound_idle1 = gi.soundindex ("brain/brnidle1.wav");
                    851:        sound_idle2 = gi.soundindex ("brain/brnidle2.wav");
                    852:        sound_idle3 = gi.soundindex ("brain/brnlens1.wav");
                    853:        sound_pain1 = gi.soundindex ("brain/brnpain1.wav");
                    854:        sound_pain2 = gi.soundindex ("brain/brnpain2.wav");
                    855:        sound_sight = gi.soundindex ("brain/brnsght1.wav");
                    856:        sound_search = gi.soundindex ("brain/brnsrch1.wav");
                    857:        sound_melee1 = gi.soundindex ("brain/melee1.wav");
                    858:        sound_melee2 = gi.soundindex ("brain/melee2.wav");
                    859:        sound_melee3 = gi.soundindex ("brain/melee3.wav");
                    860: 
                    861:        self->movetype = MOVETYPE_STEP;
                    862:        self->solid = SOLID_BBOX;
                    863:        self->s.modelindex = gi.modelindex ("models/monsters/brain/tris.md2");
                    864:        VectorSet (self->mins, -16, -16, -24);
                    865:        VectorSet (self->maxs, 16, 16, 32);
                    866: 
                    867:        self->health = 300;
                    868:        self->gib_health = -150;
                    869:        self->mass = 400;
                    870: 
                    871:        self->pain = brain_pain;
                    872:        self->die = brain_die;
                    873: 
                    874:        self->monsterinfo.stand = brain_stand;
                    875:        self->monsterinfo.walk = brain_walk;
                    876:        self->monsterinfo.run = brain_run;
                    877:        self->monsterinfo.dodge = brain_dodge;
                    878:        self->monsterinfo.attack = brain_attack;
                    879:        self->monsterinfo.melee = brain_melee;
                    880:        self->monsterinfo.sight = brain_sight;
                    881:        self->monsterinfo.search = brain_search;
                    882:        self->monsterinfo.idle = brain_idle;
                    883: 
                    884:        self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
                    885:        self->monsterinfo.power_armor_power = 100;
                    886: 
                    887:        gi.linkentity (self);
                    888: 
                    889:        self->monsterinfo.currentmove = &brain_move_stand;      
                    890:        self->monsterinfo.scale = MODEL_SCALE;
                    891: 
                    892:        walkmonster_start (self);
                    893: }

unix.superglobalmegacorp.com

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