diff --git a/src/game/baseq2/monster/tank/tank.c b/src/game/baseq2/monster/tank/tank.c index a7cd8e4b..c529a931 100644 --- a/src/game/baseq2/monster/tank/tank.c +++ b/src/game/baseq2/monster/tank/tank.c @@ -1,84 +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. - -*/ -/* -============================================================================== - -TANK - -============================================================================== -*/ + * 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. + * + * ======================================================================= + * + * Tank and Tank Commander. + * + * ======================================================================= + */ #include "../../header/local.h" #include "tank.h" +void tank_refire_rocket(edict_t *self); +void tank_doattack_rocket(edict_t *self); +void tank_reattack_blaster(edict_t *self); -void tank_refire_rocket (edict_t *self); -void tank_doattack_rocket (edict_t *self); -void tank_reattack_blaster (edict_t *self); +static int sound_thud; +static int sound_pain; +static int sound_idle; +static int sound_die; +static int sound_step; +static int sound_sight; +static int sound_windup; +static int sound_strike; -static int sound_thud; -static int sound_pain; -static int sound_idle; -static int sound_die; -static int sound_step; -static int sound_sight; -static int sound_windup; -static int sound_strike; - -// -// misc -// - -void tank_sight (edict_t *self, edict_t *other) -{ - gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0); +void +tank_sight(edict_t *self, edict_t *other) +{ + if (!self) + { + return; + } + + gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0); } - -void tank_footstep (edict_t *self) -{ - gi.sound (self, CHAN_BODY, sound_step, 1, ATTN_NORM, 0); +void +tank_footstep(edict_t *self) +{ + if (!self) + { + return; + } + + gi.sound(self, CHAN_BODY, sound_step, 1, ATTN_NORM, 0); } -void tank_thud (edict_t *self) -{ - gi.sound (self, CHAN_BODY, sound_thud, 1, ATTN_NORM, 0); +void +tank_thud(edict_t *self) +{ + if (!self) + { + return; + } + + gi.sound(self, CHAN_BODY, sound_thud, 1, ATTN_NORM, 0); } -void tank_windup (edict_t *self) -{ - gi.sound (self, CHAN_WEAPON, sound_windup, 1, ATTN_NORM, 0); +void +tank_windup(edict_t *self) +{ + if (!self) + { + return; + } + + gi.sound(self, CHAN_WEAPON, sound_windup, 1, ATTN_NORM, 0); } -void tank_idle (edict_t *self) -{ - gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0); +void +tank_idle(edict_t *self) +{ + if (!self) + { + return; + } + + gi.sound(self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0); } - -// -// stand -// - -mframe_t tank_frames_stand []= -{ +mframe_t tank_frames_stand[] = { {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, {ai_stand, 0, NULL}, @@ -110,118 +127,173 @@ mframe_t tank_frames_stand []= {ai_stand, 0, NULL}, {ai_stand, 0, NULL} }; -mmove_t tank_move_stand = {FRAME_stand01, FRAME_stand30, tank_frames_stand, NULL}; - -void tank_stand (edict_t *self) + +mmove_t tank_move_stand = { + FRAME_stand01, + FRAME_stand30, + tank_frames_stand, + NULL +}; + +void +tank_stand(edict_t *self) +{ + if (!self) + { + return; + } + self->monsterinfo.currentmove = &tank_move_stand; } +void tank_walk(edict_t *self); -// -// walk -// - -void tank_walk (edict_t *self); - -mframe_t tank_frames_start_walk [] = -{ - {ai_walk, 0, NULL}, - {ai_walk, 6, NULL}, - {ai_walk, 6, NULL}, +mframe_t tank_frames_start_walk[] = { + {ai_walk, 0, NULL}, + {ai_walk, 6, NULL}, + {ai_walk, 6, NULL}, {ai_walk, 11, tank_footstep} }; -mmove_t tank_move_start_walk = {FRAME_walk01, FRAME_walk04, tank_frames_start_walk, tank_walk}; -mframe_t tank_frames_walk [] = +mmove_t tank_move_start_walk = { - {ai_walk, 4, NULL}, - {ai_walk, 5, NULL}, - {ai_walk, 3, NULL}, - {ai_walk, 2, NULL}, - {ai_walk, 5, NULL}, - {ai_walk, 5, NULL}, - {ai_walk, 4, NULL}, - {ai_walk, 4, tank_footstep}, - {ai_walk, 3, NULL}, - {ai_walk, 5, NULL}, - {ai_walk, 4, NULL}, - {ai_walk, 5, NULL}, - {ai_walk, 7, NULL}, - {ai_walk, 7, NULL}, - {ai_walk, 6, NULL}, - {ai_walk, 6, tank_footstep} + FRAME_walk01, + FRAME_walk04, + tank_frames_start_walk, + tank_walk }; -mmove_t tank_move_walk = {FRAME_walk05, FRAME_walk20, tank_frames_walk, NULL}; -mframe_t tank_frames_stop_walk [] = -{ - {ai_walk, 3, NULL}, - {ai_walk, 3, NULL}, - {ai_walk, 2, NULL}, - {ai_walk, 2, NULL}, - {ai_walk, 4, tank_footstep} +mframe_t tank_frames_walk[] = { + {ai_walk, 4, NULL}, + {ai_walk, 5, NULL}, + {ai_walk, 3, NULL}, + {ai_walk, 2, NULL}, + {ai_walk, 5, NULL}, + {ai_walk, 5, NULL}, + {ai_walk, 4, NULL}, + {ai_walk, 4, tank_footstep}, + {ai_walk, 3, NULL}, + {ai_walk, 5, NULL}, + {ai_walk, 4, NULL}, + {ai_walk, 5, NULL}, + {ai_walk, 7, NULL}, + {ai_walk, 7, NULL}, + {ai_walk, 6, NULL}, + {ai_walk, 6, tank_footstep} }; -mmove_t tank_move_stop_walk = {FRAME_walk21, FRAME_walk25, tank_frames_stop_walk, tank_stand}; -void tank_walk (edict_t *self) +mmove_t tank_move_walk = { - self->monsterinfo.currentmove = &tank_move_walk; + FRAME_walk05, + FRAME_walk20, + tank_frames_walk, + NULL +}; + +mframe_t tank_frames_stop_walk[] = { + {ai_walk, 3, NULL}, + {ai_walk, 3, NULL}, + {ai_walk, 2, NULL}, + {ai_walk, 2, NULL}, + {ai_walk, 4, tank_footstep} +}; + +mmove_t tank_move_stop_walk = +{ + FRAME_walk21, + FRAME_walk25, + tank_frames_stop_walk, + tank_stand +}; + +void +tank_walk(edict_t *self) +{ + if (!self) + { + return; + } + + self->monsterinfo.currentmove = &tank_move_walk; } +void tank_run(edict_t *self); -// -// run -// - -void tank_run (edict_t *self); - -mframe_t tank_frames_start_run [] = -{ - {ai_run, 0, NULL}, - {ai_run, 6, NULL}, - {ai_run, 6, NULL}, +mframe_t tank_frames_start_run[] = { + {ai_run, 0, NULL}, + {ai_run, 6, NULL}, + {ai_run, 6, NULL}, {ai_run, 11, tank_footstep} }; -mmove_t tank_move_start_run = {FRAME_walk01, FRAME_walk04, tank_frames_start_run, tank_run}; -mframe_t tank_frames_run [] = +mmove_t tank_move_start_run = { - {ai_run, 4, NULL}, - {ai_run, 5, NULL}, - {ai_run, 3, NULL}, - {ai_run, 2, NULL}, - {ai_run, 5, NULL}, - {ai_run, 5, NULL}, - {ai_run, 4, NULL}, - {ai_run, 4, tank_footstep}, - {ai_run, 3, NULL}, - {ai_run, 5, NULL}, - {ai_run, 4, NULL}, - {ai_run, 5, NULL}, - {ai_run, 7, NULL}, - {ai_run, 7, NULL}, - {ai_run, 6, NULL}, - {ai_run, 6, tank_footstep} + FRAME_walk01, + FRAME_walk04, + tank_frames_start_run, + tank_run }; -mmove_t tank_move_run = {FRAME_walk05, FRAME_walk20, tank_frames_run, NULL}; -mframe_t tank_frames_stop_run [] = -{ - {ai_run, 3, NULL}, - {ai_run, 3, NULL}, - {ai_run, 2, NULL}, - {ai_run, 2, NULL}, - {ai_run, 4, tank_footstep} +mframe_t tank_frames_run[] = { + {ai_run, 4, NULL}, + {ai_run, 5, NULL}, + {ai_run, 3, NULL}, + {ai_run, 2, NULL}, + {ai_run, 5, NULL}, + {ai_run, 5, NULL}, + {ai_run, 4, NULL}, + {ai_run, 4, tank_footstep}, + {ai_run, 3, NULL}, + {ai_run, 5, NULL}, + {ai_run, 4, NULL}, + {ai_run, 5, NULL}, + {ai_run, 7, NULL}, + {ai_run, 7, NULL}, + {ai_run, 6, NULL}, + {ai_run, 6, tank_footstep} }; -mmove_t tank_move_stop_run = {FRAME_walk21, FRAME_walk25, tank_frames_stop_run, tank_walk}; -void tank_run (edict_t *self) +mmove_t tank_move_run = { + FRAME_walk05, + FRAME_walk20, + tank_frames_run, + NULL +}; + +mframe_t tank_frames_stop_run[] = { + {ai_run, 3, NULL}, + {ai_run, 3, NULL}, + {ai_run, 2, NULL}, + {ai_run, 2, NULL}, + {ai_run, 4, tank_footstep} +}; + +mmove_t tank_move_stop_run = +{ + FRAME_walk21, + FRAME_walk25, + tank_frames_stop_run, + tank_walk +}; + +void +tank_run(edict_t *self) +{ + if (!self) + { + return; + } + if (self->enemy && self->enemy->client) + { self->monsterinfo.aiflags |= AI_BRUTAL; + } else + { self->monsterinfo.aiflags &= ~AI_BRUTAL; + } if (self->monsterinfo.aiflags & AI_STAND_GROUND) { @@ -229,8 +301,8 @@ void tank_run (edict_t *self) return; } - if (self->monsterinfo.currentmove == &tank_move_walk || - self->monsterinfo.currentmove == &tank_move_start_run) + if ((self->monsterinfo.currentmove == &tank_move_walk) || + (self->monsterinfo.currentmove == &tank_move_start_run)) { self->monsterinfo.currentmove = &tank_move_run; } @@ -240,424 +312,597 @@ void tank_run (edict_t *self) } } -// -// pain -// - -mframe_t tank_frames_pain1 [] = -{ +mframe_t tank_frames_pain1[] = { {ai_move, 0, NULL}, {ai_move, 0, NULL}, {ai_move, 0, NULL}, {ai_move, 0, NULL} }; -mmove_t tank_move_pain1 = {FRAME_pain101, FRAME_pain104, tank_frames_pain1, tank_run}; -mframe_t tank_frames_pain2 [] = +mmove_t tank_move_pain1 = { + FRAME_pain101, + FRAME_pain104, + tank_frames_pain1, + tank_run +}; + +mframe_t tank_frames_pain2[] = { {ai_move, 0, NULL}, {ai_move, 0, NULL}, {ai_move, 0, NULL}, {ai_move, 0, NULL}, {ai_move, 0, NULL} }; -mmove_t tank_move_pain2 = {FRAME_pain201, FRAME_pain205, tank_frames_pain2, tank_run}; -mframe_t tank_frames_pain3 [] = +mmove_t tank_move_pain2 = { + FRAME_pain201, + FRAME_pain205, + tank_frames_pain2, + tank_run +}; + +mframe_t tank_frames_pain3[] = { {ai_move, -7, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 2, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 3, NULL}, - {ai_move, 0, NULL}, - {ai_move, 2, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, tank_footstep} + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 2, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 3, NULL}, + {ai_move, 0, NULL}, + {ai_move, 2, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, tank_footstep} }; -mmove_t tank_move_pain3 = {FRAME_pain301, FRAME_pain316, tank_frames_pain3, tank_run}; - -void tank_pain (edict_t *self, edict_t *other, float kick, int damage) +mmove_t tank_move_pain3 = { + FRAME_pain301, + FRAME_pain316, + tank_frames_pain3, + tank_run +}; + +void +tank_pain(edict_t *self, edict_t *other /* other */, + float kick /* other */, int damage) +{ + if (!self) + { + return; + } + if (self->health < (self->max_health / 2)) - self->s.skinnum |= 1; + { + self->s.skinnum |= 1; + } if (damage <= 10) + { return; + } if (level.time < self->pain_debounce_time) - return; + { + return; + } if (damage <= 30) - if (random() > 0.2) - return; - - // If hard or nightmare, don't go into pain while attacking - if ( skill->value >= 2) { - if ( (self->s.frame >= FRAME_attak301) && (self->s.frame <= FRAME_attak330) ) + if (random() > 0.2) + { return; - if ( (self->s.frame >= FRAME_attak101) && (self->s.frame <= FRAME_attak116) ) + } + } + + /* If hard or nightmare, don't go into pain while attacking */ + if (skill->value >= 2) + { + if ((self->s.frame >= FRAME_attak301) && + (self->s.frame <= FRAME_attak330)) + { return; + } + + if ((self->s.frame >= FRAME_attak101) && + (self->s.frame <= FRAME_attak116)) + { + return; + } } self->pain_debounce_time = level.time + 3; - gi.sound (self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0); + gi.sound(self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0); if (skill->value == 3) - return; // no pain anims in nightmare + { + return; /* no pain anims in nightmare */ + } if (damage <= 30) + { self->monsterinfo.currentmove = &tank_move_pain1; + } else if (damage <= 60) + { self->monsterinfo.currentmove = &tank_move_pain2; + } else + { self->monsterinfo.currentmove = &tank_move_pain3; + } } - -// -// attacks -// - -void TankBlaster (edict_t *self) +void +TankBlaster(edict_t *self) { - vec3_t forward, right; - vec3_t start; - vec3_t end; - vec3_t dir; - int flash_number; - + vec3_t forward, right; + vec3_t start; + vec3_t end; + vec3_t dir; + int flash_number; + + if (!self) + { + return; + } + if (self->s.frame == FRAME_attak110) + { flash_number = MZ2_TANK_BLASTER_1; + } else if (self->s.frame == FRAME_attak113) + { flash_number = MZ2_TANK_BLASTER_2; + } else + { flash_number = MZ2_TANK_BLASTER_3; + } - AngleVectors (self->s.angles, forward, right, NULL); - G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start); + AngleVectors(self->s.angles, forward, right, NULL); + G_ProjectSource(self->s.origin, monster_flash_offset[flash_number], + forward, right, start); - VectorCopy (self->enemy->s.origin, end); + VectorCopy(self->enemy->s.origin, end); end[2] += self->enemy->viewheight; - VectorSubtract (end, start, dir); + VectorSubtract(end, start, dir); - monster_fire_blaster (self, start, dir, 30, 800, flash_number, EF_BLASTER); -} + monster_fire_blaster(self, start, dir, 30, 800, flash_number, EF_BLASTER); +} -void TankStrike (edict_t *self) +void +TankStrike(edict_t *self) { - gi.sound (self, CHAN_WEAPON, sound_strike, 1, ATTN_NORM, 0); -} + gi.sound(self, CHAN_WEAPON, sound_strike, 1, ATTN_NORM, 0); +} -void TankRocket (edict_t *self) +void +TankRocket(edict_t *self) { - vec3_t forward, right; - vec3_t start; - vec3_t dir; - vec3_t vec; - int flash_number; - + vec3_t forward, right; + vec3_t start; + vec3_t dir; + vec3_t vec; + int flash_number; + + if (!self) + { + return; + } + if (self->s.frame == FRAME_attak324) + { flash_number = MZ2_TANK_ROCKET_1; + } else if (self->s.frame == FRAME_attak327) + { flash_number = MZ2_TANK_ROCKET_2; - else + } + else + { flash_number = MZ2_TANK_ROCKET_3; + } - AngleVectors (self->s.angles, forward, right, NULL); - G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start); + AngleVectors(self->s.angles, forward, right, NULL); + G_ProjectSource(self->s.origin, monster_flash_offset[flash_number], + forward, right, start); - VectorCopy (self->enemy->s.origin, vec); + VectorCopy(self->enemy->s.origin, vec); vec[2] += self->enemy->viewheight; - VectorSubtract (vec, start, dir); - VectorNormalize (dir); + VectorSubtract(vec, start, dir); + VectorNormalize(dir); - monster_fire_rocket (self, start, dir, 50, 550, flash_number); -} + monster_fire_rocket(self, start, dir, 50, 550, flash_number); +} -void TankMachineGun (edict_t *self) +void +TankMachineGun(edict_t *self) { - vec3_t dir; - vec3_t vec; - vec3_t start; - vec3_t forward, right; - int flash_number; - + vec3_t dir; + vec3_t vec; + vec3_t start; + vec3_t forward, right; + int flash_number; + + if (!self) + { + return; + } + flash_number = MZ2_TANK_MACHINEGUN_1 + (self->s.frame - FRAME_attak406); - AngleVectors (self->s.angles, forward, right, NULL); - G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start); + AngleVectors(self->s.angles, forward, right, NULL); + G_ProjectSource(self->s.origin, monster_flash_offset[flash_number], + forward, right, start); if (self->enemy) { - VectorCopy (self->enemy->s.origin, vec); + VectorCopy(self->enemy->s.origin, vec); vec[2] += self->enemy->viewheight; - VectorSubtract (vec, start, vec); - vectoangles (vec, vec); + VectorSubtract(vec, start, vec); + vectoangles(vec, vec); dir[0] = vec[0]; } else { dir[0] = 0; } + if (self->s.frame <= FRAME_attak415) + { dir[1] = self->s.angles[1] - 8 * (self->s.frame - FRAME_attak411); + } else + { dir[1] = self->s.angles[1] + 8 * (self->s.frame - FRAME_attak419); + } + dir[2] = 0; - AngleVectors (dir, forward, NULL, NULL); + AngleVectors(dir, forward, NULL, NULL); - monster_fire_bullet (self, start, forward, 20, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, flash_number); -} + monster_fire_bullet(self, start, forward, 20, 4, + DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, + flash_number); +} - -mframe_t tank_frames_attack_blast [] = -{ - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, -1, NULL}, - {ai_charge, -2, NULL}, - {ai_charge, -1, NULL}, - {ai_charge, -1, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, TankBlaster}, // 10 - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, TankBlaster}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, TankBlaster} // 16 +mframe_t tank_frames_attack_blast[] = { + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, -1, NULL}, + {ai_charge, -2, NULL}, + {ai_charge, -1, NULL}, + {ai_charge, -1, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, TankBlaster}, /* 10 */ + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, TankBlaster}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, TankBlaster} /* 16 */ }; -mmove_t tank_move_attack_blast = {FRAME_attak101, FRAME_attak116, tank_frames_attack_blast, tank_reattack_blaster}; -mframe_t tank_frames_reattack_blast [] = +mmove_t tank_move_attack_blast = { - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, TankBlaster}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, TankBlaster} // 16 + FRAME_attak101, + FRAME_attak116, + tank_frames_attack_blast, + tank_reattack_blaster }; -mmove_t tank_move_reattack_blast = {FRAME_attak111, FRAME_attak116, tank_frames_reattack_blast, tank_reattack_blaster}; -mframe_t tank_frames_attack_post_blast [] = -{ - {ai_move, 0, NULL}, // 17 - {ai_move, 0, NULL}, - {ai_move, 2, NULL}, - {ai_move, 3, NULL}, - {ai_move, 2, NULL}, - {ai_move, -2, tank_footstep} // 22 +mframe_t tank_frames_reattack_blast[] = { + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, TankBlaster}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, TankBlaster} /* 16 */ }; -mmove_t tank_move_attack_post_blast = {FRAME_attak117, FRAME_attak122, tank_frames_attack_post_blast, tank_run}; -void tank_reattack_blaster (edict_t *self) +mmove_t tank_move_reattack_blast = { + FRAME_attak111, + FRAME_attak116, + tank_frames_reattack_blast, + tank_reattack_blaster +}; + +mframe_t tank_frames_attack_post_blast[] = { + {ai_move, 0, NULL}, /* 17 */ + {ai_move, 0, NULL}, + {ai_move, 2, NULL}, + {ai_move, 3, NULL}, + {ai_move, 2, NULL}, + {ai_move, -2, tank_footstep} /* 22 */ +}; + +mmove_t tank_move_attack_post_blast = +{ + FRAME_attak117, + FRAME_attak122, + tank_frames_attack_post_blast, + tank_run +}; + +void +tank_reattack_blaster(edict_t *self) +{ + if (!self) + { + return; + } + if (skill->value >= 2) - if (visible (self, self->enemy)) + { + if (visible(self, self->enemy)) + { if (self->enemy->health > 0) + { if (random() <= 0.6) { self->monsterinfo.currentmove = &tank_move_reattack_blast; return; } + } + } + } + self->monsterinfo.currentmove = &tank_move_attack_post_blast; } - -void tank_poststrike (edict_t *self) -{ +void +tank_poststrike(edict_t *self) +{ + if (!self) + { + return; + } + self->enemy = NULL; - tank_run (self); + tank_run(self); } -mframe_t tank_frames_attack_strike [] = -{ - {ai_move, 3, NULL}, - {ai_move, 2, NULL}, - {ai_move, 2, NULL}, - {ai_move, 1, NULL}, - {ai_move, 6, NULL}, - {ai_move, 7, NULL}, - {ai_move, 9, tank_footstep}, - {ai_move, 2, NULL}, - {ai_move, 1, NULL}, - {ai_move, 2, NULL}, - {ai_move, 2, tank_footstep}, - {ai_move, 2, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, -2, NULL}, - {ai_move, -2, NULL}, - {ai_move, 0, tank_windup}, - {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, TankStrike}, - {ai_move, 0, NULL}, - {ai_move, -1, NULL}, - {ai_move, -1, NULL}, - {ai_move, -1, NULL}, - {ai_move, -1, NULL}, - {ai_move, -1, NULL}, - {ai_move, -3, NULL}, +mframe_t tank_frames_attack_strike[] = { + {ai_move, 3, NULL}, + {ai_move, 2, NULL}, + {ai_move, 2, NULL}, + {ai_move, 1, NULL}, + {ai_move, 6, NULL}, + {ai_move, 7, NULL}, + {ai_move, 9, tank_footstep}, + {ai_move, 2, NULL}, + {ai_move, 1, NULL}, + {ai_move, 2, NULL}, + {ai_move, 2, tank_footstep}, + {ai_move, 2, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, -2, NULL}, + {ai_move, -2, NULL}, + {ai_move, 0, tank_windup}, + {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, TankStrike}, + {ai_move, 0, NULL}, + {ai_move, -1, NULL}, + {ai_move, -1, NULL}, + {ai_move, -1, NULL}, + {ai_move, -1, NULL}, + {ai_move, -1, NULL}, + {ai_move, -3, NULL}, {ai_move, -10, NULL}, {ai_move, -10, NULL}, - {ai_move, -2, NULL}, - {ai_move, -3, NULL}, - {ai_move, -2, tank_footstep} + {ai_move, -2, NULL}, + {ai_move, -3, NULL}, + {ai_move, -2, tank_footstep} }; -mmove_t tank_move_attack_strike = {FRAME_attak201, FRAME_attak238, tank_frames_attack_strike, tank_poststrike}; -mframe_t tank_frames_attack_pre_rocket [] = +mmove_t tank_move_attack_strike = { - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, // 10 + FRAME_attak201, + FRAME_attak238, + tank_frames_attack_strike, + tank_poststrike +}; - {ai_charge, 0, NULL}, - {ai_charge, 1, NULL}, - {ai_charge, 2, NULL}, - {ai_charge, 7, NULL}, - {ai_charge, 7, NULL}, - {ai_charge, 7, tank_footstep}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, // 20 +mframe_t tank_frames_attack_pre_rocket[] = { + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, /* 10 */ + + {ai_charge, 0, NULL}, + {ai_charge, 1, NULL}, + {ai_charge, 2, NULL}, + {ai_charge, 7, NULL}, + {ai_charge, 7, NULL}, + {ai_charge, 7, tank_footstep}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, /* 20 */ {ai_charge, -3, NULL} }; -mmove_t tank_move_attack_pre_rocket = {FRAME_attak301, FRAME_attak321, tank_frames_attack_pre_rocket, tank_doattack_rocket}; -mframe_t tank_frames_attack_fire_rocket [] = +mmove_t tank_move_attack_pre_rocket = { - {ai_charge, -3, NULL}, // Loop Start 22 - {ai_charge, 0, NULL}, - {ai_charge, 0, TankRocket}, // 24 - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, TankRocket}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, -1, TankRocket} // 30 Loop End + FRAME_attak301, + FRAME_attak321, + tank_frames_attack_pre_rocket, + tank_doattack_rocket }; -mmove_t tank_move_attack_fire_rocket = {FRAME_attak322, FRAME_attak330, tank_frames_attack_fire_rocket, tank_refire_rocket}; -mframe_t tank_frames_attack_post_rocket [] = -{ - {ai_charge, 0, NULL}, // 31 +mframe_t tank_frames_attack_fire_rocket[] = { + {ai_charge, -3, NULL}, /* Loop Start 22 */ + {ai_charge, 0, NULL}, + {ai_charge, 0, TankRocket}, /* 24 */ + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, TankRocket}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, -1, TankRocket} /* 30 Loop End */ +}; + +mmove_t tank_move_attack_fire_rocket = +{ + FRAME_attak322, + FRAME_attak330, + tank_frames_attack_fire_rocket, + tank_refire_rocket +}; + +mframe_t tank_frames_attack_post_rocket[] = { + {ai_charge, 0, NULL}, /* 31 */ {ai_charge, -1, NULL}, {ai_charge, -1, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 2, NULL}, - {ai_charge, 3, NULL}, - {ai_charge, 4, NULL}, - {ai_charge, 2, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, // 40 + {ai_charge, 0, NULL}, + {ai_charge, 2, NULL}, + {ai_charge, 3, NULL}, + {ai_charge, 4, NULL}, + {ai_charge, 2, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, /* 40 */ - {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, {ai_charge, -9, NULL}, {ai_charge, -8, NULL}, {ai_charge, -7, NULL}, {ai_charge, -1, NULL}, {ai_charge, -1, tank_footstep}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, // 50 + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, /* 50 */ - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL}, - {ai_charge, 0, NULL} + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL} }; -mmove_t tank_move_attack_post_rocket = {FRAME_attak331, FRAME_attak353, tank_frames_attack_post_rocket, tank_run}; -mframe_t tank_frames_attack_chain [] = +mmove_t tank_move_attack_post_rocket = { + FRAME_attak331, + FRAME_attak353, + tank_frames_attack_post_rocket, + tank_run +}; + +mframe_t tank_frames_attack_chain[] = { {ai_charge, 0, NULL}, {ai_charge, 0, NULL}, {ai_charge, 0, NULL}, {ai_charge, 0, NULL}, {ai_charge, 0, NULL}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, - {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, + {NULL, 0, TankMachineGun}, {ai_charge, 0, NULL}, {ai_charge, 0, NULL}, {ai_charge, 0, NULL}, {ai_charge, 0, NULL}, {ai_charge, 0, NULL} }; -mmove_t tank_move_attack_chain = {FRAME_attak401, FRAME_attak429, tank_frames_attack_chain, tank_run}; -void tank_refire_rocket (edict_t *self) +mmove_t tank_move_attack_chain = { - // Only on hard or nightmare - if ( skill->value >= 2 ) + FRAME_attak401, + FRAME_attak429, + tank_frames_attack_chain, + tank_run +}; + +void +tank_refire_rocket(edict_t *self) +{ + if (!self) + { + return; + } + + /* Only on hard or nightmare */ + if (skill->value >= 2) + { if (self->enemy->health > 0) - if (visible(self, self->enemy) ) + { + if (visible(self, self->enemy)) + { if (random() <= 0.4) { - self->monsterinfo.currentmove = &tank_move_attack_fire_rocket; + self->monsterinfo.currentmove = + &tank_move_attack_fire_rocket; return; } + } + } + } + self->monsterinfo.currentmove = &tank_move_attack_post_rocket; } -void tank_doattack_rocket (edict_t *self) -{ +void +tank_doattack_rocket(edict_t *self) +{ + if (!self) + { + return; + } + self->monsterinfo.currentmove = &tank_move_attack_fire_rocket; } -void tank_attack(edict_t *self) +void +tank_attack(edict_t *self) { - vec3_t vec; - float range; - float r; - + vec3_t vec; + float range; + float r; + + if (!self) + { + return; + } + if (self->enemy->health < 0) { self->monsterinfo.currentmove = &tank_move_attack_strike; @@ -665,160 +910,201 @@ void tank_attack(edict_t *self) return; } - VectorSubtract (self->enemy->s.origin, self->s.origin, vec); - range = VectorLength (vec); + VectorSubtract(self->enemy->s.origin, self->s.origin, vec); + range = VectorLength(vec); r = random(); if (range <= 125) { if (r < 0.4) + { self->monsterinfo.currentmove = &tank_move_attack_chain; - else + } + else + { self->monsterinfo.currentmove = &tank_move_attack_blast; + } } else if (range <= 250) { if (r < 0.5) + { self->monsterinfo.currentmove = &tank_move_attack_chain; + } else + { self->monsterinfo.currentmove = &tank_move_attack_blast; + } } else { if (r < 0.33) + { self->monsterinfo.currentmove = &tank_move_attack_chain; + } else if (r < 0.66) { self->monsterinfo.currentmove = &tank_move_attack_pre_rocket; - self->pain_debounce_time = level.time + 5.0; // no pain for a while + self->pain_debounce_time = level.time + 5.0; /* no pain for a while */ } else + { self->monsterinfo.currentmove = &tank_move_attack_blast; + } } } - -// -// death -// - -void tank_dead (edict_t *self) -{ - VectorSet (self->mins, -16, -16, -16); - VectorSet (self->maxs, 16, 16, -0); +void +tank_dead(edict_t *self) +{ + if (!self) + { + return; + } + + VectorSet(self->mins, -16, -16, -16); + VectorSet(self->maxs, 16, 16, -0); self->movetype = MOVETYPE_TOSS; self->svflags |= SVF_DEADMONSTER; self->nextthink = 0; - gi.linkentity (self); + gi.linkentity(self); } -mframe_t tank_frames_death1 [] = -{ - {ai_move, -7, NULL}, - {ai_move, -2, NULL}, - {ai_move, -2, NULL}, - {ai_move, 1, NULL}, - {ai_move, 3, NULL}, - {ai_move, 6, NULL}, - {ai_move, 1, NULL}, - {ai_move, 1, NULL}, - {ai_move, 2, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, -2, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, -3, 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, -4, NULL}, - {ai_move, -6, NULL}, - {ai_move, -4, NULL}, - {ai_move, -5, NULL}, - {ai_move, -7, NULL}, +mframe_t tank_frames_death1[] = { + {ai_move, -7, NULL}, + {ai_move, -2, NULL}, + {ai_move, -2, NULL}, + {ai_move, 1, NULL}, + {ai_move, 3, NULL}, + {ai_move, 6, NULL}, + {ai_move, 1, NULL}, + {ai_move, 1, NULL}, + {ai_move, 2, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, -2, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, -3, 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, -4, NULL}, + {ai_move, -6, NULL}, + {ai_move, -4, NULL}, + {ai_move, -5, NULL}, + {ai_move, -7, NULL}, {ai_move, -15, tank_thud}, - {ai_move, -5, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL}, - {ai_move, 0, NULL} + {ai_move, -5, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL} }; -mmove_t tank_move_death = {FRAME_death101, FRAME_death132, tank_frames_death1, tank_dead}; -void tank_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +mmove_t tank_move_death = { - int n; + FRAME_death101, + FRAME_death132, + tank_frames_death1, + tank_dead +}; - // check for gib +void +tank_die(edict_t *self, edict_t *inflictor /* unused */, + edict_t *attacker /* unused */, int damage, + vec3_t point /* unused */) +{ + int n; + + if (!self) + { + return; + } + + /* check for gib */ if (self->health <= self->gib_health) { - gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0); - for (n= 0; n < 1 /*4*/; n++) - ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); - for (n= 0; n < 4; n++) - ThrowGib (self, "models/objects/gibs/sm_metal/tris.md2", damage, GIB_METALLIC); - ThrowGib (self, "models/objects/gibs/chest/tris.md2", damage, GIB_ORGANIC); - ThrowHead (self, "models/objects/gibs/gear/tris.md2", damage, GIB_METALLIC); + gi.sound(self, CHAN_VOICE, gi.soundindex("misc/udeath.wav"), 1, ATTN_NORM, 0); + + for (n = 0; n < 1; n++) + { + ThrowGib(self, "models/objects/gibs/sm_meat/tris.md2", + damage, GIB_ORGANIC); + } + + for (n = 0; n < 4; n++) + { + ThrowGib(self, "models/objects/gibs/sm_metal/tris.md2", + damage, GIB_METALLIC); + } + + ThrowGib(self, "models/objects/gibs/chest/tris.md2", + damage, GIB_ORGANIC); + ThrowHead(self, "models/objects/gibs/gear/tris.md2", + damage, GIB_METALLIC); self->deadflag = DEAD_DEAD; return; } if (self->deadflag == DEAD_DEAD) + { return; + } - // regular death - gi.sound (self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0); + /* regular death */ + gi.sound(self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0); self->deadflag = DEAD_DEAD; self->takedamage = DAMAGE_YES; self->monsterinfo.currentmove = &tank_move_death; - } - -// -// monster_tank -// - -/*QUAKED monster_tank (1 .5 0) (-32 -32 -16) (32 32 72) Ambush Trigger_Spawn Sight -*/ -/*QUAKED monster_tank_commander (1 .5 0) (-32 -32 -16) (32 32 72) Ambush Trigger_Spawn Sight -*/ -void SP_monster_tank (edict_t *self) -{ +/* + * QUAKED monster_tank (1 .5 0) (-32 -32 -16) (32 32 72) Ambush Trigger_Spawn Sight + + * QUAKED monster_tank_commander (1 .5 0) (-32 -32 -16) (32 32 72) Ambush Trigger_Spawn Sight + */ +void +SP_monster_tank(edict_t *self) +{ + if (!self) + { + return; + } + if (deathmatch->value) { - G_FreeEdict (self); + G_FreeEdict(self); return; } - self->s.modelindex = gi.modelindex ("models/monsters/tank/tris.md2"); - VectorSet (self->mins, -32, -32, -16); - VectorSet (self->maxs, 32, 32, 72); + self->s.modelindex = gi.modelindex("models/monsters/tank/tris.md2"); + VectorSet(self->mins, -32, -32, -16); + VectorSet(self->maxs, 32, 32, 72); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; - sound_pain = gi.soundindex ("tank/tnkpain2.wav"); - sound_thud = gi.soundindex ("tank/tnkdeth2.wav"); - sound_idle = gi.soundindex ("tank/tnkidle1.wav"); - sound_die = gi.soundindex ("tank/death.wav"); - sound_step = gi.soundindex ("tank/step.wav"); - sound_windup = gi.soundindex ("tank/tnkatck4.wav"); - sound_strike = gi.soundindex ("tank/tnkatck5.wav"); - sound_sight = gi.soundindex ("tank/sight1.wav"); + sound_pain = gi.soundindex("tank/tnkpain2.wav"); + sound_thud = gi.soundindex("tank/tnkdeth2.wav"); + sound_idle = gi.soundindex("tank/tnkidle1.wav"); + sound_die = gi.soundindex("tank/death.wav"); + sound_step = gi.soundindex("tank/step.wav"); + sound_windup = gi.soundindex("tank/tnkatck4.wav"); + sound_strike = gi.soundindex("tank/tnkatck5.wav"); + sound_sight = gi.soundindex("tank/sight1.wav"); - gi.soundindex ("tank/tnkatck1.wav"); - gi.soundindex ("tank/tnkatk2a.wav"); - gi.soundindex ("tank/tnkatk2b.wav"); - gi.soundindex ("tank/tnkatk2c.wav"); - gi.soundindex ("tank/tnkatk2d.wav"); - gi.soundindex ("tank/tnkatk2e.wav"); - gi.soundindex ("tank/tnkatck3.wav"); + gi.soundindex("tank/tnkatck1.wav"); + gi.soundindex("tank/tnkatk2a.wav"); + gi.soundindex("tank/tnkatk2b.wav"); + gi.soundindex("tank/tnkatk2c.wav"); + gi.soundindex("tank/tnkatk2d.wav"); + gi.soundindex("tank/tnkatk2e.wav"); + gi.soundindex("tank/tnkatck3.wav"); if (strcmp(self->classname, "monster_tank_commander") == 0) { @@ -844,14 +1130,16 @@ void SP_monster_tank (edict_t *self) self->monsterinfo.sight = tank_sight; self->monsterinfo.idle = tank_idle; - gi.linkentity (self); - + gi.linkentity(self); + self->monsterinfo.currentmove = &tank_move_stand; self->monsterinfo.scale = MODEL_SCALE; walkmonster_start(self); if (strcmp(self->classname, "monster_tank_commander") == 0) + { self->s.skinnum = 2; + } } diff --git a/src/game/baseq2/monster/tank/tank.h b/src/game/baseq2/monster/tank/tank.h index 284a5be2..aa30337c 100644 --- a/src/game/baseq2/monster/tank/tank.h +++ b/src/game/baseq2/monster/tank/tank.h @@ -1,319 +1,322 @@ /* -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. + * + * ======================================================================= + * + * Tank and Tank Commander 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_stand01 0 +#define FRAME_stand02 1 +#define FRAME_stand03 2 +#define FRAME_stand04 3 +#define FRAME_stand05 4 +#define FRAME_stand06 5 +#define FRAME_stand07 6 +#define FRAME_stand08 7 +#define FRAME_stand09 8 +#define FRAME_stand10 9 +#define FRAME_stand11 10 +#define FRAME_stand12 11 +#define FRAME_stand13 12 +#define FRAME_stand14 13 +#define FRAME_stand15 14 +#define FRAME_stand16 15 +#define FRAME_stand17 16 +#define FRAME_stand18 17 +#define FRAME_stand19 18 +#define FRAME_stand20 19 +#define FRAME_stand21 20 +#define FRAME_stand22 21 +#define FRAME_stand23 22 +#define FRAME_stand24 23 +#define FRAME_stand25 24 +#define FRAME_stand26 25 +#define FRAME_stand27 26 +#define FRAME_stand28 27 +#define FRAME_stand29 28 +#define FRAME_stand30 29 +#define FRAME_walk01 30 +#define FRAME_walk02 31 +#define FRAME_walk03 32 +#define FRAME_walk04 33 +#define FRAME_walk05 34 +#define FRAME_walk06 35 +#define FRAME_walk07 36 +#define FRAME_walk08 37 +#define FRAME_walk09 38 +#define FRAME_walk10 39 +#define FRAME_walk11 40 +#define FRAME_walk12 41 +#define FRAME_walk13 42 +#define FRAME_walk14 43 +#define FRAME_walk15 44 +#define FRAME_walk16 45 +#define FRAME_walk17 46 +#define FRAME_walk18 47 +#define FRAME_walk19 48 +#define FRAME_walk20 49 +#define FRAME_walk21 50 +#define FRAME_walk22 51 +#define FRAME_walk23 52 +#define FRAME_walk24 53 +#define FRAME_walk25 54 +#define FRAME_attak101 55 +#define FRAME_attak102 56 +#define FRAME_attak103 57 +#define FRAME_attak104 58 +#define FRAME_attak105 59 +#define FRAME_attak106 60 +#define FRAME_attak107 61 +#define FRAME_attak108 62 +#define FRAME_attak109 63 +#define FRAME_attak110 64 +#define FRAME_attak111 65 +#define FRAME_attak112 66 +#define FRAME_attak113 67 +#define FRAME_attak114 68 +#define FRAME_attak115 69 +#define FRAME_attak116 70 +#define FRAME_attak117 71 +#define FRAME_attak118 72 +#define FRAME_attak119 73 +#define FRAME_attak120 74 +#define FRAME_attak121 75 +#define FRAME_attak122 76 +#define FRAME_attak201 77 +#define FRAME_attak202 78 +#define FRAME_attak203 79 +#define FRAME_attak204 80 +#define FRAME_attak205 81 +#define FRAME_attak206 82 +#define FRAME_attak207 83 +#define FRAME_attak208 84 +#define FRAME_attak209 85 +#define FRAME_attak210 86 +#define FRAME_attak211 87 +#define FRAME_attak212 88 +#define FRAME_attak213 89 +#define FRAME_attak214 90 +#define FRAME_attak215 91 +#define FRAME_attak216 92 +#define FRAME_attak217 93 +#define FRAME_attak218 94 +#define FRAME_attak219 95 +#define FRAME_attak220 96 +#define FRAME_attak221 97 +#define FRAME_attak222 98 +#define FRAME_attak223 99 +#define FRAME_attak224 100 +#define FRAME_attak225 101 +#define FRAME_attak226 102 +#define FRAME_attak227 103 +#define FRAME_attak228 104 +#define FRAME_attak229 105 +#define FRAME_attak230 106 +#define FRAME_attak231 107 +#define FRAME_attak232 108 +#define FRAME_attak233 109 +#define FRAME_attak234 110 +#define FRAME_attak235 111 +#define FRAME_attak236 112 +#define FRAME_attak237 113 +#define FRAME_attak238 114 +#define FRAME_attak301 115 +#define FRAME_attak302 116 +#define FRAME_attak303 117 +#define FRAME_attak304 118 +#define FRAME_attak305 119 +#define FRAME_attak306 120 +#define FRAME_attak307 121 +#define FRAME_attak308 122 +#define FRAME_attak309 123 +#define FRAME_attak310 124 +#define FRAME_attak311 125 +#define FRAME_attak312 126 +#define FRAME_attak313 127 +#define FRAME_attak314 128 +#define FRAME_attak315 129 +#define FRAME_attak316 130 +#define FRAME_attak317 131 +#define FRAME_attak318 132 +#define FRAME_attak319 133 +#define FRAME_attak320 134 +#define FRAME_attak321 135 +#define FRAME_attak322 136 +#define FRAME_attak323 137 +#define FRAME_attak324 138 +#define FRAME_attak325 139 +#define FRAME_attak326 140 +#define FRAME_attak327 141 +#define FRAME_attak328 142 +#define FRAME_attak329 143 +#define FRAME_attak330 144 +#define FRAME_attak331 145 +#define FRAME_attak332 146 +#define FRAME_attak333 147 +#define FRAME_attak334 148 +#define FRAME_attak335 149 +#define FRAME_attak336 150 +#define FRAME_attak337 151 +#define FRAME_attak338 152 +#define FRAME_attak339 153 +#define FRAME_attak340 154 +#define FRAME_attak341 155 +#define FRAME_attak342 156 +#define FRAME_attak343 157 +#define FRAME_attak344 158 +#define FRAME_attak345 159 +#define FRAME_attak346 160 +#define FRAME_attak347 161 +#define FRAME_attak348 162 +#define FRAME_attak349 163 +#define FRAME_attak350 164 +#define FRAME_attak351 165 +#define FRAME_attak352 166 +#define FRAME_attak353 167 +#define FRAME_attak401 168 +#define FRAME_attak402 169 +#define FRAME_attak403 170 +#define FRAME_attak404 171 +#define FRAME_attak405 172 +#define FRAME_attak406 173 +#define FRAME_attak407 174 +#define FRAME_attak408 175 +#define FRAME_attak409 176 +#define FRAME_attak410 177 +#define FRAME_attak411 178 +#define FRAME_attak412 179 +#define FRAME_attak413 180 +#define FRAME_attak414 181 +#define FRAME_attak415 182 +#define FRAME_attak416 183 +#define FRAME_attak417 184 +#define FRAME_attak418 185 +#define FRAME_attak419 186 +#define FRAME_attak420 187 +#define FRAME_attak421 188 +#define FRAME_attak422 189 +#define FRAME_attak423 190 +#define FRAME_attak424 191 +#define FRAME_attak425 192 +#define FRAME_attak426 193 +#define FRAME_attak427 194 +#define FRAME_attak428 195 +#define FRAME_attak429 196 +#define FRAME_pain101 197 +#define FRAME_pain102 198 +#define FRAME_pain103 199 +#define FRAME_pain104 200 +#define FRAME_pain201 201 +#define FRAME_pain202 202 +#define FRAME_pain203 203 +#define FRAME_pain204 204 +#define FRAME_pain205 205 +#define FRAME_pain301 206 +#define FRAME_pain302 207 +#define FRAME_pain303 208 +#define FRAME_pain304 209 +#define FRAME_pain305 210 +#define FRAME_pain306 211 +#define FRAME_pain307 212 +#define FRAME_pain308 213 +#define FRAME_pain309 214 +#define FRAME_pain310 215 +#define FRAME_pain311 216 +#define FRAME_pain312 217 +#define FRAME_pain313 218 +#define FRAME_pain314 219 +#define FRAME_pain315 220 +#define FRAME_pain316 221 +#define FRAME_death101 222 +#define FRAME_death102 223 +#define FRAME_death103 224 +#define FRAME_death104 225 +#define FRAME_death105 226 +#define FRAME_death106 227 +#define FRAME_death107 228 +#define FRAME_death108 229 +#define FRAME_death109 230 +#define FRAME_death110 231 +#define FRAME_death111 232 +#define FRAME_death112 233 +#define FRAME_death113 234 +#define FRAME_death114 235 +#define FRAME_death115 236 +#define FRAME_death116 237 +#define FRAME_death117 238 +#define FRAME_death118 239 +#define FRAME_death119 240 +#define FRAME_death120 241 +#define FRAME_death121 242 +#define FRAME_death122 243 +#define FRAME_death123 244 +#define FRAME_death124 245 +#define FRAME_death125 246 +#define FRAME_death126 247 +#define FRAME_death127 248 +#define FRAME_death128 249 +#define FRAME_death129 250 +#define FRAME_death130 251 +#define FRAME_death131 252 +#define FRAME_death132 253 +#define FRAME_recln101 254 +#define FRAME_recln102 255 +#define FRAME_recln103 256 +#define FRAME_recln104 257 +#define FRAME_recln105 258 +#define FRAME_recln106 259 +#define FRAME_recln107 260 +#define FRAME_recln108 261 +#define FRAME_recln109 262 +#define FRAME_recln110 263 +#define FRAME_recln111 264 +#define FRAME_recln112 265 +#define FRAME_recln113 266 +#define FRAME_recln114 267 +#define FRAME_recln115 268 +#define FRAME_recln116 269 +#define FRAME_recln117 270 +#define FRAME_recln118 271 +#define FRAME_recln119 272 +#define FRAME_recln120 273 +#define FRAME_recln121 274 +#define FRAME_recln122 275 +#define FRAME_recln123 276 +#define FRAME_recln124 277 +#define FRAME_recln125 278 +#define FRAME_recln126 279 +#define FRAME_recln127 280 +#define FRAME_recln128 281 +#define FRAME_recln129 282 +#define FRAME_recln130 283 +#define FRAME_recln131 284 +#define FRAME_recln132 285 +#define FRAME_recln133 286 +#define FRAME_recln134 287 +#define FRAME_recln135 288 +#define FRAME_recln136 289 +#define FRAME_recln137 290 +#define FRAME_recln138 291 +#define FRAME_recln139 292 +#define FRAME_recln140 293 -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/tank - -// This file generated by qdata - Do NOT Modify - -#define FRAME_stand01 0 -#define FRAME_stand02 1 -#define FRAME_stand03 2 -#define FRAME_stand04 3 -#define FRAME_stand05 4 -#define FRAME_stand06 5 -#define FRAME_stand07 6 -#define FRAME_stand08 7 -#define FRAME_stand09 8 -#define FRAME_stand10 9 -#define FRAME_stand11 10 -#define FRAME_stand12 11 -#define FRAME_stand13 12 -#define FRAME_stand14 13 -#define FRAME_stand15 14 -#define FRAME_stand16 15 -#define FRAME_stand17 16 -#define FRAME_stand18 17 -#define FRAME_stand19 18 -#define FRAME_stand20 19 -#define FRAME_stand21 20 -#define FRAME_stand22 21 -#define FRAME_stand23 22 -#define FRAME_stand24 23 -#define FRAME_stand25 24 -#define FRAME_stand26 25 -#define FRAME_stand27 26 -#define FRAME_stand28 27 -#define FRAME_stand29 28 -#define FRAME_stand30 29 -#define FRAME_walk01 30 -#define FRAME_walk02 31 -#define FRAME_walk03 32 -#define FRAME_walk04 33 -#define FRAME_walk05 34 -#define FRAME_walk06 35 -#define FRAME_walk07 36 -#define FRAME_walk08 37 -#define FRAME_walk09 38 -#define FRAME_walk10 39 -#define FRAME_walk11 40 -#define FRAME_walk12 41 -#define FRAME_walk13 42 -#define FRAME_walk14 43 -#define FRAME_walk15 44 -#define FRAME_walk16 45 -#define FRAME_walk17 46 -#define FRAME_walk18 47 -#define FRAME_walk19 48 -#define FRAME_walk20 49 -#define FRAME_walk21 50 -#define FRAME_walk22 51 -#define FRAME_walk23 52 -#define FRAME_walk24 53 -#define FRAME_walk25 54 -#define FRAME_attak101 55 -#define FRAME_attak102 56 -#define FRAME_attak103 57 -#define FRAME_attak104 58 -#define FRAME_attak105 59 -#define FRAME_attak106 60 -#define FRAME_attak107 61 -#define FRAME_attak108 62 -#define FRAME_attak109 63 -#define FRAME_attak110 64 -#define FRAME_attak111 65 -#define FRAME_attak112 66 -#define FRAME_attak113 67 -#define FRAME_attak114 68 -#define FRAME_attak115 69 -#define FRAME_attak116 70 -#define FRAME_attak117 71 -#define FRAME_attak118 72 -#define FRAME_attak119 73 -#define FRAME_attak120 74 -#define FRAME_attak121 75 -#define FRAME_attak122 76 -#define FRAME_attak201 77 -#define FRAME_attak202 78 -#define FRAME_attak203 79 -#define FRAME_attak204 80 -#define FRAME_attak205 81 -#define FRAME_attak206 82 -#define FRAME_attak207 83 -#define FRAME_attak208 84 -#define FRAME_attak209 85 -#define FRAME_attak210 86 -#define FRAME_attak211 87 -#define FRAME_attak212 88 -#define FRAME_attak213 89 -#define FRAME_attak214 90 -#define FRAME_attak215 91 -#define FRAME_attak216 92 -#define FRAME_attak217 93 -#define FRAME_attak218 94 -#define FRAME_attak219 95 -#define FRAME_attak220 96 -#define FRAME_attak221 97 -#define FRAME_attak222 98 -#define FRAME_attak223 99 -#define FRAME_attak224 100 -#define FRAME_attak225 101 -#define FRAME_attak226 102 -#define FRAME_attak227 103 -#define FRAME_attak228 104 -#define FRAME_attak229 105 -#define FRAME_attak230 106 -#define FRAME_attak231 107 -#define FRAME_attak232 108 -#define FRAME_attak233 109 -#define FRAME_attak234 110 -#define FRAME_attak235 111 -#define FRAME_attak236 112 -#define FRAME_attak237 113 -#define FRAME_attak238 114 -#define FRAME_attak301 115 -#define FRAME_attak302 116 -#define FRAME_attak303 117 -#define FRAME_attak304 118 -#define FRAME_attak305 119 -#define FRAME_attak306 120 -#define FRAME_attak307 121 -#define FRAME_attak308 122 -#define FRAME_attak309 123 -#define FRAME_attak310 124 -#define FRAME_attak311 125 -#define FRAME_attak312 126 -#define FRAME_attak313 127 -#define FRAME_attak314 128 -#define FRAME_attak315 129 -#define FRAME_attak316 130 -#define FRAME_attak317 131 -#define FRAME_attak318 132 -#define FRAME_attak319 133 -#define FRAME_attak320 134 -#define FRAME_attak321 135 -#define FRAME_attak322 136 -#define FRAME_attak323 137 -#define FRAME_attak324 138 -#define FRAME_attak325 139 -#define FRAME_attak326 140 -#define FRAME_attak327 141 -#define FRAME_attak328 142 -#define FRAME_attak329 143 -#define FRAME_attak330 144 -#define FRAME_attak331 145 -#define FRAME_attak332 146 -#define FRAME_attak333 147 -#define FRAME_attak334 148 -#define FRAME_attak335 149 -#define FRAME_attak336 150 -#define FRAME_attak337 151 -#define FRAME_attak338 152 -#define FRAME_attak339 153 -#define FRAME_attak340 154 -#define FRAME_attak341 155 -#define FRAME_attak342 156 -#define FRAME_attak343 157 -#define FRAME_attak344 158 -#define FRAME_attak345 159 -#define FRAME_attak346 160 -#define FRAME_attak347 161 -#define FRAME_attak348 162 -#define FRAME_attak349 163 -#define FRAME_attak350 164 -#define FRAME_attak351 165 -#define FRAME_attak352 166 -#define FRAME_attak353 167 -#define FRAME_attak401 168 -#define FRAME_attak402 169 -#define FRAME_attak403 170 -#define FRAME_attak404 171 -#define FRAME_attak405 172 -#define FRAME_attak406 173 -#define FRAME_attak407 174 -#define FRAME_attak408 175 -#define FRAME_attak409 176 -#define FRAME_attak410 177 -#define FRAME_attak411 178 -#define FRAME_attak412 179 -#define FRAME_attak413 180 -#define FRAME_attak414 181 -#define FRAME_attak415 182 -#define FRAME_attak416 183 -#define FRAME_attak417 184 -#define FRAME_attak418 185 -#define FRAME_attak419 186 -#define FRAME_attak420 187 -#define FRAME_attak421 188 -#define FRAME_attak422 189 -#define FRAME_attak423 190 -#define FRAME_attak424 191 -#define FRAME_attak425 192 -#define FRAME_attak426 193 -#define FRAME_attak427 194 -#define FRAME_attak428 195 -#define FRAME_attak429 196 -#define FRAME_pain101 197 -#define FRAME_pain102 198 -#define FRAME_pain103 199 -#define FRAME_pain104 200 -#define FRAME_pain201 201 -#define FRAME_pain202 202 -#define FRAME_pain203 203 -#define FRAME_pain204 204 -#define FRAME_pain205 205 -#define FRAME_pain301 206 -#define FRAME_pain302 207 -#define FRAME_pain303 208 -#define FRAME_pain304 209 -#define FRAME_pain305 210 -#define FRAME_pain306 211 -#define FRAME_pain307 212 -#define FRAME_pain308 213 -#define FRAME_pain309 214 -#define FRAME_pain310 215 -#define FRAME_pain311 216 -#define FRAME_pain312 217 -#define FRAME_pain313 218 -#define FRAME_pain314 219 -#define FRAME_pain315 220 -#define FRAME_pain316 221 -#define FRAME_death101 222 -#define FRAME_death102 223 -#define FRAME_death103 224 -#define FRAME_death104 225 -#define FRAME_death105 226 -#define FRAME_death106 227 -#define FRAME_death107 228 -#define FRAME_death108 229 -#define FRAME_death109 230 -#define FRAME_death110 231 -#define FRAME_death111 232 -#define FRAME_death112 233 -#define FRAME_death113 234 -#define FRAME_death114 235 -#define FRAME_death115 236 -#define FRAME_death116 237 -#define FRAME_death117 238 -#define FRAME_death118 239 -#define FRAME_death119 240 -#define FRAME_death120 241 -#define FRAME_death121 242 -#define FRAME_death122 243 -#define FRAME_death123 244 -#define FRAME_death124 245 -#define FRAME_death125 246 -#define FRAME_death126 247 -#define FRAME_death127 248 -#define FRAME_death128 249 -#define FRAME_death129 250 -#define FRAME_death130 251 -#define FRAME_death131 252 -#define FRAME_death132 253 -#define FRAME_recln101 254 -#define FRAME_recln102 255 -#define FRAME_recln103 256 -#define FRAME_recln104 257 -#define FRAME_recln105 258 -#define FRAME_recln106 259 -#define FRAME_recln107 260 -#define FRAME_recln108 261 -#define FRAME_recln109 262 -#define FRAME_recln110 263 -#define FRAME_recln111 264 -#define FRAME_recln112 265 -#define FRAME_recln113 266 -#define FRAME_recln114 267 -#define FRAME_recln115 268 -#define FRAME_recln116 269 -#define FRAME_recln117 270 -#define FRAME_recln118 271 -#define FRAME_recln119 272 -#define FRAME_recln120 273 -#define FRAME_recln121 274 -#define FRAME_recln122 275 -#define FRAME_recln123 276 -#define FRAME_recln124 277 -#define FRAME_recln125 278 -#define FRAME_recln126 279 -#define FRAME_recln127 280 -#define FRAME_recln128 281 -#define FRAME_recln129 282 -#define FRAME_recln130 283 -#define FRAME_recln131 284 -#define FRAME_recln132 285 -#define FRAME_recln133 286 -#define FRAME_recln134 287 -#define FRAME_recln135 288 -#define FRAME_recln136 289 -#define FRAME_recln137 290 -#define FRAME_recln138 291 -#define FRAME_recln139 292 -#define FRAME_recln140 293 - -#define MODEL_SCALE 1.000000 +#define MODEL_SCALE 1.000000