|
|
1.1 ! root 1: ! 2: /* ! 3: ============================================================================== ! 4: ! 5: GLADIATOR BOSS ! 6: ! 7: ============================================================================== ! 8: */ ! 9: ! 10: #include "g_local.h" ! 11: #include "m_gladiator.h" ! 12: ! 13: ! 14: static int sound_pain1; ! 15: static int sound_pain2; ! 16: static int sound_die; ! 17: static int sound_gun; ! 18: static int sound_cleaver_swing; ! 19: static int sound_cleaver_hit; ! 20: static int sound_cleaver_miss; ! 21: static int sound_idle; ! 22: static int sound_search; ! 23: static int sound_sight; ! 24: ! 25: ! 26: void gladb_idle (edict_t *self) ! 27: { ! 28: gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0); ! 29: } ! 30: ! 31: void gladb_sight (edict_t *self, edict_t *other) ! 32: { ! 33: gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0); ! 34: } ! 35: ! 36: void gladb_search (edict_t *self) ! 37: { ! 38: gi.sound (self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0); ! 39: } ! 40: ! 41: void gladb_cleaver_swing (edict_t *self) ! 42: { ! 43: gi.sound (self, CHAN_WEAPON, sound_cleaver_swing, 1, ATTN_NORM, 0); ! 44: } ! 45: ! 46: mframe_t gladb_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: }; ! 56: mmove_t gladb_move_stand = {FRAME_stand1, FRAME_stand7, gladb_frames_stand, NULL}; ! 57: ! 58: void gladb_stand (edict_t *self) ! 59: { ! 60: self->monsterinfo.currentmove = &gladb_move_stand; ! 61: } ! 62: ! 63: ! 64: mframe_t gladb_frames_walk [] = ! 65: { ! 66: ai_walk, 15, NULL, ! 67: ai_walk, 7, NULL, ! 68: ai_walk, 6, NULL, ! 69: ai_walk, 5, NULL, ! 70: ai_walk, 2, NULL, ! 71: ai_walk, 0, NULL, ! 72: ai_walk, 2, NULL, ! 73: ai_walk, 8, NULL, ! 74: ai_walk, 12, NULL, ! 75: ai_walk, 8, NULL, ! 76: ai_walk, 5, NULL, ! 77: ai_walk, 5, NULL, ! 78: ai_walk, 2, NULL, ! 79: ai_walk, 2, NULL, ! 80: ai_walk, 1, NULL, ! 81: ai_walk, 8, NULL ! 82: }; ! 83: mmove_t gladb_move_walk = {FRAME_walk1, FRAME_walk16, gladb_frames_walk, NULL}; ! 84: ! 85: void gladb_walk (edict_t *self) ! 86: { ! 87: self->monsterinfo.currentmove = &gladb_move_walk; ! 88: } ! 89: ! 90: ! 91: mframe_t gladb_frames_run [] = ! 92: { ! 93: ai_run, 23, NULL, ! 94: ai_run, 14, NULL, ! 95: ai_run, 14, NULL, ! 96: ai_run, 21, NULL, ! 97: ai_run, 12, NULL, ! 98: ai_run, 13, NULL ! 99: }; ! 100: mmove_t gladb_move_run = {FRAME_run1, FRAME_run6, gladb_frames_run, NULL}; ! 101: ! 102: void gladb_run (edict_t *self) ! 103: { ! 104: if (self->monsterinfo.aiflags & AI_STAND_GROUND) ! 105: self->monsterinfo.currentmove = &gladb_move_stand; ! 106: else ! 107: self->monsterinfo.currentmove = &gladb_move_run; ! 108: } ! 109: ! 110: ! 111: void GladbMelee (edict_t *self) ! 112: { ! 113: vec3_t aim; ! 114: ! 115: VectorSet (aim, MELEE_DISTANCE, self->mins[0], -4); ! 116: if (fire_hit (self, aim, (20 + (rand() %5)), 300)) ! 117: gi.sound (self, CHAN_AUTO, sound_cleaver_hit, 1, ATTN_NORM, 0); ! 118: else ! 119: gi.sound (self, CHAN_AUTO, sound_cleaver_miss, 1, ATTN_NORM, 0); ! 120: } ! 121: ! 122: mframe_t gladb_frames_attack_melee [] = ! 123: { ! 124: ai_charge, 0, NULL, ! 125: ai_charge, 0, NULL, ! 126: ai_charge, 0, NULL, ! 127: ai_charge, 0, NULL, ! 128: ai_charge, 0, gladb_cleaver_swing, ! 129: ai_charge, 0, NULL, ! 130: ai_charge, 0, GladbMelee, ! 131: ai_charge, 0, NULL, ! 132: ai_charge, 0, NULL, ! 133: ai_charge, 0, NULL, ! 134: ai_charge, 0, gladb_cleaver_swing, ! 135: ai_charge, 0, NULL, ! 136: ai_charge, 0, NULL, ! 137: ai_charge, 0, GladbMelee, ! 138: ai_charge, 0, NULL, ! 139: ai_charge, 0, NULL, ! 140: ai_charge, 0, NULL ! 141: }; ! 142: mmove_t gladb_move_attack_melee = {FRAME_melee1, FRAME_melee17, gladb_frames_attack_melee, gladb_run}; ! 143: ! 144: void gladb_melee(edict_t *self) ! 145: { ! 146: self->monsterinfo.currentmove = &gladb_move_attack_melee; ! 147: } ! 148: ! 149: ! 150: void gladbGun (edict_t *self) ! 151: { ! 152: vec3_t start; ! 153: vec3_t dir; ! 154: vec3_t forward, right; ! 155: ! 156: AngleVectors (self->s.angles, forward, right, NULL); ! 157: G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_GLADIATOR_RAILGUN_1], forward, right, start); ! 158: ! 159: // calc direction to where we targted ! 160: VectorSubtract (self->pos1, start, dir); ! 161: VectorNormalize (dir); ! 162: ! 163: fire_plasma (self, start, dir, 100, 725, 60, 60); ! 164: } ! 165: ! 166: void gladbGun_check (edict_t *self) ! 167: { ! 168: if (skill->value == 3) ! 169: gladbGun (self); ! 170: } ! 171: ! 172: mframe_t gladb_frames_attack_gun [] = ! 173: { ! 174: ai_charge, 0, NULL, ! 175: ai_charge, 0, NULL, ! 176: ai_charge, 0, gladbGun, ! 177: ai_charge, 0, NULL, ! 178: ai_charge, 0, NULL, ! 179: ai_charge, 0, gladbGun, ! 180: ai_charge, 0, NULL, ! 181: ai_charge, 0, NULL, ! 182: ai_charge, 0, gladbGun_check ! 183: }; ! 184: mmove_t gladb_move_attack_gun = {FRAME_attack1, FRAME_attack9, gladb_frames_attack_gun, gladb_run}; ! 185: ! 186: void gladb_attack(edict_t *self) ! 187: { ! 188: float range; ! 189: vec3_t v; ! 190: ! 191: // a small safe zone ! 192: VectorSubtract (self->s.origin, self->enemy->s.origin, v); ! 193: range = VectorLength(v); ! 194: if (range <= (MELEE_DISTANCE + 32)) ! 195: return; ! 196: ! 197: // charge up the railgun ! 198: gi.sound (self, CHAN_WEAPON, sound_gun, 1, ATTN_NORM, 0); ! 199: VectorCopy (self->enemy->s.origin, self->pos1); //save for aiming the shot ! 200: self->pos1[2] += self->enemy->viewheight; ! 201: self->monsterinfo.currentmove = &gladb_move_attack_gun; ! 202: } ! 203: ! 204: ! 205: mframe_t gladb_frames_pain [] = ! 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: }; ! 214: mmove_t gladb_move_pain = {FRAME_pain1, FRAME_pain6, gladb_frames_pain, gladb_run}; ! 215: ! 216: mframe_t gladb_frames_pain_air [] = ! 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: }; ! 226: mmove_t gladb_move_pain_air = {FRAME_painup1, FRAME_painup7, gladb_frames_pain_air, gladb_run}; ! 227: ! 228: void gladb_pain (edict_t *self, edict_t *other, float kick, int damage) ! 229: { ! 230: ! 231: if (self->health < (self->max_health / 2)) ! 232: self->s.skinnum = 1; ! 233: ! 234: if (level.time < self->pain_debounce_time) ! 235: { ! 236: if ((self->velocity[2] > 100) && (self->monsterinfo.currentmove == &gladb_move_pain)) ! 237: self->monsterinfo.currentmove = &gladb_move_pain_air; ! 238: return; ! 239: } ! 240: ! 241: self->pain_debounce_time = level.time + 3; ! 242: ! 243: if (random() < 0.5) ! 244: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); ! 245: else ! 246: gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); ! 247: ! 248: if (self->velocity[2] > 100) ! 249: self->monsterinfo.currentmove = &gladb_move_pain_air; ! 250: else ! 251: self->monsterinfo.currentmove = &gladb_move_pain; ! 252: ! 253: } ! 254: ! 255: ! 256: void gladb_dead (edict_t *self) ! 257: { ! 258: VectorSet (self->mins, -16, -16, -24); ! 259: VectorSet (self->maxs, 16, 16, -8); ! 260: self->movetype = MOVETYPE_TOSS; ! 261: self->svflags |= SVF_DEADMONSTER; ! 262: self->nextthink = 0; ! 263: gi.linkentity (self); ! 264: } ! 265: ! 266: mframe_t gladb_frames_death [] = ! 267: { ! 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, 0, NULL, ! 279: ai_move, 0, NULL, ! 280: ai_move, 0, NULL, ! 281: ai_move, 0, NULL, ! 282: ai_move, 0, NULL, ! 283: ai_move, 0, NULL, ! 284: ai_move, 0, NULL, ! 285: ai_move, 0, NULL, ! 286: ai_move, 0, NULL, ! 287: ai_move, 0, NULL, ! 288: ai_move, 0, NULL, ! 289: ai_move, 0, NULL ! 290: }; ! 291: mmove_t gladb_move_death = {FRAME_death1, FRAME_death22, gladb_frames_death, gladb_dead}; ! 292: ! 293: void gladb_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) ! 294: { ! 295: int n; ! 296: ! 297: // check for gib ! 298: if (self->health <= self->gib_health) ! 299: { ! 300: gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0); ! 301: for (n= 0; n < 2; n++) ! 302: ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC); ! 303: for (n= 0; n < 4; n++) ! 304: ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); ! 305: ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC); ! 306: self->deadflag = DEAD_DEAD; ! 307: return; ! 308: } ! 309: ! 310: if (self->deadflag == DEAD_DEAD) ! 311: return; ! 312: ! 313: // regular death ! 314: gi.sound (self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0); ! 315: self->deadflag = DEAD_DEAD; ! 316: self->takedamage = DAMAGE_YES; ! 317: ! 318: self->monsterinfo.currentmove = &gladb_move_death; ! 319: } ! 320: ! 321: ! 322: /*QUAKED monster_gladb (1 .5 0) (-32 -32 -24) (32 32 64) Ambush Trigger_Spawn Sight ! 323: */ ! 324: void SP_monster_gladb (edict_t *self) ! 325: { ! 326: if (deathmatch->value) ! 327: { ! 328: G_FreeEdict (self); ! 329: return; ! 330: } ! 331: ! 332: ! 333: sound_pain1 = gi.soundindex ("gladiator/pain.wav"); ! 334: sound_pain2 = gi.soundindex ("gladiator/gldpain2.wav"); ! 335: sound_die = gi.soundindex ("gladiator/glddeth2.wav"); ! 336: // note to self ! 337: // need to change to PHALANX sound ! 338: sound_gun = gi.soundindex ("weapons/plasshot.wav"); ! 339: ! 340: sound_cleaver_swing = gi.soundindex ("gladiator/melee1.wav"); ! 341: sound_cleaver_hit = gi.soundindex ("gladiator/melee2.wav"); ! 342: sound_cleaver_miss = gi.soundindex ("gladiator/melee3.wav"); ! 343: sound_idle = gi.soundindex ("gladiator/gldidle1.wav"); ! 344: sound_search = gi.soundindex ("gladiator/gldsrch1.wav"); ! 345: sound_sight = gi.soundindex ("gladiator/sight.wav"); ! 346: ! 347: self->movetype = MOVETYPE_STEP; ! 348: self->solid = SOLID_BBOX; ! 349: self->s.modelindex = gi.modelindex ("models/monsters/gladb/tris.md2"); ! 350: VectorSet (self->mins, -32, -32, -24); ! 351: VectorSet (self->maxs, 32, 32, 64); ! 352: ! 353: self->health = 800; ! 354: self->gib_health = -175; ! 355: self->mass = 350; ! 356: ! 357: self->pain = gladb_pain; ! 358: self->die = gladb_die; ! 359: ! 360: self->monsterinfo.stand = gladb_stand; ! 361: self->monsterinfo.walk = gladb_walk; ! 362: self->monsterinfo.run = gladb_run; ! 363: self->monsterinfo.dodge = NULL; ! 364: self->monsterinfo.attack = gladb_attack; ! 365: self->monsterinfo.melee = gladb_melee; ! 366: self->monsterinfo.sight = gladb_sight; ! 367: self->monsterinfo.idle = gladb_idle; ! 368: self->monsterinfo.search = gladb_search; ! 369: ! 370: gi.linkentity (self); ! 371: self->monsterinfo.currentmove = &gladb_move_stand; ! 372: self->monsterinfo.scale = MODEL_SCALE; ! 373: ! 374: self->monsterinfo.power_armor_type = POWER_ARMOR_SHIELD; ! 375: self->monsterinfo.power_armor_power = 400; ! 376: ! 377: ! 378: walkmonster_start (self); ! 379: } ! 380:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.