From 7040761a4c25635e72abdf23bb76f6deb363c4c8 Mon Sep 17 00:00:00 2001 From: Yamagi Burmeister Date: Sun, 9 Oct 2011 15:50:37 +0000 Subject: [PATCH] cleanup mutant/ and add sanity checks --- src/game/baseq2/monster/mutant/mutant.c | 921 +++++++++++++++--------- src/game/baseq2/monster/mutant/mutant.h | 345 ++++----- 2 files changed, 750 insertions(+), 516 deletions(-) diff --git a/src/game/baseq2/monster/mutant/mutant.c b/src/game/baseq2/monster/mutant/mutant.c index b636c080..eafce7bf 100644 --- a/src/game/baseq2/monster/mutant/mutant.c +++ b/src/game/baseq2/monster/mutant/mutant.c @@ -1,86 +1,101 @@ /* -Copyright (C) 1997-2001 Id Software, Inc. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -*/ -/* -============================================================================== - -mutant - -============================================================================== -*/ + * Copyright (C) 1997-2001 Id Software, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * ======================================================================= + * + * Mutant. + * + * ======================================================================= + */ #include "../../header/local.h" #include "mutant.h" +static int sound_swing; +static int sound_hit; +static int sound_hit2; +static int sound_death; +static int sound_idle; +static int sound_pain1; +static int sound_pain2; +static int sound_sight; +static int sound_search; +static int sound_step1; +static int sound_step2; +static int sound_step3; +static int sound_thud; -static int sound_swing; -static int sound_hit; -static int sound_hit2; -static int sound_death; -static int sound_idle; -static int sound_pain1; -static int sound_pain2; -static int sound_sight; -static int sound_search; -static int sound_step1; -static int sound_step2; -static int sound_step3; -static int sound_thud; - -// -// SOUNDS -// - -void mutant_step (edict_t *self) +void +mutant_step(edict_t *self) { - int n; + int n; + + if (!self) + { + return; + } + n = (rand() + 1) % 3; + if (n == 0) - gi.sound (self, CHAN_VOICE, sound_step1, 1, ATTN_NORM, 0); + { + gi.sound(self, CHAN_VOICE, sound_step1, 1, ATTN_NORM, 0); + } else if (n == 1) - gi.sound (self, CHAN_VOICE, sound_step2, 1, ATTN_NORM, 0); + { + gi.sound(self, CHAN_VOICE, sound_step2, 1, ATTN_NORM, 0); + } else - gi.sound (self, CHAN_VOICE, sound_step3, 1, ATTN_NORM, 0); + { + gi.sound(self, CHAN_VOICE, sound_step3, 1, ATTN_NORM, 0); + } } -void mutant_sight (edict_t *self, edict_t *other) -{ - gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0); +void +mutant_sight(edict_t *self, edict_t *other /* unused */) +{ + if (!self) + { + return; + } + + gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0); } -void mutant_search (edict_t *self) +void +mutant_search(edict_t *self) { - gi.sound (self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0); + gi.sound(self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0); } -void mutant_swing (edict_t *self) -{ - gi.sound (self, CHAN_VOICE, sound_swing, 1, ATTN_NORM, 0); +void +mutant_swing(edict_t *self) +{ + if (!self) + { + return; + } + + gi.sound(self, CHAN_VOICE, sound_swing, 1, ATTN_NORM, 0); } - -// -// STAND -// - -mframe_t mutant_frames_stand [] = -{ +mframe_t mutant_frames_stand[] = { {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, @@ -90,7 +105,7 @@ mframe_t mutant_frames_stand [] = {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, - {ai_stand, 0, NULL}, // 10 + {ai_stand, 0, NULL}, /* 10 */ {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, @@ -101,7 +116,7 @@ mframe_t mutant_frames_stand [] = {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, - {ai_stand, 0, NULL}, // 20 + {ai_stand, 0, NULL}, /* 20 */ {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, @@ -112,7 +127,7 @@ mframe_t mutant_frames_stand [] = {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, - {ai_stand, 0, NULL}, // 30 + {ai_stand, 0, NULL}, /* 30 */ {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, @@ -123,7 +138,7 @@ mframe_t mutant_frames_stand [] = {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, - {ai_stand, 0, NULL}, // 40 + {ai_stand, 0, NULL}, /* 40 */ {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, @@ -134,37 +149,51 @@ mframe_t mutant_frames_stand [] = {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, - {ai_stand, 0, NULL}, // 50 + {ai_stand, 0, NULL}, /* 50 */ {ai_stand, 0, NULL} }; -mmove_t mutant_move_stand = {FRAME_stand101, FRAME_stand151, mutant_frames_stand, NULL}; -void mutant_stand (edict_t *self) +mmove_t mutant_move_stand = { + FRAME_stand101, + FRAME_stand151, + mutant_frames_stand, NULL +}; + +void +mutant_stand(edict_t *self) +{ + if (!self) + { + return; + } + self->monsterinfo.currentmove = &mutant_move_stand; } - -// -// IDLE -// - -void mutant_idle_loop (edict_t *self) -{ +void +mutant_idle_loop(edict_t *self) +{ + if (!self) + { + return; + } + if (random() < 0.75) + { self->monsterinfo.nextframe = FRAME_stand155; + } } -mframe_t mutant_frames_idle [] = -{ +mframe_t mutant_frames_idle[] = { {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, - {ai_stand, 0, NULL}, // scratch loop start + {ai_stand, 0, NULL}, /* scratch loop start */ {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, - {ai_stand, 0, mutant_idle_loop}, // scratch loop end + {ai_stand, 0, mutant_idle_loop}, /* scratch loop end */ {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, @@ -172,141 +201,226 @@ mframe_t mutant_frames_idle [] = {ai_stand, 0, NULL}, {ai_stand, 0, NULL} }; -mmove_t mutant_move_idle = {FRAME_stand152, FRAME_stand164, mutant_frames_idle, mutant_stand}; -void mutant_idle (edict_t *self) +mmove_t mutant_move_idle = { + FRAME_stand152, + FRAME_stand164, + mutant_frames_idle, + mutant_stand +}; + +void +mutant_idle(edict_t *self) +{ + if (!self) + { + return; + } + self->monsterinfo.currentmove = &mutant_move_idle; - gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0); + gi.sound(self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0); } +void mutant_walk(edict_t *self); -// -// WALK -// - -void mutant_walk (edict_t *self); - -mframe_t mutant_frames_walk [] = -{ - {ai_walk, 3, NULL}, - {ai_walk, 1, NULL}, - {ai_walk, 5, NULL}, - {ai_walk, 10, NULL}, - {ai_walk, 13, NULL}, - {ai_walk, 10, NULL}, - {ai_walk, 0, NULL}, - {ai_walk, 5, NULL}, - {ai_walk, 6, NULL}, - {ai_walk, 16, NULL}, - {ai_walk, 15, NULL}, - {ai_walk, 6, NULL} +mframe_t mutant_frames_walk[] = { + {ai_walk, 3, NULL}, + {ai_walk, 1, NULL}, + {ai_walk, 5, NULL}, + {ai_walk, 10, NULL}, + {ai_walk, 13, NULL}, + {ai_walk, 10, NULL}, + {ai_walk, 0, NULL}, + {ai_walk, 5, NULL}, + {ai_walk, 6, NULL}, + {ai_walk, 16, NULL}, + {ai_walk, 15, NULL}, + {ai_walk, 6, NULL} }; -mmove_t mutant_move_walk = {FRAME_walk05, FRAME_walk16, mutant_frames_walk, NULL}; -void mutant_walk_loop (edict_t *self) +mmove_t mutant_move_walk = { + FRAME_walk05, + FRAME_walk16, + mutant_frames_walk, + NULL +}; + +void +mutant_walk_loop(edict_t *self) +{ + if (!self) + { + return; + } + self->monsterinfo.currentmove = &mutant_move_walk; } -mframe_t mutant_frames_start_walk [] = -{ - {ai_walk, 5, NULL}, - {ai_walk, 5, NULL}, - {ai_walk, -2, NULL}, - {ai_walk, 1, NULL} +mframe_t mutant_frames_start_walk[] = { + {ai_walk, 5, NULL}, + {ai_walk, 5, NULL}, + {ai_walk, -2, NULL}, + {ai_walk, 1, NULL} }; -mmove_t mutant_move_start_walk = {FRAME_walk01, FRAME_walk04, mutant_frames_start_walk, mutant_walk_loop}; -void mutant_walk (edict_t *self) +mmove_t mutant_move_start_walk = { + FRAME_walk01, + FRAME_walk04, + mutant_frames_start_walk, + mutant_walk_loop +}; + +void +mutant_walk(edict_t *self) +{ + if (!self) + { + return; + } + self->monsterinfo.currentmove = &mutant_move_start_walk; } - -// -// RUN -// - -mframe_t mutant_frames_run [] = -{ - {ai_run, 40, NULL}, - {ai_run, 40, mutant_step}, - {ai_run, 24, NULL}, - {ai_run, 5, mutant_step}, - {ai_run, 17, NULL}, - {ai_run, 10, NULL} +mframe_t mutant_frames_run[] = { + {ai_run, 40, NULL}, + {ai_run, 40, mutant_step}, + {ai_run, 24, NULL}, + {ai_run, 5, mutant_step}, + {ai_run, 17, NULL}, + {ai_run, 10, NULL} }; -mmove_t mutant_move_run = {FRAME_run03, FRAME_run08, mutant_frames_run, NULL}; -void mutant_run (edict_t *self) +mmove_t mutant_move_run = { - if (self->monsterinfo.aiflags & AI_STAND_GROUND) - self->monsterinfo.currentmove = &mutant_move_stand; - else - self->monsterinfo.currentmove = &mutant_move_run; -} + FRAME_run03, + FRAME_run08, + mutant_frames_run, + NULL +}; - -// -// MELEE -// - -void mutant_hit_left (edict_t *self) -{ - vec3_t aim; - - VectorSet (aim, MELEE_DISTANCE, self->mins[0], 8); - if (fire_hit (self, aim, (10 + (rand() %5)), 100)) - gi.sound (self, CHAN_WEAPON, sound_hit, 1, ATTN_NORM, 0); - else - gi.sound (self, CHAN_WEAPON, sound_swing, 1, ATTN_NORM, 0); -} - -void mutant_hit_right (edict_t *self) -{ - vec3_t aim; - - VectorSet (aim, MELEE_DISTANCE, self->maxs[0], 8); - if (fire_hit (self, aim, (10 + (rand() %5)), 100)) - gi.sound (self, CHAN_WEAPON, sound_hit2, 1, ATTN_NORM, 0); - else - gi.sound (self, CHAN_WEAPON, sound_swing, 1, ATTN_NORM, 0); -} - -void mutant_check_refire (edict_t *self) -{ - if (!self->enemy || !self->enemy->inuse || self->enemy->health <= 0) +void +mutant_run(edict_t *self) +{ + if (!self) + { return; - - if ( ((skill->value == 3) && (random() < 0.5)) || (range(self, self->enemy) == RANGE_MELEE) ) - self->monsterinfo.nextframe = FRAME_attack09; + } + + if (self->monsterinfo.aiflags & AI_STAND_GROUND) + { + self->monsterinfo.currentmove = &mutant_move_stand; + } + else + { + self->monsterinfo.currentmove = &mutant_move_run; + } } -mframe_t mutant_frames_attack [] = +void +mutant_hit_left(edict_t *self) { - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, mutant_hit_left}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, mutant_hit_right}, - {ai_charge, 0, mutant_check_refire} -}; -mmove_t mutant_move_attack = {FRAME_attack09, FRAME_attack15, mutant_frames_attack, mutant_run}; + vec3_t aim; + + if (!self) + { + return; + } + + VectorSet(aim, MELEE_DISTANCE, self->mins[0], 8); -void mutant_melee (edict_t *self) + if (fire_hit(self, aim, (10 + (rand() % 5)), 100)) + { + gi.sound(self, CHAN_WEAPON, sound_hit, 1, ATTN_NORM, 0); + } + else + { + gi.sound(self, CHAN_WEAPON, sound_swing, 1, ATTN_NORM, 0); + } +} + +void +mutant_hit_right(edict_t *self) { + vec3_t aim; + + if (!self) + { + return; + } + + VectorSet(aim, MELEE_DISTANCE, self->maxs[0], 8); + + if (fire_hit(self, aim, (10 + (rand() % 5)), 100)) + { + gi.sound(self, CHAN_WEAPON, sound_hit2, 1, ATTN_NORM, 0); + } + else + { + gi.sound(self, CHAN_WEAPON, sound_swing, 1, ATTN_NORM, 0); + } +} + +void +mutant_check_refire(edict_t *self) +{ + if (!self) + { + return; + } + + if (!self->enemy || !self->enemy->inuse || (self->enemy->health <= 0)) + { + return; + } + + if (((skill->value == 3) && + (random() < 0.5)) || (range(self, self->enemy) == RANGE_MELEE)) + { + self->monsterinfo.nextframe = FRAME_attack09; + } +} + +mframe_t mutant_frames_attack[] = { + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, mutant_hit_left}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, mutant_hit_right}, + {ai_charge, 0, mutant_check_refire} +}; + +mmove_t mutant_move_attack = +{ + FRAME_attack09, + FRAME_attack15, + mutant_frames_attack, + mutant_run +}; + +void +mutant_melee(edict_t *self) +{ + if (!self) + { + return; + } + self->monsterinfo.currentmove = &mutant_move_attack; } - -// -// ATTACK -// - -void mutant_jump_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf) -{ +void +mutant_jump_touch(edict_t *self, edict_t *other, + cplane_t *plane /* unused */, csurface_t *surf /* unused */) +{ + if (!self) + { + return; + } + if (self->health <= 0) { self->touch = NULL; @@ -317,39 +431,47 @@ void mutant_jump_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface { if (VectorLength(self->velocity) > 400) { - vec3_t point; - vec3_t normal; - int damage; + vec3_t point; + vec3_t normal; + int damage; - VectorCopy (self->velocity, normal); + VectorCopy(self->velocity, normal); VectorNormalize(normal); - VectorMA (self->s.origin, self->maxs[0], normal, point); + VectorMA(self->s.origin, self->maxs[0], normal, point); damage = 40 + 10 * random(); - T_Damage (other, self, self, self->velocity, point, normal, damage, damage, 0, MOD_UNKNOWN); + T_Damage(other, self, self, self->velocity, point, + normal, damage, damage, 0, MOD_UNKNOWN); } } - if (!M_CheckBottom (self)) + if (!M_CheckBottom(self)) { if (self->groundentity) { self->monsterinfo.nextframe = FRAME_attack02; self->touch = NULL; } + return; } self->touch = NULL; } -void mutant_jump_takeoff (edict_t *self) +void +mutant_jump_takeoff(edict_t *self) { - vec3_t forward; - - gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0); - AngleVectors (self->s.angles, forward, NULL, NULL); + vec3_t forward; + + if (!self) + { + return; + } + + gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0); + AngleVectors(self->s.angles, forward, NULL, NULL); self->s.origin[2] += 1; - VectorScale (forward, 600, self->velocity); + VectorScale(forward, 600, self->velocity); self->velocity[2] = 250; self->groundentity = NULL; self->monsterinfo.aiflags |= AI_DUCKED; @@ -357,62 +479,98 @@ void mutant_jump_takeoff (edict_t *self) self->touch = mutant_jump_touch; } -void mutant_check_landing (edict_t *self) -{ +void +mutant_check_landing(edict_t *self) +{ + if (!self) + { + return; + } + if (self->groundentity) { - gi.sound (self, CHAN_WEAPON, sound_thud, 1, ATTN_NORM, 0); + gi.sound(self, CHAN_WEAPON, sound_thud, 1, ATTN_NORM, 0); self->monsterinfo.attack_finished = 0; self->monsterinfo.aiflags &= ~AI_DUCKED; return; } if (level.time > self->monsterinfo.attack_finished) + { self->monsterinfo.nextframe = FRAME_attack02; + } else + { self->monsterinfo.nextframe = FRAME_attack05; + } } -mframe_t mutant_frames_jump [] = -{ - {ai_charge, 0, NULL}, - {ai_charge, 17, NULL}, - {ai_charge, 15, mutant_jump_takeoff}, - {ai_charge, 15, NULL}, - {ai_charge, 15, mutant_check_landing}, - {ai_charge, 0, NULL}, - {ai_charge, 3, NULL}, - {ai_charge, 0, NULL} +mframe_t mutant_frames_jump[] = { + {ai_charge, 0, NULL}, + {ai_charge, 17, NULL}, + {ai_charge, 15, mutant_jump_takeoff}, + {ai_charge, 15, NULL}, + {ai_charge, 15, mutant_check_landing}, + {ai_charge, 0, NULL}, + {ai_charge, 3, NULL}, + {ai_charge, 0, NULL} }; -mmove_t mutant_move_jump = {FRAME_attack01, FRAME_attack08, mutant_frames_jump, mutant_run}; -void mutant_jump (edict_t *self) +mmove_t mutant_move_jump = { + FRAME_attack01, + FRAME_attack08, + mutant_frames_jump, + mutant_run +}; + +void +mutant_jump(edict_t *self) +{ + if (!self) + { + return; + } + self->monsterinfo.currentmove = &mutant_move_jump; } - -// -// CHECKATTACK -// - -qboolean mutant_check_melee (edict_t *self) -{ - if (range (self, self->enemy) == RANGE_MELEE) +qboolean +mutant_check_melee(edict_t *self) +{ + if (!self) + { + return false; + } + + if (range(self, self->enemy) == RANGE_MELEE) + { return true; + } + return false; } -qboolean mutant_check_jump (edict_t *self) +qboolean +mutant_check_jump(edict_t *self) { - vec3_t v; - float distance; - - if (self->absmin[2] > (self->enemy->absmin[2] + 0.75 * self->enemy->size[2])) + vec3_t v; + float distance; + + if (!self) + { return false; + } + + if (self->absmin[2] > (self->enemy->absmin[2] + 0.75 * self->enemy->size[2])) + { + return false; + } if (self->absmax[2] < (self->enemy->absmin[2] + 0.25 * self->enemy->size[2])) + { return false; + } v[0] = self->s.origin[0] - self->enemy->s.origin[0]; v[1] = self->s.origin[1] - self->enemy->s.origin[1]; @@ -420,20 +578,33 @@ qboolean mutant_check_jump (edict_t *self) distance = VectorLength(v); if (distance < 100) + { return false; + } + if (distance > 100) { if (random() < 0.9) + { return false; + } } return true; } -qboolean mutant_checkattack (edict_t *self) -{ - if (!self->enemy || self->enemy->health <= 0) +qboolean +mutant_checkattack(edict_t *self) +{ + if (!self) + { return false; + } + + if (!self->enemy || (self->enemy->health <= 0)) + { + return false; + } if (mutant_check_melee(self)) { @@ -444,197 +615,257 @@ qboolean mutant_checkattack (edict_t *self) if (mutant_check_jump(self)) { self->monsterinfo.attack_state = AS_MISSILE; - // FIXME play a jump sound here return true; } return false; } - -// -// PAIN -// - -mframe_t mutant_frames_pain1 [] = -{ - {ai_move, 4, NULL}, - {ai_move, -3, NULL}, - {ai_move, -8, NULL}, - {ai_move, 2, NULL}, - {ai_move, 5, NULL} +mframe_t mutant_frames_pain1[] = { + {ai_move, 4, NULL}, + {ai_move, -3, NULL}, + {ai_move, -8, NULL}, + {ai_move, 2, NULL}, + {ai_move, 5, NULL} }; -mmove_t mutant_move_pain1 = {FRAME_pain101, FRAME_pain105, mutant_frames_pain1, mutant_run}; -mframe_t mutant_frames_pain2 [] = +mmove_t mutant_move_pain1 = { - {ai_move, -24,NULL}, - {ai_move, 11, NULL}, - {ai_move, 5, NULL}, - {ai_move, -2, NULL}, - {ai_move, 6, NULL}, - {ai_move, 4, NULL} + FRAME_pain101, + FRAME_pain105, + mutant_frames_pain1, + mutant_run }; -mmove_t mutant_move_pain2 = {FRAME_pain201, FRAME_pain206, mutant_frames_pain2, mutant_run}; -mframe_t mutant_frames_pain3 [] = -{ - {ai_move, -22,NULL}, - {ai_move, 3, NULL}, - {ai_move, 3, NULL}, - {ai_move, 2, NULL}, - {ai_move, 1, NULL}, - {ai_move, 1, NULL}, - {ai_move, 6, NULL}, - {ai_move, 3, NULL}, - {ai_move, 2, NULL}, - {ai_move, 0, NULL}, - {ai_move, 1, NULL} +mframe_t mutant_frames_pain2[] = { + {ai_move, -24, NULL}, + {ai_move, 11, NULL}, + {ai_move, 5, NULL}, + {ai_move, -2, NULL}, + {ai_move, 6, NULL}, + {ai_move, 4, NULL} }; -mmove_t mutant_move_pain3 = {FRAME_pain301, FRAME_pain311, mutant_frames_pain3, mutant_run}; -void mutant_pain (edict_t *self, edict_t *other, float kick, int damage) +mmove_t mutant_move_pain2 = { - float r; + FRAME_pain201, + FRAME_pain206, + mutant_frames_pain2, + mutant_run +}; + +mframe_t mutant_frames_pain3[] = { + {ai_move, -22, NULL}, + {ai_move, 3, NULL}, + {ai_move, 3, NULL}, + {ai_move, 2, NULL}, + {ai_move, 1, NULL}, + {ai_move, 1, NULL}, + {ai_move, 6, NULL}, + {ai_move, 3, NULL}, + {ai_move, 2, NULL}, + {ai_move, 0, NULL}, + {ai_move, 1, NULL} +}; + +mmove_t mutant_move_pain3 = +{ + FRAME_pain301, + FRAME_pain311, + mutant_frames_pain3, + mutant_run +}; + +void +mutant_pain(edict_t *self, edict_t *other /* unused */, + float kick /* unused */, int damage /* unused */) +{ + float r; if (self->health < (self->max_health / 2)) + { self->s.skinnum = 1; + } if (level.time < self->pain_debounce_time) + { return; + } self->pain_debounce_time = level.time + 3; if (skill->value == 3) - return; // no pain anims in nightmare + { + return; /* no pain anims in nightmare */ + } r = random(); + if (r < 0.33) { - gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); + gi.sound(self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); self->monsterinfo.currentmove = &mutant_move_pain1; } else if (r < 0.66) { - gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); + gi.sound(self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0); self->monsterinfo.currentmove = &mutant_move_pain2; } else { - gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); + gi.sound(self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0); self->monsterinfo.currentmove = &mutant_move_pain3; } } - -// -// DEATH -// - -void mutant_dead (edict_t *self) -{ - VectorSet (self->mins, -16, -16, -24); - VectorSet (self->maxs, 16, 16, -8); +void +mutant_dead(edict_t *self) +{ + if (!self) + { + return; + } + + VectorSet(self->mins, -16, -16, -24); + VectorSet(self->maxs, 16, 16, -8); self->movetype = MOVETYPE_TOSS; self->svflags |= SVF_DEADMONSTER; - gi.linkentity (self); + gi.linkentity(self); - M_FlyCheck (self); + M_FlyCheck(self); } -mframe_t mutant_frames_death1 [] = -{ - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL} +mframe_t mutant_frames_death1[] = { + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL} }; -mmove_t mutant_move_death1 = {FRAME_death101, FRAME_death109, mutant_frames_death1, mutant_dead}; -mframe_t mutant_frames_death2 [] = +mmove_t mutant_move_death1 = { - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL} + FRAME_death101, + FRAME_death109, + mutant_frames_death1, + mutant_dead }; -mmove_t mutant_move_death2 = {FRAME_death201, FRAME_death210, mutant_frames_death2, mutant_dead}; -void mutant_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +mframe_t mutant_frames_death2[] = { + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL} +}; + +mmove_t mutant_move_death2 = { - int n; + FRAME_death201, + FRAME_death210, + mutant_frames_death2, + mutant_dead +}; +void +mutant_die(edict_t *self, edict_t *inflictor /* unused */, + edict_t *attacker /* unused */, int damage, + vec3_t point /* unused */) +{ + int n; + + if (!self) + { + return; + } + if (self->health <= self->gib_health) { - gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0); - for (n= 0; n < 2; n++) - ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC); - for (n= 0; n < 4; n++) - ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); - ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC); + gi.sound(self, CHAN_VOICE, gi.soundindex( "misc/udeath.wav"), 1, ATTN_NORM, 0); + + for (n = 0; n < 2; n++) + { + ThrowGib(self, "models/objects/gibs/bone/tris.md2", + damage, GIB_ORGANIC); + } + + for (n = 0; n < 4; n++) + { + ThrowGib(self, "models/objects/gibs/sm_meat/tris.md2", + damage, GIB_ORGANIC); + } + + ThrowHead(self, "models/objects/gibs/head2/tris.md2", + damage, GIB_ORGANIC); self->deadflag = DEAD_DEAD; return; } if (self->deadflag == DEAD_DEAD) + { return; + } - gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0); + gi.sound(self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0); self->deadflag = DEAD_DEAD; self->takedamage = DAMAGE_YES; self->s.skinnum = 1; if (random() < 0.5) + { self->monsterinfo.currentmove = &mutant_move_death1; + } else + { self->monsterinfo.currentmove = &mutant_move_death2; + } } - -// -// SPAWN -// - -/*QUAKED monster_mutant (1 .5 0) (-32 -32 -24) (32 32 32) Ambush Trigger_Spawn Sight -*/ -void SP_monster_mutant (edict_t *self) -{ +/* + * QUAKED monster_mutant (1 .5 0) (-32 -32 -24) (32 32 32) Ambush Trigger_Spawn Sight + */ +void +SP_monster_mutant(edict_t *self) +{ + if (!self) + { + return; + } + if (deathmatch->value) { - G_FreeEdict (self); + G_FreeEdict(self); return; } - sound_swing = gi.soundindex ("mutant/mutatck1.wav"); - sound_hit = gi.soundindex ("mutant/mutatck2.wav"); - sound_hit2 = gi.soundindex ("mutant/mutatck3.wav"); - sound_death = gi.soundindex ("mutant/mutdeth1.wav"); - sound_idle = gi.soundindex ("mutant/mutidle1.wav"); - sound_pain1 = gi.soundindex ("mutant/mutpain1.wav"); - sound_pain2 = gi.soundindex ("mutant/mutpain2.wav"); - sound_sight = gi.soundindex ("mutant/mutsght1.wav"); - sound_search = gi.soundindex ("mutant/mutsrch1.wav"); - sound_step1 = gi.soundindex ("mutant/step1.wav"); - sound_step2 = gi.soundindex ("mutant/step2.wav"); - sound_step3 = gi.soundindex ("mutant/step3.wav"); - sound_thud = gi.soundindex ("mutant/thud1.wav"); - + sound_swing = gi.soundindex("mutant/mutatck1.wav"); + sound_hit = gi.soundindex("mutant/mutatck2.wav"); + sound_hit2 = gi.soundindex("mutant/mutatck3.wav"); + sound_death = gi.soundindex("mutant/mutdeth1.wav"); + sound_idle = gi.soundindex("mutant/mutidle1.wav"); + sound_pain1 = gi.soundindex("mutant/mutpain1.wav"); + sound_pain2 = gi.soundindex("mutant/mutpain2.wav"); + sound_sight = gi.soundindex("mutant/mutsght1.wav"); + sound_search = gi.soundindex("mutant/mutsrch1.wav"); + sound_step1 = gi.soundindex("mutant/step1.wav"); + sound_step2 = gi.soundindex("mutant/step2.wav"); + sound_step3 = gi.soundindex("mutant/step3.wav"); + sound_thud = gi.soundindex("mutant/thud1.wav"); + self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; - self->s.modelindex = gi.modelindex ("models/monsters/mutant/tris.md2"); - VectorSet (self->mins, -32, -32, -24); - VectorSet (self->maxs, 32, 32, 48); + self->s.modelindex = gi.modelindex("models/monsters/mutant/tris.md2"); + VectorSet(self->mins, -32, -32, -24); + VectorSet(self->maxs, 32, 32, 48); self->health = 300; self->gib_health = -120; @@ -654,11 +885,11 @@ void SP_monster_mutant (edict_t *self) self->monsterinfo.idle = mutant_idle; self->monsterinfo.checkattack = mutant_checkattack; - gi.linkentity (self); - + gi.linkentity(self); + self->monsterinfo.currentmove = &mutant_move_stand; self->monsterinfo.scale = MODEL_SCALE; - walkmonster_start (self); + walkmonster_start(self); } diff --git a/src/game/baseq2/monster/mutant/mutant.h b/src/game/baseq2/monster/mutant/mutant.h index 8c6f3fed..4fe4cb75 100644 --- a/src/game/baseq2/monster/mutant/mutant.h +++ b/src/game/baseq2/monster/mutant/mutant.h @@ -1,174 +1,177 @@ /* -Copyright (C) 1997-2001 Id Software, Inc. + * Copyright (C) 1997-2001 Id Software, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * ======================================================================= + * + * Mutant animations. + * + * ======================================================================= + */ -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. +#define FRAME_attack01 0 +#define FRAME_attack02 1 +#define FRAME_attack03 2 +#define FRAME_attack04 3 +#define FRAME_attack05 4 +#define FRAME_attack06 5 +#define FRAME_attack07 6 +#define FRAME_attack08 7 +#define FRAME_attack09 8 +#define FRAME_attack10 9 +#define FRAME_attack11 10 +#define FRAME_attack12 11 +#define FRAME_attack13 12 +#define FRAME_attack14 13 +#define FRAME_attack15 14 +#define FRAME_death101 15 +#define FRAME_death102 16 +#define FRAME_death103 17 +#define FRAME_death104 18 +#define FRAME_death105 19 +#define FRAME_death106 20 +#define FRAME_death107 21 +#define FRAME_death108 22 +#define FRAME_death109 23 +#define FRAME_death201 24 +#define FRAME_death202 25 +#define FRAME_death203 26 +#define FRAME_death204 27 +#define FRAME_death205 28 +#define FRAME_death206 29 +#define FRAME_death207 30 +#define FRAME_death208 31 +#define FRAME_death209 32 +#define FRAME_death210 33 +#define FRAME_pain101 34 +#define FRAME_pain102 35 +#define FRAME_pain103 36 +#define FRAME_pain104 37 +#define FRAME_pain105 38 +#define FRAME_pain201 39 +#define FRAME_pain202 40 +#define FRAME_pain203 41 +#define FRAME_pain204 42 +#define FRAME_pain205 43 +#define FRAME_pain206 44 +#define FRAME_pain301 45 +#define FRAME_pain302 46 +#define FRAME_pain303 47 +#define FRAME_pain304 48 +#define FRAME_pain305 49 +#define FRAME_pain306 50 +#define FRAME_pain307 51 +#define FRAME_pain308 52 +#define FRAME_pain309 53 +#define FRAME_pain310 54 +#define FRAME_pain311 55 +#define FRAME_run03 56 +#define FRAME_run04 57 +#define FRAME_run05 58 +#define FRAME_run06 59 +#define FRAME_run07 60 +#define FRAME_run08 61 +#define FRAME_stand101 62 +#define FRAME_stand102 63 +#define FRAME_stand103 64 +#define FRAME_stand104 65 +#define FRAME_stand105 66 +#define FRAME_stand106 67 +#define FRAME_stand107 68 +#define FRAME_stand108 69 +#define FRAME_stand109 70 +#define FRAME_stand110 71 +#define FRAME_stand111 72 +#define FRAME_stand112 73 +#define FRAME_stand113 74 +#define FRAME_stand114 75 +#define FRAME_stand115 76 +#define FRAME_stand116 77 +#define FRAME_stand117 78 +#define FRAME_stand118 79 +#define FRAME_stand119 80 +#define FRAME_stand120 81 +#define FRAME_stand121 82 +#define FRAME_stand122 83 +#define FRAME_stand123 84 +#define FRAME_stand124 85 +#define FRAME_stand125 86 +#define FRAME_stand126 87 +#define FRAME_stand127 88 +#define FRAME_stand128 89 +#define FRAME_stand129 90 +#define FRAME_stand130 91 +#define FRAME_stand131 92 +#define FRAME_stand132 93 +#define FRAME_stand133 94 +#define FRAME_stand134 95 +#define FRAME_stand135 96 +#define FRAME_stand136 97 +#define FRAME_stand137 98 +#define FRAME_stand138 99 +#define FRAME_stand139 100 +#define FRAME_stand140 101 +#define FRAME_stand141 102 +#define FRAME_stand142 103 +#define FRAME_stand143 104 +#define FRAME_stand144 105 +#define FRAME_stand145 106 +#define FRAME_stand146 107 +#define FRAME_stand147 108 +#define FRAME_stand148 109 +#define FRAME_stand149 110 +#define FRAME_stand150 111 +#define FRAME_stand151 112 +#define FRAME_stand152 113 +#define FRAME_stand153 114 +#define FRAME_stand154 115 +#define FRAME_stand155 116 +#define FRAME_stand156 117 +#define FRAME_stand157 118 +#define FRAME_stand158 119 +#define FRAME_stand159 120 +#define FRAME_stand160 121 +#define FRAME_stand161 122 +#define FRAME_stand162 123 +#define FRAME_stand163 124 +#define FRAME_stand164 125 +#define FRAME_walk01 126 +#define FRAME_walk02 127 +#define FRAME_walk03 128 +#define FRAME_walk04 129 +#define FRAME_walk05 130 +#define FRAME_walk06 131 +#define FRAME_walk07 132 +#define FRAME_walk08 133 +#define FRAME_walk09 134 +#define FRAME_walk10 135 +#define FRAME_walk11 136 +#define FRAME_walk12 137 +#define FRAME_walk13 138 +#define FRAME_walk14 139 +#define FRAME_walk15 140 +#define FRAME_walk16 141 +#define FRAME_walk17 142 +#define FRAME_walk18 143 +#define FRAME_walk19 144 +#define FRAME_walk20 145 +#define FRAME_walk21 146 +#define FRAME_walk22 147 +#define FRAME_walk23 148 -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -*/ -// G:\quake2\baseq2\models/monsters/mutant - -// This file generated by ModelGen - Do NOT Modify - -#define FRAME_attack01 0 -#define FRAME_attack02 1 -#define FRAME_attack03 2 -#define FRAME_attack04 3 -#define FRAME_attack05 4 -#define FRAME_attack06 5 -#define FRAME_attack07 6 -#define FRAME_attack08 7 -#define FRAME_attack09 8 -#define FRAME_attack10 9 -#define FRAME_attack11 10 -#define FRAME_attack12 11 -#define FRAME_attack13 12 -#define FRAME_attack14 13 -#define FRAME_attack15 14 -#define FRAME_death101 15 -#define FRAME_death102 16 -#define FRAME_death103 17 -#define FRAME_death104 18 -#define FRAME_death105 19 -#define FRAME_death106 20 -#define FRAME_death107 21 -#define FRAME_death108 22 -#define FRAME_death109 23 -#define FRAME_death201 24 -#define FRAME_death202 25 -#define FRAME_death203 26 -#define FRAME_death204 27 -#define FRAME_death205 28 -#define FRAME_death206 29 -#define FRAME_death207 30 -#define FRAME_death208 31 -#define FRAME_death209 32 -#define FRAME_death210 33 -#define FRAME_pain101 34 -#define FRAME_pain102 35 -#define FRAME_pain103 36 -#define FRAME_pain104 37 -#define FRAME_pain105 38 -#define FRAME_pain201 39 -#define FRAME_pain202 40 -#define FRAME_pain203 41 -#define FRAME_pain204 42 -#define FRAME_pain205 43 -#define FRAME_pain206 44 -#define FRAME_pain301 45 -#define FRAME_pain302 46 -#define FRAME_pain303 47 -#define FRAME_pain304 48 -#define FRAME_pain305 49 -#define FRAME_pain306 50 -#define FRAME_pain307 51 -#define FRAME_pain308 52 -#define FRAME_pain309 53 -#define FRAME_pain310 54 -#define FRAME_pain311 55 -#define FRAME_run03 56 -#define FRAME_run04 57 -#define FRAME_run05 58 -#define FRAME_run06 59 -#define FRAME_run07 60 -#define FRAME_run08 61 -#define FRAME_stand101 62 -#define FRAME_stand102 63 -#define FRAME_stand103 64 -#define FRAME_stand104 65 -#define FRAME_stand105 66 -#define FRAME_stand106 67 -#define FRAME_stand107 68 -#define FRAME_stand108 69 -#define FRAME_stand109 70 -#define FRAME_stand110 71 -#define FRAME_stand111 72 -#define FRAME_stand112 73 -#define FRAME_stand113 74 -#define FRAME_stand114 75 -#define FRAME_stand115 76 -#define FRAME_stand116 77 -#define FRAME_stand117 78 -#define FRAME_stand118 79 -#define FRAME_stand119 80 -#define FRAME_stand120 81 -#define FRAME_stand121 82 -#define FRAME_stand122 83 -#define FRAME_stand123 84 -#define FRAME_stand124 85 -#define FRAME_stand125 86 -#define FRAME_stand126 87 -#define FRAME_stand127 88 -#define FRAME_stand128 89 -#define FRAME_stand129 90 -#define FRAME_stand130 91 -#define FRAME_stand131 92 -#define FRAME_stand132 93 -#define FRAME_stand133 94 -#define FRAME_stand134 95 -#define FRAME_stand135 96 -#define FRAME_stand136 97 -#define FRAME_stand137 98 -#define FRAME_stand138 99 -#define FRAME_stand139 100 -#define FRAME_stand140 101 -#define FRAME_stand141 102 -#define FRAME_stand142 103 -#define FRAME_stand143 104 -#define FRAME_stand144 105 -#define FRAME_stand145 106 -#define FRAME_stand146 107 -#define FRAME_stand147 108 -#define FRAME_stand148 109 -#define FRAME_stand149 110 -#define FRAME_stand150 111 -#define FRAME_stand151 112 -#define FRAME_stand152 113 -#define FRAME_stand153 114 -#define FRAME_stand154 115 -#define FRAME_stand155 116 -#define FRAME_stand156 117 -#define FRAME_stand157 118 -#define FRAME_stand158 119 -#define FRAME_stand159 120 -#define FRAME_stand160 121 -#define FRAME_stand161 122 -#define FRAME_stand162 123 -#define FRAME_stand163 124 -#define FRAME_stand164 125 -#define FRAME_walk01 126 -#define FRAME_walk02 127 -#define FRAME_walk03 128 -#define FRAME_walk04 129 -#define FRAME_walk05 130 -#define FRAME_walk06 131 -#define FRAME_walk07 132 -#define FRAME_walk08 133 -#define FRAME_walk09 134 -#define FRAME_walk10 135 -#define FRAME_walk11 136 -#define FRAME_walk12 137 -#define FRAME_walk13 138 -#define FRAME_walk14 139 -#define FRAME_walk15 140 -#define FRAME_walk16 141 -#define FRAME_walk17 142 -#define FRAME_walk18 143 -#define FRAME_walk19 144 -#define FRAME_walk20 145 -#define FRAME_walk21 146 -#define FRAME_walk22 147 -#define FRAME_walk23 148 - -#define MODEL_SCALE 1.000000 +#define MODEL_SCALE 1.000000