|
|
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: hover 24: 25: ============================================================================== 26: */ 27: 28: #include "g_local.h" 29: #include "m_hover.h" 30: 31: qboolean visible (edict_t *self, edict_t *other); 32: 33: 34: static int sound_pain1; 35: static int sound_pain2; 36: static int sound_death1; 37: static int sound_death2; 38: static int sound_sight; 39: static int sound_search1; 40: static int sound_search2; 41: 42: 43: void hover_sight (edict_t *self, edict_t *other) 44: { 45: gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0); 46: } 47: 48: void hover_search (edict_t *self) 49: { 50: if (random() < 0.5) 51: gi.sound (self, CHAN_VOICE, sound_search1, 1, ATTN_NORM, 0); 52: else 53: gi.sound (self, CHAN_VOICE, sound_search2, 1, ATTN_NORM, 0); 54: } 55: 56: 57: void hover_run (edict_t *self); 58: void hover_stand (edict_t *self); 59: void hover_dead (edict_t *self); 60: void hover_attack (edict_t *self); 61: void hover_reattack (edict_t *self); 62: void hover_fire_blaster (edict_t *self); 63: void hover_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); 64: 65: mframe_t hover_frames_stand [] = 66: { 67: ai_stand, 0, NULL, 68: ai_stand, 0, NULL, 69: ai_stand, 0, NULL, 70: ai_stand, 0, NULL, 71: ai_stand, 0, NULL, 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: ai_stand, 0, NULL, 83: ai_stand, 0, NULL, 84: ai_stand, 0, NULL, 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: }; 98: mmove_t hover_move_stand = {FRAME_stand01, FRAME_stand30, hover_frames_stand, NULL}; 99: 100: mframe_t hover_frames_stop1 [] = 101: { 102: ai_move, 0, NULL, 103: ai_move, 0, NULL, 104: ai_move, 0, NULL, 105: ai_move, 0, NULL, 106: ai_move, 0, NULL, 107: ai_move, 0, NULL, 108: ai_move, 0, NULL, 109: ai_move, 0, NULL, 110: ai_move, 0, NULL 111: }; 112: mmove_t hover_move_stop1 = {FRAME_stop101, FRAME_stop109, hover_frames_stop1, NULL}; 113: 114: mframe_t hover_frames_stop2 [] = 115: { 116: ai_move, 0, NULL, 117: ai_move, 0, NULL, 118: ai_move, 0, NULL, 119: ai_move, 0, NULL, 120: ai_move, 0, NULL, 121: ai_move, 0, NULL, 122: ai_move, 0, NULL, 123: ai_move, 0, NULL 124: }; 125: mmove_t hover_move_stop2 = {FRAME_stop201, FRAME_stop208, hover_frames_stop2, NULL}; 126: 127: mframe_t hover_frames_takeoff [] = 128: { 129: ai_move, 0, NULL, 130: ai_move, -2, NULL, 131: ai_move, 5, NULL, 132: ai_move, -1, NULL, 133: ai_move, 1, NULL, 134: ai_move, 0, NULL, 135: ai_move, 0, NULL, 136: ai_move, -1, NULL, 137: ai_move, -1, NULL, 138: ai_move, -1, NULL, 139: ai_move, 0, NULL, 140: ai_move, 2, NULL, 141: ai_move, 2, NULL, 142: ai_move, 1, NULL, 143: ai_move, 1, NULL, 144: ai_move, -6, NULL, 145: ai_move, -9, NULL, 146: ai_move, 1, NULL, 147: ai_move, 0, NULL, 148: ai_move, 2, NULL, 149: ai_move, 2, NULL, 150: ai_move, 1, NULL, 151: ai_move, 1, NULL, 152: ai_move, 1, NULL, 153: ai_move, 2, NULL, 154: ai_move, 0, NULL, 155: ai_move, 2, NULL, 156: ai_move, 3, NULL, 157: ai_move, 2, NULL, 158: ai_move, 0, NULL 159: }; 160: mmove_t hover_move_takeoff = {FRAME_takeof01, FRAME_takeof30, hover_frames_takeoff, NULL}; 161: 162: mframe_t hover_frames_pain3 [] = 163: { 164: ai_move, 0, NULL, 165: ai_move, 0, NULL, 166: ai_move, 0, NULL, 167: ai_move, 0, NULL, 168: ai_move, 0, NULL, 169: ai_move, 0, NULL, 170: ai_move, 0, NULL, 171: ai_move, 0, NULL, 172: ai_move, 0, NULL 173: }; 174: mmove_t hover_move_pain3 = {FRAME_pain301, FRAME_pain309, hover_frames_pain3, hover_run}; 175: 176: mframe_t hover_frames_pain2 [] = 177: { 178: ai_move, 0, NULL, 179: ai_move, 0, NULL, 180: ai_move, 0, NULL, 181: ai_move, 0, NULL, 182: ai_move, 0, NULL, 183: ai_move, 0, NULL, 184: ai_move, 0, NULL, 185: ai_move, 0, NULL, 186: ai_move, 0, NULL, 187: ai_move, 0, NULL, 188: ai_move, 0, NULL, 189: ai_move, 0, NULL 190: }; 191: mmove_t hover_move_pain2 = {FRAME_pain201, FRAME_pain212, hover_frames_pain2, hover_run}; 192: 193: mframe_t hover_frames_pain1 [] = 194: { 195: ai_move, 0, NULL, 196: ai_move, 0, NULL, 197: ai_move, 2, NULL, 198: ai_move, -8, NULL, 199: ai_move, -4, NULL, 200: ai_move, -6, NULL, 201: ai_move, -4, NULL, 202: ai_move, -3, NULL, 203: ai_move, 1, NULL, 204: ai_move, 0, NULL, 205: ai_move, 0, NULL, 206: ai_move, 0, NULL, 207: ai_move, 3, NULL, 208: ai_move, 1, NULL, 209: ai_move, 0, NULL, 210: ai_move, 2, NULL, 211: ai_move, 3, NULL, 212: ai_move, 2, NULL, 213: ai_move, 7, NULL, 214: ai_move, 1, NULL, 215: ai_move, 0, NULL, 216: ai_move, 0, NULL, 217: ai_move, 2, NULL, 218: ai_move, 0, NULL, 219: ai_move, 0, NULL, 220: ai_move, 5, NULL, 221: ai_move, 3, NULL, 222: ai_move, 4, NULL 223: }; 224: mmove_t hover_move_pain1 = {FRAME_pain101, FRAME_pain128, hover_frames_pain1, hover_run}; 225: 226: mframe_t hover_frames_land [] = 227: { 228: ai_move, 0, NULL 229: }; 230: mmove_t hover_move_land = {FRAME_land01, FRAME_land01, hover_frames_land, NULL}; 231: 232: mframe_t hover_frames_forward [] = 233: { 234: ai_move, 0, NULL, 235: ai_move, 0, NULL, 236: ai_move, 0, NULL, 237: ai_move, 0, NULL, 238: ai_move, 0, NULL, 239: ai_move, 0, NULL, 240: ai_move, 0, NULL, 241: ai_move, 0, NULL, 242: ai_move, 0, NULL, 243: ai_move, 0, NULL, 244: ai_move, 0, NULL, 245: ai_move, 0, NULL, 246: ai_move, 0, NULL, 247: ai_move, 0, NULL, 248: ai_move, 0, NULL, 249: ai_move, 0, NULL, 250: ai_move, 0, NULL, 251: ai_move, 0, NULL, 252: ai_move, 0, NULL, 253: ai_move, 0, NULL, 254: ai_move, 0, NULL, 255: ai_move, 0, NULL, 256: ai_move, 0, NULL, 257: ai_move, 0, NULL, 258: ai_move, 0, NULL, 259: ai_move, 0, NULL, 260: ai_move, 0, NULL, 261: ai_move, 0, NULL, 262: ai_move, 0, NULL, 263: ai_move, 0, NULL, 264: ai_move, 0, NULL, 265: ai_move, 0, NULL, 266: ai_move, 0, NULL, 267: ai_move, 0, NULL, 268: ai_move, 0, NULL 269: }; 270: mmove_t hover_move_forward = {FRAME_forwrd01, FRAME_forwrd35, hover_frames_forward, NULL}; 271: 272: mframe_t hover_frames_walk [] = 273: { 274: ai_walk, 4, NULL, 275: ai_walk, 4, NULL, 276: ai_walk, 4, NULL, 277: ai_walk, 4, NULL, 278: ai_walk, 4, NULL, 279: ai_walk, 4, NULL, 280: ai_walk, 4, NULL, 281: ai_walk, 4, NULL, 282: ai_walk, 4, NULL, 283: ai_walk, 4, NULL, 284: ai_walk, 4, NULL, 285: ai_walk, 4, NULL, 286: ai_walk, 4, NULL, 287: ai_walk, 4, NULL, 288: ai_walk, 4, NULL, 289: ai_walk, 4, NULL, 290: ai_walk, 4, NULL, 291: ai_walk, 4, NULL, 292: ai_walk, 4, NULL, 293: ai_walk, 4, NULL, 294: ai_walk, 4, NULL, 295: ai_walk, 4, NULL, 296: ai_walk, 4, NULL, 297: ai_walk, 4, NULL, 298: ai_walk, 4, NULL, 299: ai_walk, 4, NULL, 300: ai_walk, 4, NULL, 301: ai_walk, 4, NULL, 302: ai_walk, 4, NULL, 303: ai_walk, 4, NULL, 304: ai_walk, 4, NULL, 305: ai_walk, 4, NULL, 306: ai_walk, 4, NULL, 307: ai_walk, 4, NULL, 308: ai_walk, 4, NULL 309: }; 310: mmove_t hover_move_walk = {FRAME_forwrd01, FRAME_forwrd35, hover_frames_walk, NULL}; 311: 312: mframe_t hover_frames_run [] = 313: { 314: ai_run, 10, NULL, 315: ai_run, 10, NULL, 316: ai_run, 10, NULL, 317: ai_run, 10, NULL, 318: ai_run, 10, NULL, 319: ai_run, 10, NULL, 320: ai_run, 10, NULL, 321: ai_run, 10, NULL, 322: ai_run, 10, NULL, 323: ai_run, 10, NULL, 324: ai_run, 10, NULL, 325: ai_run, 10, NULL, 326: ai_run, 10, NULL, 327: ai_run, 10, NULL, 328: ai_run, 10, NULL, 329: ai_run, 10, NULL, 330: ai_run, 10, NULL, 331: ai_run, 10, NULL, 332: ai_run, 10, NULL, 333: ai_run, 10, NULL, 334: ai_run, 10, NULL, 335: ai_run, 10, NULL, 336: ai_run, 10, NULL, 337: ai_run, 10, NULL, 338: ai_run, 10, NULL, 339: ai_run, 10, NULL, 340: ai_run, 10, NULL, 341: ai_run, 10, NULL, 342: ai_run, 10, NULL, 343: ai_run, 10, NULL, 344: ai_run, 10, NULL, 345: ai_run, 10, NULL, 346: ai_run, 10, NULL, 347: ai_run, 10, NULL, 348: ai_run, 10, NULL 349: }; 350: mmove_t hover_move_run = {FRAME_forwrd01, FRAME_forwrd35, hover_frames_run, NULL}; 351: 352: mframe_t hover_frames_death1 [] = 353: { 354: ai_move, 0, NULL, 355: ai_move, 0, NULL, 356: ai_move, 0, NULL, 357: ai_move, 0, NULL, 358: ai_move, 0, NULL, 359: ai_move, 0, NULL, 360: ai_move, -10,NULL, 361: ai_move, 3, NULL, 362: ai_move, 5, NULL, 363: ai_move, 4, NULL, 364: ai_move, 7, NULL 365: }; 366: mmove_t hover_move_death1 = {FRAME_death101, FRAME_death111, hover_frames_death1, hover_dead}; 367: 368: mframe_t hover_frames_backward [] = 369: { 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: 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: 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 hover_move_backward = {FRAME_backwd01, FRAME_backwd24, hover_frames_backward, NULL}; 396: 397: mframe_t hover_frames_start_attack [] = 398: { 399: ai_charge, 1, NULL, 400: ai_charge, 1, NULL, 401: ai_charge, 1, NULL 402: }; 403: mmove_t hover_move_start_attack = {FRAME_attak101, FRAME_attak103, hover_frames_start_attack, hover_attack}; 404: 405: mframe_t hover_frames_attack1 [] = 406: { 407: ai_charge, -10, hover_fire_blaster, 408: ai_charge, -10, hover_fire_blaster, 409: ai_charge, 0, hover_reattack, 410: }; 411: mmove_t hover_move_attack1 = {FRAME_attak104, FRAME_attak106, hover_frames_attack1, NULL}; 412: 413: 414: mframe_t hover_frames_end_attack [] = 415: { 416: ai_charge, 1, NULL, 417: ai_charge, 1, NULL 418: }; 419: mmove_t hover_move_end_attack = {FRAME_attak107, FRAME_attak108, hover_frames_end_attack, hover_run}; 420: 421: void hover_reattack (edict_t *self) 422: { 423: if (self->enemy->health > 0 ) 424: if (visible (self, self->enemy) ) 425: if (random() <= 0.6) 426: { 427: self->monsterinfo.currentmove = &hover_move_attack1; 428: return; 429: } 430: self->monsterinfo.currentmove = &hover_move_end_attack; 431: } 432: 433: 434: void hover_fire_blaster (edict_t *self) 435: { 436: vec3_t start; 437: vec3_t forward, right; 438: vec3_t end; 439: vec3_t dir; 440: int effect; 441: 442: if (self->s.frame == FRAME_attak104) 443: effect = EF_HYPERBLASTER; 444: else 445: effect = 0; 446: 447: AngleVectors (self->s.angles, forward, right, NULL); 448: G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_HOVER_BLASTER_1], forward, right, start); 449: 450: VectorCopy (self->enemy->s.origin, end); 451: end[2] += self->enemy->viewheight; 452: VectorSubtract (end, start, dir); 453: 454: monster_fire_blaster (self, start, dir, 1, 1000, MZ2_HOVER_BLASTER_1, effect); 455: } 456: 457: 458: void hover_stand (edict_t *self) 459: { 460: self->monsterinfo.currentmove = &hover_move_stand; 461: } 462: 463: void hover_run (edict_t *self) 464: { 465: if (self->monsterinfo.aiflags & AI_STAND_GROUND) 466: self->monsterinfo.currentmove = &hover_move_stand; 467: else 468: self->monsterinfo.currentmove = &hover_move_run; 469: } 470: 471: void hover_walk (edict_t *self) 472: { 473: self->monsterinfo.currentmove = &hover_move_walk; 474: } 475: 476: void hover_start_attack (edict_t *self) 477: { 478: self->monsterinfo.currentmove = &hover_move_start_attack; 479: } 480: 481: void hover_attack(edict_t *self) 482: { 483: self->monsterinfo.currentmove = &hover_move_attack1; 484: } 485: 486: 487: void hover_pain (edict_t *self, edict_t *other, float kick, int damage) 488: { 489: if (self->health < (self->max_health / 2)) 490: self->s.skinnum = 1; 491: 492: if (level.time < self->pain_debounce_time) 493: return; 494: 495: self->pain_debounce_time = level.time + 3; 496: 497: if (skill->value == 3) 498: return; // no pain anims in nightmare 499: 500: if (damage <= 25) 501: { 502: if (random() < 0.5) 503: { 504: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); 505: self->monsterinfo.currentmove = &hover_move_pain3; 506: } 507: else 508: { 509: gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); 510: self->monsterinfo.currentmove = &hover_move_pain2; 511: } 512: } 513: else 514: { 515: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); 516: self->monsterinfo.currentmove = &hover_move_pain1; 517: } 518: } 519: 520: void hover_deadthink (edict_t *self) 521: { 522: if (!self->groundentity && level.time < self->timestamp) 523: { 524: self->nextthink = level.time + FRAMETIME; 525: return; 526: } 527: BecomeExplosion1(self); 528: } 529: 530: void hover_dead (edict_t *self) 531: { 532: VectorSet (self->mins, -16, -16, -24); 533: VectorSet (self->maxs, 16, 16, -8); 534: self->movetype = MOVETYPE_TOSS; 535: self->think = hover_deadthink; 536: self->nextthink = level.time + FRAMETIME; 537: self->timestamp = level.time + 15; 538: gi.linkentity (self); 539: } 540: 541: void hover_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) 542: { 543: int n; 544: 545: // check for gib 546: if (self->health <= self->gib_health) 547: { 548: gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0); 549: for (n= 0; n < 2; n++) 550: ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC); 551: for (n= 0; n < 2; n++) 552: ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); 553: ThrowHead (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); 554: self->deadflag = DEAD_DEAD; 555: return; 556: } 557: 558: if (self->deadflag == DEAD_DEAD) 559: return; 560: 561: // regular death 562: if (random() < 0.5) 563: gi.sound (self, CHAN_VOICE, sound_death1, 1, ATTN_NORM, 0); 564: else 565: gi.sound (self, CHAN_VOICE, sound_death2, 1, ATTN_NORM, 0); 566: self->deadflag = DEAD_DEAD; 567: self->takedamage = DAMAGE_YES; 568: self->monsterinfo.currentmove = &hover_move_death1; 569: } 570: 571: /*QUAKED monster_hover (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight 572: */ 573: void SP_monster_hover (edict_t *self) 574: { 575: if (deathmatch->value) 576: { 577: G_FreeEdict (self); 578: return; 579: } 580: 581: sound_pain1 = gi.soundindex ("hover/hovpain1.wav"); 582: sound_pain2 = gi.soundindex ("hover/hovpain2.wav"); 583: sound_death1 = gi.soundindex ("hover/hovdeth1.wav"); 584: sound_death2 = gi.soundindex ("hover/hovdeth2.wav"); 585: sound_sight = gi.soundindex ("hover/hovsght1.wav"); 586: sound_search1 = gi.soundindex ("hover/hovsrch1.wav"); 587: sound_search2 = gi.soundindex ("hover/hovsrch2.wav"); 588: 589: gi.soundindex ("hover/hovatck1.wav"); 590: 591: self->s.sound = gi.soundindex ("hover/hovidle1.wav"); 592: 593: self->movetype = MOVETYPE_STEP; 594: self->solid = SOLID_BBOX; 595: self->s.modelindex = gi.modelindex("models/monsters/hover/tris.md2"); 596: VectorSet (self->mins, -24, -24, -24); 597: VectorSet (self->maxs, 24, 24, 32); 598: 599: self->health = 240; 600: self->gib_health = -100; 601: self->mass = 150; 602: 603: self->pain = hover_pain; 604: self->die = hover_die; 605: 606: self->monsterinfo.stand = hover_stand; 607: self->monsterinfo.walk = hover_walk; 608: self->monsterinfo.run = hover_run; 609: // self->monsterinfo.dodge = hover_dodge; 610: self->monsterinfo.attack = hover_start_attack; 611: self->monsterinfo.sight = hover_sight; 612: self->monsterinfo.search = hover_search; 613: 614: gi.linkentity (self); 615: 616: self->monsterinfo.currentmove = &hover_move_stand; 617: self->monsterinfo.scale = MODEL_SCALE; 618: 619: flymonster_start (self); 620: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.