diff --git a/Makefile b/Makefile index e64d9275..b60c1e56 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/arachnid/arachnid.o \ src/game/monster/berserker/berserker.o \ src/game/monster/boss2/boss2.o \ src/game/monster/boss3/boss3.o \ diff --git a/src/game/g_spawn.c b/src/game/g_spawn.c index 7709c155..7bf7ea90 100644 --- a/src/game/g_spawn.c +++ b/src/game/g_spawn.c @@ -130,6 +130,7 @@ void SP_misc_eastertank(edict_t *self); void SP_misc_easterchick(edict_t *self); void SP_misc_easterchick2(edict_t *self); +void SP_monster_arachnid(edict_t *self); void SP_monster_berserk(edict_t *self); void SP_monster_gladiator(edict_t *self); void SP_monster_gunner(edict_t *self); @@ -320,6 +321,7 @@ static spawn_t spawns[] = { {"misc_transport", SP_misc_transport}, {"misc_nuke", SP_misc_nuke}, + {"monster_arachnid", SP_monster_arachnid}, {"monster_berserk", SP_monster_berserk}, {"monster_gladiator", SP_monster_gladiator}, {"monster_gunner", SP_monster_gunner}, diff --git a/src/game/monster/arachnid/arachnid.c b/src/game/monster/arachnid/arachnid.c new file mode 100644 index 00000000..46ad3b5a --- /dev/null +++ b/src/game/monster/arachnid/arachnid.c @@ -0,0 +1,580 @@ +/* + * 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. + * + * ======================================================================= + * + * The arachnid. + * + * ======================================================================= + */ + +#include "../../header/local.h" +#include "arachnid.h" + +static int sound_pain; +static int sound_die; +static int sound_step; +static int sound_sight; +static int sound_charge; + +void +arachnid_sight(edict_t *self, edict_t *other /* unused */) +{ + if (!self) + { + return; + } + + gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0); +} + +void +arachnid_footstep(edict_t *self) +{ + if (!self) + { + return; + } + + gi.sound(self, CHAN_BODY, sound_step, 0.5f, ATTN_IDLE, 0.0f); +} + +// +// stand +// + +static mframe_t arachnid_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} +}; + +mmove_t arachnid_move_stand = +{ + FRAME_idle1, + FRAME_idle13, + arachnid_frames_stand, + NULL +}; + +void +arachnid_stand(edict_t *self) +{ + if (!self) + { + return; + } + + self->monsterinfo.currentmove = &arachnid_move_stand; +} + +// +// walk +// + +static mframe_t arachnid_frames_walk[] = +{ + {ai_walk, 8, arachnid_footstep}, + {ai_walk, 8, NULL}, + {ai_walk, 8, NULL}, + {ai_walk, 8, NULL}, + {ai_walk, 8, NULL}, + {ai_walk, 8, arachnid_footstep}, + {ai_walk, 8, NULL}, + {ai_walk, 8, NULL}, + {ai_walk, 8, NULL}, + {ai_walk, 8, NULL} +}; + +mmove_t arachnid_move_walk = +{ + FRAME_walk1, + FRAME_walk10, + arachnid_frames_walk, + NULL +}; + +void +arachnid_walk(edict_t *self) +{ + if (!self) + { + return; + } + + self->monsterinfo.currentmove = &arachnid_move_walk; +} + +// +// run +// + +static mframe_t arachnid_frames_run[] = +{ + {ai_run, 8, arachnid_footstep}, + {ai_run, 8, NULL}, + {ai_run, 8, NULL}, + {ai_run, 8, NULL}, + {ai_run, 8, NULL}, + {ai_run, 8, arachnid_footstep}, + {ai_run, 8, NULL}, + {ai_run, 8, NULL}, + {ai_run, 8, NULL}, + {ai_run, 8, NULL} +}; + +mmove_t arachnid_move_run = +{ + FRAME_walk1, + FRAME_walk10, + arachnid_frames_run, + NULL +}; + +void +arachnid_run(edict_t *self) +{ + if (self->monsterinfo.aiflags & AI_STAND_GROUND) + { + self->monsterinfo.currentmove = &arachnid_move_stand; + return; + } + + self->monsterinfo.currentmove = &arachnid_move_run; +} + +// +// pain +// + +static mframe_t arachnid_frames_pain1[] = { + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL} +}; + +mmove_t arachnid_move_pain1 = +{ + FRAME_pain11, + FRAME_pain15, + arachnid_frames_pain1, + arachnid_run +}; + +static mframe_t arachnid_frames_pain2[] = +{ + {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 arachnid_move_pain2 = +{ + FRAME_pain21, + FRAME_pain26, + arachnid_frames_pain2, + arachnid_run +}; + +void +arachnid_pain(edict_t *self, edict_t *other /* other */, + float kick /* other */, int damage) +{ + if (!self) + { + return; + } + + if (level.time < self->pain_debounce_time) + { + return; + } + + self->pain_debounce_time = level.time + 3; + gi.sound(self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0); + + if (skill->value == SKILL_HARDPLUS) + { + return; /* no pain anims in nightmare */ + } + + if ((rand() % 2) > 0) + { + self->monsterinfo.currentmove = &arachnid_move_pain1; + } + else + { + self->monsterinfo.currentmove = &arachnid_move_pain2; + } +} + +void +arachnid_charge_rail(edict_t *self) +{ + if (!self->enemy || !self->enemy->inuse) + { + return; + } + + gi.sound(self, CHAN_WEAPON, sound_charge, 1.f, ATTN_NORM, 0.f); + + VectorCopy(self->enemy->s.origin, self->pos1); /* save for aiming the shot */ + self->pos1[2] += self->enemy->viewheight; +} + +void +arachnid_rail(edict_t *self) +{ + vec3_t start, dir, forward, right, offset = {0, 0, 0}; + int id = 0; + + switch (self->s.frame) + { + case FRAME_rails4: + default: + id = MZ2_WIDOW_RAIL; + /* MZ2_ARACHNID_RAIL1 */ + offset[0] = 58.f; + offset[1] = 20.f; + offset[2] = 17.2f; + break; + case FRAME_rails8: + id = MZ2_WIDOW_RAIL_LEFT; + /* MZ2_ARACHNID_RAIL2 */ + offset[0] = 64.f; + offset[1] = -22.f; + offset[2] = 24.f; + break; + case FRAME_rails_up7: + id = MZ2_WIDOW_RAIL_RIGHT; + /* MZ2_ARACHNID_RAIL_UP1 */ + offset[0] = 37.f; + offset[1] = 13.f; + offset[2] = 72.f; + break; + case FRAME_rails_up11: + id = MZ2_WIDOW_RAIL; + /* MZ2_ARACHNID_RAIL_UP2 */ + offset[0] = 58.f; + offset[1] = -25.f; + offset[2] = 72.f; + break; + } + + AngleVectors(self->s.angles, forward, right, NULL); + G_ProjectSource(self->s.origin, offset, forward, right, start); + + /* calc direction to where we targeted */ + VectorSubtract(self->pos1, start, dir); + VectorNormalize(dir); + + monster_fire_railgun(self, start, dir, 35, 100, id); + self->timestamp = level.time + 3; +} + +static mframe_t arachnid_frames_attack1[] = +{ + {ai_charge, 0, arachnid_charge_rail}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, arachnid_rail}, + {ai_charge, 0, arachnid_charge_rail}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, arachnid_rail}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL} +}; + +mmove_t arachnid_attack1 = +{ + FRAME_rails1, + FRAME_rails11, + arachnid_frames_attack1, + arachnid_run +}; + +static mframe_t arachnid_frames_attack_up1[] = { + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, arachnid_charge_rail}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, arachnid_rail}, + {ai_charge, 0, arachnid_charge_rail}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, arachnid_rail}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, +}; + +mmove_t arachnid_attack_up1 = +{ + FRAME_rails_up1, + FRAME_rails_up16, + arachnid_frames_attack_up1, + arachnid_run +}; + +static int sound_melee, sound_melee_hit; + +void arachnid_melee_charge(edict_t *self) +{ + gi.sound(self, CHAN_WEAPON, sound_melee, 1.f, ATTN_NORM, 0.f); +} + +void arachnid_melee_hit(edict_t *self) +{ + static vec3_t aim = {MELEE_DISTANCE, 0, 0}; + + if (!self) + { + return; + } + + fire_hit(self, aim, 15, 50); +} + +static mframe_t arachnid_frames_melee[] = { + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, arachnid_melee_charge}, + {ai_charge, 0, NULL}, + {ai_charge, 0, arachnid_melee_hit}, + {ai_charge, 0, NULL}, + {ai_charge, 0, NULL}, + {ai_charge, 0, arachnid_melee_charge}, + {ai_charge, 0, NULL}, + {ai_charge, 0, arachnid_melee_hit}, + {ai_charge, 0, NULL} +}; + +mmove_t arachnid_melee = +{ + FRAME_melee_atk1, + FRAME_melee_atk12, + arachnid_frames_melee, + arachnid_run +}; + +void +arachnid_attack(edict_t *self) +{ + float real_enemy_range; + + if (!self || !self->enemy || !self->enemy->inuse) + { + return; + } + + real_enemy_range = realrange(self, self->enemy); + + if (real_enemy_range <= MELEE_DISTANCE) + { + self->monsterinfo.currentmove = &arachnid_melee; + } + else if ((self->enemy->s.origin[2] - self->s.origin[2]) > 150.f) + { + self->monsterinfo.currentmove = &arachnid_attack_up1; + } + else + { + self->monsterinfo.currentmove = &arachnid_attack1; + } +} + +// +// death +// + +void +arachnid_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; + self->nextthink = 0; + gi.linkentity(self); +} + +static mframe_t arachnid_frames_death1[] = +{ + {ai_move, 0, NULL}, + {ai_move, -1.23f, NULL}, + {ai_move, -1.23f, NULL}, + {ai_move, -1.23f, NULL}, + {ai_move, -1.23f, NULL}, + {ai_move, -1.64f, NULL}, + {ai_move, -1.64f, NULL}, + {ai_move, -2.45f, NULL}, + {ai_move, -8.63f, NULL}, + {ai_move, -4.0f, NULL}, + {ai_move, -4.5f, NULL}, + {ai_move, -6.8f, NULL}, + {ai_move, -8.0f, NULL}, + {ai_move, -5.4f, NULL}, + {ai_move, -3.4f, NULL}, + {ai_move, -1.9f, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, + {ai_move, 0, NULL}, +}; + +mmove_t arachnid_move_death = +{ + FRAME_death1, + FRAME_death20, + arachnid_frames_death1, + arachnid_dead +}; + +void +arachnid_die(edict_t *self, edict_t *inflictor /* unused */, + edict_t *attacker /* unused */, int damage, + vec3_t point /* unused */) +{ + if (!self) + { + return; + } + + /* check for gib */ + if (self->health <= self->gib_health) + { + int n; + + 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; + } + + /* regular death */ + gi.sound(self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0); + self->deadflag = DEAD_DEAD; + self->takedamage = DAMAGE_YES; + + self->monsterinfo.currentmove = &arachnid_move_death; +} + +/* + * QUAKED monster_arachnid (1 .5 0) (-48 -48 -20) (48 48 48) Ambush Trigger_Spawn Sight + */ +void +SP_monster_arachnid(edict_t *self) +{ + if (!self) + { + return; + } + + if (deathmatch->value) + { + G_FreeEdict(self); + return; + } + + self->s.modelindex = gi.modelindex("models/monsters/arachnid/tris.md2"); + VectorSet(self->mins, -48, -48, -20); + VectorSet(self->maxs, 48, 48, 48); + self->movetype = MOVETYPE_STEP; + self->solid = SOLID_BBOX; + + sound_step = gi.soundindex("insane/insane11.wav"); + sound_charge = gi.soundindex("gladiator/railgun.wav"); + sound_melee = gi.soundindex("gladiator/melee3.wav"); + sound_melee_hit = gi.soundindex("gladiator/melee2.wav"); + sound_pain = gi.soundindex("arachnid/pain.wav"); + sound_die = gi.soundindex("arachnid/death.wav"); + sound_sight = gi.soundindex("arachnid/sight.wav"); + + self->health = 1000; + self->gib_health = -200; + + self->mass = 450; + + self->pain = arachnid_pain; + self->die = arachnid_die; + self->monsterinfo.stand = arachnid_stand; + self->monsterinfo.walk = arachnid_walk; + self->monsterinfo.run = arachnid_run; + self->monsterinfo.dodge = NULL; + self->monsterinfo.attack = arachnid_attack; + self->monsterinfo.melee = NULL; + self->monsterinfo.sight = arachnid_sight; + self->monsterinfo.idle = NULL; + self->monsterinfo.blocked = NULL; + + gi.linkentity(self); + + self->monsterinfo.currentmove = &arachnid_move_stand; + self->monsterinfo.scale = MODEL_SCALE; + + walkmonster_start(self); +} diff --git a/src/game/monster/arachnid/arachnid.h b/src/game/monster/arachnid/arachnid.h new file mode 100644 index 00000000..d1453dfd --- /dev/null +++ b/src/game/monster/arachnid/arachnid.h @@ -0,0 +1,160 @@ +/* + * 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. + * + * ======================================================================= + * + * Arachnid animations. + * + * ======================================================================= + */ + +#define FRAME_rails1 1 +#define FRAME_rails2 2 +#define FRAME_rails3 3 +#define FRAME_rails4 4 +#define FRAME_rails5 5 +#define FRAME_rails6 6 +#define FRAME_rails7 7 +#define FRAME_rails8 8 +#define FRAME_rails9 9 +#define FRAME_rails10 10 +#define FRAME_rails11 11 +#define FRAME_death1 12 +#define FRAME_death2 13 +#define FRAME_death3 14 +#define FRAME_death4 15 +#define FRAME_death5 16 +#define FRAME_death6 17 +#define FRAME_death7 18 +#define FRAME_death8 19 +#define FRAME_death9 20 +#define FRAME_death10 21 +#define FRAME_death11 22 +#define FRAME_death12 23 +#define FRAME_death13 24 +#define FRAME_death14 25 +#define FRAME_death15 26 +#define FRAME_death16 27 +#define FRAME_death17 28 +#define FRAME_death18 29 +#define FRAME_death19 30 +#define FRAME_death20 31 +#define FRAME_melee_atk1 32 +#define FRAME_melee_atk2 33 +#define FRAME_melee_atk3 34 +#define FRAME_melee_atk4 35 +#define FRAME_melee_atk5 36 +#define FRAME_melee_atk6 37 +#define FRAME_melee_atk7 38 +#define FRAME_melee_atk8 39 +#define FRAME_melee_atk9 40 +#define FRAME_melee_atk10 41 +#define FRAME_melee_atk11 42 +#define FRAME_melee_atk12 43 +#define FRAME_pain11 44 +#define FRAME_pain12 45 +#define FRAME_pain13 46 +#define FRAME_pain14 47 +#define FRAME_pain15 48 +#define FRAME_idle1 49 +#define FRAME_idle2 50 +#define FRAME_idle3 51 +#define FRAME_idle4 52 +#define FRAME_idle5 53 +#define FRAME_idle6 54 +#define FRAME_idle7 55 +#define FRAME_idle8 56 +#define FRAME_idle9 57 +#define FRAME_idle10 58 +#define FRAME_idle11 59 +#define FRAME_idle12 60 +#define FRAME_idle13 61 +#define FRAME_walk1 62 +#define FRAME_walk2 63 +#define FRAME_walk3 64 +#define FRAME_walk4 65 +#define FRAME_walk5 66 +#define FRAME_walk6 67 +#define FRAME_walk7 68 +#define FRAME_walk8 69 +#define FRAME_walk9 70 +#define FRAME_walk10 71 +#define FRAME_turn1 72 +#define FRAME_turn2 73 +#define FRAME_turn3 74 +#define FRAME_melee_out1 75 +#define FRAME_melee_out2 76 +#define FRAME_melee_out3 77 +#define FRAME_pain21 78 +#define FRAME_pain22 79 +#define FRAME_pain23 80 +#define FRAME_pain24 81 +#define FRAME_pain25 82 +#define FRAME_pain26 83 +#define FRAME_melee_pain1 84 +#define FRAME_melee_pain2 85 +#define FRAME_melee_pain3 86 +#define FRAME_melee_pain4 87 +#define FRAME_melee_pain5 88 +#define FRAME_melee_pain6 89 +#define FRAME_melee_pain7 90 +#define FRAME_melee_pain8 91 +#define FRAME_melee_pain9 92 +#define FRAME_melee_pain10 93 +#define FRAME_melee_pain11 94 +#define FRAME_melee_pain12 95 +#define FRAME_melee_pain13 96 +#define FRAME_melee_pain14 97 +#define FRAME_melee_pain15 98 +#define FRAME_melee_pain16 99 +#define FRAME_melee_in1 100 +#define FRAME_melee_in2 101 +#define FRAME_melee_in3 102 +#define FRAME_melee_in4 103 +#define FRAME_melee_in5 104 +#define FRAME_melee_in6 105 +#define FRAME_melee_in7 106 +#define FRAME_melee_in8 107 +#define FRAME_melee_in9 108 +#define FRAME_melee_in10 109 +#define FRAME_melee_in11 110 +#define FRAME_melee_in12 111 +#define FRAME_melee_in13 112 +#define FRAME_melee_in14 113 +#define FRAME_melee_in15 114 +#define FRAME_melee_in16 115 +#define FRAME_rails_up1 116 +#define FRAME_rails_up2 117 +#define FRAME_rails_up3 118 +#define FRAME_rails_up4 119 +#define FRAME_rails_up5 120 +#define FRAME_rails_up6 121 +#define FRAME_rails_up7 122 +#define FRAME_rails_up8 123 +#define FRAME_rails_up9 124 +#define FRAME_rails_up10 125 +#define FRAME_rails_up11 126 +#define FRAME_rails_up12 127 +#define FRAME_rails_up13 128 +#define FRAME_rails_up14 129 +#define FRAME_rails_up15 130 +#define FRAME_rails_up16 131 + +#define MODEL_SCALE 1.000000 diff --git a/src/game/savegame/tables/gamefunc_decs.h b/src/game/savegame/tables/gamefunc_decs.h index a36a00dd..dadfe5d0 100644 --- a/src/game/savegame/tables/gamefunc_decs.h +++ b/src/game/savegame/tables/gamefunc_decs.h @@ -334,6 +334,20 @@ extern void TurretAim ( edict_t * self ) ; extern void SP_CreateUnnamedSpawn ( edict_t * self ) ; extern void SP_CreateCoopSpots ( edict_t * self ) ; extern void SP_FixCoopSpots ( edict_t * self ) ; +extern void SP_monster_arachnid ( edict_t * self ) ; +extern void arachnid_sight(edict_t *self, edict_t *other /* unused */); +extern void arachnid_footstep(edict_t *self); +extern void arachnid_stand(edict_t *self); +extern void arachnid_walk(edict_t *self); +extern void arachnid_run(edict_t *self); +extern void arachnid_pain(edict_t *self, edict_t *other /* other */, float kick /* other */, int damage); +extern void arachnid_charge_rail(edict_t *self); +extern void arachnid_rail(edict_t *self); +extern void arachnid_melee_charge(edict_t *self); +extern void arachnid_melee_hit(edict_t *self); +extern void arachnid_attack(edict_t *self); +extern void arachnid_dead(edict_t *self); +extern void arachnid_die(edict_t *self, edict_t *inflictor /* unused */, edict_t *attacker /* unused */, int damage, vec3_t point /* unused */); extern void SP_monster_tank ( edict_t * self ) ; extern void tank_stand_think ( edict_t * self ) ; extern void tank_die ( edict_t * self , edict_t * inflictor , edict_t * attacker , int damage , vec3_t point ) ; diff --git a/src/game/savegame/tables/gamefunc_list.h b/src/game/savegame/tables/gamefunc_list.h index 3e7f26fa..96c5a613 100644 --- a/src/game/savegame/tables/gamefunc_list.h +++ b/src/game/savegame/tables/gamefunc_list.h @@ -333,6 +333,20 @@ {"turret_search", (byte *)turret_search}, {"turret_sight", (byte *)turret_sight}, {"TurretAim", (byte *)TurretAim}, +{"SP_monster_arachnid", (byte *)SP_monster_arachnid}, +{"arachnid_sight", (byte *)arachnid_sight}, +{"arachnid_footstep", (byte *)arachnid_footstep}, +{"arachnid_stand", (byte *)arachnid_stand}, +{"arachnid_walk", (byte *)arachnid_walk}, +{"arachnid_run", (byte *)arachnid_run}, +{"arachnid_pain", (byte *)arachnid_pain}, +{"arachnid_charge_rail", (byte *)arachnid_charge_rail}, +{"arachnid_rail", (byte *)arachnid_rail}, +{"arachnid_melee_charge", (byte *)arachnid_melee_charge}, +{"arachnid_melee_hit", (byte *)arachnid_melee_hit}, +{"arachnid_attack", (byte *)arachnid_attack}, +{"arachnid_dead", (byte *)arachnid_dead}, +{"arachnid_die", (byte *)arachnid_die}, {"SP_monster_tank", (byte *)SP_monster_tank}, {"tank_stand_think", (byte *)tank_stand_think}, {"tank_die", (byte *)tank_die}, diff --git a/src/game/savegame/tables/gamemmove_decs.h b/src/game/savegame/tables/gamemmove_decs.h index ad11e087..f2901cd6 100644 --- a/src/game/savegame/tables/gamemmove_decs.h +++ b/src/game/savegame/tables/gamemmove_decs.h @@ -482,4 +482,13 @@ extern mmove_t berserk_move_attack_spike ; extern mmove_t berserk_move_run1 ; extern mmove_t berserk_move_walk ; extern mmove_t berserk_move_stand_fidget ; -extern mmove_t berserk_move_stand ; +extern mmove_t berserk_move_stand ; +extern mmove_t arachnid_move_stand ; +extern mmove_t arachnid_move_walk ; +extern mmove_t arachnid_move_run ; +extern mmove_t arachnid_move_pain1 ; +extern mmove_t arachnid_move_pain2 ; +extern mmove_t arachnid_attack1 ; +extern mmove_t arachnid_attack_up1 ; +extern mmove_t arachnid_melee ; +extern mmove_t arachnid_move_death ; diff --git a/src/game/savegame/tables/gamemmove_list.h b/src/game/savegame/tables/gamemmove_list.h index 76cfb59f..82930cc5 100644 --- a/src/game/savegame/tables/gamemmove_list.h +++ b/src/game/savegame/tables/gamemmove_list.h @@ -482,4 +482,13 @@ {"berserk_move_walk", &berserk_move_walk}, {"berserk_move_stand_fidget", &berserk_move_stand_fidget}, {"berserk_move_stand", &berserk_move_stand}, +{"arachnid_move_stand", &arachnid_move_stand}, +{"arachnid_move_walk", &arachnid_move_walk}, +{"arachnid_move_run", &arachnid_move_run}, +{"arachnid_move_pain1", &arachnid_move_pain1}, +{"arachnid_move_pain2", &arachnid_move_pain2}, +{"arachnid_attack1", &arachnid_attack1}, +{"arachnid_attack_up1", &arachnid_attack_up1}, +{"arachnid_melee", &arachnid_melee}, +{"arachnid_move_death", &arachnid_move_death}, {0, 0}