|
|
1.1 root 1: /* 1.1.1.2 ! root 2: Copyright (C) 1997-2001 Id Software, Inc. ! 3: ! 4: This program is free software; you can redistribute it and/or ! 5: modify it under the terms of the GNU General Public License ! 6: as published by the Free Software Foundation; either version 2 ! 7: of the License, or (at your option) any later version. ! 8: ! 9: This program is distributed in the hope that it will be useful, ! 10: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! 12: ! 13: See the GNU General Public License for more details. ! 14: ! 15: You should have received a copy of the GNU General Public License ! 16: along with this program; if not, write to the Free Software ! 17: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ! 18: ! 19: */ ! 20: /* 1.1 root 21: ============================================================================== 22: 23: floater 24: 25: ============================================================================== 26: */ 27: 28: #include "g_local.h" 29: #include "m_float.h" 30: 31: 32: static int sound_attack2; 33: static int sound_attack3; 34: static int sound_death1; 35: static int sound_idle; 36: static int sound_pain1; 37: static int sound_pain2; 38: static int sound_sight; 39: 40: 41: void floater_sight (edict_t *self, edict_t *other) 42: { 43: gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0); 44: } 45: 46: void floater_idle (edict_t *self) 47: { 48: gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0); 49: } 50: 51: 52: //void floater_stand1 (edict_t *self); 53: void floater_dead (edict_t *self); 54: void floater_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); 55: void floater_run (edict_t *self); 56: void floater_wham (edict_t *self); 57: void floater_zap (edict_t *self); 58: 59: 60: void floater_fire_blaster (edict_t *self) 61: { 62: vec3_t start; 63: vec3_t forward, right; 64: vec3_t end; 65: vec3_t dir; 66: int effect; 67: 68: if ((self->s.frame == FRAME_attak104) || (self->s.frame == FRAME_attak107)) 69: effect = EF_HYPERBLASTER; 70: else 71: effect = 0; 72: AngleVectors (self->s.angles, forward, right, NULL); 73: G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_FLOAT_BLASTER_1], forward, right, start); 74: 75: VectorCopy (self->enemy->s.origin, end); 76: end[2] += self->enemy->viewheight; 77: VectorSubtract (end, start, dir); 78: 79: monster_fire_blaster (self, start, dir, 1, 1000, MZ2_FLOAT_BLASTER_1, effect); 80: } 81: 82: 83: mframe_t floater_frames_stand1 [] = 84: { 85: ai_stand, 0, NULL, 86: ai_stand, 0, NULL, 87: ai_stand, 0, NULL, 88: ai_stand, 0, NULL, 89: ai_stand, 0, NULL, 90: ai_stand, 0, NULL, 91: ai_stand, 0, NULL, 92: ai_stand, 0, NULL, 93: ai_stand, 0, NULL, 94: ai_stand, 0, NULL, 95: ai_stand, 0, NULL, 96: ai_stand, 0, NULL, 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: ai_stand, 0, NULL, 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: ai_stand, 0, NULL, 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: ai_stand, 0, NULL, 130: ai_stand, 0, NULL, 131: ai_stand, 0, NULL, 132: ai_stand, 0, NULL, 133: ai_stand, 0, NULL, 134: ai_stand, 0, NULL, 135: ai_stand, 0, NULL, 136: ai_stand, 0, NULL 137: }; 138: mmove_t floater_move_stand1 = {FRAME_stand101, FRAME_stand152, floater_frames_stand1, NULL}; 139: 140: mframe_t floater_frames_stand2 [] = 141: { 142: ai_stand, 0, NULL, 143: ai_stand, 0, NULL, 144: ai_stand, 0, NULL, 145: ai_stand, 0, NULL, 146: ai_stand, 0, NULL, 147: ai_stand, 0, NULL, 148: ai_stand, 0, NULL, 149: ai_stand, 0, NULL, 150: ai_stand, 0, NULL, 151: ai_stand, 0, NULL, 152: ai_stand, 0, NULL, 153: ai_stand, 0, NULL, 154: ai_stand, 0, NULL, 155: ai_stand, 0, NULL, 156: ai_stand, 0, NULL, 157: ai_stand, 0, NULL, 158: ai_stand, 0, NULL, 159: ai_stand, 0, NULL, 160: ai_stand, 0, NULL, 161: ai_stand, 0, NULL, 162: ai_stand, 0, NULL, 163: ai_stand, 0, NULL, 164: ai_stand, 0, NULL, 165: ai_stand, 0, NULL, 166: ai_stand, 0, NULL, 167: ai_stand, 0, NULL, 168: ai_stand, 0, NULL, 169: ai_stand, 0, NULL, 170: ai_stand, 0, NULL, 171: ai_stand, 0, NULL, 172: ai_stand, 0, NULL, 173: ai_stand, 0, NULL, 174: ai_stand, 0, NULL, 175: ai_stand, 0, NULL, 176: ai_stand, 0, NULL, 177: ai_stand, 0, NULL, 178: ai_stand, 0, NULL, 179: ai_stand, 0, NULL, 180: ai_stand, 0, NULL, 181: ai_stand, 0, NULL, 182: ai_stand, 0, NULL, 183: ai_stand, 0, NULL, 184: ai_stand, 0, NULL, 185: ai_stand, 0, NULL, 186: ai_stand, 0, NULL, 187: ai_stand, 0, NULL, 188: ai_stand, 0, NULL, 189: ai_stand, 0, NULL, 190: ai_stand, 0, NULL, 191: ai_stand, 0, NULL, 192: ai_stand, 0, NULL, 193: ai_stand, 0, NULL 194: }; 195: mmove_t floater_move_stand2 = {FRAME_stand201, FRAME_stand252, floater_frames_stand2, NULL}; 196: 197: void floater_stand (edict_t *self) 198: { 199: if (random() <= 0.5) 200: self->monsterinfo.currentmove = &floater_move_stand1; 201: else 202: self->monsterinfo.currentmove = &floater_move_stand2; 203: } 204: 205: mframe_t floater_frames_activate [] = 206: { 207: ai_move, 0, NULL, 208: ai_move, 0, NULL, 209: ai_move, 0, NULL, 210: ai_move, 0, NULL, 211: ai_move, 0, NULL, 212: ai_move, 0, NULL, 213: ai_move, 0, NULL, 214: ai_move, 0, NULL, 215: ai_move, 0, NULL, 216: ai_move, 0, NULL, 217: ai_move, 0, NULL, 218: ai_move, 0, NULL, 219: ai_move, 0, NULL, 220: ai_move, 0, NULL, 221: ai_move, 0, NULL, 222: ai_move, 0, NULL, 223: ai_move, 0, NULL, 224: ai_move, 0, NULL, 225: ai_move, 0, NULL, 226: ai_move, 0, NULL, 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: ai_move, 0, NULL 237: }; 238: mmove_t floater_move_activate = {FRAME_actvat01, FRAME_actvat31, floater_frames_activate, NULL}; 239: 240: mframe_t floater_frames_attack1 [] = 241: { 242: ai_charge, 0, NULL, // Blaster attack 243: ai_charge, 0, NULL, 244: ai_charge, 0, NULL, 245: ai_charge, 0, floater_fire_blaster, // BOOM (0, -25.8, 32.5) -- LOOP Starts 246: ai_charge, 0, floater_fire_blaster, 247: ai_charge, 0, floater_fire_blaster, 248: ai_charge, 0, floater_fire_blaster, 249: ai_charge, 0, floater_fire_blaster, 250: ai_charge, 0, floater_fire_blaster, 251: ai_charge, 0, floater_fire_blaster, 252: ai_charge, 0, NULL, 253: ai_charge, 0, NULL, 254: ai_charge, 0, NULL, 255: ai_charge, 0, NULL // -- LOOP Ends 256: }; 257: mmove_t floater_move_attack1 = {FRAME_attak101, FRAME_attak114, floater_frames_attack1, floater_run}; 258: 259: mframe_t floater_frames_attack2 [] = 260: { 261: ai_charge, 0, NULL, // Claws 262: ai_charge, 0, NULL, 263: ai_charge, 0, NULL, 264: ai_charge, 0, NULL, 265: ai_charge, 0, NULL, 266: ai_charge, 0, NULL, 267: ai_charge, 0, NULL, 268: ai_charge, 0, NULL, 269: ai_charge, 0, NULL, 270: ai_charge, 0, NULL, 271: ai_charge, 0, NULL, 272: ai_charge, 0, floater_wham, // WHAM (0, -45, 29.6) -- LOOP Starts 273: ai_charge, 0, NULL, 274: ai_charge, 0, NULL, 275: ai_charge, 0, NULL, 276: ai_charge, 0, NULL, 277: ai_charge, 0, NULL, 278: ai_charge, 0, NULL, 279: ai_charge, 0, NULL, // -- LOOP Ends 280: ai_charge, 0, NULL, 281: ai_charge, 0, NULL, 282: ai_charge, 0, NULL, 283: ai_charge, 0, NULL, 284: ai_charge, 0, NULL, 285: ai_charge, 0, NULL 286: }; 287: mmove_t floater_move_attack2 = {FRAME_attak201, FRAME_attak225, floater_frames_attack2, floater_run}; 288: 289: mframe_t floater_frames_attack3 [] = 290: { 291: ai_charge, 0, NULL, 292: ai_charge, 0, NULL, 293: ai_charge, 0, NULL, 294: ai_charge, 0, NULL, 295: ai_charge, 0, NULL, 296: ai_charge, 0, NULL, 297: ai_charge, 0, NULL, 298: ai_charge, 0, NULL, 299: ai_charge, 0, floater_zap, // -- LOOP Starts 300: ai_charge, 0, NULL, 301: ai_charge, 0, NULL, 302: ai_charge, 0, NULL, 303: ai_charge, 0, NULL, 304: ai_charge, 0, NULL, 305: ai_charge, 0, NULL, 306: ai_charge, 0, NULL, 307: ai_charge, 0, NULL, 308: ai_charge, 0, NULL, 309: ai_charge, 0, NULL, 310: ai_charge, 0, NULL, 311: ai_charge, 0, NULL, 312: ai_charge, 0, NULL, 313: ai_charge, 0, NULL, 314: ai_charge, 0, NULL, 315: ai_charge, 0, NULL, 316: ai_charge, 0, NULL, 317: ai_charge, 0, NULL, 318: ai_charge, 0, NULL, 319: ai_charge, 0, NULL, // -- LOOP Ends 320: ai_charge, 0, NULL, 321: ai_charge, 0, NULL, 322: ai_charge, 0, NULL, 323: ai_charge, 0, NULL, 324: ai_charge, 0, NULL 325: }; 326: mmove_t floater_move_attack3 = {FRAME_attak301, FRAME_attak334, floater_frames_attack3, floater_run}; 327: 328: mframe_t floater_frames_death [] = 329: { 330: ai_move, 0, NULL, 331: ai_move, 0, NULL, 332: ai_move, 0, NULL, 333: ai_move, 0, NULL, 334: ai_move, 0, NULL, 335: ai_move, 0, NULL, 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: }; 344: mmove_t floater_move_death = {FRAME_death01, FRAME_death13, floater_frames_death, floater_dead}; 345: 346: mframe_t floater_frames_pain1 [] = 347: { 348: ai_move, 0, NULL, 349: ai_move, 0, NULL, 350: ai_move, 0, NULL, 351: ai_move, 0, NULL, 352: ai_move, 0, NULL, 353: ai_move, 0, NULL, 354: ai_move, 0, NULL 355: }; 356: mmove_t floater_move_pain1 = {FRAME_pain101, FRAME_pain107, floater_frames_pain1, floater_run}; 357: 358: mframe_t floater_frames_pain2 [] = 359: { 360: ai_move, 0, NULL, 361: ai_move, 0, 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: }; 369: mmove_t floater_move_pain2 = {FRAME_pain201, FRAME_pain208, floater_frames_pain2, floater_run}; 370: 371: mframe_t floater_frames_pain3 [] = 372: { 373: ai_move, 0, NULL, 374: ai_move, 0, NULL, 375: ai_move, 0, NULL, 376: ai_move, 0, NULL, 377: ai_move, 0, NULL, 378: ai_move, 0, NULL, 379: ai_move, 0, 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: }; 386: mmove_t floater_move_pain3 = {FRAME_pain301, FRAME_pain312, floater_frames_pain3, floater_run}; 387: 388: mframe_t floater_frames_walk [] = 389: { 390: ai_walk, 5, NULL, 391: ai_walk, 5, NULL, 392: ai_walk, 5, NULL, 393: ai_walk, 5, NULL, 394: ai_walk, 5, NULL, 395: ai_walk, 5, NULL, 396: ai_walk, 5, NULL, 397: ai_walk, 5, NULL, 398: ai_walk, 5, NULL, 399: ai_walk, 5, NULL, 400: ai_walk, 5, NULL, 401: ai_walk, 5, NULL, 402: ai_walk, 5, NULL, 403: ai_walk, 5, NULL, 404: ai_walk, 5, NULL, 405: ai_walk, 5, NULL, 406: ai_walk, 5, NULL, 407: ai_walk, 5, NULL, 408: ai_walk, 5, NULL, 409: ai_walk, 5, NULL, 410: ai_walk, 5, NULL, 411: ai_walk, 5, NULL, 412: ai_walk, 5, NULL, 413: ai_walk, 5, NULL, 414: ai_walk, 5, NULL, 415: ai_walk, 5, NULL, 416: ai_walk, 5, NULL, 417: ai_walk, 5, NULL, 418: ai_walk, 5, NULL, 419: ai_walk, 5, NULL, 420: ai_walk, 5, NULL, 421: ai_walk, 5, NULL, 422: ai_walk, 5, NULL, 423: ai_walk, 5, NULL, 424: ai_walk, 5, NULL, 425: ai_walk, 5, NULL, 426: ai_walk, 5, NULL, 427: ai_walk, 5, NULL, 428: ai_walk, 5, NULL, 429: ai_walk, 5, NULL, 430: ai_walk, 5, NULL, 431: ai_walk, 5, NULL, 432: ai_walk, 5, NULL, 433: ai_walk, 5, NULL, 434: ai_walk, 5, NULL, 435: ai_walk, 5, NULL, 436: ai_walk, 5, NULL, 437: ai_walk, 5, NULL, 438: ai_walk, 5, NULL, 439: ai_walk, 5, NULL, 440: ai_walk, 5, NULL, 441: ai_walk, 5, NULL 442: }; 443: mmove_t floater_move_walk = {FRAME_stand101, FRAME_stand152, floater_frames_walk, NULL}; 444: 445: mframe_t floater_frames_run [] = 446: { 447: ai_run, 13, NULL, 448: ai_run, 13, NULL, 449: ai_run, 13, NULL, 450: ai_run, 13, NULL, 451: ai_run, 13, NULL, 452: ai_run, 13, NULL, 453: ai_run, 13, NULL, 454: ai_run, 13, NULL, 455: ai_run, 13, NULL, 456: ai_run, 13, NULL, 457: ai_run, 13, NULL, 458: ai_run, 13, NULL, 459: ai_run, 13, NULL, 460: ai_run, 13, NULL, 461: ai_run, 13, NULL, 462: ai_run, 13, NULL, 463: ai_run, 13, NULL, 464: ai_run, 13, NULL, 465: ai_run, 13, NULL, 466: ai_run, 13, NULL, 467: ai_run, 13, NULL, 468: ai_run, 13, NULL, 469: ai_run, 13, NULL, 470: ai_run, 13, NULL, 471: ai_run, 13, NULL, 472: ai_run, 13, NULL, 473: ai_run, 13, NULL, 474: ai_run, 13, NULL, 475: ai_run, 13, NULL, 476: ai_run, 13, NULL, 477: ai_run, 13, NULL, 478: ai_run, 13, NULL, 479: ai_run, 13, NULL, 480: ai_run, 13, NULL, 481: ai_run, 13, NULL, 482: ai_run, 13, NULL, 483: ai_run, 13, NULL, 484: ai_run, 13, NULL, 485: ai_run, 13, NULL, 486: ai_run, 13, NULL, 487: ai_run, 13, NULL, 488: ai_run, 13, NULL, 489: ai_run, 13, NULL, 490: ai_run, 13, NULL, 491: ai_run, 13, NULL, 492: ai_run, 13, NULL, 493: ai_run, 13, NULL, 494: ai_run, 13, NULL, 495: ai_run, 13, NULL, 496: ai_run, 13, NULL, 497: ai_run, 13, NULL, 498: ai_run, 13, NULL 499: }; 500: mmove_t floater_move_run = {FRAME_stand101, FRAME_stand152, floater_frames_run, NULL}; 501: 502: void floater_run (edict_t *self) 503: { 504: if (self->monsterinfo.aiflags & AI_STAND_GROUND) 505: self->monsterinfo.currentmove = &floater_move_stand1; 506: else 507: self->monsterinfo.currentmove = &floater_move_run; 508: } 509: 510: void floater_walk (edict_t *self) 511: { 512: self->monsterinfo.currentmove = &floater_move_walk; 513: } 514: 515: void floater_wham (edict_t *self) 516: { 517: static vec3_t aim = {MELEE_DISTANCE, 0, 0}; 518: gi.sound (self, CHAN_WEAPON, sound_attack3, 1, ATTN_NORM, 0); 519: fire_hit (self, aim, 5 + rand() % 6, -50); 520: } 521: 522: void floater_zap (edict_t *self) 523: { 524: vec3_t forward, right; 525: vec3_t origin; 526: vec3_t dir; 527: vec3_t offset; 528: 529: VectorSubtract (self->enemy->s.origin, self->s.origin, dir); 530: 531: AngleVectors (self->s.angles, forward, right, NULL); 532: //FIXME use a flash and replace these two lines with the commented one 533: VectorSet (offset, 18.5, -0.9, 10); 534: G_ProjectSource (self->s.origin, offset, forward, right, origin); 535: // G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, origin); 536: 537: gi.sound (self, CHAN_WEAPON, sound_attack2, 1, ATTN_NORM, 0); 538: 539: //FIXME use the flash, Luke 540: gi.WriteByte (svc_temp_entity); 541: gi.WriteByte (TE_SPLASH); 542: gi.WriteByte (32); 543: gi.WritePosition (origin); 544: gi.WriteDir (dir); 545: gi.WriteByte (1); //sparks 546: gi.multicast (origin, MULTICAST_PVS); 547: 548: T_Damage (self->enemy, self, self, dir, self->enemy->s.origin, vec3_origin, 5 + rand() % 6, -10, DAMAGE_ENERGY, MOD_UNKNOWN); 549: } 550: 551: void floater_attack(edict_t *self) 552: { 553: self->monsterinfo.currentmove = &floater_move_attack1; 554: } 555: 556: 557: void floater_melee(edict_t *self) 558: { 559: if (random() < 0.5) 560: self->monsterinfo.currentmove = &floater_move_attack3; 561: else 562: self->monsterinfo.currentmove = &floater_move_attack2; 563: } 564: 565: 566: void floater_pain (edict_t *self, edict_t *other, float kick, int damage) 567: { 568: int n; 569: 570: if (self->health < (self->max_health / 2)) 571: self->s.skinnum = 1; 572: 573: if (level.time < self->pain_debounce_time) 574: return; 575: 576: self->pain_debounce_time = level.time + 3; 577: if (skill->value == 3) 578: return; // no pain anims in nightmare 579: 580: n = (rand() + 1) % 3; 581: if (n == 0) 582: { 583: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); 584: self->monsterinfo.currentmove = &floater_move_pain1; 585: } 586: else 587: { 588: gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); 589: self->monsterinfo.currentmove = &floater_move_pain2; 590: } 591: } 592: 593: void floater_dead (edict_t *self) 594: { 595: VectorSet (self->mins, -16, -16, -24); 596: VectorSet (self->maxs, 16, 16, -8); 597: self->movetype = MOVETYPE_TOSS; 598: self->svflags |= SVF_DEADMONSTER; 599: self->nextthink = 0; 600: gi.linkentity (self); 601: } 602: 603: void floater_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) 604: { 605: gi.sound (self, CHAN_VOICE, sound_death1, 1, ATTN_NORM, 0); 606: BecomeExplosion1(self); 607: } 608: 609: /*QUAKED monster_floater (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight 610: */ 611: void SP_monster_floater (edict_t *self) 612: { 613: if (deathmatch->value) 614: { 615: G_FreeEdict (self); 616: return; 617: } 618: 619: sound_attack2 = gi.soundindex ("floater/fltatck2.wav"); 620: sound_attack3 = gi.soundindex ("floater/fltatck3.wav"); 621: sound_death1 = gi.soundindex ("floater/fltdeth1.wav"); 622: sound_idle = gi.soundindex ("floater/fltidle1.wav"); 623: sound_pain1 = gi.soundindex ("floater/fltpain1.wav"); 624: sound_pain2 = gi.soundindex ("floater/fltpain2.wav"); 625: sound_sight = gi.soundindex ("floater/fltsght1.wav"); 626: 627: gi.soundindex ("floater/fltatck1.wav"); 628: 629: self->s.sound = gi.soundindex ("floater/fltsrch1.wav"); 630: 631: self->movetype = MOVETYPE_STEP; 632: self->solid = SOLID_BBOX; 633: self->s.modelindex = gi.modelindex ("models/monsters/float/tris.md2"); 634: VectorSet (self->mins, -24, -24, -24); 635: VectorSet (self->maxs, 24, 24, 32); 636: 637: self->health = 200; 638: self->gib_health = -80; 639: self->mass = 300; 640: 641: self->pain = floater_pain; 642: self->die = floater_die; 643: 644: self->monsterinfo.stand = floater_stand; 645: self->monsterinfo.walk = floater_walk; 646: self->monsterinfo.run = floater_run; 647: // self->monsterinfo.dodge = floater_dodge; 648: self->monsterinfo.attack = floater_attack; 649: self->monsterinfo.melee = floater_melee; 650: self->monsterinfo.sight = floater_sight; 651: self->monsterinfo.idle = floater_idle; 652: 653: gi.linkentity (self); 654: 655: if (random() <= 0.5) 656: self->monsterinfo.currentmove = &floater_move_stand1; 657: else 658: self->monsterinfo.currentmove = &floater_move_stand2; 659: 660: self->monsterinfo.scale = MODEL_SCALE; 661: 662: flymonster_start (self); 663: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.