m_insane.c (17253B)
1 /* 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 /* 21 ============================================================================== 22 23 insane 24 25 ============================================================================== 26 */ 27 28 #include "g_local.h" 29 #include "m_insane.h" 30 31 32 static int sound_fist; 33 static int sound_shake; 34 static int sound_moan; 35 static int sound_scream[8]; 36 37 void insane_fist (edict_t *self) 38 { 39 gi.sound (self, CHAN_VOICE, sound_fist, 1, ATTN_IDLE, 0); 40 } 41 42 void insane_shake (edict_t *self) 43 { 44 gi.sound (self, CHAN_VOICE, sound_shake, 1, ATTN_IDLE, 0); 45 } 46 47 void insane_moan (edict_t *self) 48 { 49 gi.sound (self, CHAN_VOICE, sound_moan, 1, ATTN_IDLE, 0); 50 } 51 52 void insane_scream (edict_t *self) 53 { 54 gi.sound (self, CHAN_VOICE, sound_scream[rand()%8], 1, ATTN_IDLE, 0); 55 } 56 57 58 void insane_stand (edict_t *self); 59 void insane_dead (edict_t *self); 60 void insane_cross (edict_t *self); 61 void insane_walk (edict_t *self); 62 void insane_run (edict_t *self); 63 void insane_checkdown (edict_t *self); 64 void insane_checkup (edict_t *self); 65 void insane_onground (edict_t *self); 66 67 68 mframe_t insane_frames_stand_normal [] = 69 { 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, insane_checkdown 76 }; 77 mmove_t insane_move_stand_normal = {FRAME_stand60, FRAME_stand65, insane_frames_stand_normal, insane_stand}; 78 79 mframe_t insane_frames_stand_insane [] = 80 { 81 ai_stand, 0, insane_shake, 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 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, insane_checkdown 111 }; 112 mmove_t insane_move_stand_insane = {FRAME_stand65, FRAME_stand94, insane_frames_stand_insane, insane_stand}; 113 114 mframe_t insane_frames_uptodown [] = 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, insane_moan, 124 ai_move, 0, NULL, 125 ai_move, 0, NULL, 126 127 ai_move, 0, NULL, 128 ai_move, 0, NULL, 129 ai_move, 0, NULL, 130 ai_move, 0, NULL, 131 ai_move, 0, NULL, 132 ai_move, 0, NULL, 133 ai_move, 0, NULL, 134 ai_move, 0, NULL, 135 ai_move, 0, NULL, 136 ai_move, 0, NULL, 137 138 ai_move, 2.7, NULL, 139 ai_move, 4.1, NULL, 140 ai_move, 6, NULL, 141 ai_move, 7.6, NULL, 142 ai_move, 3.6, NULL, 143 ai_move, 0, NULL, 144 ai_move, 0, NULL, 145 ai_move, 0, insane_fist, 146 ai_move, 0, NULL, 147 ai_move, 0, NULL, 148 149 ai_move, 0, NULL, 150 ai_move, 0, NULL, 151 ai_move, 0, NULL, 152 ai_move, 0, insane_fist, 153 ai_move, 0, NULL, 154 ai_move, 0, NULL, 155 ai_move, 0, NULL, 156 ai_move, 0, NULL, 157 ai_move, 0, NULL, 158 ai_move, 0, NULL 159 }; 160 mmove_t insane_move_uptodown = {FRAME_stand1, FRAME_stand40, insane_frames_uptodown, insane_onground}; 161 162 163 mframe_t insane_frames_downtoup [] = 164 { 165 ai_move, -0.7, NULL, // 41 166 ai_move, -1.2, NULL, // 42 167 ai_move, -1.5, NULL, // 43 168 ai_move, -4.5, NULL, // 44 169 ai_move, -3.5, NULL, // 45 170 ai_move, -0.2, NULL, // 46 171 ai_move, 0, NULL, // 47 172 ai_move, -1.3, NULL, // 48 173 ai_move, -3, NULL, // 49 174 ai_move, -2, NULL, // 50 175 ai_move, 0, NULL, // 51 176 ai_move, 0, NULL, // 52 177 ai_move, 0, NULL, // 53 178 ai_move, -3.3, NULL, // 54 179 ai_move, -1.6, NULL, // 55 180 ai_move, -0.3, NULL, // 56 181 ai_move, 0, NULL, // 57 182 ai_move, 0, NULL, // 58 183 ai_move, 0, NULL // 59 184 }; 185 mmove_t insane_move_downtoup = {FRAME_stand41, FRAME_stand59, insane_frames_downtoup, insane_stand}; 186 187 mframe_t insane_frames_jumpdown [] = 188 { 189 ai_move, 0.2, NULL, 190 ai_move, 11.5, NULL, 191 ai_move, 5.1, NULL, 192 ai_move, 7.1, NULL, 193 ai_move, 0, NULL 194 }; 195 mmove_t insane_move_jumpdown = {FRAME_stand96, FRAME_stand100, insane_frames_jumpdown, insane_onground}; 196 197 198 mframe_t insane_frames_down [] = 199 { 200 ai_move, 0, NULL, // 100 201 ai_move, 0, NULL, 202 ai_move, 0, NULL, 203 ai_move, 0, NULL, 204 ai_move, 0, NULL, 205 ai_move, 0, NULL, 206 ai_move, 0, NULL, 207 ai_move, 0, NULL, 208 ai_move, 0, NULL, 209 ai_move, 0, NULL, 210 ai_move, 0, NULL, // 110 211 ai_move, -1.7, NULL, 212 ai_move, -1.6, NULL, 213 ai_move, 0, NULL, 214 ai_move, 0, NULL, 215 ai_move, 0, NULL, 216 ai_move, 0, insane_fist, 217 ai_move, 0, NULL, 218 ai_move, 0, NULL, 219 ai_move, 0, NULL, 220 ai_move, 0, NULL, // 120 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, // 130 231 ai_move, 0, NULL, 232 ai_move, 0, NULL, 233 ai_move, 0, insane_moan, 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, // 140 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, // 150 251 ai_move, 0.5, NULL, 252 ai_move, 0, NULL, 253 ai_move, -0.2, insane_scream, 254 ai_move, 0, NULL, 255 ai_move, 0.2, NULL, 256 ai_move, 0.4, NULL, 257 ai_move, 0.6, NULL, 258 ai_move, 0.8, NULL, 259 ai_move, 0.7, NULL, 260 ai_move, 0, insane_checkup // 160 261 }; 262 mmove_t insane_move_down = {FRAME_stand100, FRAME_stand160, insane_frames_down, insane_onground}; 263 264 mframe_t insane_frames_walk_normal [] = 265 { 266 ai_walk, 0, insane_scream, 267 ai_walk, 2.5, NULL, 268 ai_walk, 3.5, NULL, 269 ai_walk, 1.7, NULL, 270 ai_walk, 2.3, NULL, 271 ai_walk, 2.4, NULL, 272 ai_walk, 2.2, NULL, 273 ai_walk, 4.2, NULL, 274 ai_walk, 5.6, NULL, 275 ai_walk, 3.3, NULL, 276 ai_walk, 2.4, NULL, 277 ai_walk, 0.9, NULL, 278 ai_walk, 0, NULL 279 }; 280 mmove_t insane_move_walk_normal = {FRAME_walk27, FRAME_walk39, insane_frames_walk_normal, insane_walk}; 281 mmove_t insane_move_run_normal = {FRAME_walk27, FRAME_walk39, insane_frames_walk_normal, insane_run}; 282 283 mframe_t insane_frames_walk_insane [] = 284 { 285 ai_walk, 0, insane_scream, // walk 1 286 ai_walk, 3.4, NULL, // walk 2 287 ai_walk, 3.6, NULL, // 3 288 ai_walk, 2.9, NULL, // 4 289 ai_walk, 2.2, NULL, // 5 290 ai_walk, 2.6, NULL, // 6 291 ai_walk, 0, NULL, // 7 292 ai_walk, 0.7, NULL, // 8 293 ai_walk, 4.8, NULL, // 9 294 ai_walk, 5.3, NULL, // 10 295 ai_walk, 1.1, NULL, // 11 296 ai_walk, 2, NULL, // 12 297 ai_walk, 0.5, NULL, // 13 298 ai_walk, 0, NULL, // 14 299 ai_walk, 0, NULL, // 15 300 ai_walk, 4.9, NULL, // 16 301 ai_walk, 6.7, NULL, // 17 302 ai_walk, 3.8, NULL, // 18 303 ai_walk, 2, NULL, // 19 304 ai_walk, 0.2, NULL, // 20 305 ai_walk, 0, NULL, // 21 306 ai_walk, 3.4, NULL, // 22 307 ai_walk, 6.4, NULL, // 23 308 ai_walk, 5, NULL, // 24 309 ai_walk, 1.8, NULL, // 25 310 ai_walk, 0, NULL // 26 311 }; 312 mmove_t insane_move_walk_insane = {FRAME_walk1, FRAME_walk26, insane_frames_walk_insane, insane_walk}; 313 mmove_t insane_move_run_insane = {FRAME_walk1, FRAME_walk26, insane_frames_walk_insane, insane_run}; 314 315 mframe_t insane_frames_stand_pain [] = 316 { 317 ai_move, 0, NULL, 318 ai_move, 0, NULL, 319 ai_move, 0, NULL, 320 ai_move, 0, NULL, 321 ai_move, 0, NULL, 322 ai_move, 0, NULL, 323 ai_move, 0, NULL, 324 ai_move, 0, NULL, 325 ai_move, 0, NULL, 326 ai_move, 0, NULL, 327 ai_move, 0, NULL 328 }; 329 mmove_t insane_move_stand_pain = {FRAME_st_pain2, FRAME_st_pain12, insane_frames_stand_pain, insane_run}; 330 331 mframe_t insane_frames_stand_death [] = 332 { 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 ai_move, 0, NULL, 344 ai_move, 0, NULL, 345 ai_move, 0, NULL, 346 ai_move, 0, NULL, 347 ai_move, 0, NULL, 348 ai_move, 0, NULL, 349 ai_move, 0, NULL 350 }; 351 mmove_t insane_move_stand_death = {FRAME_st_death2, FRAME_st_death18, insane_frames_stand_death, insane_dead}; 352 353 mframe_t insane_frames_crawl [] = 354 { 355 ai_walk, 0, insane_scream, 356 ai_walk, 1.5, NULL, 357 ai_walk, 2.1, NULL, 358 ai_walk, 3.6, NULL, 359 ai_walk, 2, NULL, 360 ai_walk, 0.9, NULL, 361 ai_walk, 3, NULL, 362 ai_walk, 3.4, NULL, 363 ai_walk, 2.4, NULL 364 }; 365 mmove_t insane_move_crawl = {FRAME_crawl1, FRAME_crawl9, insane_frames_crawl, NULL}; 366 mmove_t insane_move_runcrawl = {FRAME_crawl1, FRAME_crawl9, insane_frames_crawl, NULL}; 367 368 mframe_t insane_frames_crawl_pain [] = 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 }; 380 mmove_t insane_move_crawl_pain = {FRAME_cr_pain2, FRAME_cr_pain10, insane_frames_crawl_pain, insane_run}; 381 382 mframe_t insane_frames_crawl_death [] = 383 { 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 }; 392 mmove_t insane_move_crawl_death = {FRAME_cr_death10, FRAME_cr_death16, insane_frames_crawl_death, insane_dead}; 393 394 mframe_t insane_frames_cross [] = 395 { 396 ai_move, 0, insane_moan, 397 ai_move, 0, NULL, 398 ai_move, 0, NULL, 399 ai_move, 0, NULL, 400 ai_move, 0, NULL, 401 ai_move, 0, NULL, 402 ai_move, 0, NULL, 403 ai_move, 0, NULL, 404 ai_move, 0, NULL, 405 ai_move, 0, NULL, 406 ai_move, 0, NULL, 407 ai_move, 0, NULL, 408 ai_move, 0, NULL, 409 ai_move, 0, NULL, 410 ai_move, 0, NULL 411 }; 412 mmove_t insane_move_cross = {FRAME_cross1, FRAME_cross15, insane_frames_cross, insane_cross}; 413 414 mframe_t insane_frames_struggle_cross [] = 415 { 416 ai_move, 0, insane_scream, 417 ai_move, 0, NULL, 418 ai_move, 0, NULL, 419 ai_move, 0, NULL, 420 ai_move, 0, NULL, 421 ai_move, 0, NULL, 422 ai_move, 0, NULL, 423 ai_move, 0, NULL, 424 ai_move, 0, NULL, 425 ai_move, 0, NULL, 426 ai_move, 0, NULL, 427 ai_move, 0, NULL, 428 ai_move, 0, NULL, 429 ai_move, 0, NULL, 430 ai_move, 0, NULL 431 }; 432 mmove_t insane_move_struggle_cross = {FRAME_cross16, FRAME_cross30, insane_frames_struggle_cross, insane_cross}; 433 434 void insane_cross (edict_t *self) 435 { 436 if (random() < 0.8) 437 self->monsterinfo.currentmove = &insane_move_cross; 438 else 439 self->monsterinfo.currentmove = &insane_move_struggle_cross; 440 } 441 442 void insane_walk (edict_t *self) 443 { 444 if ( self->spawnflags & 16 ) // Hold Ground? 445 if (self->s.frame == FRAME_cr_pain10) 446 { 447 self->monsterinfo.currentmove = &insane_move_down; 448 return; 449 } 450 if (self->spawnflags & 4) 451 self->monsterinfo.currentmove = &insane_move_crawl; 452 else 453 if (random() <= 0.5) 454 self->monsterinfo.currentmove = &insane_move_walk_normal; 455 else 456 self->monsterinfo.currentmove = &insane_move_walk_insane; 457 } 458 459 void insane_run (edict_t *self) 460 { 461 if ( self->spawnflags & 16 ) // Hold Ground? 462 if (self->s.frame == FRAME_cr_pain10) 463 { 464 self->monsterinfo.currentmove = &insane_move_down; 465 return; 466 } 467 if (self->spawnflags & 4) // Crawling? 468 self->monsterinfo.currentmove = &insane_move_runcrawl; 469 else 470 if (random() <= 0.5) // Else, mix it up 471 self->monsterinfo.currentmove = &insane_move_run_normal; 472 else 473 self->monsterinfo.currentmove = &insane_move_run_insane; 474 } 475 476 477 void insane_pain (edict_t *self, edict_t *other, float kick, int damage) 478 { 479 int l,r; 480 481 // if (self->health < (self->max_health / 2)) 482 // self->s.skinnum = 1; 483 484 if (level.time < self->pain_debounce_time) 485 return; 486 487 self->pain_debounce_time = level.time + 3; 488 489 r = 1 + (rand()&1); 490 if (self->health < 25) 491 l = 25; 492 else if (self->health < 50) 493 l = 50; 494 else if (self->health < 75) 495 l = 75; 496 else 497 l = 100; 498 gi.sound (self, CHAN_VOICE, gi.soundindex (va("player/male/pain%i_%i.wav", l, r)), 1, ATTN_IDLE, 0); 499 500 if (skill->value == 3) 501 return; // no pain anims in nightmare 502 503 // Don't go into pain frames if crucified. 504 if (self->spawnflags & 8) 505 { 506 self->monsterinfo.currentmove = &insane_move_struggle_cross; 507 return; 508 } 509 510 if ( ((self->s.frame >= FRAME_crawl1) && (self->s.frame <= FRAME_crawl9)) || ((self->s.frame >= FRAME_stand99) && (self->s.frame <= FRAME_stand160)) ) 511 { 512 self->monsterinfo.currentmove = &insane_move_crawl_pain; 513 } 514 else 515 self->monsterinfo.currentmove = &insane_move_stand_pain; 516 517 } 518 519 void insane_onground (edict_t *self) 520 { 521 self->monsterinfo.currentmove = &insane_move_down; 522 } 523 524 void insane_checkdown (edict_t *self) 525 { 526 // if ( (self->s.frame == FRAME_stand94) || (self->s.frame == FRAME_stand65) ) 527 if (self->spawnflags & 32) // Always stand 528 return; 529 if (random() < 0.3) 530 if (random() < 0.5) 531 self->monsterinfo.currentmove = &insane_move_uptodown; 532 else 533 self->monsterinfo.currentmove = &insane_move_jumpdown; 534 } 535 536 void insane_checkup (edict_t *self) 537 { 538 // If Hold_Ground and Crawl are set 539 if ( (self->spawnflags & 4) && (self->spawnflags & 16) ) 540 return; 541 if (random() < 0.5) 542 self->monsterinfo.currentmove = &insane_move_downtoup; 543 544 } 545 546 void insane_stand (edict_t *self) 547 { 548 if (self->spawnflags & 8) // If crucified 549 { 550 self->monsterinfo.currentmove = &insane_move_cross; 551 self->monsterinfo.aiflags |= AI_STAND_GROUND; 552 } 553 // If Hold_Ground and Crawl are set 554 else if ( (self->spawnflags & 4) && (self->spawnflags & 16) ) 555 self->monsterinfo.currentmove = &insane_move_down; 556 else 557 if (random() < 0.5) 558 self->monsterinfo.currentmove = &insane_move_stand_normal; 559 else 560 self->monsterinfo.currentmove = &insane_move_stand_insane; 561 } 562 563 void insane_dead (edict_t *self) 564 { 565 if (self->spawnflags & 8) 566 { 567 self->flags |= FL_FLY; 568 } 569 else 570 { 571 VectorSet (self->mins, -16, -16, -24); 572 VectorSet (self->maxs, 16, 16, -8); 573 self->movetype = MOVETYPE_TOSS; 574 } 575 self->svflags |= SVF_DEADMONSTER; 576 self->nextthink = 0; 577 gi.linkentity (self); 578 } 579 580 581 void insane_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) 582 { 583 int n; 584 585 if (self->health <= self->gib_health) 586 { 587 gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_IDLE, 0); 588 for (n= 0; n < 2; n++) 589 ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC); 590 for (n= 0; n < 4; n++) 591 ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); 592 ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC); 593 self->deadflag = DEAD_DEAD; 594 return; 595 } 596 597 if (self->deadflag == DEAD_DEAD) 598 return; 599 600 gi.sound (self, CHAN_VOICE, gi.soundindex(va("player/male/death%i.wav", (rand()%4)+1)), 1, ATTN_IDLE, 0); 601 602 self->deadflag = DEAD_DEAD; 603 self->takedamage = DAMAGE_YES; 604 605 if (self->spawnflags & 8) 606 { 607 insane_dead (self); 608 } 609 else 610 { 611 if ( ((self->s.frame >= FRAME_crawl1) && (self->s.frame <= FRAME_crawl9)) || ((self->s.frame >= FRAME_stand99) && (self->s.frame <= FRAME_stand160)) ) 612 self->monsterinfo.currentmove = &insane_move_crawl_death; 613 else 614 self->monsterinfo.currentmove = &insane_move_stand_death; 615 } 616 } 617 618 619 /*QUAKED misc_insane (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn CRAWL CRUCIFIED STAND_GROUND ALWAYS_STAND 620 */ 621 void SP_misc_insane (edict_t *self) 622 { 623 // static int skin = 0; //@@ 624 625 if (deathmatch->value) 626 { 627 G_FreeEdict (self); 628 return; 629 } 630 631 sound_fist = gi.soundindex ("insane/insane11.wav"); 632 sound_shake = gi.soundindex ("insane/insane5.wav"); 633 sound_moan = gi.soundindex ("insane/insane7.wav"); 634 sound_scream[0] = gi.soundindex ("insane/insane1.wav"); 635 sound_scream[1] = gi.soundindex ("insane/insane2.wav"); 636 sound_scream[2] = gi.soundindex ("insane/insane3.wav"); 637 sound_scream[3] = gi.soundindex ("insane/insane4.wav"); 638 sound_scream[4] = gi.soundindex ("insane/insane6.wav"); 639 sound_scream[5] = gi.soundindex ("insane/insane8.wav"); 640 sound_scream[6] = gi.soundindex ("insane/insane9.wav"); 641 sound_scream[7] = gi.soundindex ("insane/insane10.wav"); 642 643 self->movetype = MOVETYPE_STEP; 644 self->solid = SOLID_BBOX; 645 self->s.modelindex = gi.modelindex("models/monsters/insane/tris.md2"); 646 647 VectorSet (self->mins, -16, -16, -24); 648 VectorSet (self->maxs, 16, 16, 32); 649 650 self->health = 100; 651 self->gib_health = -50; 652 self->mass = 300; 653 654 self->pain = insane_pain; 655 self->die = insane_die; 656 657 self->monsterinfo.stand = insane_stand; 658 self->monsterinfo.walk = insane_walk; 659 self->monsterinfo.run = insane_run; 660 self->monsterinfo.dodge = NULL; 661 self->monsterinfo.attack = NULL; 662 self->monsterinfo.melee = NULL; 663 self->monsterinfo.sight = NULL; 664 self->monsterinfo.aiflags |= AI_GOOD_GUY; 665 666 //@@ 667 // self->s.skinnum = skin; 668 // skin++; 669 // if (skin > 12) 670 // skin = 0; 671 672 gi.linkentity (self); 673 674 if (self->spawnflags & 16) // Stand Ground 675 self->monsterinfo.aiflags |= AI_STAND_GROUND; 676 677 self->monsterinfo.currentmove = &insane_move_stand_normal; 678 679 self->monsterinfo.scale = MODEL_SCALE; 680 681 if (self->spawnflags & 8) // Crucified ? 682 { 683 VectorSet (self->mins, -16, 0, 0); 684 VectorSet (self->maxs, 16, 8, 32); 685 self->flags |= FL_NO_KNOCKBACK; 686 flymonster_start (self); 687 } 688 else 689 { 690 walkmonster_start (self); 691 self->s.skinnum = rand()%3; 692 } 693 }