From 6aece83adb51f8ef22fae5768177cfb55f9c7f82 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Thu, 9 Nov 2023 00:56:03 +0200 Subject: [PATCH] game: restore rerelease target_actor used in biggun --- Makefile | 1 + src/game/g_spawn.c | 2 + src/game/monster/actor/actor.c | 671 +++++++++++++++++++++++++++++++++ src/game/monster/actor/actor.h | 505 +++++++++++++++++++++++++ 4 files changed, 1179 insertions(+) create mode 100644 src/game/monster/actor/actor.c create mode 100644 src/game/monster/actor/actor.h diff --git a/Makefile b/Makefile index b60c1e56..2f3e50a6 100644 --- a/Makefile +++ b/Makefile @@ -891,6 +891,7 @@ GAME_OBJS_ = \ src/game/dm/ball.o \ src/game/dm/tag.o \ src/game/menu/menu.o \ + src/game/monster/actor/actor.o \ src/game/monster/arachnid/arachnid.o \ src/game/monster/berserker/berserker.o \ src/game/monster/boss2/boss2.o \ diff --git a/src/game/g_spawn.c b/src/game/g_spawn.c index 7bf7ea90..ce855f9e 100644 --- a/src/game/g_spawn.c +++ b/src/game/g_spawn.c @@ -275,6 +275,7 @@ static spawn_t spawns[] = { {"target_crosslevel_target", SP_target_crosslevel_target}, {"target_laser", SP_target_laser}, {"target_help", SP_target_help}, + {"target_actor", SP_target_actor}, {"target_lightramp", SP_target_lightramp}, {"target_earthquake", SP_target_earthquake}, {"target_music", SP_target_music}, @@ -299,6 +300,7 @@ static spawn_t spawns[] = { {"misc_banner", SP_misc_banner}, {"misc_ctf_banner", SP_misc_ctf_banner}, {"misc_ctf_small_banner", SP_misc_ctf_small_banner}, + {"misc_actor", SP_misc_actor}, {"misc_satellite_dish", SP_misc_satellite_dish}, {"misc_gib_arm", SP_misc_gib_arm}, {"misc_gib_leg", SP_misc_gib_leg}, diff --git a/src/game/monster/actor/actor.c b/src/game/monster/actor/actor.c new file mode 100644 index 00000000..579bd031 --- /dev/null +++ b/src/game/monster/actor/actor.c @@ -0,0 +1,671 @@ +/* + * Copyright (C) 1997-2001 Id Software, Inc. + * Copyright (c) ZeniMax Media 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. + * + */ + +#include "../../header/local.h" +#include "actor.h" + +#define MAX_ACTOR_NAMES 8 +char *actor_names[MAX_ACTOR_NAMES] = +{ + "Hellrot", + "Tokay", + "Killme", + "Disruptor", + "Adrianator", + "Rambear", + "Titus", + "Bitterman" +}; + +static mframe_t actor_frames_stand [] = +{ + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL}, + {ai_stand, 0, NULL} +}; + +mmove_t actor_move_stand = { + FRAME_stand101, + FRAME_stand140, + actor_frames_stand, + NULL +}; + +void actor_stand (edict_t *self) +{ + self->monsterinfo.currentmove = &actor_move_stand; + + // randomize on startup + if (level.time < 1.0) + { + self->s.frame = self->monsterinfo.currentmove->firstframe + (rand() % (self->monsterinfo.currentmove->lastframe - self->monsterinfo.currentmove->firstframe + 1)); + } +} + + +static mframe_t actor_frames_walk [] = +{ + {ai_walk, 0, NULL}, + {ai_walk, 6, NULL}, + {ai_walk, 10, NULL}, + {ai_walk, 3, NULL}, + {ai_walk, 2, NULL}, + {ai_walk, 7, NULL}, + {ai_walk, 10, NULL}, + {ai_walk, 1, NULL}, + {ai_walk, 4, NULL}, + {ai_walk, 0, NULL}, + {ai_walk, 0, NULL} +}; +mmove_t actor_move_walk = { + FRAME_walk01, + FRAME_walk08, + actor_frames_walk, + NULL +}; + +void actor_walk (edict_t *self) +{ + self->monsterinfo.currentmove = &actor_move_walk; +} + + +static mframe_t actor_frames_run [] = +{ + {ai_run, 4, NULL}, + {ai_run, 15, NULL}, + {ai_run, 15, NULL}, + {ai_run, 8, NULL}, + {ai_run, 20, NULL}, + {ai_run, 15, NULL}, + {ai_run, 8, NULL}, + {ai_run, 17, NULL}, + {ai_run, 12, NULL}, + {ai_run, -2, NULL}, + {ai_run, -2, NULL}, + {ai_run, -1, NULL} +}; +mmove_t actor_move_run = {FRAME_run02, FRAME_run07, actor_frames_run, NULL}; + +void actor_run (edict_t *self) +{ + if ((level.time < self->pain_debounce_time) && (!self->enemy)) + { + if (self->movetarget) + { + actor_walk(self); + } + else + { + actor_stand(self); + } + return; + } + + if (self->monsterinfo.aiflags & AI_STAND_GROUND) + { + actor_stand(self); + return; + } + + self->monsterinfo.currentmove = &actor_move_run; +} + + +static mframe_t actor_frames_pain1 [] = +{ + {ai_move, -5, NULL}, + {ai_move, 4, NULL}, + {ai_move, 1, NULL} +}; +mmove_t actor_move_pain1 = { + FRAME_pain101, + FRAME_pain103, + actor_frames_pain1, + actor_run +}; + +static mframe_t actor_frames_pain2 [] = +{ + {ai_move, -4, NULL}, + {ai_move, 4, NULL}, + {ai_move, 0, NULL} +}; + +mmove_t actor_move_pain2 = { + FRAME_pain201, + FRAME_pain203, + actor_frames_pain2, + actor_run +}; + +static mframe_t actor_frames_pain3 [] = +{ + {ai_move, -1, NULL}, + {ai_move, 1, NULL}, + {ai_move, 0, NULL} +}; +mmove_t actor_move_pain3 = { + FRAME_pain301, + FRAME_pain303, + actor_frames_pain3, + actor_run +}; + +static mframe_t actor_frames_flipoff [] = +{ + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL} +}; +mmove_t actor_move_flipoff = { + FRAME_flip01, + FRAME_flip14, + actor_frames_flipoff, + actor_run +}; + +static mframe_t actor_frames_taunt [] = +{ + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL}, + {ai_turn, 0, NULL} +}; +mmove_t actor_move_taunt = { + FRAME_taunt01, + FRAME_taunt17, + actor_frames_taunt, + actor_run +}; + +char *messages[] = +{ + "Watch it", + "#$@*&", + "Idiot", + "Check your targets" +}; + +void actor_pain (edict_t *self, edict_t *other, float kick, int damage) +{ + int n; + + 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; +// gi.sound (self, CHAN_VOICE, actor.sound_pain, 1, ATTN_NORM, 0); + + if ((other->client) && (random() < 0.4)) + { + vec3_t v; + char *name; + + VectorSubtract (other->s.origin, self->s.origin, v); + self->ideal_yaw = vectoyaw (v); + if (random() < 0.5) + self->monsterinfo.currentmove = &actor_move_flipoff; + else + self->monsterinfo.currentmove = &actor_move_taunt; + name = actor_names[(self - g_edicts)%MAX_ACTOR_NAMES]; + gi.cprintf (other, PRINT_CHAT, "%s: %s!\n", name, messages[rand()%3]); + return; + } + + n = rand() % 3; + if (n == 0) + self->monsterinfo.currentmove = &actor_move_pain1; + else if (n == 1) + self->monsterinfo.currentmove = &actor_move_pain2; + else + self->monsterinfo.currentmove = &actor_move_pain3; +} + + +void actorMachineGun (edict_t *self) +{ + vec3_t start, target; + vec3_t forward, right; + + AngleVectors (self->s.angles, forward, right, NULL); + G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_ACTOR_MACHINEGUN_1], forward, right, start); + if (self->enemy) + { + if (self->enemy->health > 0) + { + VectorMA (self->enemy->s.origin, -0.2, self->enemy->velocity, target); + target[2] += self->enemy->viewheight; + } + else + { + VectorCopy (self->enemy->absmin, target); + target[2] += (self->enemy->size[2] / 2); + } + VectorSubtract (target, start, forward); + VectorNormalize (forward); + } + else + { + AngleVectors (self->s.angles, forward, NULL, NULL); + } + monster_fire_bullet (self, start, forward, 3, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, MZ2_ACTOR_MACHINEGUN_1); +} + + +void actor_dead (edict_t *self) +{ + VectorSet (self->mins, -16, -16, -24); + VectorSet (self->maxs, 16, 16, -8); + self->movetype = MOVETYPE_TOSS; + self->svflags |= SVF_DEADMONSTER; + self->nextthink = 0; + gi.linkentity (self); +} + +static mframe_t actor_frames_death1 [] = +{ + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, -13, NULL}, + {ai_move, 14, NULL}, + {ai_move, 3, NULL}, + {ai_move, -2, NULL}, + {ai_move, 1, NULL} +}; +mmove_t actor_move_death1 = { + FRAME_death101, + FRAME_death107, + actor_frames_death1, + actor_dead +}; + +static mframe_t actor_frames_death2 [] = +{ + {ai_move, 0, NULL}, + {ai_move, 7, NULL}, + {ai_move, -6, NULL}, + {ai_move, -5, NULL}, + {ai_move, 1, NULL}, + {ai_move, 0, NULL}, + {ai_move, -1, NULL}, + {ai_move, -2, NULL}, + {ai_move, -1, NULL}, + {ai_move, -9, NULL}, + {ai_move, -13, NULL}, + {ai_move, -13, NULL}, + {ai_move, 0, NULL} +}; +mmove_t actor_move_death2 = { + FRAME_death201, + FRAME_death213, + actor_frames_death2, + actor_dead +}; + +void actor_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + int n; + +// check for gib + if (self->health <= -80) + { +// gi.sound (self, CHAN_VOICE, actor.sound_gib, 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; + +// regular death +// gi.sound (self, CHAN_VOICE, actor.sound_die, 1, ATTN_NORM, 0); + self->deadflag = DEAD_DEAD; + self->takedamage = DAMAGE_YES; + + n = rand() % 2; + if (n == 0) + self->monsterinfo.currentmove = &actor_move_death1; + else + self->monsterinfo.currentmove = &actor_move_death2; +} + + +void actor_fire (edict_t *self) +{ + actorMachineGun (self); + + if (level.time >= self->monsterinfo.pausetime) + self->monsterinfo.aiflags &= ~AI_HOLD_FRAME; + else + self->monsterinfo.aiflags |= AI_HOLD_FRAME; +} + +static mframe_t actor_frames_attack [] = +{ + {ai_charge, -2, actor_fire}, + {ai_charge, -2, NULL}, + {ai_charge, 3, NULL}, + {ai_charge, 2, NULL} +}; + +mmove_t actor_move_attack = { + FRAME_attak01, + FRAME_attak04, + actor_frames_attack, + actor_run +}; + +void actor_attack(edict_t *self) +{ + int n; + + self->monsterinfo.currentmove = &actor_move_attack; + n = (rand() & 15) + 3 + 7; + self->monsterinfo.pausetime = level.time + n * FRAMETIME; +} + + +void actor_use (edict_t *self, edict_t *other, edict_t *activator) +{ + vec3_t v; + + self->goalentity = self->movetarget = G_PickTarget(self->target); + if ((!self->movetarget) || (strcmp(self->movetarget->classname, "target_actor") != 0)) + { + gi.dprintf ("%s has bad target %s at %s\n", self->classname, self->target, vtos(self->s.origin)); + self->target = NULL; + self->monsterinfo.pausetime = 100000000; + self->monsterinfo.stand (self); + return; + } + + VectorSubtract (self->goalentity->s.origin, self->s.origin, v); + self->ideal_yaw = self->s.angles[YAW] = vectoyaw(v); + self->monsterinfo.walk (self); + self->target = NULL; +} + + +/*QUAKED misc_actor (1 .5 0) (-16 -16 -24) (16 16 32) +*/ + +void SP_misc_actor (edict_t *self) +{ + if (deathmatch->value) + { + G_FreeEdict (self); + return; + } + + if (!self->targetname) + { + gi.dprintf("untargeted %s at %s\n", self->classname, vtos(self->s.origin)); + G_FreeEdict (self); + return; + } + + if (!self->target) + { + gi.dprintf("%s with no target at %s\n", self->classname, vtos(self->s.origin)); + G_FreeEdict (self); + return; + } + + self->movetype = MOVETYPE_STEP; + self->solid = SOLID_BBOX; + self->s.modelindex = gi.modelindex("players/male/tris.md2"); + VectorSet (self->mins, -16, -16, -24); + VectorSet (self->maxs, 16, 16, 32); + + if (!self->health) + self->health = 100; + self->mass = 200; + + self->pain = actor_pain; + self->die = actor_die; + + self->monsterinfo.stand = actor_stand; + self->monsterinfo.walk = actor_walk; + self->monsterinfo.run = actor_run; + self->monsterinfo.attack = actor_attack; + self->monsterinfo.melee = NULL; + self->monsterinfo.sight = NULL; + + self->monsterinfo.aiflags |= AI_GOOD_GUY; + + gi.linkentity (self); + + self->monsterinfo.currentmove = &actor_move_stand; + self->monsterinfo.scale = MODEL_SCALE; + + walkmonster_start (self); + + // actors always start in a dormant state, they *must* be used to get going + self->use = actor_use; +} + + +/*QUAKED target_actor (.5 .3 0) (-8 -8 -8) (8 8 8) JUMP SHOOT ATTACK x HOLD BRUTAL +JUMP jump in set direction upon reaching this target +SHOOT take a single shot at the pathtarget +ATTACK attack pathtarget until it or actor is dead + +"target" next target_actor +"pathtarget" target of any action to be taken at this point +"wait" amount of time actor should pause at this point +"message" actor will "say" this to the player + +for JUMP only: +"speed" speed thrown forward (default 200) +"height" speed thrown upwards (default 200) +*/ + +void target_actor_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf) +{ + vec3_t v; + + if (other->movetarget != self) + return; + + if (other->enemy) + return; + + other->goalentity = other->movetarget = NULL; + + if (self->message) + { + int n; + edict_t *ent; + + for (n = 1; n <= game.maxclients; n++) + { + ent = &g_edicts[n]; + if (!ent->inuse) + continue; + gi.cprintf (ent, PRINT_CHAT, "%s: %s\n", actor_names[(other - g_edicts)%MAX_ACTOR_NAMES], self->message); + } + } + + if (self->spawnflags & 1) //jump + { + other->velocity[0] = self->movedir[0] * self->speed; + other->velocity[1] = self->movedir[1] * self->speed; + + if (other->groundentity) + { + other->groundentity = NULL; + other->velocity[2] = self->movedir[2]; + gi.sound(other, CHAN_VOICE, gi.soundindex("player/male/jump1.wav"), 1, ATTN_NORM, 0); + } + } + + if (self->spawnflags & 2) //shoot + { + } + else if (self->spawnflags & 4) //attack + { + other->enemy = G_PickTarget(self->pathtarget); + if (other->enemy) + { + other->goalentity = other->enemy; + if (self->spawnflags & 32) + other->monsterinfo.aiflags |= AI_BRUTAL; + if (self->spawnflags & 16) + { + other->monsterinfo.aiflags |= AI_STAND_GROUND; + actor_stand (other); + } + else + { + actor_run (other); + } + } + } + + if (!(self->spawnflags & 6) && (self->pathtarget)) + { + char *savetarget; + + savetarget = self->target; + self->target = self->pathtarget; + G_UseTargets (self, other); + self->target = savetarget; + } + + other->movetarget = G_PickTarget(self->target); + + if (!other->goalentity) + other->goalentity = other->movetarget; + + if (!other->movetarget && !other->enemy) + { + other->monsterinfo.pausetime = level.time + 100000000; + other->monsterinfo.stand (other); + } + else if (other->movetarget == other->goalentity) + { + VectorSubtract (other->movetarget->s.origin, other->s.origin, v); + other->ideal_yaw = vectoyaw (v); + } +} + +void SP_target_actor (edict_t *self) +{ + if (!self->targetname) + { + gi.dprintf ("%s with no targetname at %s\n", + self->classname, vtos(self->s.origin)); + } + + self->solid = SOLID_TRIGGER; + self->touch = target_actor_touch; + VectorSet (self->mins, -8, -8, -8); + VectorSet (self->maxs, 8, 8, 8); + self->svflags = SVF_NOCLIENT; + + if (self->spawnflags & 1) + { + if (!self->speed) + self->speed = 200; + if (!st.height) + st.height = 200; + if (self->s.angles[YAW] == 0) + self->s.angles[YAW] = 360; + G_SetMovedir (self->s.angles, self->movedir); + self->movedir[2] = st.height; + } + + gi.linkentity (self); +} diff --git a/src/game/monster/actor/actor.h b/src/game/monster/actor/actor.h new file mode 100644 index 00000000..2703ae06 --- /dev/null +++ b/src/game/monster/actor/actor.h @@ -0,0 +1,505 @@ +/* + * Copyright (C) 1997-2001 Id Software, Inc. + * Copyright (c) ZeniMax Media 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. + * + */ + +#define FRAME_attak01 0 +#define FRAME_attak02 1 +#define FRAME_attak03 2 +#define FRAME_attak04 3 +#define FRAME_death101 4 +#define FRAME_death102 5 +#define FRAME_death103 6 +#define FRAME_death104 7 +#define FRAME_death105 8 +#define FRAME_death106 9 +#define FRAME_death107 10 +#define FRAME_death201 11 +#define FRAME_death202 12 +#define FRAME_death203 13 +#define FRAME_death204 14 +#define FRAME_death205 15 +#define FRAME_death206 16 +#define FRAME_death207 17 +#define FRAME_death208 18 +#define FRAME_death209 19 +#define FRAME_death210 20 +#define FRAME_death211 21 +#define FRAME_death212 22 +#define FRAME_death213 23 +#define FRAME_death301 24 +#define FRAME_death302 25 +#define FRAME_death303 26 +#define FRAME_death304 27 +#define FRAME_death305 28 +#define FRAME_death306 29 +#define FRAME_death307 30 +#define FRAME_death308 31 +#define FRAME_death309 32 +#define FRAME_death310 33 +#define FRAME_death311 34 +#define FRAME_death312 35 +#define FRAME_death313 36 +#define FRAME_death314 37 +#define FRAME_death315 38 +#define FRAME_flip01 39 +#define FRAME_flip02 40 +#define FRAME_flip03 41 +#define FRAME_flip04 42 +#define FRAME_flip05 43 +#define FRAME_flip06 44 +#define FRAME_flip07 45 +#define FRAME_flip08 46 +#define FRAME_flip09 47 +#define FRAME_flip10 48 +#define FRAME_flip11 49 +#define FRAME_flip12 50 +#define FRAME_flip13 51 +#define FRAME_flip14 52 +#define FRAME_grenad01 53 +#define FRAME_grenad02 54 +#define FRAME_grenad03 55 +#define FRAME_grenad04 56 +#define FRAME_grenad05 57 +#define FRAME_grenad06 58 +#define FRAME_grenad07 59 +#define FRAME_grenad08 60 +#define FRAME_grenad09 61 +#define FRAME_grenad10 62 +#define FRAME_grenad11 63 +#define FRAME_grenad12 64 +#define FRAME_grenad13 65 +#define FRAME_grenad14 66 +#define FRAME_grenad15 67 +#define FRAME_jump01 68 +#define FRAME_jump02 69 +#define FRAME_jump03 70 +#define FRAME_jump04 71 +#define FRAME_jump05 72 +#define FRAME_jump06 73 +#define FRAME_pain101 74 +#define FRAME_pain102 75 +#define FRAME_pain103 76 +#define FRAME_pain201 77 +#define FRAME_pain202 78 +#define FRAME_pain203 79 +#define FRAME_pain301 80 +#define FRAME_pain302 81 +#define FRAME_pain303 82 +#define FRAME_push01 83 +#define FRAME_push02 84 +#define FRAME_push03 85 +#define FRAME_push04 86 +#define FRAME_push05 87 +#define FRAME_push06 88 +#define FRAME_push07 89 +#define FRAME_push08 90 +#define FRAME_push09 91 +#define FRAME_run01 92 +#define FRAME_run02 93 +#define FRAME_run03 94 +#define FRAME_run04 95 +#define FRAME_run05 96 +#define FRAME_run06 97 +#define FRAME_run07 98 +#define FRAME_run08 99 +#define FRAME_run09 100 +#define FRAME_run10 101 +#define FRAME_run11 102 +#define FRAME_run12 103 +#define FRAME_runs01 104 +#define FRAME_runs02 105 +#define FRAME_runs03 106 +#define FRAME_runs04 107 +#define FRAME_runs05 108 +#define FRAME_runs06 109 +#define FRAME_runs07 110 +#define FRAME_runs08 111 +#define FRAME_runs09 112 +#define FRAME_runs10 113 +#define FRAME_runs11 114 +#define FRAME_runs12 115 +#define FRAME_salute01 116 +#define FRAME_salute02 117 +#define FRAME_salute03 118 +#define FRAME_salute04 119 +#define FRAME_salute05 120 +#define FRAME_salute06 121 +#define FRAME_salute07 122 +#define FRAME_salute08 123 +#define FRAME_salute09 124 +#define FRAME_salute10 125 +#define FRAME_salute11 126 +#define FRAME_salute12 127 +#define FRAME_stand101 128 +#define FRAME_stand102 129 +#define FRAME_stand103 130 +#define FRAME_stand104 131 +#define FRAME_stand105 132 +#define FRAME_stand106 133 +#define FRAME_stand107 134 +#define FRAME_stand108 135 +#define FRAME_stand109 136 +#define FRAME_stand110 137 +#define FRAME_stand111 138 +#define FRAME_stand112 139 +#define FRAME_stand113 140 +#define FRAME_stand114 141 +#define FRAME_stand115 142 +#define FRAME_stand116 143 +#define FRAME_stand117 144 +#define FRAME_stand118 145 +#define FRAME_stand119 146 +#define FRAME_stand120 147 +#define FRAME_stand121 148 +#define FRAME_stand122 149 +#define FRAME_stand123 150 +#define FRAME_stand124 151 +#define FRAME_stand125 152 +#define FRAME_stand126 153 +#define FRAME_stand127 154 +#define FRAME_stand128 155 +#define FRAME_stand129 156 +#define FRAME_stand130 157 +#define FRAME_stand131 158 +#define FRAME_stand132 159 +#define FRAME_stand133 160 +#define FRAME_stand134 161 +#define FRAME_stand135 162 +#define FRAME_stand136 163 +#define FRAME_stand137 164 +#define FRAME_stand138 165 +#define FRAME_stand139 166 +#define FRAME_stand140 167 +#define FRAME_stand201 168 +#define FRAME_stand202 169 +#define FRAME_stand203 170 +#define FRAME_stand204 171 +#define FRAME_stand205 172 +#define FRAME_stand206 173 +#define FRAME_stand207 174 +#define FRAME_stand208 175 +#define FRAME_stand209 176 +#define FRAME_stand210 177 +#define FRAME_stand211 178 +#define FRAME_stand212 179 +#define FRAME_stand213 180 +#define FRAME_stand214 181 +#define FRAME_stand215 182 +#define FRAME_stand216 183 +#define FRAME_stand217 184 +#define FRAME_stand218 185 +#define FRAME_stand219 186 +#define FRAME_stand220 187 +#define FRAME_stand221 188 +#define FRAME_stand222 189 +#define FRAME_stand223 190 +#define FRAME_swim01 191 +#define FRAME_swim02 192 +#define FRAME_swim03 193 +#define FRAME_swim04 194 +#define FRAME_swim05 195 +#define FRAME_swim06 196 +#define FRAME_swim07 197 +#define FRAME_swim08 198 +#define FRAME_swim09 199 +#define FRAME_swim10 200 +#define FRAME_swim11 201 +#define FRAME_swim12 202 +#define FRAME_sw_atk01 203 +#define FRAME_sw_atk02 204 +#define FRAME_sw_atk03 205 +#define FRAME_sw_atk04 206 +#define FRAME_sw_atk05 207 +#define FRAME_sw_atk06 208 +#define FRAME_sw_pan01 209 +#define FRAME_sw_pan02 210 +#define FRAME_sw_pan03 211 +#define FRAME_sw_pan04 212 +#define FRAME_sw_pan05 213 +#define FRAME_sw_std01 214 +#define FRAME_sw_std02 215 +#define FRAME_sw_std03 216 +#define FRAME_sw_std04 217 +#define FRAME_sw_std05 218 +#define FRAME_sw_std06 219 +#define FRAME_sw_std07 220 +#define FRAME_sw_std08 221 +#define FRAME_sw_std09 222 +#define FRAME_sw_std10 223 +#define FRAME_sw_std11 224 +#define FRAME_sw_std12 225 +#define FRAME_sw_std13 226 +#define FRAME_sw_std14 227 +#define FRAME_sw_std15 228 +#define FRAME_sw_std16 229 +#define FRAME_sw_std17 230 +#define FRAME_sw_std18 231 +#define FRAME_sw_std19 232 +#define FRAME_sw_std20 233 +#define FRAME_taunt01 234 +#define FRAME_taunt02 235 +#define FRAME_taunt03 236 +#define FRAME_taunt04 237 +#define FRAME_taunt05 238 +#define FRAME_taunt06 239 +#define FRAME_taunt07 240 +#define FRAME_taunt08 241 +#define FRAME_taunt09 242 +#define FRAME_taunt10 243 +#define FRAME_taunt11 244 +#define FRAME_taunt12 245 +#define FRAME_taunt13 246 +#define FRAME_taunt14 247 +#define FRAME_taunt15 248 +#define FRAME_taunt16 249 +#define FRAME_taunt17 250 +#define FRAME_walk01 251 +#define FRAME_walk02 252 +#define FRAME_walk03 253 +#define FRAME_walk04 254 +#define FRAME_walk05 255 +#define FRAME_walk06 256 +#define FRAME_walk07 257 +#define FRAME_walk08 258 +#define FRAME_walk09 259 +#define FRAME_walk10 260 +#define FRAME_walk11 261 +#define FRAME_wave01 262 +#define FRAME_wave02 263 +#define FRAME_wave03 264 +#define FRAME_wave04 265 +#define FRAME_wave05 266 +#define FRAME_wave06 267 +#define FRAME_wave07 268 +#define FRAME_wave08 269 +#define FRAME_wave09 270 +#define FRAME_wave10 271 +#define FRAME_wave11 272 +#define FRAME_wave12 273 +#define FRAME_wave13 274 +#define FRAME_wave14 275 +#define FRAME_wave15 276 +#define FRAME_wave16 277 +#define FRAME_wave17 278 +#define FRAME_wave18 279 +#define FRAME_wave19 280 +#define FRAME_wave20 281 +#define FRAME_wave21 282 +#define FRAME_bl_atk01 283 +#define FRAME_bl_atk02 284 +#define FRAME_bl_atk03 285 +#define FRAME_bl_atk04 286 +#define FRAME_bl_atk05 287 +#define FRAME_bl_atk06 288 +#define FRAME_bl_flp01 289 +#define FRAME_bl_flp02 290 +#define FRAME_bl_flp13 291 +#define FRAME_bl_flp14 292 +#define FRAME_bl_flp15 293 +#define FRAME_bl_jmp01 294 +#define FRAME_bl_jmp02 295 +#define FRAME_bl_jmp03 296 +#define FRAME_bl_jmp04 297 +#define FRAME_bl_jmp05 298 +#define FRAME_bl_jmp06 299 +#define FRAME_bl_pn101 300 +#define FRAME_bl_pn102 301 +#define FRAME_bl_pn103 302 +#define FRAME_bl_pn201 303 +#define FRAME_bl_pn202 304 +#define FRAME_bl_pn203 305 +#define FRAME_bl_pn301 306 +#define FRAME_bl_pn302 307 +#define FRAME_bl_pn303 308 +#define FRAME_bl_psh08 309 +#define FRAME_bl_psh09 310 +#define FRAME_bl_run01 311 +#define FRAME_bl_run02 312 +#define FRAME_bl_run03 313 +#define FRAME_bl_run04 314 +#define FRAME_bl_run05 315 +#define FRAME_bl_run06 316 +#define FRAME_bl_run07 317 +#define FRAME_bl_run08 318 +#define FRAME_bl_run09 319 +#define FRAME_bl_run10 320 +#define FRAME_bl_run11 321 +#define FRAME_bl_run12 322 +#define FRAME_bl_rns03 323 +#define FRAME_bl_rns04 324 +#define FRAME_bl_rns05 325 +#define FRAME_bl_rns06 326 +#define FRAME_bl_rns07 327 +#define FRAME_bl_rns08 328 +#define FRAME_bl_rns09 329 +#define FRAME_bl_sal10 330 +#define FRAME_bl_sal11 331 +#define FRAME_bl_sal12 332 +#define FRAME_bl_std01 333 +#define FRAME_bl_std02 334 +#define FRAME_bl_std03 335 +#define FRAME_bl_std04 336 +#define FRAME_bl_std05 337 +#define FRAME_bl_std06 338 +#define FRAME_bl_std07 339 +#define FRAME_bl_std08 340 +#define FRAME_bl_std09 341 +#define FRAME_bl_std10 342 +#define FRAME_bl_std11 343 +#define FRAME_bl_std12 344 +#define FRAME_bl_std13 345 +#define FRAME_bl_std14 346 +#define FRAME_bl_std15 347 +#define FRAME_bl_std16 348 +#define FRAME_bl_std17 349 +#define FRAME_bl_std18 350 +#define FRAME_bl_std19 351 +#define FRAME_bl_std20 352 +#define FRAME_bl_std21 353 +#define FRAME_bl_std22 354 +#define FRAME_bl_std23 355 +#define FRAME_bl_std24 356 +#define FRAME_bl_std25 357 +#define FRAME_bl_std26 358 +#define FRAME_bl_std27 359 +#define FRAME_bl_std28 360 +#define FRAME_bl_std29 361 +#define FRAME_bl_std30 362 +#define FRAME_bl_std31 363 +#define FRAME_bl_std32 364 +#define FRAME_bl_std33 365 +#define FRAME_bl_std34 366 +#define FRAME_bl_std35 367 +#define FRAME_bl_std36 368 +#define FRAME_bl_std37 369 +#define FRAME_bl_std38 370 +#define FRAME_bl_std39 371 +#define FRAME_bl_std40 372 +#define FRAME_bl_swm01 373 +#define FRAME_bl_swm02 374 +#define FRAME_bl_swm03 375 +#define FRAME_bl_swm04 376 +#define FRAME_bl_swm05 377 +#define FRAME_bl_swm06 378 +#define FRAME_bl_swm07 379 +#define FRAME_bl_swm08 380 +#define FRAME_bl_swm09 381 +#define FRAME_bl_swm10 382 +#define FRAME_bl_swm11 383 +#define FRAME_bl_swm12 384 +#define FRAME_bl_swk01 385 +#define FRAME_bl_swk02 386 +#define FRAME_bl_swk03 387 +#define FRAME_bl_swk04 388 +#define FRAME_bl_swk05 389 +#define FRAME_bl_swk06 390 +#define FRAME_bl_swp01 391 +#define FRAME_bl_swp02 392 +#define FRAME_bl_swp03 393 +#define FRAME_bl_swp04 394 +#define FRAME_bl_swp05 395 +#define FRAME_bl_sws01 396 +#define FRAME_bl_sws02 397 +#define FRAME_bl_sws03 398 +#define FRAME_bl_sws04 399 +#define FRAME_bl_sws05 400 +#define FRAME_bl_sws06 401 +#define FRAME_bl_sws07 402 +#define FRAME_bl_sws08 403 +#define FRAME_bl_sws09 404 +#define FRAME_bl_sws10 405 +#define FRAME_bl_sws11 406 +#define FRAME_bl_sws12 407 +#define FRAME_bl_sws13 408 +#define FRAME_bl_sws14 409 +#define FRAME_bl_tau14 410 +#define FRAME_bl_tau15 411 +#define FRAME_bl_tau16 412 +#define FRAME_bl_tau17 413 +#define FRAME_bl_wlk01 414 +#define FRAME_bl_wlk02 415 +#define FRAME_bl_wlk03 416 +#define FRAME_bl_wlk04 417 +#define FRAME_bl_wlk05 418 +#define FRAME_bl_wlk06 419 +#define FRAME_bl_wlk07 420 +#define FRAME_bl_wlk08 421 +#define FRAME_bl_wlk09 422 +#define FRAME_bl_wlk10 423 +#define FRAME_bl_wlk11 424 +#define FRAME_bl_wav19 425 +#define FRAME_bl_wav20 426 +#define FRAME_bl_wav21 427 +#define FRAME_cr_atk01 428 +#define FRAME_cr_atk02 429 +#define FRAME_cr_atk03 430 +#define FRAME_cr_atk04 431 +#define FRAME_cr_atk05 432 +#define FRAME_cr_atk06 433 +#define FRAME_cr_atk07 434 +#define FRAME_cr_atk08 435 +#define FRAME_cr_pan01 436 +#define FRAME_cr_pan02 437 +#define FRAME_cr_pan03 438 +#define FRAME_cr_pan04 439 +#define FRAME_cr_std01 440 +#define FRAME_cr_std02 441 +#define FRAME_cr_std03 442 +#define FRAME_cr_std04 443 +#define FRAME_cr_std05 444 +#define FRAME_cr_std06 445 +#define FRAME_cr_std07 446 +#define FRAME_cr_std08 447 +#define FRAME_cr_wlk01 448 +#define FRAME_cr_wlk02 449 +#define FRAME_cr_wlk03 450 +#define FRAME_cr_wlk04 451 +#define FRAME_cr_wlk05 452 +#define FRAME_cr_wlk06 453 +#define FRAME_cr_wlk07 454 +#define FRAME_crbl_a01 455 +#define FRAME_crbl_a02 456 +#define FRAME_crbl_a03 457 +#define FRAME_crbl_a04 458 +#define FRAME_crbl_a05 459 +#define FRAME_crbl_a06 460 +#define FRAME_crbl_a07 461 +#define FRAME_crbl_p01 462 +#define FRAME_crbl_p02 463 +#define FRAME_crbl_p03 464 +#define FRAME_crbl_p04 465 +#define FRAME_crbl_s01 466 +#define FRAME_crbl_s02 467 +#define FRAME_crbl_s03 468 +#define FRAME_crbl_s04 469 +#define FRAME_crbl_s05 470 +#define FRAME_crbl_s06 471 +#define FRAME_crbl_s07 472 +#define FRAME_crbl_s08 473 +#define FRAME_crbl_w01 474 +#define FRAME_crbl_w02 475 +#define FRAME_crbl_w03 476 +#define FRAME_crbl_w04 477 +#define FRAME_crbl_w05 478 +#define FRAME_crbl_w06 479 +#define FRAME_crbl_w07 480 + +#define MODEL_SCALE 1.000000