|
|
1.1 ! root 1: /* ! 2: ============================================================================== ! 3: ! 4: hover ! 5: ! 6: ============================================================================== ! 7: */ ! 8: ! 9: #include "g_local.h" ! 10: #include "m_hover.h" ! 11: ! 12: qboolean visible (edict_t *self, edict_t *other); ! 13: ! 14: ! 15: static int sound_pain1; ! 16: static int sound_pain2; ! 17: static int sound_death1; ! 18: static int sound_death2; ! 19: static int sound_sight; ! 20: static int sound_search1; ! 21: static int sound_search2; ! 22: ! 23: ! 24: void hover_sight (edict_t *self, edict_t *other) ! 25: { ! 26: gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0); ! 27: } ! 28: ! 29: void hover_search (edict_t *self) ! 30: { ! 31: if (random() < 0.5) ! 32: gi.sound (self, CHAN_VOICE, sound_search1, 1, ATTN_NORM, 0); ! 33: else ! 34: gi.sound (self, CHAN_VOICE, sound_search2, 1, ATTN_NORM, 0); ! 35: } ! 36: ! 37: ! 38: void hover_run (edict_t *self); ! 39: void hover_stand (edict_t *self); ! 40: void hover_dead (edict_t *self); ! 41: void hover_attack (edict_t *self); ! 42: void hover_reattack (edict_t *self); ! 43: void hover_fire_blaster (edict_t *self); ! 44: void hover_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); ! 45: ! 46: mframe_t hover_frames_stand [] = ! 47: { ! 48: ai_stand, 0, NULL, ! 49: ai_stand, 0, NULL, ! 50: ai_stand, 0, NULL, ! 51: ai_stand, 0, NULL, ! 52: ai_stand, 0, NULL, ! 53: ai_stand, 0, NULL, ! 54: ai_stand, 0, NULL, ! 55: ai_stand, 0, NULL, ! 56: ai_stand, 0, NULL, ! 57: ai_stand, 0, NULL, ! 58: ai_stand, 0, NULL, ! 59: ai_stand, 0, NULL, ! 60: ai_stand, 0, NULL, ! 61: ai_stand, 0, NULL, ! 62: ai_stand, 0, NULL, ! 63: ai_stand, 0, NULL, ! 64: ai_stand, 0, NULL, ! 65: ai_stand, 0, NULL, ! 66: ai_stand, 0, NULL, ! 67: ai_stand, 0, NULL, ! 68: ai_stand, 0, NULL, ! 69: 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: }; ! 79: mmove_t hover_move_stand = {FRAME_stand01, FRAME_stand30, hover_frames_stand, NULL}; ! 80: /* ! 81: mframe_t hover_frames_stop1 [] = ! 82: { ! 83: ai_move, 0, NULL, ! 84: ai_move, 0, NULL, ! 85: ai_move, 0, NULL, ! 86: ai_move, 0, NULL, ! 87: ai_move, 0, NULL, ! 88: ai_move, 0, NULL, ! 89: ai_move, 0, NULL, ! 90: ai_move, 0, NULL, ! 91: ai_move, 0, NULL ! 92: }; ! 93: mmove_t hover_move_stop1 = {FRAME_stop101, FRAME_stop109, hover_frames_stop1, NULL}; ! 94: ! 95: mframe_t hover_frames_stop2 [] = ! 96: { ! 97: ai_move, 0, NULL, ! 98: ai_move, 0, NULL, ! 99: ai_move, 0, NULL, ! 100: ai_move, 0, NULL, ! 101: ai_move, 0, NULL, ! 102: ai_move, 0, NULL, ! 103: ai_move, 0, NULL, ! 104: ai_move, 0, NULL ! 105: }; ! 106: mmove_t hover_move_stop2 = {FRAME_stop201, FRAME_stop208, hover_frames_stop2, NULL}; ! 107: */ ! 108: /* ! 109: mframe_t hover_frames_takeoff [] = ! 110: { ! 111: ai_move, 0, NULL, ! 112: ai_move, -2, NULL, ! 113: ai_move, 5, NULL, ! 114: ai_move, -1, NULL, ! 115: ai_move, 1, NULL, ! 116: ai_move, 0, NULL, ! 117: ai_move, 0, NULL, ! 118: ai_move, -1, NULL, ! 119: ai_move, -1, NULL, ! 120: ai_move, -1, NULL, ! 121: ai_move, 0, NULL, ! 122: ai_move, 2, NULL, ! 123: ai_move, 2, NULL, ! 124: ai_move, 1, NULL, ! 125: ai_move, 1, NULL, ! 126: ai_move, -6, NULL, ! 127: ai_move, -9, NULL, ! 128: ai_move, 1, NULL, ! 129: ai_move, 0, NULL, ! 130: ai_move, 2, NULL, ! 131: ai_move, 2, NULL, ! 132: ai_move, 1, NULL, ! 133: ai_move, 1, NULL, ! 134: ai_move, 1, NULL, ! 135: ai_move, 2, NULL, ! 136: ai_move, 0, NULL, ! 137: ai_move, 2, NULL, ! 138: ai_move, 3, NULL, ! 139: ai_move, 2, NULL, ! 140: ai_move, 0, NULL ! 141: }; ! 142: mmove_t hover_move_takeoff = {FRAME_takeof01, FRAME_takeof30, hover_frames_takeoff, NULL}; ! 143: */ ! 144: mframe_t hover_frames_pain3 [] = ! 145: { ! 146: ai_move, 0, NULL, ! 147: ai_move, 0, NULL, ! 148: ai_move, 0, NULL, ! 149: ai_move, 0, NULL, ! 150: ai_move, 0, NULL, ! 151: ai_move, 0, NULL, ! 152: ai_move, 0, NULL, ! 153: ai_move, 0, NULL, ! 154: ai_move, 0, NULL ! 155: }; ! 156: mmove_t hover_move_pain3 = {FRAME_pain301, FRAME_pain309, hover_frames_pain3, hover_run}; ! 157: ! 158: mframe_t hover_frames_pain2 [] = ! 159: { ! 160: ai_move, 0, NULL, ! 161: ai_move, 0, NULL, ! 162: ai_move, 0, NULL, ! 163: ai_move, 0, NULL, ! 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: }; ! 173: mmove_t hover_move_pain2 = {FRAME_pain201, FRAME_pain212, hover_frames_pain2, hover_run}; ! 174: ! 175: mframe_t hover_frames_pain1 [] = ! 176: { ! 177: ai_move, 0, NULL, ! 178: ai_move, 0, NULL, ! 179: ai_move, 2, NULL, ! 180: ai_move, -8, NULL, ! 181: ai_move, -4, NULL, ! 182: ai_move, -6, NULL, ! 183: ai_move, -4, NULL, ! 184: ai_move, -3, NULL, ! 185: ai_move, 1, NULL, ! 186: ai_move, 0, NULL, ! 187: ai_move, 0, NULL, ! 188: ai_move, 0, NULL, ! 189: ai_move, 3, NULL, ! 190: ai_move, 1, NULL, ! 191: ai_move, 0, NULL, ! 192: ai_move, 2, NULL, ! 193: ai_move, 3, NULL, ! 194: ai_move, 2, NULL, ! 195: ai_move, 7, NULL, ! 196: ai_move, 1, NULL, ! 197: ai_move, 0, NULL, ! 198: ai_move, 0, NULL, ! 199: ai_move, 2, NULL, ! 200: ai_move, 0, NULL, ! 201: ai_move, 0, NULL, ! 202: ai_move, 5, NULL, ! 203: ai_move, 3, NULL, ! 204: ai_move, 4, NULL ! 205: }; ! 206: mmove_t hover_move_pain1 = {FRAME_pain101, FRAME_pain128, hover_frames_pain1, hover_run}; ! 207: ! 208: /* ! 209: mframe_t hover_frames_land [] = ! 210: { ! 211: ai_move, 0, NULL ! 212: }; ! 213: mmove_t hover_move_land = {FRAME_land01, FRAME_land01, hover_frames_land, NULL}; ! 214: */ ! 215: /* ! 216: mframe_t hover_frames_forward [] = ! 217: { ! 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: 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: }; ! 254: mmove_t hover_move_forward = {FRAME_forwrd01, FRAME_forwrd35, hover_frames_forward, NULL}; ! 255: */ ! 256: mframe_t hover_frames_walk [] = ! 257: { ! 258: ai_walk, 4, NULL, ! 259: ai_walk, 4, NULL, ! 260: ai_walk, 4, NULL, ! 261: ai_walk, 4, NULL, ! 262: ai_walk, 4, NULL, ! 263: ai_walk, 4, NULL, ! 264: ai_walk, 4, NULL, ! 265: ai_walk, 4, NULL, ! 266: ai_walk, 4, NULL, ! 267: ai_walk, 4, NULL, ! 268: ai_walk, 4, NULL, ! 269: ai_walk, 4, NULL, ! 270: ai_walk, 4, NULL, ! 271: ai_walk, 4, NULL, ! 272: ai_walk, 4, NULL, ! 273: ai_walk, 4, NULL, ! 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: }; ! 294: mmove_t hover_move_walk = {FRAME_forwrd01, FRAME_forwrd35, hover_frames_walk, NULL}; ! 295: ! 296: mframe_t hover_frames_run [] = ! 297: { ! 298: ai_run, 10, NULL, ! 299: ai_run, 10, NULL, ! 300: ai_run, 10, NULL, ! 301: ai_run, 10, NULL, ! 302: ai_run, 10, NULL, ! 303: ai_run, 10, NULL, ! 304: ai_run, 10, NULL, ! 305: ai_run, 10, NULL, ! 306: ai_run, 10, NULL, ! 307: ai_run, 10, NULL, ! 308: ai_run, 10, NULL, ! 309: ai_run, 10, NULL, ! 310: ai_run, 10, NULL, ! 311: ai_run, 10, NULL, ! 312: ai_run, 10, NULL, ! 313: ai_run, 10, NULL, ! 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: }; ! 334: mmove_t hover_move_run = {FRAME_forwrd01, FRAME_forwrd35, hover_frames_run, NULL}; ! 335: ! 336: mframe_t hover_frames_death1 [] = ! 337: { ! 338: ai_move, 0, NULL, ! 339: ai_move, 0, NULL, ! 340: ai_move, 0, NULL, ! 341: ai_move, 0, NULL, ! 342: ai_move, 0, NULL, ! 343: ai_move, 0, NULL, ! 344: ai_move, -10,NULL, ! 345: ai_move, 3, NULL, ! 346: ai_move, 5, NULL, ! 347: ai_move, 4, NULL, ! 348: ai_move, 7, NULL ! 349: }; ! 350: mmove_t hover_move_death1 = {FRAME_death101, FRAME_death111, hover_frames_death1, hover_dead}; ! 351: /* ! 352: mframe_t hover_frames_backward [] = ! 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, 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: 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: ai_move, 0, NULL, ! 377: ai_move, 0, NULL ! 378: }; ! 379: mmove_t hover_move_backward = {FRAME_backwd01, FRAME_backwd24, hover_frames_backward, NULL}; ! 380: */ ! 381: mframe_t hover_frames_start_attack [] = ! 382: { ! 383: ai_charge, 1, NULL, ! 384: ai_charge, 1, NULL, ! 385: ai_charge, 1, NULL ! 386: }; ! 387: mmove_t hover_move_start_attack = {FRAME_attak101, FRAME_attak103, hover_frames_start_attack, hover_attack}; ! 388: ! 389: mframe_t hover_frames_attack1 [] = ! 390: { ! 391: ai_charge, -10, hover_fire_blaster, ! 392: ai_charge, -10, hover_fire_blaster, ! 393: ai_charge, 0, hover_reattack, ! 394: }; ! 395: mmove_t hover_move_attack1 = {FRAME_attak104, FRAME_attak106, hover_frames_attack1, NULL}; ! 396: ! 397: ! 398: mframe_t hover_frames_end_attack [] = ! 399: { ! 400: ai_charge, 1, NULL, ! 401: ai_charge, 1, NULL ! 402: }; ! 403: mmove_t hover_move_end_attack = {FRAME_attak107, FRAME_attak108, hover_frames_end_attack, hover_run}; ! 404: ! 405: /* PMM - circle strafing code */ ! 406: ! 407: mframe_t hover_frames_start_attack2 [] = ! 408: { ! 409: ai_charge, 15, NULL, ! 410: ai_charge, 15, NULL, ! 411: ai_charge, 15, NULL ! 412: }; ! 413: mmove_t hover_move_start_attack2 = {FRAME_attak101, FRAME_attak103, hover_frames_start_attack2, hover_attack}; ! 414: ! 415: mframe_t hover_frames_attack2 [] = ! 416: { ! 417: ai_charge, 10, hover_fire_blaster, ! 418: ai_charge, 10, hover_fire_blaster, ! 419: ai_charge, 10, hover_reattack, ! 420: }; ! 421: mmove_t hover_move_attack2 = {FRAME_attak104, FRAME_attak106, hover_frames_attack2, NULL}; ! 422: ! 423: ! 424: mframe_t hover_frames_end_attack2 [] = ! 425: { ! 426: ai_charge, 15, NULL, ! 427: ai_charge, 15, NULL ! 428: }; ! 429: mmove_t hover_move_end_attack2 = {FRAME_attak107, FRAME_attak108, hover_frames_end_attack2, hover_run}; ! 430: ! 431: // end of circle strafe ! 432: ! 433: ! 434: void hover_reattack (edict_t *self) ! 435: { ! 436: if (self->enemy->health > 0 ) ! 437: if (visible (self, self->enemy) ) ! 438: if (random() <= 0.6) ! 439: { ! 440: if (self->monsterinfo.attack_state == AS_STRAIGHT) ! 441: { ! 442: self->monsterinfo.currentmove = &hover_move_attack1; ! 443: return; ! 444: } ! 445: else if (self->monsterinfo.attack_state == AS_SLIDING) ! 446: { ! 447: self->monsterinfo.currentmove = &hover_move_attack2; ! 448: return; ! 449: } ! 450: else ! 451: gi.dprintf ("hover_reattack: unexpected state %d\n", self->monsterinfo.attack_state); ! 452: } ! 453: self->monsterinfo.currentmove = &hover_move_end_attack; ! 454: } ! 455: ! 456: ! 457: void hover_fire_blaster (edict_t *self) ! 458: { ! 459: vec3_t start; ! 460: vec3_t forward, right; ! 461: vec3_t end; ! 462: vec3_t dir; ! 463: int effect; ! 464: ! 465: if(!self->enemy || !self->enemy->inuse) //PGM ! 466: return; //PGM ! 467: ! 468: if (self->s.frame == FRAME_attak104) ! 469: effect = EF_HYPERBLASTER; ! 470: else ! 471: effect = 0; ! 472: ! 473: AngleVectors (self->s.angles, forward, right, NULL); ! 474: G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_HOVER_BLASTER_1], forward, right, start); ! 475: ! 476: VectorCopy (self->enemy->s.origin, end); ! 477: end[2] += self->enemy->viewheight; ! 478: VectorSubtract (end, start, dir); ! 479: ! 480: //PGM - daedalus fires blaster2 ! 481: if(self->mass < 200) ! 482: monster_fire_blaster (self, start, dir, 1, 1000, MZ2_HOVER_BLASTER_1, effect); ! 483: else ! 484: monster_fire_blaster2 (self, start, dir, 1, 1000, MZ2_DAEDALUS_BLASTER, EF_BLASTER); ! 485: // fixme - different muzzle flash ! 486: //PGM ! 487: } ! 488: ! 489: ! 490: void hover_stand (edict_t *self) ! 491: { ! 492: self->monsterinfo.currentmove = &hover_move_stand; ! 493: } ! 494: ! 495: void hover_run (edict_t *self) ! 496: { ! 497: if (self->monsterinfo.aiflags & AI_STAND_GROUND) ! 498: self->monsterinfo.currentmove = &hover_move_stand; ! 499: else ! 500: self->monsterinfo.currentmove = &hover_move_run; ! 501: } ! 502: ! 503: void hover_walk (edict_t *self) ! 504: { ! 505: self->monsterinfo.currentmove = &hover_move_walk; ! 506: } ! 507: ! 508: void hover_start_attack (edict_t *self) ! 509: { ! 510: self->monsterinfo.currentmove = &hover_move_start_attack; ! 511: } ! 512: ! 513: void hover_attack(edict_t *self) ! 514: { ! 515: float chance; ! 516: /* if (random() <= 0.5) ! 517: self->monsterinfo.currentmove = &flyer_move_attack1; ! 518: else */ ! 519: // 0% chance of circle in easy ! 520: // 50% chance in normal ! 521: // 75% chance in hard ! 522: // 86.67% chance in nightmare ! 523: if (!skill->value) ! 524: chance = 0; ! 525: else ! 526: chance = 1.0 - (0.5/(float)(skill->value)); ! 527: ! 528: if (self->mass > 150) // the daedalus strafes more ! 529: chance += 0.1; ! 530: ! 531: if (random() > chance) ! 532: { ! 533: self->monsterinfo.currentmove = &hover_move_attack1; ! 534: self->monsterinfo.attack_state = AS_STRAIGHT; ! 535: } ! 536: else // circle strafe ! 537: { ! 538: if (random () <= 0.5) // switch directions ! 539: self->monsterinfo.lefty = 1 - self->monsterinfo.lefty; ! 540: self->monsterinfo.currentmove = &hover_move_attack2; ! 541: self->monsterinfo.attack_state = AS_SLIDING; ! 542: } ! 543: } ! 544: ! 545: ! 546: void hover_pain (edict_t *self, edict_t *other, float kick, int damage) ! 547: { ! 548: if (self->health < (self->max_health / 2)) ! 549: self->s.skinnum |= 1; // PGM support for skins 2 & 3. ! 550: ! 551: if (level.time < self->pain_debounce_time) ! 552: return; ! 553: ! 554: self->pain_debounce_time = level.time + 3; ! 555: ! 556: if (skill->value == 3) ! 557: return; // no pain anims in nightmare ! 558: ! 559: if (damage <= 25) ! 560: { ! 561: if (random() < 0.5) ! 562: { ! 563: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); ! 564: self->monsterinfo.currentmove = &hover_move_pain3; ! 565: } ! 566: else ! 567: { ! 568: gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); ! 569: self->monsterinfo.currentmove = &hover_move_pain2; ! 570: } ! 571: } ! 572: else ! 573: { ! 574: //==== ! 575: //PGM pain sequence is WAY too long ! 576: if (random() < (0.45 - (0.1 * skill->value))) ! 577: { ! 578: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); ! 579: self->monsterinfo.currentmove = &hover_move_pain1; ! 580: } ! 581: else ! 582: { ! 583: gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); ! 584: self->monsterinfo.currentmove = &hover_move_pain2; ! 585: } ! 586: //PGM ! 587: //==== ! 588: } ! 589: } ! 590: ! 591: void hover_deadthink (edict_t *self) ! 592: { ! 593: if (!self->groundentity && level.time < self->timestamp) ! 594: { ! 595: self->nextthink = level.time + FRAMETIME; ! 596: return; ! 597: } ! 598: BecomeExplosion1(self); ! 599: } ! 600: ! 601: void hover_dead (edict_t *self) ! 602: { ! 603: VectorSet (self->mins, -16, -16, -24); ! 604: VectorSet (self->maxs, 16, 16, -8); ! 605: self->movetype = MOVETYPE_TOSS; ! 606: self->think = hover_deadthink; ! 607: self->nextthink = level.time + FRAMETIME; ! 608: self->timestamp = level.time + 15; ! 609: gi.linkentity (self); ! 610: } ! 611: ! 612: void hover_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) ! 613: { ! 614: int n; ! 615: ! 616: self->s.effects = 0; ! 617: self->monsterinfo.power_armor_type = POWER_ARMOR_NONE; ! 618: ! 619: // check for gib ! 620: if (self->health <= self->gib_health) ! 621: { ! 622: gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0); ! 623: for (n= 0; n < 2; n++) ! 624: ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC); ! 625: for (n= 0; n < 2; n++) ! 626: ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); ! 627: ThrowHead (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); ! 628: self->deadflag = DEAD_DEAD; ! 629: return; ! 630: } ! 631: ! 632: if (self->deadflag == DEAD_DEAD) ! 633: return; ! 634: ! 635: // regular death ! 636: if (random() < 0.5) ! 637: gi.sound (self, CHAN_VOICE, sound_death1, 1, ATTN_NORM, 0); ! 638: else ! 639: gi.sound (self, CHAN_VOICE, sound_death2, 1, ATTN_NORM, 0); ! 640: self->deadflag = DEAD_DEAD; ! 641: self->takedamage = DAMAGE_YES; ! 642: self->monsterinfo.currentmove = &hover_move_death1; ! 643: } ! 644: ! 645: //=========== ! 646: //PGM ! 647: qboolean hover_blocked (edict_t *self, float dist) ! 648: { ! 649: if(blocked_checkshot (self, 0.25 + (0.05 * skill->value) )) ! 650: return true; ! 651: ! 652: return false; ! 653: } ! 654: //PGM ! 655: //=========== ! 656: ! 657: /*QUAKED monster_hover (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight ! 658: */ ! 659: /*QUAKED monster_daedalus (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight ! 660: This is the improved icarus monster. ! 661: */ ! 662: void SP_monster_hover (edict_t *self) ! 663: { ! 664: if (deathmatch->value) ! 665: { ! 666: G_FreeEdict (self); ! 667: return; ! 668: } ! 669: ! 670: sound_pain1 = gi.soundindex ("hover/hovpain1.wav"); ! 671: sound_pain2 = gi.soundindex ("hover/hovpain2.wav"); ! 672: sound_death1 = gi.soundindex ("hover/hovdeth1.wav"); ! 673: sound_death2 = gi.soundindex ("hover/hovdeth2.wav"); ! 674: sound_sight = gi.soundindex ("hover/hovsght1.wav"); ! 675: sound_search1 = gi.soundindex ("hover/hovsrch1.wav"); ! 676: sound_search2 = gi.soundindex ("hover/hovsrch2.wav"); ! 677: ! 678: gi.soundindex ("hover/hovatck1.wav"); ! 679: ! 680: self->s.sound = gi.soundindex ("hover/hovidle1.wav"); ! 681: ! 682: self->movetype = MOVETYPE_STEP; ! 683: self->solid = SOLID_BBOX; ! 684: self->s.modelindex = gi.modelindex("models/monsters/hover/tris.md2"); ! 685: VectorSet (self->mins, -24, -24, -24); ! 686: VectorSet (self->maxs, 24, 24, 32); ! 687: ! 688: self->health = 240; ! 689: self->gib_health = -100; ! 690: self->mass = 150; ! 691: ! 692: self->pain = hover_pain; ! 693: self->die = hover_die; ! 694: ! 695: self->monsterinfo.stand = hover_stand; ! 696: self->monsterinfo.walk = hover_walk; ! 697: self->monsterinfo.run = hover_run; ! 698: // self->monsterinfo.dodge = hover_dodge; ! 699: self->monsterinfo.attack = hover_start_attack; ! 700: self->monsterinfo.sight = hover_sight; ! 701: self->monsterinfo.search = hover_search; ! 702: self->monsterinfo.blocked = hover_blocked; // PGM ! 703: ! 704: //PGM ! 705: if (strcmp(self->classname, "monster_daedalus") == 0) ! 706: { ! 707: self->health = 450; ! 708: self->mass = 225; ! 709: self->yaw_speed = 25; ! 710: self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN; ! 711: self->monsterinfo.power_armor_power = 100; ! 712: } ! 713: //PGM ! 714: ! 715: gi.linkentity (self); ! 716: ! 717: self->monsterinfo.currentmove = &hover_move_stand; ! 718: self->monsterinfo.scale = MODEL_SCALE; ! 719: ! 720: flymonster_start (self); ! 721: ! 722: //PGM ! 723: if (strcmp(self->classname, "monster_daedalus") == 0) ! 724: self->s.skinnum = 2; ! 725: //PGM ! 726: ! 727: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.