|
|
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: mframe_t brain_frames_duck [] = ! 290: { ! 291: ai_move, 0, NULL, ! 292: ai_move, -2, monster_duck_down, ! 293: ai_move, 17, monster_duck_hold, ! 294: ai_move, -3, NULL, ! 295: ai_move, -1, monster_duck_up, ! 296: ai_move, -5, NULL, ! 297: ai_move, -6, NULL, ! 298: ai_move, -6, NULL ! 299: }; ! 300: mmove_t brain_move_duck = {FRAME_duck01, FRAME_duck08, brain_frames_duck, brain_run}; ! 301: ! 302: /* ! 303: void brain_dodge (edict_t *self, edict_t *attacker, float eta, trace_t *tr) ! 304: { ! 305: //======== ! 306: //PMM - new dodge code ! 307: float r; ! 308: float height; ! 309: ! 310: if (!self->enemy) ! 311: { ! 312: self->enemy = attacker; ! 313: FoundTarget (self); ! 314: } ! 315: ! 316: // PMM - don't bother if it's going to hit anyway; fix for weird in-your-face etas (I was ! 317: // seeing numbers like 13 and 14) ! 318: if ((eta < 0.1) || (eta > 5)) ! 319: return; ! 320: ! 321: r = random(); ! 322: if (r > (0.25*((skill->value)+1))) ! 323: return; ! 324: ! 325: if (self->monsterinfo.aiflags & AI_DODGING) ! 326: { ! 327: height = self->absmax[2]; ! 328: } ! 329: else ! 330: { ! 331: height = self->absmax[2]-32-1; // the -1 is because the absmax is s.origin + maxs + 1 ! 332: } ! 333: ! 334: // check to see if it makes sense to duck ! 335: if (tr->endpos[2] <= height) ! 336: { ! 337: // if it doesn't sense to duck, try to strafe and shoot ! 338: // FIXME - this guy is so slow, it's not worth it ! 339: ! 340: //vec3_t forward,right,up,diff; ! 341: ! 342: monster_done_dodge (self); ! 343: return; ! 344: } ! 345: ! 346: if (skill->value == 0) ! 347: { ! 348: self->monsterinfo.currentmove = &brain_move_duck; ! 349: // PMM - stupid dodge ! 350: self->monsterinfo.duck_wait_time = level.time + eta + 1; ! 351: self->monsterinfo.aiflags |= AI_DODGING; ! 352: return; ! 353: } ! 354: ! 355: self->monsterinfo.currentmove = &brain_move_duck; ! 356: self->monsterinfo.duck_wait_time = level.time + eta + (0.1 * (3 - skill->value)); ! 357: self->monsterinfo.aiflags |= AI_DODGING; ! 358: return; ! 359: //============ ! 360: //PMM ! 361: } ! 362: */ ! 363: ! 364: mframe_t brain_frames_death2 [] = ! 365: { ! 366: ai_move, 0, NULL, ! 367: ai_move, 0, NULL, ! 368: ai_move, 0, NULL, ! 369: ai_move, 9, NULL, ! 370: ai_move, 0, NULL ! 371: }; ! 372: mmove_t brain_move_death2 = {FRAME_death201, FRAME_death205, brain_frames_death2, brain_dead}; ! 373: ! 374: mframe_t brain_frames_death1 [] = ! 375: { ! 376: ai_move, 0, NULL, ! 377: ai_move, 0, NULL, ! 378: ai_move, -2, NULL, ! 379: ai_move, 9, NULL, ! 380: ai_move, 0, NULL, ! 381: ai_move, 0, NULL, ! 382: ai_move, 0, NULL, ! 383: ai_move, 0, NULL, ! 384: ai_move, 0, NULL, ! 385: ai_move, 0, NULL, ! 386: ai_move, 0, NULL, ! 387: ai_move, 0, NULL, ! 388: ai_move, 0, NULL, ! 389: ai_move, 0, NULL, ! 390: ai_move, 0, NULL, ! 391: ai_move, 0, NULL, ! 392: ai_move, 0, NULL, ! 393: ai_move, 0, NULL ! 394: }; ! 395: mmove_t brain_move_death1 = {FRAME_death101, FRAME_death118, brain_frames_death1, brain_dead}; ! 396: ! 397: ! 398: // ! 399: // MELEE ! 400: // ! 401: ! 402: void brain_swing_right (edict_t *self) ! 403: { ! 404: gi.sound (self, CHAN_BODY, sound_melee1, 1, ATTN_NORM, 0); ! 405: } ! 406: ! 407: void brain_hit_right (edict_t *self) ! 408: { ! 409: vec3_t aim; ! 410: ! 411: VectorSet (aim, MELEE_DISTANCE, self->maxs[0], 8); ! 412: if (fire_hit (self, aim, (15 + (rand() %5)), 40)) ! 413: gi.sound (self, CHAN_WEAPON, sound_melee3, 1, ATTN_NORM, 0); ! 414: } ! 415: ! 416: void brain_swing_left (edict_t *self) ! 417: { ! 418: gi.sound (self, CHAN_BODY, sound_melee2, 1, ATTN_NORM, 0); ! 419: } ! 420: ! 421: void brain_hit_left (edict_t *self) ! 422: { ! 423: vec3_t aim; ! 424: ! 425: VectorSet (aim, MELEE_DISTANCE, self->mins[0], 8); ! 426: if (fire_hit (self, aim, (15 + (rand() %5)), 40)) ! 427: gi.sound (self, CHAN_WEAPON, sound_melee3, 1, ATTN_NORM, 0); ! 428: } ! 429: ! 430: mframe_t brain_frames_attack1 [] = ! 431: { ! 432: ai_charge, 8, NULL, ! 433: ai_charge, 3, NULL, ! 434: ai_charge, 5, NULL, ! 435: ai_charge, 0, NULL, ! 436: ai_charge, -3, brain_swing_right, ! 437: ai_charge, 0, NULL, ! 438: ai_charge, -5, NULL, ! 439: ai_charge, -7, brain_hit_right, ! 440: ai_charge, 0, NULL, ! 441: ai_charge, 6, brain_swing_left, ! 442: ai_charge, 1, NULL, ! 443: ai_charge, 2, brain_hit_left, ! 444: ai_charge, -3, NULL, ! 445: ai_charge, 6, NULL, ! 446: ai_charge, -1, NULL, ! 447: ai_charge, -3, NULL, ! 448: ai_charge, 2, NULL, ! 449: ai_charge, -11,NULL ! 450: }; ! 451: mmove_t brain_move_attack1 = {FRAME_attak101, FRAME_attak118, brain_frames_attack1, brain_run}; ! 452: ! 453: void brain_chest_open (edict_t *self) ! 454: { ! 455: self->spawnflags &= ~65536; ! 456: self->monsterinfo.power_armor_type = POWER_ARMOR_NONE; ! 457: gi.sound (self, CHAN_BODY, sound_chest_open, 1, ATTN_NORM, 0); ! 458: } ! 459: ! 460: void brain_tentacle_attack (edict_t *self) ! 461: { ! 462: vec3_t aim; ! 463: ! 464: VectorSet (aim, MELEE_DISTANCE, 0, 8); ! 465: if (fire_hit (self, aim, (10 + (rand() %5)), -600) && skill->value > 0) ! 466: self->spawnflags |= 65536; ! 467: gi.sound (self, CHAN_WEAPON, sound_tentacles_retract, 1, ATTN_NORM, 0); ! 468: } ! 469: ! 470: void brain_chest_closed (edict_t *self) ! 471: { ! 472: self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN; ! 473: if (self->spawnflags & 65536) ! 474: { ! 475: self->spawnflags &= ~65536; ! 476: self->monsterinfo.currentmove = &brain_move_attack1; ! 477: } ! 478: } ! 479: ! 480: mframe_t brain_frames_attack2 [] = ! 481: { ! 482: ai_charge, 5, NULL, ! 483: ai_charge, -4, NULL, ! 484: ai_charge, -4, NULL, ! 485: ai_charge, -3, NULL, ! 486: ai_charge, 0, brain_chest_open, ! 487: ai_charge, 0, NULL, ! 488: ai_charge, 13, brain_tentacle_attack, ! 489: ai_charge, 0, NULL, ! 490: ai_charge, 2, NULL, ! 491: ai_charge, 0, NULL, ! 492: ai_charge, -9, brain_chest_closed, ! 493: ai_charge, 0, NULL, ! 494: ai_charge, 4, NULL, ! 495: ai_charge, 3, NULL, ! 496: ai_charge, 2, NULL, ! 497: ai_charge, -3, NULL, ! 498: ai_charge, -6, NULL ! 499: }; ! 500: mmove_t brain_move_attack2 = {FRAME_attak201, FRAME_attak217, brain_frames_attack2, brain_run}; ! 501: ! 502: void brain_melee(edict_t *self) ! 503: { ! 504: if (random() <= 0.5) ! 505: self->monsterinfo.currentmove = &brain_move_attack1; ! 506: else ! 507: self->monsterinfo.currentmove = &brain_move_attack2; ! 508: } ! 509: ! 510: ! 511: // ! 512: // RUN ! 513: // ! 514: ! 515: mframe_t brain_frames_run [] = ! 516: { ! 517: ai_run, 9, NULL, ! 518: ai_run, 2, NULL, ! 519: ai_run, 3, NULL, ! 520: ai_run, 3, NULL, ! 521: ai_run, 1, NULL, ! 522: ai_run, 0, NULL, ! 523: ai_run, 0, NULL, ! 524: ai_run, 10, NULL, ! 525: ai_run, -4, NULL, ! 526: ai_run, -1, NULL, ! 527: ai_run, 2, NULL ! 528: }; ! 529: mmove_t brain_move_run = {FRAME_walk101, FRAME_walk111, brain_frames_run, NULL}; ! 530: ! 531: void brain_run (edict_t *self) ! 532: { ! 533: self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN; ! 534: if (self->monsterinfo.aiflags & AI_STAND_GROUND) ! 535: self->monsterinfo.currentmove = &brain_move_stand; ! 536: else ! 537: self->monsterinfo.currentmove = &brain_move_run; ! 538: } ! 539: ! 540: ! 541: void brain_pain (edict_t *self, edict_t *other, float kick, int damage) ! 542: { ! 543: float r; ! 544: ! 545: if (self->health < (self->max_health / 2)) ! 546: self->s.skinnum = 1; ! 547: ! 548: if (level.time < self->pain_debounce_time) ! 549: return; ! 550: ! 551: self->pain_debounce_time = level.time + 3; ! 552: ! 553: if (skill->value == 3) ! 554: return; // no pain anims in nightmare ! 555: ! 556: r = random(); ! 557: if (r < 0.33) ! 558: { ! 559: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); ! 560: self->monsterinfo.currentmove = &brain_move_pain1; ! 561: } ! 562: else if (r < 0.66) ! 563: { ! 564: gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); ! 565: self->monsterinfo.currentmove = &brain_move_pain2; ! 566: } ! 567: else ! 568: { ! 569: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); ! 570: self->monsterinfo.currentmove = &brain_move_pain3; ! 571: } ! 572: // PMM - clear duck flag ! 573: if (self->monsterinfo.aiflags & AI_DUCKED) ! 574: monster_duck_up(self); ! 575: } ! 576: ! 577: void brain_dead (edict_t *self) ! 578: { ! 579: VectorSet (self->mins, -16, -16, -24); ! 580: VectorSet (self->maxs, 16, 16, -8); ! 581: self->movetype = MOVETYPE_TOSS; ! 582: self->svflags |= SVF_DEADMONSTER; ! 583: self->nextthink = 0; ! 584: gi.linkentity (self); ! 585: } ! 586: ! 587: ! 588: ! 589: void brain_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) ! 590: { ! 591: int n; ! 592: ! 593: self->s.effects = 0; ! 594: self->monsterinfo.power_armor_type = POWER_ARMOR_NONE; ! 595: ! 596: // check for gib ! 597: if (self->health <= self->gib_health) ! 598: { ! 599: gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0); ! 600: for (n= 0; n < 2; n++) ! 601: ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC); ! 602: for (n= 0; n < 4; n++) ! 603: ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); ! 604: ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC); ! 605: self->deadflag = DEAD_DEAD; ! 606: return; ! 607: } ! 608: ! 609: if (self->deadflag == DEAD_DEAD) ! 610: return; ! 611: ! 612: // regular death ! 613: gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0); ! 614: self->deadflag = DEAD_DEAD; ! 615: self->takedamage = DAMAGE_YES; ! 616: if (random() <= 0.5) ! 617: self->monsterinfo.currentmove = &brain_move_death1; ! 618: else ! 619: self->monsterinfo.currentmove = &brain_move_death2; ! 620: } ! 621: ! 622: void brain_duck (edict_t *self, float eta) ! 623: { ! 624: // has to be done immediately otherwise he can get stuck ! 625: monster_duck_down(self); ! 626: ! 627: if (skill->value == 0) ! 628: // PMM - stupid dodge ! 629: self->monsterinfo.duck_wait_time = level.time + eta + 1; ! 630: else ! 631: self->monsterinfo.duck_wait_time = level.time + eta + (0.1 * (3 - skill->value)); ! 632: ! 633: self->monsterinfo.currentmove = &brain_move_duck; ! 634: self->monsterinfo.nextframe = FRAME_duck01; ! 635: return; ! 636: } ! 637: ! 638: ! 639: /*QUAKED monster_brain (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight ! 640: */ ! 641: void SP_monster_brain (edict_t *self) ! 642: { ! 643: if (deathmatch->value) ! 644: { ! 645: G_FreeEdict (self); ! 646: return; ! 647: } ! 648: ! 649: sound_chest_open = gi.soundindex ("brain/brnatck1.wav"); ! 650: sound_tentacles_extend = gi.soundindex ("brain/brnatck2.wav"); ! 651: sound_tentacles_retract = gi.soundindex ("brain/brnatck3.wav"); ! 652: sound_death = gi.soundindex ("brain/brndeth1.wav"); ! 653: sound_idle1 = gi.soundindex ("brain/brnidle1.wav"); ! 654: sound_idle2 = gi.soundindex ("brain/brnidle2.wav"); ! 655: sound_idle3 = gi.soundindex ("brain/brnlens1.wav"); ! 656: sound_pain1 = gi.soundindex ("brain/brnpain1.wav"); ! 657: sound_pain2 = gi.soundindex ("brain/brnpain2.wav"); ! 658: sound_sight = gi.soundindex ("brain/brnsght1.wav"); ! 659: sound_search = gi.soundindex ("brain/brnsrch1.wav"); ! 660: sound_melee1 = gi.soundindex ("brain/melee1.wav"); ! 661: sound_melee2 = gi.soundindex ("brain/melee2.wav"); ! 662: sound_melee3 = gi.soundindex ("brain/melee3.wav"); ! 663: ! 664: self->movetype = MOVETYPE_STEP; ! 665: self->solid = SOLID_BBOX; ! 666: self->s.modelindex = gi.modelindex ("models/monsters/brain/tris.md2"); ! 667: VectorSet (self->mins, -16, -16, -24); ! 668: VectorSet (self->maxs, 16, 16, 32); ! 669: ! 670: self->health = 300; ! 671: self->gib_health = -150; ! 672: self->mass = 400; ! 673: ! 674: self->pain = brain_pain; ! 675: self->die = brain_die; ! 676: ! 677: self->monsterinfo.stand = brain_stand; ! 678: self->monsterinfo.walk = brain_walk; ! 679: self->monsterinfo.run = brain_run; ! 680: // PMM ! 681: self->monsterinfo.dodge = M_MonsterDodge; ! 682: self->monsterinfo.duck = brain_duck; ! 683: self->monsterinfo.unduck = monster_duck_up; ! 684: // self->monsterinfo.dodge = brain_dodge; ! 685: // pmm ! 686: // self->monsterinfo.attack = brain_attack; ! 687: self->monsterinfo.melee = brain_melee; ! 688: self->monsterinfo.sight = brain_sight; ! 689: self->monsterinfo.search = brain_search; ! 690: self->monsterinfo.idle = brain_idle; ! 691: ! 692: self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN; ! 693: self->monsterinfo.power_armor_power = 100; ! 694: ! 695: gi.linkentity (self); ! 696: ! 697: self->monsterinfo.currentmove = &brain_move_stand; ! 698: self->monsterinfo.scale = MODEL_SCALE; ! 699: ! 700: walkmonster_start (self); ! 701: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.