|
|
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: mframe_t hover_frames_takeoff [] = ! 109: { ! 110: ai_move, 0, NULL, ! 111: ai_move, -2, NULL, ! 112: ai_move, 5, NULL, ! 113: ai_move, -1, NULL, ! 114: ai_move, 1, NULL, ! 115: ai_move, 0, NULL, ! 116: ai_move, 0, NULL, ! 117: ai_move, -1, NULL, ! 118: ai_move, -1, NULL, ! 119: ai_move, -1, NULL, ! 120: ai_move, 0, NULL, ! 121: ai_move, 2, NULL, ! 122: ai_move, 2, NULL, ! 123: ai_move, 1, NULL, ! 124: ai_move, 1, NULL, ! 125: ai_move, -6, NULL, ! 126: ai_move, -9, NULL, ! 127: ai_move, 1, NULL, ! 128: ai_move, 0, NULL, ! 129: ai_move, 2, NULL, ! 130: ai_move, 2, NULL, ! 131: ai_move, 1, NULL, ! 132: ai_move, 1, NULL, ! 133: ai_move, 1, NULL, ! 134: ai_move, 2, NULL, ! 135: ai_move, 0, NULL, ! 136: ai_move, 2, NULL, ! 137: ai_move, 3, NULL, ! 138: ai_move, 2, NULL, ! 139: ai_move, 0, NULL ! 140: }; ! 141: mmove_t hover_move_takeoff = {FRAME_takeof01, FRAME_takeof30, hover_frames_takeoff, NULL}; ! 142: ! 143: mframe_t hover_frames_pain3 [] = ! 144: { ! 145: ai_move, 0, NULL, ! 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: }; ! 155: mmove_t hover_move_pain3 = {FRAME_pain301, FRAME_pain309, hover_frames_pain3, hover_run}; ! 156: ! 157: mframe_t hover_frames_pain2 [] = ! 158: { ! 159: ai_move, 0, NULL, ! 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: }; ! 172: mmove_t hover_move_pain2 = {FRAME_pain201, FRAME_pain212, hover_frames_pain2, hover_run}; ! 173: ! 174: mframe_t hover_frames_pain1 [] = ! 175: { ! 176: ai_move, 0, NULL, ! 177: ai_move, 0, NULL, ! 178: ai_move, 2, NULL, ! 179: ai_move, -8, NULL, ! 180: ai_move, -4, NULL, ! 181: ai_move, -6, NULL, ! 182: ai_move, -4, NULL, ! 183: ai_move, -3, NULL, ! 184: ai_move, 1, NULL, ! 185: ai_move, 0, NULL, ! 186: ai_move, 0, NULL, ! 187: ai_move, 0, NULL, ! 188: ai_move, 3, NULL, ! 189: ai_move, 1, NULL, ! 190: ai_move, 0, NULL, ! 191: ai_move, 2, NULL, ! 192: ai_move, 3, NULL, ! 193: ai_move, 2, NULL, ! 194: ai_move, 7, NULL, ! 195: ai_move, 1, NULL, ! 196: ai_move, 0, NULL, ! 197: ai_move, 0, NULL, ! 198: ai_move, 2, NULL, ! 199: ai_move, 0, NULL, ! 200: ai_move, 0, NULL, ! 201: ai_move, 5, NULL, ! 202: ai_move, 3, NULL, ! 203: ai_move, 4, NULL ! 204: }; ! 205: mmove_t hover_move_pain1 = {FRAME_pain101, FRAME_pain128, hover_frames_pain1, hover_run}; ! 206: ! 207: mframe_t hover_frames_land [] = ! 208: { ! 209: ai_move, 0, NULL ! 210: }; ! 211: mmove_t hover_move_land = {FRAME_land01, FRAME_land01, hover_frames_land, NULL}; ! 212: ! 213: mframe_t hover_frames_forward [] = ! 214: { ! 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: 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: }; ! 251: mmove_t hover_move_forward = {FRAME_forwrd01, FRAME_forwrd35, hover_frames_forward, NULL}; ! 252: ! 253: mframe_t hover_frames_walk [] = ! 254: { ! 255: ai_walk, 4, NULL, ! 256: ai_walk, 4, NULL, ! 257: ai_walk, 4, NULL, ! 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: }; ! 291: mmove_t hover_move_walk = {FRAME_forwrd01, FRAME_forwrd35, hover_frames_walk, NULL}; ! 292: ! 293: mframe_t hover_frames_run [] = ! 294: { ! 295: ai_run, 10, NULL, ! 296: ai_run, 10, NULL, ! 297: ai_run, 10, NULL, ! 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: }; ! 331: mmove_t hover_move_run = {FRAME_forwrd01, FRAME_forwrd35, hover_frames_run, NULL}; ! 332: ! 333: mframe_t hover_frames_death1 [] = ! 334: { ! 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, -10,NULL, ! 342: ai_move, 3, NULL, ! 343: ai_move, 5, NULL, ! 344: ai_move, 4, NULL, ! 345: ai_move, 7, NULL ! 346: }; ! 347: mmove_t hover_move_death1 = {FRAME_death101, FRAME_death111, hover_frames_death1, hover_dead}; ! 348: ! 349: mframe_t hover_frames_backward [] = ! 350: { ! 351: ai_move, 0, NULL, ! 352: ai_move, 0, NULL, ! 353: ai_move, 0, NULL, ! 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: }; ! 376: mmove_t hover_move_backward = {FRAME_backwd01, FRAME_backwd24, hover_frames_backward, NULL}; ! 377: ! 378: mframe_t hover_frames_start_attack [] = ! 379: { ! 380: ai_charge, 1, NULL, ! 381: ai_charge, 1, NULL, ! 382: ai_charge, 1, NULL ! 383: }; ! 384: mmove_t hover_move_start_attack = {FRAME_attak101, FRAME_attak103, hover_frames_start_attack, hover_attack}; ! 385: ! 386: mframe_t hover_frames_attack1 [] = ! 387: { ! 388: ai_charge, -10, hover_fire_blaster, ! 389: ai_charge, -10, hover_fire_blaster, ! 390: ai_charge, 0, hover_reattack, ! 391: }; ! 392: mmove_t hover_move_attack1 = {FRAME_attak104, FRAME_attak106, hover_frames_attack1, NULL}; ! 393: ! 394: ! 395: mframe_t hover_frames_end_attack [] = ! 396: { ! 397: ai_charge, 1, NULL, ! 398: ai_charge, 1, NULL ! 399: }; ! 400: mmove_t hover_move_end_attack = {FRAME_attak107, FRAME_attak108, hover_frames_end_attack, hover_run}; ! 401: ! 402: void hover_reattack (edict_t *self) ! 403: { ! 404: if (self->enemy->health > 0 ) ! 405: if (visible (self, self->enemy) ) ! 406: if (random() <= 0.6) ! 407: { ! 408: self->monsterinfo.currentmove = &hover_move_attack1; ! 409: return; ! 410: } ! 411: self->monsterinfo.currentmove = &hover_move_end_attack; ! 412: } ! 413: ! 414: ! 415: void hover_fire_blaster (edict_t *self) ! 416: { ! 417: vec3_t start; ! 418: vec3_t forward, right; ! 419: vec3_t end; ! 420: vec3_t dir; ! 421: int effect; ! 422: ! 423: if (self->s.frame == FRAME_attak104) ! 424: effect = EF_HYPERBLASTER; ! 425: else ! 426: effect = 0; ! 427: ! 428: AngleVectors (self->s.angles, forward, right, NULL); ! 429: G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_HOVER_BLASTER_1], forward, right, start); ! 430: ! 431: VectorCopy (self->enemy->s.origin, end); ! 432: end[2] += self->enemy->viewheight; ! 433: VectorSubtract (end, start, dir); ! 434: ! 435: monster_fire_blaster (self, start, dir, 1, 1000, MZ2_HOVER_BLASTER_1, effect); ! 436: } ! 437: ! 438: ! 439: void hover_stand (edict_t *self) ! 440: { ! 441: self->monsterinfo.currentmove = &hover_move_stand; ! 442: } ! 443: ! 444: void hover_run (edict_t *self) ! 445: { ! 446: if (self->monsterinfo.aiflags & AI_STAND_GROUND) ! 447: self->monsterinfo.currentmove = &hover_move_stand; ! 448: else ! 449: self->monsterinfo.currentmove = &hover_move_run; ! 450: } ! 451: ! 452: void hover_walk (edict_t *self) ! 453: { ! 454: self->monsterinfo.currentmove = &hover_move_walk; ! 455: } ! 456: ! 457: void hover_start_attack (edict_t *self) ! 458: { ! 459: self->monsterinfo.currentmove = &hover_move_start_attack; ! 460: } ! 461: ! 462: void hover_attack(edict_t *self) ! 463: { ! 464: self->monsterinfo.currentmove = &hover_move_attack1; ! 465: } ! 466: ! 467: ! 468: void hover_pain (edict_t *self, edict_t *other, float kick, int damage) ! 469: { ! 470: if (self->health < (self->max_health / 2)) ! 471: self->s.skinnum = 1; ! 472: ! 473: if (level.time < self->pain_debounce_time) ! 474: return; ! 475: ! 476: self->pain_debounce_time = level.time + 3; ! 477: ! 478: if (skill->value == 3) ! 479: return; // no pain anims in nightmare ! 480: ! 481: if (damage <= 25) ! 482: { ! 483: if (random() < 0.5) ! 484: { ! 485: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); ! 486: self->monsterinfo.currentmove = &hover_move_pain3; ! 487: } ! 488: else ! 489: { ! 490: gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); ! 491: self->monsterinfo.currentmove = &hover_move_pain2; ! 492: } ! 493: } ! 494: else ! 495: { ! 496: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); ! 497: self->monsterinfo.currentmove = &hover_move_pain1; ! 498: } ! 499: } ! 500: ! 501: void hover_deadthink (edict_t *self) ! 502: { ! 503: if (!self->groundentity && level.time < self->timestamp) ! 504: { ! 505: self->nextthink = level.time + FRAMETIME; ! 506: return; ! 507: } ! 508: BecomeExplosion1(self); ! 509: } ! 510: ! 511: void hover_dead (edict_t *self) ! 512: { ! 513: VectorSet (self->mins, -16, -16, -24); ! 514: VectorSet (self->maxs, 16, 16, -8); ! 515: self->movetype = MOVETYPE_TOSS; ! 516: self->think = hover_deadthink; ! 517: self->nextthink = level.time + FRAMETIME; ! 518: self->timestamp = level.time + 15; ! 519: gi.linkentity (self); ! 520: } ! 521: ! 522: void hover_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) ! 523: { ! 524: int n; ! 525: ! 526: // check for gib ! 527: if (self->health <= self->gib_health) ! 528: { ! 529: gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0); ! 530: for (n= 0; n < 2; n++) ! 531: ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC); ! 532: for (n= 0; n < 2; n++) ! 533: ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); ! 534: ThrowHead (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); ! 535: self->deadflag = DEAD_DEAD; ! 536: return; ! 537: } ! 538: ! 539: if (self->deadflag == DEAD_DEAD) ! 540: return; ! 541: ! 542: // regular death ! 543: if (random() < 0.5) ! 544: gi.sound (self, CHAN_VOICE, sound_death1, 1, ATTN_NORM, 0); ! 545: else ! 546: gi.sound (self, CHAN_VOICE, sound_death2, 1, ATTN_NORM, 0); ! 547: self->deadflag = DEAD_DEAD; ! 548: self->takedamage = DAMAGE_YES; ! 549: self->monsterinfo.currentmove = &hover_move_death1; ! 550: } ! 551: ! 552: /*QUAKED monster_hover (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight ! 553: */ ! 554: void SP_monster_hover (edict_t *self) ! 555: { ! 556: if (deathmatch->value) ! 557: { ! 558: G_FreeEdict (self); ! 559: return; ! 560: } ! 561: ! 562: sound_pain1 = gi.soundindex ("hover/hovpain1.wav"); ! 563: sound_pain2 = gi.soundindex ("hover/hovpain2.wav"); ! 564: sound_death1 = gi.soundindex ("hover/hovdeth1.wav"); ! 565: sound_death2 = gi.soundindex ("hover/hovdeth2.wav"); ! 566: sound_sight = gi.soundindex ("hover/hovsght1.wav"); ! 567: sound_search1 = gi.soundindex ("hover/hovsrch1.wav"); ! 568: sound_search2 = gi.soundindex ("hover/hovsrch2.wav"); ! 569: ! 570: gi.soundindex ("hover/hovatck1.wav"); ! 571: ! 572: self->s.sound = gi.soundindex ("hover/hovidle1.wav"); ! 573: ! 574: self->movetype = MOVETYPE_STEP; ! 575: self->solid = SOLID_BBOX; ! 576: self->s.modelindex = gi.modelindex("models/monsters/hover/tris.md2"); ! 577: VectorSet (self->mins, -24, -24, -24); ! 578: VectorSet (self->maxs, 24, 24, 32); ! 579: ! 580: self->health = 240; ! 581: self->gib_health = -100; ! 582: self->mass = 150; ! 583: ! 584: self->pain = hover_pain; ! 585: self->die = hover_die; ! 586: ! 587: self->monsterinfo.stand = hover_stand; ! 588: self->monsterinfo.walk = hover_walk; ! 589: self->monsterinfo.run = hover_run; ! 590: // self->monsterinfo.dodge = hover_dodge; ! 591: self->monsterinfo.attack = hover_start_attack; ! 592: self->monsterinfo.sight = hover_sight; ! 593: self->monsterinfo.search = hover_search; ! 594: ! 595: gi.linkentity (self); ! 596: ! 597: self->monsterinfo.currentmove = &hover_move_stand; ! 598: self->monsterinfo.scale = MODEL_SCALE; ! 599: ! 600: flymonster_start (self); ! 601: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.