mirror of
https://github.com/yquake2/rogue.git
synced 2024-11-21 20:01:39 +00:00
Port the new savegame system from quake 2
This commit is contained in:
parent
e4b136c168
commit
d1c7849ef1
11 changed files with 4967 additions and 797 deletions
4
Makefile
4
Makefile
|
@ -92,7 +92,7 @@ ROGUE_OBJS = \
|
|||
build/g_newtrig.o \
|
||||
build/g_newweap.o \
|
||||
build/g_phys.o \
|
||||
build/g_save.o \
|
||||
build/savegame.o \
|
||||
build/g_spawn.o \
|
||||
build/g_sphere.o \
|
||||
build/g_svcmds.o \
|
||||
|
@ -194,7 +194,7 @@ build/g_newweap.o: src/g_newweap.c
|
|||
build/g_phys.o: src/g_phys.c
|
||||
$(CC) $(CFLAGS) -o $@ -c $<
|
||||
|
||||
build/g_save.o: src/g_save.c
|
||||
build/savegame.o: src/savegame/savegame.c
|
||||
$(CC) $(CFLAGS) -o $@ -c $<
|
||||
|
||||
build/g_sphere.o: src/g_sphere.c
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#include "game.h"
|
||||
|
||||
// the "gameversion" client command will print this plus compile date
|
||||
#define GAMEVERSION "baseq2"
|
||||
#define GAMEVERSION "rogue"
|
||||
|
||||
// protocol bytes that can be directly added to messages
|
||||
#define svc_muzzleflash 1
|
||||
|
|
794
src/g_save.c
794
src/g_save.c
|
@ -1,794 +0,0 @@
|
|||
|
||||
#include "g_local.h"
|
||||
|
||||
#define Function(f) {#f, f}
|
||||
|
||||
mmove_t mmove_reloc;
|
||||
|
||||
field_t fields[] = {
|
||||
{"classname", FOFS(classname), F_LSTRING},
|
||||
{"model", FOFS(model), F_LSTRING},
|
||||
{"spawnflags", FOFS(spawnflags), F_INT},
|
||||
{"speed", FOFS(speed), F_FLOAT},
|
||||
{"accel", FOFS(accel), F_FLOAT},
|
||||
{"decel", FOFS(decel), F_FLOAT},
|
||||
{"target", FOFS(target), F_LSTRING},
|
||||
{"targetname", FOFS(targetname), F_LSTRING},
|
||||
{"pathtarget", FOFS(pathtarget), F_LSTRING},
|
||||
{"deathtarget", FOFS(deathtarget), F_LSTRING},
|
||||
{"killtarget", FOFS(killtarget), F_LSTRING},
|
||||
{"combattarget", FOFS(combattarget), F_LSTRING},
|
||||
{"message", FOFS(message), F_LSTRING},
|
||||
{"team", FOFS(team), F_LSTRING},
|
||||
{"wait", FOFS(wait), F_FLOAT},
|
||||
{"delay", FOFS(delay), F_FLOAT},
|
||||
{"random", FOFS(random), F_FLOAT},
|
||||
{"move_origin", FOFS(move_origin), F_VECTOR},
|
||||
{"move_angles", FOFS(move_angles), F_VECTOR},
|
||||
{"style", FOFS(style), F_INT},
|
||||
{"count", FOFS(count), F_INT},
|
||||
{"health", FOFS(health), F_INT},
|
||||
{"sounds", FOFS(sounds), F_INT},
|
||||
{"light", 0, F_IGNORE},
|
||||
{"dmg", FOFS(dmg), F_INT},
|
||||
{"mass", FOFS(mass), F_INT},
|
||||
{"volume", FOFS(volume), F_FLOAT},
|
||||
{"attenuation", FOFS(attenuation), F_FLOAT},
|
||||
{"map", FOFS(map), F_LSTRING},
|
||||
{"origin", FOFS(s.origin), F_VECTOR},
|
||||
{"angles", FOFS(s.angles), F_VECTOR},
|
||||
{"angle", FOFS(s.angles), F_ANGLEHACK},
|
||||
|
||||
{"goalentity", FOFS(goalentity), F_EDICT, FFL_NOSPAWN},
|
||||
{"movetarget", FOFS(movetarget), F_EDICT, FFL_NOSPAWN},
|
||||
{"enemy", FOFS(enemy), F_EDICT, FFL_NOSPAWN},
|
||||
{"oldenemy", FOFS(oldenemy), F_EDICT, FFL_NOSPAWN},
|
||||
{"activator", FOFS(activator), F_EDICT, FFL_NOSPAWN},
|
||||
{"groundentity", FOFS(groundentity), F_EDICT, FFL_NOSPAWN},
|
||||
{"teamchain", FOFS(teamchain), F_EDICT, FFL_NOSPAWN},
|
||||
{"teammaster", FOFS(teammaster), F_EDICT, FFL_NOSPAWN},
|
||||
{"owner", FOFS(owner), F_EDICT, FFL_NOSPAWN},
|
||||
{"mynoise", FOFS(mynoise), F_EDICT, FFL_NOSPAWN},
|
||||
{"mynoise2", FOFS(mynoise2), F_EDICT, FFL_NOSPAWN},
|
||||
{"target_ent", FOFS(target_ent), F_EDICT, FFL_NOSPAWN},
|
||||
{"chain", FOFS(chain), F_EDICT, FFL_NOSPAWN},
|
||||
|
||||
{"prethink", FOFS(prethink), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"think", FOFS(think), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"blocked", FOFS(blocked), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"touch", FOFS(touch), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"use", FOFS(use), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"pain", FOFS(pain), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"die", FOFS(die), F_FUNCTION, FFL_NOSPAWN},
|
||||
|
||||
{"stand", FOFS(monsterinfo.stand), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"idle", FOFS(monsterinfo.idle), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"search", FOFS(monsterinfo.search), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"walk", FOFS(monsterinfo.walk), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"run", FOFS(monsterinfo.run), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"dodge", FOFS(monsterinfo.dodge), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"attack", FOFS(monsterinfo.attack), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"melee", FOFS(monsterinfo.melee), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"sight", FOFS(monsterinfo.sight), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"checkattack", FOFS(monsterinfo.checkattack), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"currentmove", FOFS(monsterinfo.currentmove), F_MMOVE, FFL_NOSPAWN},
|
||||
|
||||
{"endfunc", FOFS(moveinfo.endfunc), F_FUNCTION, FFL_NOSPAWN},
|
||||
|
||||
// temp spawn vars -- only valid when the spawn function is called
|
||||
{"lip", STOFS(lip), F_INT, FFL_SPAWNTEMP},
|
||||
{"distance", STOFS(distance), F_INT, FFL_SPAWNTEMP},
|
||||
{"height", STOFS(height), F_INT, FFL_SPAWNTEMP},
|
||||
{"noise", STOFS(noise), F_LSTRING, FFL_SPAWNTEMP},
|
||||
{"pausetime", STOFS(pausetime), F_FLOAT, FFL_SPAWNTEMP},
|
||||
{"item", STOFS(item), F_LSTRING, FFL_SPAWNTEMP},
|
||||
|
||||
//need for item field in edict struct, FFL_SPAWNTEMP item will be skipped on saves
|
||||
{"item", FOFS(item), F_ITEM},
|
||||
|
||||
{"gravity", STOFS(gravity), F_LSTRING, FFL_SPAWNTEMP},
|
||||
{"sky", STOFS(sky), F_LSTRING, FFL_SPAWNTEMP},
|
||||
{"skyrotate", STOFS(skyrotate), F_FLOAT, FFL_SPAWNTEMP},
|
||||
{"skyaxis", STOFS(skyaxis), F_VECTOR, FFL_SPAWNTEMP},
|
||||
{"minyaw", STOFS(minyaw), F_FLOAT, FFL_SPAWNTEMP},
|
||||
{"maxyaw", STOFS(maxyaw), F_FLOAT, FFL_SPAWNTEMP},
|
||||
{"minpitch", STOFS(minpitch), F_FLOAT, FFL_SPAWNTEMP},
|
||||
{"maxpitch", STOFS(maxpitch), F_FLOAT, FFL_SPAWNTEMP},
|
||||
{"nextmap", STOFS(nextmap), F_LSTRING, FFL_SPAWNTEMP},
|
||||
|
||||
// ROGUE
|
||||
{"bad_area", FOFS(bad_area), F_EDICT},
|
||||
// while the hint_path stuff could be reassembled on the fly, no reason to be different
|
||||
{"hint_chain", FOFS(hint_chain), F_EDICT},
|
||||
{"monster_hint_chain", FOFS(monster_hint_chain), F_EDICT},
|
||||
{"target_hint_chain", FOFS(target_hint_chain), F_EDICT},
|
||||
//
|
||||
{"goal_hint", FOFS(monsterinfo.goal_hint), F_EDICT},
|
||||
{"badMedic1", FOFS(monsterinfo.badMedic1), F_EDICT},
|
||||
{"badMedic2", FOFS(monsterinfo.badMedic2), F_EDICT},
|
||||
{"last_player_enemy", FOFS(monsterinfo.last_player_enemy), F_EDICT},
|
||||
{"commander", FOFS(monsterinfo.commander), F_EDICT},
|
||||
{"blocked", FOFS(monsterinfo.blocked), F_MMOVE, FFL_NOSPAWN},
|
||||
{"duck", FOFS(monsterinfo.duck), F_MMOVE, FFL_NOSPAWN},
|
||||
{"unduck", FOFS(monsterinfo.unduck), F_MMOVE, FFL_NOSPAWN},
|
||||
{"sidestep", FOFS(monsterinfo.sidestep), F_MMOVE, FFL_NOSPAWN},
|
||||
// ROGUE
|
||||
|
||||
{0, 0, 0, 0}
|
||||
|
||||
};
|
||||
|
||||
field_t levelfields[] =
|
||||
{
|
||||
{"changemap", LLOFS(changemap), F_LSTRING},
|
||||
|
||||
{"sight_client", LLOFS(sight_client), F_EDICT},
|
||||
{"sight_entity", LLOFS(sight_entity), F_EDICT},
|
||||
{"sound_entity", LLOFS(sound_entity), F_EDICT},
|
||||
{"sound2_entity", LLOFS(sound2_entity), F_EDICT},
|
||||
|
||||
// ROGUE
|
||||
{"disguise_violator", LLOFS(disguise_violator), F_EDICT},
|
||||
// ROGUE
|
||||
|
||||
{NULL, 0, F_INT}
|
||||
};
|
||||
|
||||
field_t clientfields[] =
|
||||
{
|
||||
{"pers.weapon", CLOFS(pers.weapon), F_ITEM},
|
||||
{"pers.lastweapon", CLOFS(pers.lastweapon), F_ITEM},
|
||||
{"newweapon", CLOFS(newweapon), F_ITEM},
|
||||
// ROGUE
|
||||
{"owned_sphere", CLOFS(owned_sphere), F_EDICT},
|
||||
// ROGUE
|
||||
|
||||
{NULL, 0, F_INT}
|
||||
};
|
||||
|
||||
/*
|
||||
============
|
||||
InitGame
|
||||
|
||||
This will be called when the dll is first loaded, which
|
||||
only happens when a new game is started or a save game
|
||||
is loaded.
|
||||
============
|
||||
*/
|
||||
void InitGame (void)
|
||||
{
|
||||
gi.dprintf ("Game is starting up.\n");
|
||||
gi.dprintf ("Game is rogue.\n");
|
||||
|
||||
gun_x = gi.cvar ("gun_x", "0", 0);
|
||||
gun_y = gi.cvar ("gun_y", "0", 0);
|
||||
gun_z = gi.cvar ("gun_z", "0", 0);
|
||||
|
||||
//FIXME: sv_ prefix is wrong for these
|
||||
sv_rollspeed = gi.cvar ("sv_rollspeed", "200", 0);
|
||||
sv_rollangle = gi.cvar ("sv_rollangle", "2", 0);
|
||||
sv_maxvelocity = gi.cvar ("sv_maxvelocity", "2000", 0);
|
||||
sv_gravity = gi.cvar ("sv_gravity", "800", 0);
|
||||
|
||||
sv_stopspeed = gi.cvar ("sv_stopspeed", "100", 0); // PGM - was #define in g_phys.c
|
||||
|
||||
//ROGUE
|
||||
g_showlogic = gi.cvar ("g_showlogic", "0", 0);
|
||||
huntercam = gi.cvar ("huntercam", "1", CVAR_SERVERINFO|CVAR_LATCH);
|
||||
strong_mines = gi.cvar ("strong_mines", "0", 0);
|
||||
randomrespawn = gi.cvar ("randomrespawn", "0", 0);
|
||||
//ROGUE
|
||||
|
||||
// noset vars
|
||||
dedicated = gi.cvar ("dedicated", "0", CVAR_NOSET);
|
||||
|
||||
// latched vars
|
||||
sv_cheats = gi.cvar ("cheats", "0", CVAR_SERVERINFO|CVAR_LATCH);
|
||||
gi.cvar ("gamename", GAMEVERSION , CVAR_SERVERINFO | CVAR_LATCH);
|
||||
gi.cvar ("gamedate", __DATE__ , CVAR_SERVERINFO | CVAR_LATCH);
|
||||
|
||||
maxclients = gi.cvar ("maxclients", "4", CVAR_SERVERINFO | CVAR_LATCH);
|
||||
maxspectators = gi.cvar ("maxspectators", "4", CVAR_SERVERINFO);
|
||||
deathmatch = gi.cvar ("deathmatch", "0", CVAR_LATCH);
|
||||
coop = gi.cvar ("coop", "0", CVAR_LATCH);
|
||||
skill = gi.cvar ("skill", "1", CVAR_LATCH);
|
||||
maxentities = gi.cvar ("maxentities", "1024", CVAR_LATCH);
|
||||
gamerules = gi.cvar ("gamerules", "0", CVAR_LATCH); //PGM
|
||||
|
||||
// change anytime vars
|
||||
dmflags = gi.cvar ("dmflags", "0", CVAR_SERVERINFO);
|
||||
fraglimit = gi.cvar ("fraglimit", "0", CVAR_SERVERINFO);
|
||||
timelimit = gi.cvar ("timelimit", "0", CVAR_SERVERINFO);
|
||||
password = gi.cvar ("password", "", CVAR_USERINFO);
|
||||
spectator_password = gi.cvar ("spectator_password", "", CVAR_USERINFO);
|
||||
filterban = gi.cvar ("filterban", "1", 0);
|
||||
|
||||
g_select_empty = gi.cvar ("g_select_empty", "0", CVAR_ARCHIVE);
|
||||
|
||||
run_pitch = gi.cvar ("run_pitch", "0.002", 0);
|
||||
run_roll = gi.cvar ("run_roll", "0.005", 0);
|
||||
bob_up = gi.cvar ("bob_up", "0.005", 0);
|
||||
bob_pitch = gi.cvar ("bob_pitch", "0.002", 0);
|
||||
bob_roll = gi.cvar ("bob_roll", "0.002", 0);
|
||||
|
||||
// flood control
|
||||
flood_msgs = gi.cvar ("flood_msgs", "4", 0);
|
||||
flood_persecond = gi.cvar ("flood_persecond", "4", 0);
|
||||
flood_waitdelay = gi.cvar ("flood_waitdelay", "10", 0);
|
||||
|
||||
// dm map list
|
||||
sv_maplist = gi.cvar ("sv_maplist", "", 0);
|
||||
|
||||
// items
|
||||
InitItems ();
|
||||
|
||||
Com_sprintf (game.helpmessage1, sizeof(game.helpmessage1), "");
|
||||
|
||||
Com_sprintf (game.helpmessage2, sizeof(game.helpmessage2), "");
|
||||
|
||||
// initialize all entities for this game
|
||||
game.maxentities = maxentities->value;
|
||||
g_edicts = gi.TagMalloc (game.maxentities * sizeof(g_edicts[0]), TAG_GAME);
|
||||
globals.edicts = g_edicts;
|
||||
globals.max_edicts = game.maxentities;
|
||||
|
||||
// initialize all clients for this game
|
||||
game.maxclients = maxclients->value;
|
||||
game.clients = gi.TagMalloc (game.maxclients * sizeof(game.clients[0]), TAG_GAME);
|
||||
globals.num_edicts = game.maxclients+1;
|
||||
|
||||
//======
|
||||
//ROGUE
|
||||
if(gamerules)
|
||||
{
|
||||
InitGameRules(); // if there are game rules to set up, do so now.
|
||||
}
|
||||
//ROGUE
|
||||
//======
|
||||
}
|
||||
|
||||
//=========================================================
|
||||
|
||||
void WriteField1 (FILE *f, field_t *field, byte *base)
|
||||
{
|
||||
void *p;
|
||||
int len;
|
||||
int index;
|
||||
|
||||
if (field->flags & FFL_SPAWNTEMP)
|
||||
return;
|
||||
|
||||
p = (void *)(base + field->ofs);
|
||||
switch (field->type)
|
||||
{
|
||||
case F_INT:
|
||||
case F_FLOAT:
|
||||
case F_ANGLEHACK:
|
||||
case F_VECTOR:
|
||||
case F_IGNORE:
|
||||
break;
|
||||
|
||||
case F_LSTRING:
|
||||
case F_GSTRING:
|
||||
if ( *(char **)p )
|
||||
len = strlen(*(char **)p) + 1;
|
||||
else
|
||||
len = 0;
|
||||
*(int *)p = len;
|
||||
break;
|
||||
case F_EDICT:
|
||||
if ( *(edict_t **)p == NULL)
|
||||
index = -1;
|
||||
else
|
||||
index = *(edict_t **)p - g_edicts;
|
||||
*(int *)p = index;
|
||||
break;
|
||||
case F_CLIENT:
|
||||
if ( *(gclient_t **)p == NULL)
|
||||
index = -1;
|
||||
else
|
||||
index = *(gclient_t **)p - game.clients;
|
||||
*(int *)p = index;
|
||||
break;
|
||||
case F_ITEM:
|
||||
if ( *(edict_t **)p == NULL)
|
||||
index = -1;
|
||||
else
|
||||
index = *(gitem_t **)p - itemlist;
|
||||
*(int *)p = index;
|
||||
break;
|
||||
|
||||
//relative to code segment
|
||||
case F_FUNCTION:
|
||||
if (*(byte **)p == NULL)
|
||||
index = 0;
|
||||
else
|
||||
index = *(byte **)p - ((byte *)InitGame);
|
||||
*(int *)p = index;
|
||||
break;
|
||||
|
||||
//relative to data segment
|
||||
case F_MMOVE:
|
||||
if (*(byte **)p == NULL)
|
||||
index = 0;
|
||||
else
|
||||
index = *(byte **)p - (byte *)&mmove_reloc;
|
||||
*(int *)p = index;
|
||||
break;
|
||||
|
||||
default:
|
||||
gi.error ("WriteEdict: unknown field type");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void WriteField2 (FILE *f, field_t *field, byte *base)
|
||||
{
|
||||
int len;
|
||||
void *p;
|
||||
|
||||
if (field->flags & FFL_SPAWNTEMP)
|
||||
return;
|
||||
|
||||
p = (void *)(base + field->ofs);
|
||||
switch (field->type)
|
||||
{
|
||||
case F_LSTRING:
|
||||
if ( *(char **)p )
|
||||
{
|
||||
len = strlen(*(char **)p) + 1;
|
||||
fwrite (*(char **)p, len, 1, f);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ReadField (FILE *f, field_t *field, byte *base)
|
||||
{
|
||||
void *p;
|
||||
int len;
|
||||
int index;
|
||||
|
||||
if (field->flags & FFL_SPAWNTEMP)
|
||||
return;
|
||||
|
||||
p = (void *)(base + field->ofs);
|
||||
switch (field->type)
|
||||
{
|
||||
case F_INT:
|
||||
case F_FLOAT:
|
||||
case F_ANGLEHACK:
|
||||
case F_VECTOR:
|
||||
case F_IGNORE:
|
||||
break;
|
||||
|
||||
case F_LSTRING:
|
||||
len = *(int *)p;
|
||||
if (!len)
|
||||
*(char **)p = NULL;
|
||||
else
|
||||
{
|
||||
/*
|
||||
SBF: FIXME - 32 extra bytes alloc'd since the saved
|
||||
string might not be long enough
|
||||
*/
|
||||
*(char **)p = gi.TagMalloc (32+len, TAG_LEVEL);
|
||||
fread (*(char **)p, len, 1, f);
|
||||
}
|
||||
break;
|
||||
case F_EDICT:
|
||||
index = *(int *)p;
|
||||
if ( index == -1 )
|
||||
*(edict_t **)p = NULL;
|
||||
else
|
||||
*(edict_t **)p = &g_edicts[index];
|
||||
break;
|
||||
case F_CLIENT:
|
||||
index = *(int *)p;
|
||||
if ( index == -1 )
|
||||
*(gclient_t **)p = NULL;
|
||||
else
|
||||
*(gclient_t **)p = &game.clients[index];
|
||||
break;
|
||||
case F_ITEM:
|
||||
index = *(int *)p;
|
||||
if ( index == -1 )
|
||||
*(gitem_t **)p = NULL;
|
||||
else
|
||||
*(gitem_t **)p = &itemlist[index];
|
||||
break;
|
||||
|
||||
//relative to code segment
|
||||
case F_FUNCTION:
|
||||
index = *(int *)p;
|
||||
if ( index == 0 )
|
||||
*(byte **)p = NULL;
|
||||
else
|
||||
*(byte **)p = ((byte *)InitGame) + index;
|
||||
break;
|
||||
|
||||
//relative to data segment
|
||||
case F_MMOVE:
|
||||
index = *(int *)p;
|
||||
if (index == 0)
|
||||
*(byte **)p = NULL;
|
||||
else
|
||||
*(byte **)p = (byte *)&mmove_reloc + index;
|
||||
break;
|
||||
|
||||
default:
|
||||
gi.error ("ReadEdict: unknown field type");
|
||||
}
|
||||
}
|
||||
|
||||
//=========================================================
|
||||
|
||||
/*
|
||||
==============
|
||||
WriteClient
|
||||
|
||||
All pointer variables (except function pointers) must be handled specially.
|
||||
==============
|
||||
*/
|
||||
void WriteClient (FILE *f, gclient_t *client)
|
||||
{
|
||||
field_t *field;
|
||||
gclient_t temp;
|
||||
|
||||
// all of the ints, floats, and vectors stay as they are
|
||||
temp = *client;
|
||||
|
||||
// change the pointers to lengths or indexes
|
||||
for (field=clientfields ; field->name ; field++)
|
||||
{
|
||||
WriteField1 (f, field, (byte *)&temp);
|
||||
}
|
||||
|
||||
// write the block
|
||||
fwrite (&temp, sizeof(temp), 1, f);
|
||||
|
||||
// now write any allocated data following the edict
|
||||
for (field=clientfields ; field->name ; field++)
|
||||
{
|
||||
WriteField2 (f, field, (byte *)client);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
ReadClient
|
||||
|
||||
All pointer variables (except function pointers) must be handled specially.
|
||||
==============
|
||||
*/
|
||||
void ReadClient (FILE *f, gclient_t *client)
|
||||
{
|
||||
field_t *field;
|
||||
|
||||
fread (client, sizeof(*client), 1, f);
|
||||
|
||||
for (field=clientfields ; field->name ; field++)
|
||||
{
|
||||
ReadField (f, field, (byte *)client);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
WriteGame
|
||||
|
||||
This will be called whenever the game goes to a new level,
|
||||
and when the user explicitly saves the game.
|
||||
|
||||
Game information include cross level data, like multi level
|
||||
triggers, help computer info, and all client states.
|
||||
|
||||
A single player death will automatically restore from the
|
||||
last save position.
|
||||
============
|
||||
*/
|
||||
void WriteGame (const char *filename, qboolean autosave)
|
||||
{
|
||||
FILE *f;
|
||||
int i;
|
||||
char str[16];
|
||||
|
||||
if (!autosave)
|
||||
SaveClientData ();
|
||||
|
||||
f = fopen (filename, "wb");
|
||||
if (!f)
|
||||
gi.error ("Couldn't open %s", filename);
|
||||
|
||||
memset (str, 0, sizeof(str));
|
||||
strcpy (str, __DATE__);
|
||||
fwrite (str, sizeof(str), 1, f);
|
||||
|
||||
game.autosaved = autosave;
|
||||
fwrite (&game, sizeof(game), 1, f);
|
||||
game.autosaved = false;
|
||||
|
||||
for (i=0 ; i<game.maxclients ; i++)
|
||||
WriteClient (f, &game.clients[i]);
|
||||
|
||||
fclose (f);
|
||||
}
|
||||
|
||||
void ReadGame (const char *filename)
|
||||
{
|
||||
FILE *f;
|
||||
int i;
|
||||
char str[16];
|
||||
|
||||
gi.FreeTags (TAG_GAME);
|
||||
|
||||
f = fopen (filename, "rb");
|
||||
if (!f)
|
||||
gi.error ("Couldn't open %s", filename);
|
||||
|
||||
fread (str, sizeof(str), 1, f);
|
||||
if (strcmp (str, __DATE__))
|
||||
{
|
||||
fclose (f);
|
||||
gi.error ("Savegame from an older version.\n");
|
||||
}
|
||||
|
||||
g_edicts = gi.TagMalloc (game.maxentities * sizeof(g_edicts[0]), TAG_GAME);
|
||||
globals.edicts = g_edicts;
|
||||
|
||||
fread (&game, sizeof(game), 1, f);
|
||||
game.clients = gi.TagMalloc (game.maxclients * sizeof(game.clients[0]), TAG_GAME);
|
||||
for (i=0 ; i<game.maxclients ; i++)
|
||||
ReadClient (f, &game.clients[i]);
|
||||
|
||||
fclose (f);
|
||||
}
|
||||
|
||||
//==========================================================
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
WriteEdict
|
||||
|
||||
All pointer variables (except function pointers) must be handled specially.
|
||||
==============
|
||||
*/
|
||||
void WriteEdict (FILE *f, edict_t *ent)
|
||||
{
|
||||
field_t *field;
|
||||
edict_t temp;
|
||||
|
||||
// all of the ints, floats, and vectors stay as they are
|
||||
temp = *ent;
|
||||
|
||||
// change the pointers to lengths or indexes
|
||||
for (field=fields ; field->name ; field++)
|
||||
{
|
||||
WriteField1 (f, field, (byte *)&temp);
|
||||
}
|
||||
|
||||
// write the block
|
||||
fwrite (&temp, sizeof(temp), 1, f);
|
||||
|
||||
// now write any allocated data following the edict
|
||||
for (field=fields ; field->name ; field++)
|
||||
{
|
||||
WriteField2 (f, field, (byte *)ent);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
WriteLevelLocals
|
||||
|
||||
All pointer variables (except function pointers) must be handled specially.
|
||||
==============
|
||||
*/
|
||||
void WriteLevelLocals (FILE *f)
|
||||
{
|
||||
field_t *field;
|
||||
level_locals_t temp;
|
||||
|
||||
// all of the ints, floats, and vectors stay as they are
|
||||
temp = level;
|
||||
|
||||
// change the pointers to lengths or indexes
|
||||
for (field=levelfields ; field->name ; field++)
|
||||
{
|
||||
WriteField1 (f, field, (byte *)&temp);
|
||||
}
|
||||
|
||||
// write the block
|
||||
fwrite (&temp, sizeof(temp), 1, f);
|
||||
|
||||
// now write any allocated data following the edict
|
||||
for (field=levelfields ; field->name ; field++)
|
||||
{
|
||||
WriteField2 (f, field, (byte *)&level);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
ReadEdict
|
||||
|
||||
All pointer variables (except function pointers) must be handled specially.
|
||||
==============
|
||||
*/
|
||||
void ReadEdict (FILE *f, edict_t *ent)
|
||||
{
|
||||
field_t *field;
|
||||
|
||||
fread (ent, sizeof(*ent), 1, f);
|
||||
|
||||
for (field=fields ; field->name ; field++)
|
||||
{
|
||||
ReadField (f, field, (byte *)ent);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
ReadLevelLocals
|
||||
|
||||
All pointer variables (except function pointers) must be handled specially.
|
||||
==============
|
||||
*/
|
||||
void ReadLevelLocals (FILE *f)
|
||||
{
|
||||
field_t *field;
|
||||
|
||||
fread (&level, sizeof(level), 1, f);
|
||||
|
||||
for (field=levelfields ; field->name ; field++)
|
||||
{
|
||||
ReadField (f, field, (byte *)&level);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
WriteLevel
|
||||
|
||||
=================
|
||||
*/
|
||||
void WriteLevel (const char *filename)
|
||||
{
|
||||
int i;
|
||||
edict_t *ent;
|
||||
FILE *f;
|
||||
void *base;
|
||||
|
||||
f = fopen (filename, "wb");
|
||||
if (!f)
|
||||
gi.error ("Couldn't open %s", filename);
|
||||
|
||||
// write out edict size for checking
|
||||
i = sizeof(edict_t);
|
||||
fwrite (&i, sizeof(i), 1, f);
|
||||
|
||||
// write out a function pointer for checking
|
||||
base = (void *)InitGame;
|
||||
fwrite (&base, sizeof(base), 1, f);
|
||||
|
||||
// write out level_locals_t
|
||||
WriteLevelLocals (f);
|
||||
|
||||
// write out all the entities
|
||||
for (i=0 ; i<globals.num_edicts ; i++)
|
||||
{
|
||||
ent = &g_edicts[i];
|
||||
if (!ent->inuse)
|
||||
continue;
|
||||
fwrite (&i, sizeof(i), 1, f);
|
||||
WriteEdict (f, ent);
|
||||
}
|
||||
i = -1;
|
||||
fwrite (&i, sizeof(i), 1, f);
|
||||
|
||||
fclose (f);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=================
|
||||
ReadLevel
|
||||
|
||||
SpawnEntities will already have been called on the
|
||||
level the same way it was when the level was saved.
|
||||
|
||||
That is necessary to get the baselines
|
||||
set up identically.
|
||||
|
||||
The server will have cleared all of the world links before
|
||||
calling ReadLevel.
|
||||
|
||||
No clients are connected yet.
|
||||
=================
|
||||
*/
|
||||
void ReadLevel (const char *filename)
|
||||
{
|
||||
int entnum;
|
||||
FILE *f;
|
||||
int i;
|
||||
void *base;
|
||||
edict_t *ent;
|
||||
|
||||
f = fopen (filename, "rb");
|
||||
if (!f)
|
||||
gi.error ("Couldn't open %s", filename);
|
||||
|
||||
// free any dynamic memory allocated by loading the level
|
||||
// base state
|
||||
gi.FreeTags (TAG_LEVEL);
|
||||
|
||||
// wipe all the entities
|
||||
memset (g_edicts, 0, game.maxentities*sizeof(g_edicts[0]));
|
||||
globals.num_edicts = maxclients->value+1;
|
||||
|
||||
// check edict size
|
||||
fread (&i, sizeof(i), 1, f);
|
||||
if (i != sizeof(edict_t))
|
||||
{
|
||||
fclose (f);
|
||||
gi.error ("ReadLevel: mismatched edict size");
|
||||
}
|
||||
|
||||
// check function pointer base address
|
||||
fread (&base, sizeof(base), 1, f);
|
||||
gi.dprintf("Function offsets %d\n", ((byte *)base) - ((byte *)InitGame));
|
||||
|
||||
// load the level locals
|
||||
ReadLevelLocals (f);
|
||||
|
||||
// load all the entities
|
||||
while (1)
|
||||
{
|
||||
if (fread (&entnum, sizeof(entnum), 1, f) != 1)
|
||||
{
|
||||
fclose (f);
|
||||
gi.error ("ReadLevel: failed to read entnum");
|
||||
}
|
||||
if (entnum == -1)
|
||||
break;
|
||||
if (entnum >= globals.num_edicts)
|
||||
globals.num_edicts = entnum+1;
|
||||
|
||||
ent = &g_edicts[entnum];
|
||||
ReadEdict (f, ent);
|
||||
|
||||
// let the server rebuild world links for this ent
|
||||
memset (&ent->area, 0, sizeof(ent->area));
|
||||
gi.linkentity (ent);
|
||||
}
|
||||
|
||||
fclose (f);
|
||||
|
||||
// mark all clients as unconnected
|
||||
for (i=0 ; i<maxclients->value ; i++)
|
||||
{
|
||||
ent = &g_edicts[i+1];
|
||||
ent->client = game.clients + i;
|
||||
ent->client->pers.connected = false;
|
||||
}
|
||||
|
||||
// do any load time things at this point
|
||||
for (i=0 ; i<globals.num_edicts ; i++)
|
||||
{
|
||||
ent = &g_edicts[i];
|
||||
|
||||
if (!ent->inuse)
|
||||
continue;
|
||||
|
||||
// fire any cross-level triggers
|
||||
if (ent->classname)
|
||||
if (strcmp(ent->classname, "target_crosslevel_target") == 0)
|
||||
ent->nextthink = level.time + ent->delay;
|
||||
}
|
||||
}
|
||||
|
1098
src/savegame/savegame.c
Normal file
1098
src/savegame/savegame.c
Normal file
File diff suppressed because it is too large
Load diff
13
src/savegame/tables/clientfields.h
Normal file
13
src/savegame/tables/clientfields.h
Normal file
|
@ -0,0 +1,13 @@
|
|||
/*
|
||||
* =======================================================================
|
||||
*
|
||||
* Fields of the client to be saved.
|
||||
*
|
||||
* =======================================================================
|
||||
*/
|
||||
|
||||
{"pers.weapon", CLOFS(pers.weapon), F_ITEM},
|
||||
{"pers.lastweapon", CLOFS(pers.lastweapon), F_ITEM},
|
||||
{"newweapon", CLOFS(newweapon), F_ITEM},
|
||||
{"owned_sphere", CLOFS(owned_sphere), F_EDICT},
|
||||
{NULL, 0, F_INT}
|
102
src/savegame/tables/fields.h
Normal file
102
src/savegame/tables/fields.h
Normal file
|
@ -0,0 +1,102 @@
|
|||
/*
|
||||
* =======================================================================
|
||||
*
|
||||
* Game fields to be saved.
|
||||
*
|
||||
* =======================================================================
|
||||
*/
|
||||
|
||||
{"classname", FOFS(classname), F_LSTRING},
|
||||
{"model", FOFS(model), F_LSTRING},
|
||||
{"spawnflags", FOFS(spawnflags), F_INT},
|
||||
{"speed", FOFS(speed), F_FLOAT},
|
||||
{"accel", FOFS(accel), F_FLOAT},
|
||||
{"decel", FOFS(decel), F_FLOAT},
|
||||
{"target", FOFS(target), F_LSTRING},
|
||||
{"targetname", FOFS(targetname), F_LSTRING},
|
||||
{"pathtarget", FOFS(pathtarget), F_LSTRING},
|
||||
{"deathtarget", FOFS(deathtarget), F_LSTRING},
|
||||
{"killtarget", FOFS(killtarget), F_LSTRING},
|
||||
{"combattarget", FOFS(combattarget), F_LSTRING},
|
||||
{"message", FOFS(message), F_LSTRING},
|
||||
{"team", FOFS(team), F_LSTRING},
|
||||
{"wait", FOFS(wait), F_FLOAT},
|
||||
{"delay", FOFS(delay), F_FLOAT},
|
||||
{"random", FOFS(random), F_FLOAT},
|
||||
{"move_origin", FOFS(move_origin), F_VECTOR},
|
||||
{"move_angles", FOFS(move_angles), F_VECTOR},
|
||||
{"style", FOFS(style), F_INT},
|
||||
{"count", FOFS(count), F_INT},
|
||||
{"health", FOFS(health), F_INT},
|
||||
{"sounds", FOFS(sounds), F_INT},
|
||||
{"light", 0, F_IGNORE},
|
||||
{"dmg", FOFS(dmg), F_INT},
|
||||
{"mass", FOFS(mass), F_INT},
|
||||
{"volume", FOFS(volume), F_FLOAT},
|
||||
{"attenuation", FOFS(attenuation), F_FLOAT},
|
||||
{"map", FOFS(map), F_LSTRING},
|
||||
{"origin", FOFS(s.origin), F_VECTOR},
|
||||
{"angles", FOFS(s.angles), F_VECTOR},
|
||||
{"angle", FOFS(s.angles), F_ANGLEHACK},
|
||||
{"goalentity", FOFS(goalentity), F_EDICT, FFL_NOSPAWN},
|
||||
{"movetarget", FOFS(movetarget), F_EDICT, FFL_NOSPAWN},
|
||||
{"enemy", FOFS(enemy), F_EDICT, FFL_NOSPAWN},
|
||||
{"oldenemy", FOFS(oldenemy), F_EDICT, FFL_NOSPAWN},
|
||||
{"activator", FOFS(activator), F_EDICT, FFL_NOSPAWN},
|
||||
{"groundentity", FOFS(groundentity), F_EDICT, FFL_NOSPAWN},
|
||||
{"teamchain", FOFS(teamchain), F_EDICT, FFL_NOSPAWN},
|
||||
{"teammaster", FOFS(teammaster), F_EDICT, FFL_NOSPAWN},
|
||||
{"owner", FOFS(owner), F_EDICT, FFL_NOSPAWN},
|
||||
{"mynoise", FOFS(mynoise), F_EDICT, FFL_NOSPAWN},
|
||||
{"mynoise2", FOFS(mynoise2), F_EDICT, FFL_NOSPAWN},
|
||||
{"target_ent", FOFS(target_ent), F_EDICT, FFL_NOSPAWN},
|
||||
{"chain", FOFS(chain), F_EDICT, FFL_NOSPAWN},
|
||||
{"prethink", FOFS(prethink), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"think", FOFS(think), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"blocked", FOFS(blocked), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"touch", FOFS(touch), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"use", FOFS(use), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"pain", FOFS(pain), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"die", FOFS(die), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"stand", FOFS(monsterinfo.stand), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"idle", FOFS(monsterinfo.idle), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"search", FOFS(monsterinfo.search), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"walk", FOFS(monsterinfo.walk), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"run", FOFS(monsterinfo.run), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"dodge", FOFS(monsterinfo.dodge), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"attack", FOFS(monsterinfo.attack), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"melee", FOFS(monsterinfo.melee), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"sight", FOFS(monsterinfo.sight), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"checkattack", FOFS(monsterinfo.checkattack), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"currentmove", FOFS(monsterinfo.currentmove), F_MMOVE, FFL_NOSPAWN},
|
||||
{"endfunc", FOFS(moveinfo.endfunc), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"lip", STOFS(lip), F_INT, FFL_SPAWNTEMP},
|
||||
{"distance", STOFS(distance), F_INT, FFL_SPAWNTEMP},
|
||||
{"height", STOFS(height), F_INT, FFL_SPAWNTEMP},
|
||||
{"noise", STOFS(noise), F_LSTRING, FFL_SPAWNTEMP},
|
||||
{"pausetime", STOFS(pausetime), F_FLOAT, FFL_SPAWNTEMP},
|
||||
{"item", STOFS(item), F_LSTRING, FFL_SPAWNTEMP},
|
||||
{"item", FOFS(item), F_ITEM},
|
||||
{"gravity", STOFS(gravity), F_LSTRING, FFL_SPAWNTEMP},
|
||||
{"sky", STOFS(sky), F_LSTRING, FFL_SPAWNTEMP},
|
||||
{"skyrotate", STOFS(skyrotate), F_FLOAT, FFL_SPAWNTEMP},
|
||||
{"skyaxis", STOFS(skyaxis), F_VECTOR, FFL_SPAWNTEMP},
|
||||
{"minyaw", STOFS(minyaw), F_FLOAT, FFL_SPAWNTEMP},
|
||||
{"maxyaw", STOFS(maxyaw), F_FLOAT, FFL_SPAWNTEMP},
|
||||
{"minpitch", STOFS(minpitch), F_FLOAT, FFL_SPAWNTEMP},
|
||||
{"maxpitch", STOFS(maxpitch), F_FLOAT, FFL_SPAWNTEMP},
|
||||
{"nextmap", STOFS(nextmap), F_LSTRING, FFL_SPAWNTEMP},
|
||||
{"bad_area", FOFS(bad_area), F_EDICT},
|
||||
{"hint_chain", FOFS(hint_chain), F_EDICT},
|
||||
{"monster_hint_chain", FOFS(monster_hint_chain), F_EDICT},
|
||||
{"target_hint_chain", FOFS(target_hint_chain), F_EDICT},
|
||||
{"goal_hint", FOFS(monsterinfo.goal_hint), F_EDICT},
|
||||
{"badMedic1", FOFS(monsterinfo.badMedic1), F_EDICT},
|
||||
{"badMedic2", FOFS(monsterinfo.badMedic2), F_EDICT},
|
||||
{"last_player_enemy", FOFS(monsterinfo.last_player_enemy), F_EDICT},
|
||||
{"commander", FOFS(monsterinfo.commander), F_EDICT},
|
||||
{"blocked", FOFS(monsterinfo.blocked), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"duck", FOFS(monsterinfo.duck), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"unduck", FOFS(monsterinfo.unduck), F_FUNCTION, FFL_NOSPAWN},
|
||||
{"sidestep", FOFS(monsterinfo.sidestep), F_FUNCTION, FFL_NOSPAWN},
|
||||
{0, 0, 0, 0}
|
1495
src/savegame/tables/gamefunc_decs.h
Normal file
1495
src/savegame/tables/gamefunc_decs.h
Normal file
File diff suppressed because it is too large
Load diff
1496
src/savegame/tables/gamefunc_list.h
Normal file
1496
src/savegame/tables/gamefunc_list.h
Normal file
File diff suppressed because it is too large
Load diff
372
src/savegame/tables/gamemmove_decs.h
Normal file
372
src/savegame/tables/gamemmove_decs.h
Normal file
|
@ -0,0 +1,372 @@
|
|||
/*
|
||||
* =======================================================================
|
||||
*
|
||||
* Prototypes for every mmove_t in the game.so.
|
||||
*
|
||||
* =======================================================================
|
||||
*/
|
||||
|
||||
extern mmove_t widow2_move_really_dead ;
|
||||
extern mmove_t widow2_move_dead ;
|
||||
extern mmove_t widow2_move_death ;
|
||||
extern mmove_t widow2_move_pain ;
|
||||
extern mmove_t widow2_move_tongs ;
|
||||
extern mmove_t widow2_move_spawn ;
|
||||
extern mmove_t widow2_move_attack_disrupt ;
|
||||
extern mmove_t widow2_move_attack_post_beam ;
|
||||
extern mmove_t widow2_move_attack_beam ;
|
||||
extern mmove_t widow2_move_attack_pre_beam ;
|
||||
extern mmove_t widow2_move_run ;
|
||||
extern mmove_t widow2_move_walk ;
|
||||
extern mmove_t widow2_move_stand ;
|
||||
extern mmove_t widow_move_attack_kick ;
|
||||
extern mmove_t widow_move_death ;
|
||||
extern mmove_t widow_move_pain_light ;
|
||||
extern mmove_t widow_move_pain_heavy ;
|
||||
extern mmove_t widow_move_spawn ;
|
||||
extern mmove_t widow_move_attack_pre_rail ;
|
||||
extern mmove_t widow_move_attack_rail_r ;
|
||||
extern mmove_t widow_move_attack_rail_l ;
|
||||
extern mmove_t widow_move_attack_rail ;
|
||||
extern mmove_t widow_move_attack_pre_blaster ;
|
||||
extern mmove_t widow_move_run_attack ;
|
||||
extern mmove_t widow_move_run ;
|
||||
extern mmove_t widow_move_walk ;
|
||||
extern mmove_t widow_move_stand ;
|
||||
extern mmove_t widow_move_attack_blaster ;
|
||||
extern mmove_t widow_move_attack_post_blaster_l ;
|
||||
extern mmove_t widow_move_attack_post_blaster_r ;
|
||||
extern mmove_t widow_move_attack_post_blaster ;
|
||||
extern mmove_t turret_move_run ;
|
||||
extern mmove_t turret_move_seek ;
|
||||
extern mmove_t turret_move_ready_gun ;
|
||||
extern mmove_t turret_move_stand ;
|
||||
extern mmove_t turret_move_fire_blind ;
|
||||
extern mmove_t turret_move_fire ;
|
||||
extern mmove_t tank_move_death ;
|
||||
extern mmove_t tank_move_attack_chain ;
|
||||
extern mmove_t tank_move_attack_post_rocket ;
|
||||
extern mmove_t tank_move_attack_fire_rocket ;
|
||||
extern mmove_t tank_move_attack_pre_rocket ;
|
||||
extern mmove_t tank_move_attack_strike ;
|
||||
extern mmove_t tank_move_attack_post_blast ;
|
||||
extern mmove_t tank_move_reattack_blast ;
|
||||
extern mmove_t tank_move_attack_blast ;
|
||||
extern mmove_t tank_move_pain3 ;
|
||||
extern mmove_t tank_move_pain2 ;
|
||||
extern mmove_t tank_move_pain1 ;
|
||||
extern mmove_t tank_move_stop_run ;
|
||||
extern mmove_t tank_move_run ;
|
||||
extern mmove_t tank_move_start_run ;
|
||||
extern mmove_t tank_move_stop_walk ;
|
||||
extern mmove_t tank_move_walk ;
|
||||
extern mmove_t tank_move_start_walk ;
|
||||
extern mmove_t tank_move_stand ;
|
||||
extern mmove_t supertank_move_end_attack1 ;
|
||||
extern mmove_t supertank_move_attack1 ;
|
||||
extern mmove_t supertank_move_attack2 ;
|
||||
extern mmove_t supertank_move_attack3 ;
|
||||
extern mmove_t supertank_move_attack4 ;
|
||||
extern mmove_t supertank_move_backward ;
|
||||
extern mmove_t supertank_move_death ;
|
||||
extern mmove_t supertank_move_pain1 ;
|
||||
extern mmove_t supertank_move_pain2 ;
|
||||
extern mmove_t supertank_move_pain3 ;
|
||||
extern mmove_t supertank_move_turn_left ;
|
||||
extern mmove_t supertank_move_turn_right ;
|
||||
extern mmove_t supertank_move_forward ;
|
||||
extern mmove_t supertank_move_run ;
|
||||
extern mmove_t supertank_move_stand ;
|
||||
extern mmove_t stalker_move_death ;
|
||||
extern mmove_t stalker_move_jump_down ;
|
||||
extern mmove_t stalker_move_jump_up ;
|
||||
extern mmove_t stalker_move_dodge_run ;
|
||||
extern mmove_t stalker_move_jump_straightup ;
|
||||
extern mmove_t stalker_move_swing_r ;
|
||||
extern mmove_t stalker_move_swing_l ;
|
||||
extern mmove_t stalker_move_shoot ;
|
||||
extern mmove_t stalker_move_pain ;
|
||||
extern mmove_t stalker_move_false_death_start ;
|
||||
extern mmove_t stalker_move_false_death ;
|
||||
extern mmove_t stalker_move_false_death_end ;
|
||||
extern mmove_t stalker_move_walk ;
|
||||
extern mmove_t stalker_move_run ;
|
||||
extern mmove_t stalker_move_stand ;
|
||||
extern mmove_t stalker_move_idle2 ;
|
||||
extern mmove_t stalker_move_idle ;
|
||||
extern mmove_t soldier_move_blind ;
|
||||
extern mmove_t soldier_move_death6 ;
|
||||
extern mmove_t soldier_move_death5 ;
|
||||
extern mmove_t soldier_move_death4 ;
|
||||
extern mmove_t soldier_move_death3 ;
|
||||
extern mmove_t soldier_move_death2 ;
|
||||
extern mmove_t soldier_move_death1 ;
|
||||
extern mmove_t soldier_move_duck ;
|
||||
extern mmove_t soldier_move_attack6 ;
|
||||
extern mmove_t soldier_move_attack4 ;
|
||||
extern mmove_t soldier_move_attack3 ;
|
||||
extern mmove_t soldier_move_attack2 ;
|
||||
extern mmove_t soldier_move_attack1 ;
|
||||
extern mmove_t soldier_move_pain4 ;
|
||||
extern mmove_t soldier_move_pain3 ;
|
||||
extern mmove_t soldier_move_pain2 ;
|
||||
extern mmove_t soldier_move_pain1 ;
|
||||
extern mmove_t soldier_move_run ;
|
||||
extern mmove_t soldier_move_start_run ;
|
||||
extern mmove_t soldier_move_walk2 ;
|
||||
extern mmove_t soldier_move_walk1 ;
|
||||
extern mmove_t soldier_move_stand3 ;
|
||||
extern mmove_t soldier_move_stand1 ;
|
||||
extern mmove_t parasite_move_death ;
|
||||
extern mmove_t parasite_move_jump_down ;
|
||||
extern mmove_t parasite_move_jump_up ;
|
||||
extern mmove_t parasite_move_break ;
|
||||
extern mmove_t parasite_move_drain ;
|
||||
extern mmove_t parasite_move_pain1 ;
|
||||
extern mmove_t parasite_move_stop_walk ;
|
||||
extern mmove_t parasite_move_start_walk ;
|
||||
extern mmove_t parasite_move_walk ;
|
||||
extern mmove_t parasite_move_stop_run ;
|
||||
extern mmove_t parasite_move_start_run ;
|
||||
extern mmove_t parasite_move_run ;
|
||||
extern mmove_t parasite_move_stand ;
|
||||
extern mmove_t parasite_move_end_fidget ;
|
||||
extern mmove_t parasite_move_fidget ;
|
||||
extern mmove_t parasite_move_start_fidget ;
|
||||
extern mmove_t mutant_move_death2 ;
|
||||
extern mmove_t mutant_move_death1 ;
|
||||
extern mmove_t mutant_move_pain3 ;
|
||||
extern mmove_t mutant_move_pain2 ;
|
||||
extern mmove_t mutant_move_pain1 ;
|
||||
extern mmove_t mutant_move_jump ;
|
||||
extern mmove_t mutant_move_attack ;
|
||||
extern mmove_t mutant_move_run ;
|
||||
extern mmove_t mutant_move_start_walk ;
|
||||
extern mmove_t mutant_move_walk ;
|
||||
extern mmove_t mutant_move_idle ;
|
||||
extern mmove_t mutant_move_stand ;
|
||||
extern mmove_t medic_move_attackCable ;
|
||||
extern mmove_t medic_move_attackBlaster ;
|
||||
extern mmove_t medic_move_attackHyperBlaster ;
|
||||
extern mmove_t medic_move_duck ;
|
||||
extern mmove_t medic_move_death ;
|
||||
extern mmove_t medic_move_pain2 ;
|
||||
extern mmove_t medic_move_pain1 ;
|
||||
extern mmove_t medic_move_run ;
|
||||
extern mmove_t medic_move_walk ;
|
||||
extern mmove_t medic_move_stand ;
|
||||
extern mmove_t insane_move_struggle_cross ;
|
||||
extern mmove_t insane_move_cross ;
|
||||
extern mmove_t insane_move_crawl_death ;
|
||||
extern mmove_t insane_move_crawl_pain ;
|
||||
extern mmove_t insane_move_runcrawl ;
|
||||
extern mmove_t insane_move_crawl ;
|
||||
extern mmove_t insane_move_stand_death ;
|
||||
extern mmove_t insane_move_stand_pain ;
|
||||
extern mmove_t insane_move_run_insane ;
|
||||
extern mmove_t insane_move_walk_insane ;
|
||||
extern mmove_t insane_move_run_normal ;
|
||||
extern mmove_t insane_move_walk_normal ;
|
||||
extern mmove_t insane_move_down ;
|
||||
extern mmove_t insane_move_jumpdown ;
|
||||
extern mmove_t insane_move_downtoup ;
|
||||
extern mmove_t insane_move_uptodown ;
|
||||
extern mmove_t insane_move_stand_insane ;
|
||||
extern mmove_t insane_move_stand_normal ;
|
||||
extern mmove_t infantry_move_jump2 ;
|
||||
extern mmove_t infantry_move_jump ;
|
||||
extern mmove_t infantry_move_attack2 ;
|
||||
extern mmove_t infantry_move_attack1 ;
|
||||
extern mmove_t infantry_move_duck ;
|
||||
extern mmove_t infantry_move_death3 ;
|
||||
extern mmove_t infantry_move_death2 ;
|
||||
extern mmove_t infantry_move_death1 ;
|
||||
extern mmove_t infantry_move_pain2 ;
|
||||
extern mmove_t infantry_move_pain1 ;
|
||||
extern mmove_t infantry_move_run ;
|
||||
extern mmove_t infantry_move_walk ;
|
||||
extern mmove_t infantry_move_fidget ;
|
||||
extern mmove_t infantry_move_stand ;
|
||||
extern mmove_t hover_move_end_attack ;
|
||||
extern mmove_t hover_move_attack1 ;
|
||||
extern mmove_t hover_move_start_attack ;
|
||||
extern mmove_t hover_move_backward ;
|
||||
extern mmove_t hover_move_death1 ;
|
||||
extern mmove_t hover_move_run ;
|
||||
extern mmove_t hover_move_walk ;
|
||||
extern mmove_t hover_move_forward ;
|
||||
extern mmove_t hover_move_land ;
|
||||
extern mmove_t hover_move_pain1 ;
|
||||
extern mmove_t hover_move_pain2 ;
|
||||
extern mmove_t hover_move_pain3 ;
|
||||
extern mmove_t hover_move_takeoff ;
|
||||
extern mmove_t hover_move_stop2 ;
|
||||
extern mmove_t hover_move_stop1 ;
|
||||
extern mmove_t hover_move_stand ;
|
||||
extern mmove_t gunner_move_jump2 ;
|
||||
extern mmove_t gunner_move_jump ;
|
||||
extern mmove_t gunner_move_attack_grenade ;
|
||||
extern mmove_t gunner_move_endfire_chain ;
|
||||
extern mmove_t gunner_move_fire_chain ;
|
||||
extern mmove_t gunner_move_attack_chain ;
|
||||
extern mmove_t gunner_move_duck ;
|
||||
extern mmove_t gunner_move_death ;
|
||||
extern mmove_t gunner_move_pain1 ;
|
||||
extern mmove_t gunner_move_pain2 ;
|
||||
extern mmove_t gunner_move_pain3 ;
|
||||
extern mmove_t gunner_move_runandshoot ;
|
||||
extern mmove_t gunner_move_run ;
|
||||
extern mmove_t gunner_move_walk ;
|
||||
extern mmove_t gunner_move_stand ;
|
||||
extern mmove_t gunner_move_fidget ;
|
||||
extern mmove_t gladiator_move_death ;
|
||||
extern mmove_t gladiator_move_pain_air ;
|
||||
extern mmove_t gladiator_move_pain ;
|
||||
extern mmove_t gladiator_move_attack_gun ;
|
||||
extern mmove_t gladiator_move_attack_melee ;
|
||||
extern mmove_t gladiator_move_run ;
|
||||
extern mmove_t gladiator_move_walk ;
|
||||
extern mmove_t gladiator_move_stand ;
|
||||
extern mmove_t flyer_move_loop_melee ;
|
||||
extern mmove_t flyer_move_end_melee ;
|
||||
extern mmove_t flyer_move_start_melee ;
|
||||
extern mmove_t flyer_move_attack3 ;
|
||||
extern mmove_t flyer_move_attack2 ;
|
||||
extern mmove_t flyer_move_bankleft ;
|
||||
extern mmove_t flyer_move_bankright ;
|
||||
extern mmove_t flyer_move_defense ;
|
||||
extern mmove_t flyer_move_pain1 ;
|
||||
extern mmove_t flyer_move_pain2 ;
|
||||
extern mmove_t flyer_move_pain3 ;
|
||||
extern mmove_t flyer_move_rollleft ;
|
||||
extern mmove_t flyer_move_rollright ;
|
||||
extern mmove_t flyer_move_stop ;
|
||||
extern mmove_t flyer_move_start ;
|
||||
extern mmove_t flyer_move_kamikaze ;
|
||||
extern mmove_t flyer_move_run ;
|
||||
extern mmove_t flyer_move_walk ;
|
||||
extern mmove_t flyer_move_stand ;
|
||||
extern mmove_t floater_move_run ;
|
||||
extern mmove_t floater_move_walk ;
|
||||
extern mmove_t floater_move_pain3 ;
|
||||
extern mmove_t floater_move_pain2 ;
|
||||
extern mmove_t floater_move_pain1 ;
|
||||
extern mmove_t floater_move_death ;
|
||||
extern mmove_t floater_move_attack3 ;
|
||||
extern mmove_t floater_move_attack2 ;
|
||||
extern mmove_t floater_move_attack1 ;
|
||||
extern mmove_t floater_move_activate ;
|
||||
extern mmove_t floater_move_stand2 ;
|
||||
extern mmove_t floater_move_stand1 ;
|
||||
extern mmove_t flipper_move_death ;
|
||||
extern mmove_t flipper_move_attack ;
|
||||
extern mmove_t flipper_move_pain1 ;
|
||||
extern mmove_t flipper_move_pain2 ;
|
||||
extern mmove_t flipper_move_start_run ;
|
||||
extern mmove_t flipper_move_walk ;
|
||||
extern mmove_t flipper_move_run_start ;
|
||||
extern mmove_t flipper_move_run_loop ;
|
||||
extern mmove_t flipper_move_stand ;
|
||||
extern mmove_t chick_move_start_slash ;
|
||||
extern mmove_t chick_move_end_slash ;
|
||||
extern mmove_t chick_move_slash ;
|
||||
extern mmove_t chick_move_end_attack1 ;
|
||||
extern mmove_t chick_move_attack1 ;
|
||||
extern mmove_t chick_move_start_attack1 ;
|
||||
extern mmove_t chick_move_duck ;
|
||||
extern mmove_t chick_move_death1 ;
|
||||
extern mmove_t chick_move_death2 ;
|
||||
extern mmove_t chick_move_pain3 ;
|
||||
extern mmove_t chick_move_pain2 ;
|
||||
extern mmove_t chick_move_pain1 ;
|
||||
extern mmove_t chick_move_walk ;
|
||||
extern mmove_t chick_move_run ;
|
||||
extern mmove_t chick_move_start_run ;
|
||||
extern mmove_t chick_move_stand ;
|
||||
extern mmove_t chick_move_fidget ;
|
||||
extern mmove_t carrier_move_death ;
|
||||
extern mmove_t carrier_move_pain_light ;
|
||||
extern mmove_t carrier_move_pain_heavy ;
|
||||
extern mmove_t carrier_move_spawn ;
|
||||
extern mmove_t carrier_move_attack_rail ;
|
||||
extern mmove_t carrier_move_attack_rocket ;
|
||||
extern mmove_t carrier_move_attack_post_gren ;
|
||||
extern mmove_t carrier_move_attack_gren ;
|
||||
extern mmove_t carrier_move_attack_pre_gren ;
|
||||
extern mmove_t carrier_move_attack_post_mg ;
|
||||
extern mmove_t carrier_move_attack_mg ;
|
||||
extern mmove_t carrier_move_attack_pre_mg ;
|
||||
extern mmove_t carrier_move_run ;
|
||||
extern mmove_t carrier_move_walk ;
|
||||
extern mmove_t carrier_move_stand ;
|
||||
extern mmove_t brain_move_run ;
|
||||
extern mmove_t brain_move_attack2 ;
|
||||
extern mmove_t brain_move_attack1 ;
|
||||
extern mmove_t brain_move_death1 ;
|
||||
extern mmove_t brain_move_death2 ;
|
||||
extern mmove_t brain_move_duck ;
|
||||
extern mmove_t brain_move_pain1 ;
|
||||
extern mmove_t brain_move_pain2 ;
|
||||
extern mmove_t brain_move_pain3 ;
|
||||
extern mmove_t brain_move_defense ;
|
||||
extern mmove_t brain_move_walk1 ;
|
||||
extern mmove_t brain_move_idle ;
|
||||
extern mmove_t brain_move_stand ;
|
||||
extern mmove_t makron_move_attack5 ;
|
||||
extern mmove_t makron_move_attack4 ;
|
||||
extern mmove_t makron_move_attack3 ;
|
||||
extern mmove_t makron_move_sight ;
|
||||
extern mmove_t makron_move_death3 ;
|
||||
extern mmove_t makron_move_death2 ;
|
||||
extern mmove_t makron_move_pain4 ;
|
||||
extern mmove_t makron_move_pain5 ;
|
||||
extern mmove_t makron_move_pain6 ;
|
||||
extern mmove_t makron_move_walk ;
|
||||
extern mmove_t makron_move_run ;
|
||||
extern mmove_t makron_move_stand ;
|
||||
extern mmove_t jorg_move_end_attack1 ;
|
||||
extern mmove_t jorg_move_attack1 ;
|
||||
extern mmove_t jorg_move_start_attack1 ;
|
||||
extern mmove_t jorg_move_attack2 ;
|
||||
extern mmove_t jorg_move_death ;
|
||||
extern mmove_t jorg_move_pain1 ;
|
||||
extern mmove_t jorg_move_pain2 ;
|
||||
extern mmove_t jorg_move_pain3 ;
|
||||
extern mmove_t jorg_move_end_walk ;
|
||||
extern mmove_t jorg_move_walk ;
|
||||
extern mmove_t jorg_move_start_walk ;
|
||||
extern mmove_t jorg_move_run ;
|
||||
extern mmove_t jorg_move_stand ;
|
||||
extern mmove_t boss2_move_death ;
|
||||
extern mmove_t boss2_move_pain_light ;
|
||||
extern mmove_t boss2_move_pain_heavy ;
|
||||
extern mmove_t boss2_move_attack_rocket ;
|
||||
extern mmove_t boss2_move_attack_post_mg ;
|
||||
extern mmove_t boss2_move_attack_mg ;
|
||||
extern mmove_t boss2_move_attack_pre_mg ;
|
||||
extern mmove_t boss2_move_run ;
|
||||
extern mmove_t boss2_move_walk ;
|
||||
extern mmove_t boss2_move_fidget ;
|
||||
extern mmove_t boss2_move_stand ;
|
||||
extern mmove_t berserk_move_death2 ;
|
||||
extern mmove_t berserk_move_death1 ;
|
||||
extern mmove_t berserk_move_pain2 ;
|
||||
extern mmove_t berserk_move_pain1 ;
|
||||
extern mmove_t berserk_move_attack_strike ;
|
||||
extern mmove_t berserk_move_attack_club ;
|
||||
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 actor_move_attack ;
|
||||
extern mmove_t actor_move_death2 ;
|
||||
extern mmove_t actor_move_death1 ;
|
||||
extern mmove_t actor_move_taunt ;
|
||||
extern mmove_t actor_move_flipoff ;
|
||||
extern mmove_t actor_move_pain3 ;
|
||||
extern mmove_t actor_move_pain2 ;
|
||||
extern mmove_t actor_move_pain1 ;
|
||||
extern mmove_t actor_move_run ;
|
||||
extern mmove_t actor_move_walk ;
|
||||
extern mmove_t actor_move_stand ;
|
373
src/savegame/tables/gamemmove_list.h
Normal file
373
src/savegame/tables/gamemmove_list.h
Normal file
|
@ -0,0 +1,373 @@
|
|||
/*
|
||||
* =======================================================================
|
||||
*
|
||||
* Pointers to every mmove_t in the game.so.
|
||||
*
|
||||
* =======================================================================
|
||||
*/
|
||||
|
||||
{"widow2_move_really_dead", &widow2_move_really_dead},
|
||||
{"widow2_move_dead", &widow2_move_dead},
|
||||
{"widow2_move_death", &widow2_move_death},
|
||||
{"widow2_move_pain", &widow2_move_pain},
|
||||
{"widow2_move_tongs", &widow2_move_tongs},
|
||||
{"widow2_move_spawn", &widow2_move_spawn},
|
||||
{"widow2_move_attack_disrupt", &widow2_move_attack_disrupt},
|
||||
{"widow2_move_attack_post_beam", &widow2_move_attack_post_beam},
|
||||
{"widow2_move_attack_beam", &widow2_move_attack_beam},
|
||||
{"widow2_move_attack_pre_beam", &widow2_move_attack_pre_beam},
|
||||
{"widow2_move_run", &widow2_move_run},
|
||||
{"widow2_move_walk", &widow2_move_walk},
|
||||
{"widow2_move_stand", &widow2_move_stand},
|
||||
{"widow_move_attack_kick", &widow_move_attack_kick},
|
||||
{"widow_move_death", &widow_move_death},
|
||||
{"widow_move_pain_light", &widow_move_pain_light},
|
||||
{"widow_move_pain_heavy", &widow_move_pain_heavy},
|
||||
{"widow_move_spawn", &widow_move_spawn},
|
||||
{"widow_move_attack_pre_rail", &widow_move_attack_pre_rail},
|
||||
{"widow_move_attack_rail_r", &widow_move_attack_rail_r},
|
||||
{"widow_move_attack_rail_l", &widow_move_attack_rail_l},
|
||||
{"widow_move_attack_rail", &widow_move_attack_rail},
|
||||
{"widow_move_attack_pre_blaster", &widow_move_attack_pre_blaster},
|
||||
{"widow_move_run_attack", &widow_move_run_attack},
|
||||
{"widow_move_run", &widow_move_run},
|
||||
{"widow_move_walk", &widow_move_walk},
|
||||
{"widow_move_stand", &widow_move_stand},
|
||||
{"widow_move_attack_blaster", &widow_move_attack_blaster},
|
||||
{"widow_move_attack_post_blaster_l", &widow_move_attack_post_blaster_l},
|
||||
{"widow_move_attack_post_blaster_r", &widow_move_attack_post_blaster_r},
|
||||
{"widow_move_attack_post_blaster", &widow_move_attack_post_blaster},
|
||||
{"turret_move_run", &turret_move_run},
|
||||
{"turret_move_seek", &turret_move_seek},
|
||||
{"turret_move_ready_gun", &turret_move_ready_gun},
|
||||
{"turret_move_stand", &turret_move_stand},
|
||||
{"turret_move_fire_blind", &turret_move_fire_blind},
|
||||
{"turret_move_fire", &turret_move_fire},
|
||||
{"tank_move_death", &tank_move_death},
|
||||
{"tank_move_attack_chain", &tank_move_attack_chain},
|
||||
{"tank_move_attack_post_rocket", &tank_move_attack_post_rocket},
|
||||
{"tank_move_attack_fire_rocket", &tank_move_attack_fire_rocket},
|
||||
{"tank_move_attack_pre_rocket", &tank_move_attack_pre_rocket},
|
||||
{"tank_move_attack_strike", &tank_move_attack_strike},
|
||||
{"tank_move_attack_post_blast", &tank_move_attack_post_blast},
|
||||
{"tank_move_reattack_blast", &tank_move_reattack_blast},
|
||||
{"tank_move_attack_blast", &tank_move_attack_blast},
|
||||
{"tank_move_pain3", &tank_move_pain3},
|
||||
{"tank_move_pain2", &tank_move_pain2},
|
||||
{"tank_move_pain1", &tank_move_pain1},
|
||||
{"tank_move_stop_run", &tank_move_stop_run},
|
||||
{"tank_move_run", &tank_move_run},
|
||||
{"tank_move_start_run", &tank_move_start_run},
|
||||
{"tank_move_stop_walk", &tank_move_stop_walk},
|
||||
{"tank_move_walk", &tank_move_walk},
|
||||
{"tank_move_start_walk", &tank_move_start_walk},
|
||||
{"tank_move_stand", &tank_move_stand},
|
||||
{"supertank_move_end_attack1", &supertank_move_end_attack1},
|
||||
{"supertank_move_attack1", &supertank_move_attack1},
|
||||
{"supertank_move_attack2", &supertank_move_attack2},
|
||||
{"supertank_move_attack3", &supertank_move_attack3},
|
||||
{"supertank_move_attack4", &supertank_move_attack4},
|
||||
{"supertank_move_backward", &supertank_move_backward},
|
||||
{"supertank_move_death", &supertank_move_death},
|
||||
{"supertank_move_pain1", &supertank_move_pain1},
|
||||
{"supertank_move_pain2", &supertank_move_pain2},
|
||||
{"supertank_move_pain3", &supertank_move_pain3},
|
||||
{"supertank_move_turn_left", &supertank_move_turn_left},
|
||||
{"supertank_move_turn_right", &supertank_move_turn_right},
|
||||
{"supertank_move_forward", &supertank_move_forward},
|
||||
{"supertank_move_run", &supertank_move_run},
|
||||
{"supertank_move_stand", &supertank_move_stand},
|
||||
{"stalker_move_death", &stalker_move_death},
|
||||
{"stalker_move_jump_down", &stalker_move_jump_down},
|
||||
{"stalker_move_jump_up", &stalker_move_jump_up},
|
||||
{"stalker_move_dodge_run", &stalker_move_dodge_run},
|
||||
{"stalker_move_jump_straightup", &stalker_move_jump_straightup},
|
||||
{"stalker_move_swing_r", &stalker_move_swing_r},
|
||||
{"stalker_move_swing_l", &stalker_move_swing_l},
|
||||
{"stalker_move_shoot", &stalker_move_shoot},
|
||||
{"stalker_move_pain", &stalker_move_pain},
|
||||
{"stalker_move_false_death_start", &stalker_move_false_death_start},
|
||||
{"stalker_move_false_death", &stalker_move_false_death},
|
||||
{"stalker_move_false_death_end", &stalker_move_false_death_end},
|
||||
{"stalker_move_walk", &stalker_move_walk},
|
||||
{"stalker_move_run", &stalker_move_run},
|
||||
{"stalker_move_stand", &stalker_move_stand},
|
||||
{"stalker_move_idle2", &stalker_move_idle2},
|
||||
{"stalker_move_idle", &stalker_move_idle},
|
||||
{"soldier_move_blind", &soldier_move_blind},
|
||||
{"soldier_move_death6", &soldier_move_death6},
|
||||
{"soldier_move_death5", &soldier_move_death5},
|
||||
{"soldier_move_death4", &soldier_move_death4},
|
||||
{"soldier_move_death3", &soldier_move_death3},
|
||||
{"soldier_move_death2", &soldier_move_death2},
|
||||
{"soldier_move_death1", &soldier_move_death1},
|
||||
{"soldier_move_duck", &soldier_move_duck},
|
||||
{"soldier_move_attack6", &soldier_move_attack6},
|
||||
{"soldier_move_attack4", &soldier_move_attack4},
|
||||
{"soldier_move_attack3", &soldier_move_attack3},
|
||||
{"soldier_move_attack2", &soldier_move_attack2},
|
||||
{"soldier_move_attack1", &soldier_move_attack1},
|
||||
{"soldier_move_pain4", &soldier_move_pain4},
|
||||
{"soldier_move_pain3", &soldier_move_pain3},
|
||||
{"soldier_move_pain2", &soldier_move_pain2},
|
||||
{"soldier_move_pain1", &soldier_move_pain1},
|
||||
{"soldier_move_run", &soldier_move_run},
|
||||
{"soldier_move_start_run", &soldier_move_start_run},
|
||||
{"soldier_move_walk2", &soldier_move_walk2},
|
||||
{"soldier_move_walk1", &soldier_move_walk1},
|
||||
{"soldier_move_stand3", &soldier_move_stand3},
|
||||
{"soldier_move_stand1", &soldier_move_stand1},
|
||||
{"parasite_move_death", ¶site_move_death},
|
||||
{"parasite_move_jump_down", ¶site_move_jump_down},
|
||||
{"parasite_move_jump_up", ¶site_move_jump_up},
|
||||
{"parasite_move_break", ¶site_move_break},
|
||||
{"parasite_move_drain", ¶site_move_drain},
|
||||
{"parasite_move_pain1", ¶site_move_pain1},
|
||||
{"parasite_move_stop_walk", ¶site_move_stop_walk},
|
||||
{"parasite_move_start_walk", ¶site_move_start_walk},
|
||||
{"parasite_move_walk", ¶site_move_walk},
|
||||
{"parasite_move_stop_run", ¶site_move_stop_run},
|
||||
{"parasite_move_start_run", ¶site_move_start_run},
|
||||
{"parasite_move_run", ¶site_move_run},
|
||||
{"parasite_move_stand", ¶site_move_stand},
|
||||
{"parasite_move_end_fidget", ¶site_move_end_fidget},
|
||||
{"parasite_move_fidget", ¶site_move_fidget},
|
||||
{"parasite_move_start_fidget", ¶site_move_start_fidget},
|
||||
{"mutant_move_death2", &mutant_move_death2},
|
||||
{"mutant_move_death1", &mutant_move_death1},
|
||||
{"mutant_move_pain3", &mutant_move_pain3},
|
||||
{"mutant_move_pain2", &mutant_move_pain2},
|
||||
{"mutant_move_pain1", &mutant_move_pain1},
|
||||
{"mutant_move_jump", &mutant_move_jump},
|
||||
{"mutant_move_attack", &mutant_move_attack},
|
||||
{"mutant_move_run", &mutant_move_run},
|
||||
{"mutant_move_start_walk", &mutant_move_start_walk},
|
||||
{"mutant_move_walk", &mutant_move_walk},
|
||||
{"mutant_move_idle", &mutant_move_idle},
|
||||
{"mutant_move_stand", &mutant_move_stand},
|
||||
{"medic_move_attackCable", &medic_move_attackCable},
|
||||
{"medic_move_attackBlaster", &medic_move_attackBlaster},
|
||||
{"medic_move_attackHyperBlaster", &medic_move_attackHyperBlaster},
|
||||
{"medic_move_duck", &medic_move_duck},
|
||||
{"medic_move_death", &medic_move_death},
|
||||
{"medic_move_pain2", &medic_move_pain2},
|
||||
{"medic_move_pain1", &medic_move_pain1},
|
||||
{"medic_move_run", &medic_move_run},
|
||||
{"medic_move_walk", &medic_move_walk},
|
||||
{"medic_move_stand", &medic_move_stand},
|
||||
{"insane_move_struggle_cross", &insane_move_struggle_cross},
|
||||
{"insane_move_cross", &insane_move_cross},
|
||||
{"insane_move_crawl_death", &insane_move_crawl_death},
|
||||
{"insane_move_crawl_pain", &insane_move_crawl_pain},
|
||||
{"insane_move_runcrawl", &insane_move_runcrawl},
|
||||
{"insane_move_crawl", &insane_move_crawl},
|
||||
{"insane_move_stand_death", &insane_move_stand_death},
|
||||
{"insane_move_stand_pain", &insane_move_stand_pain},
|
||||
{"insane_move_run_insane", &insane_move_run_insane},
|
||||
{"insane_move_walk_insane", &insane_move_walk_insane},
|
||||
{"insane_move_run_normal", &insane_move_run_normal},
|
||||
{"insane_move_walk_normal", &insane_move_walk_normal},
|
||||
{"insane_move_down", &insane_move_down},
|
||||
{"insane_move_jumpdown", &insane_move_jumpdown},
|
||||
{"insane_move_downtoup", &insane_move_downtoup},
|
||||
{"insane_move_uptodown", &insane_move_uptodown},
|
||||
{"insane_move_stand_insane", &insane_move_stand_insane},
|
||||
{"insane_move_stand_normal", &insane_move_stand_normal},
|
||||
{"infantry_move_jump2", &infantry_move_jump2},
|
||||
{"infantry_move_jump", &infantry_move_jump},
|
||||
{"infantry_move_attack2", &infantry_move_attack2},
|
||||
{"infantry_move_attack1", &infantry_move_attack1},
|
||||
{"infantry_move_duck", &infantry_move_duck},
|
||||
{"infantry_move_death3", &infantry_move_death3},
|
||||
{"infantry_move_death2", &infantry_move_death2},
|
||||
{"infantry_move_death1", &infantry_move_death1},
|
||||
{"infantry_move_pain2", &infantry_move_pain2},
|
||||
{"infantry_move_pain1", &infantry_move_pain1},
|
||||
{"infantry_move_run", &infantry_move_run},
|
||||
{"infantry_move_walk", &infantry_move_walk},
|
||||
{"infantry_move_fidget", &infantry_move_fidget},
|
||||
{"infantry_move_stand", &infantry_move_stand},
|
||||
{"hover_move_end_attack", &hover_move_end_attack},
|
||||
{"hover_move_attack1", &hover_move_attack1},
|
||||
{"hover_move_start_attack", &hover_move_start_attack},
|
||||
{"hover_move_backward", &hover_move_backward},
|
||||
{"hover_move_death1", &hover_move_death1},
|
||||
{"hover_move_run", &hover_move_run},
|
||||
{"hover_move_walk", &hover_move_walk},
|
||||
{"hover_move_forward", &hover_move_forward},
|
||||
{"hover_move_land", &hover_move_land},
|
||||
{"hover_move_pain1", &hover_move_pain1},
|
||||
{"hover_move_pain2", &hover_move_pain2},
|
||||
{"hover_move_pain3", &hover_move_pain3},
|
||||
{"hover_move_takeoff", &hover_move_takeoff},
|
||||
{"hover_move_stop2", &hover_move_stop2},
|
||||
{"hover_move_stop1", &hover_move_stop1},
|
||||
{"hover_move_stand", &hover_move_stand},
|
||||
{"gunner_move_jump2", &gunner_move_jump2},
|
||||
{"gunner_move_jump", &gunner_move_jump},
|
||||
{"gunner_move_attack_grenade", &gunner_move_attack_grenade},
|
||||
{"gunner_move_endfire_chain", &gunner_move_endfire_chain},
|
||||
{"gunner_move_fire_chain", &gunner_move_fire_chain},
|
||||
{"gunner_move_attack_chain", &gunner_move_attack_chain},
|
||||
{"gunner_move_duck", &gunner_move_duck},
|
||||
{"gunner_move_death", &gunner_move_death},
|
||||
{"gunner_move_pain1", &gunner_move_pain1},
|
||||
{"gunner_move_pain2", &gunner_move_pain2},
|
||||
{"gunner_move_pain3", &gunner_move_pain3},
|
||||
{"gunner_move_runandshoot", &gunner_move_runandshoot},
|
||||
{"gunner_move_run", &gunner_move_run},
|
||||
{"gunner_move_walk", &gunner_move_walk},
|
||||
{"gunner_move_stand", &gunner_move_stand},
|
||||
{"gunner_move_fidget", &gunner_move_fidget},
|
||||
{"gladiator_move_death", &gladiator_move_death},
|
||||
{"gladiator_move_pain_air", &gladiator_move_pain_air},
|
||||
{"gladiator_move_pain", &gladiator_move_pain},
|
||||
{"gladiator_move_attack_gun", &gladiator_move_attack_gun},
|
||||
{"gladiator_move_attack_melee", &gladiator_move_attack_melee},
|
||||
{"gladiator_move_run", &gladiator_move_run},
|
||||
{"gladiator_move_walk", &gladiator_move_walk},
|
||||
{"gladiator_move_stand", &gladiator_move_stand},
|
||||
{"flyer_move_loop_melee", &flyer_move_loop_melee},
|
||||
{"flyer_move_end_melee", &flyer_move_end_melee},
|
||||
{"flyer_move_start_melee", &flyer_move_start_melee},
|
||||
{"flyer_move_attack3", &flyer_move_attack3},
|
||||
{"flyer_move_attack2", &flyer_move_attack2},
|
||||
{"flyer_move_bankleft", &flyer_move_bankleft},
|
||||
{"flyer_move_bankright", &flyer_move_bankright},
|
||||
{"flyer_move_defense", &flyer_move_defense},
|
||||
{"flyer_move_pain1", &flyer_move_pain1},
|
||||
{"flyer_move_pain2", &flyer_move_pain2},
|
||||
{"flyer_move_pain3", &flyer_move_pain3},
|
||||
{"flyer_move_rollleft", &flyer_move_rollleft},
|
||||
{"flyer_move_rollright", &flyer_move_rollright},
|
||||
{"flyer_move_stop", &flyer_move_stop},
|
||||
{"flyer_move_start", &flyer_move_start},
|
||||
{"flyer_move_kamikaze", &flyer_move_kamikaze},
|
||||
{"flyer_move_run", &flyer_move_run},
|
||||
{"flyer_move_walk", &flyer_move_walk},
|
||||
{"flyer_move_stand", &flyer_move_stand},
|
||||
{"floater_move_run", &floater_move_run},
|
||||
{"floater_move_walk", &floater_move_walk},
|
||||
{"floater_move_pain3", &floater_move_pain3},
|
||||
{"floater_move_pain2", &floater_move_pain2},
|
||||
{"floater_move_pain1", &floater_move_pain1},
|
||||
{"floater_move_death", &floater_move_death},
|
||||
{"floater_move_attack3", &floater_move_attack3},
|
||||
{"floater_move_attack2", &floater_move_attack2},
|
||||
{"floater_move_attack1", &floater_move_attack1},
|
||||
{"floater_move_activate", &floater_move_activate},
|
||||
{"floater_move_stand2", &floater_move_stand2},
|
||||
{"floater_move_stand1", &floater_move_stand1},
|
||||
{"flipper_move_death", &flipper_move_death},
|
||||
{"flipper_move_attack", &flipper_move_attack},
|
||||
{"flipper_move_pain1", &flipper_move_pain1},
|
||||
{"flipper_move_pain2", &flipper_move_pain2},
|
||||
{"flipper_move_start_run", &flipper_move_start_run},
|
||||
{"flipper_move_walk", &flipper_move_walk},
|
||||
{"flipper_move_run_start", &flipper_move_run_start},
|
||||
{"flipper_move_run_loop", &flipper_move_run_loop},
|
||||
{"flipper_move_stand", &flipper_move_stand},
|
||||
{"chick_move_start_slash", &chick_move_start_slash},
|
||||
{"chick_move_end_slash", &chick_move_end_slash},
|
||||
{"chick_move_slash", &chick_move_slash},
|
||||
{"chick_move_end_attack1", &chick_move_end_attack1},
|
||||
{"chick_move_attack1", &chick_move_attack1},
|
||||
{"chick_move_start_attack1", &chick_move_start_attack1},
|
||||
{"chick_move_duck", &chick_move_duck},
|
||||
{"chick_move_death1", &chick_move_death1},
|
||||
{"chick_move_death2", &chick_move_death2},
|
||||
{"chick_move_pain3", &chick_move_pain3},
|
||||
{"chick_move_pain2", &chick_move_pain2},
|
||||
{"chick_move_pain1", &chick_move_pain1},
|
||||
{"chick_move_walk", &chick_move_walk},
|
||||
{"chick_move_run", &chick_move_run},
|
||||
{"chick_move_start_run", &chick_move_start_run},
|
||||
{"chick_move_stand", &chick_move_stand},
|
||||
{"chick_move_fidget", &chick_move_fidget},
|
||||
{"carrier_move_death", &carrier_move_death},
|
||||
{"carrier_move_pain_light", &carrier_move_pain_light},
|
||||
{"carrier_move_pain_heavy", &carrier_move_pain_heavy},
|
||||
{"carrier_move_spawn", &carrier_move_spawn},
|
||||
{"carrier_move_attack_rail", &carrier_move_attack_rail},
|
||||
{"carrier_move_attack_rocket", &carrier_move_attack_rocket},
|
||||
{"carrier_move_attack_post_gren", &carrier_move_attack_post_gren},
|
||||
{"carrier_move_attack_gren", &carrier_move_attack_gren},
|
||||
{"carrier_move_attack_pre_gren", &carrier_move_attack_pre_gren},
|
||||
{"carrier_move_attack_post_mg", &carrier_move_attack_post_mg},
|
||||
{"carrier_move_attack_mg", &carrier_move_attack_mg},
|
||||
{"carrier_move_attack_pre_mg", &carrier_move_attack_pre_mg},
|
||||
{"carrier_move_run", &carrier_move_run},
|
||||
{"carrier_move_walk", &carrier_move_walk},
|
||||
{"carrier_move_stand", &carrier_move_stand},
|
||||
{"brain_move_run", &brain_move_run},
|
||||
{"brain_move_attack2", &brain_move_attack2},
|
||||
{"brain_move_attack1", &brain_move_attack1},
|
||||
{"brain_move_death1", &brain_move_death1},
|
||||
{"brain_move_death2", &brain_move_death2},
|
||||
{"brain_move_duck", &brain_move_duck},
|
||||
{"brain_move_pain1", &brain_move_pain1},
|
||||
{"brain_move_pain2", &brain_move_pain2},
|
||||
{"brain_move_pain3", &brain_move_pain3},
|
||||
{"brain_move_defense", &brain_move_defense},
|
||||
{"brain_move_walk1", &brain_move_walk1},
|
||||
{"brain_move_idle", &brain_move_idle},
|
||||
{"brain_move_stand", &brain_move_stand},
|
||||
{"makron_move_attack5", &makron_move_attack5},
|
||||
{"makron_move_attack4", &makron_move_attack4},
|
||||
{"makron_move_attack3", &makron_move_attack3},
|
||||
{"makron_move_sight", &makron_move_sight},
|
||||
{"makron_move_death3", &makron_move_death3},
|
||||
{"makron_move_death2", &makron_move_death2},
|
||||
{"makron_move_pain4", &makron_move_pain4},
|
||||
{"makron_move_pain5", &makron_move_pain5},
|
||||
{"makron_move_pain6", &makron_move_pain6},
|
||||
{"makron_move_walk", &makron_move_walk},
|
||||
{"makron_move_run", &makron_move_run},
|
||||
{"makron_move_stand", &makron_move_stand},
|
||||
{"jorg_move_end_attack1", &jorg_move_end_attack1},
|
||||
{"jorg_move_attack1", &jorg_move_attack1},
|
||||
{"jorg_move_start_attack1", &jorg_move_start_attack1},
|
||||
{"jorg_move_attack2", &jorg_move_attack2},
|
||||
{"jorg_move_death", &jorg_move_death},
|
||||
{"jorg_move_pain1", &jorg_move_pain1},
|
||||
{"jorg_move_pain2", &jorg_move_pain2},
|
||||
{"jorg_move_pain3", &jorg_move_pain3},
|
||||
{"jorg_move_end_walk", &jorg_move_end_walk},
|
||||
{"jorg_move_walk", &jorg_move_walk},
|
||||
{"jorg_move_start_walk", &jorg_move_start_walk},
|
||||
{"jorg_move_run", &jorg_move_run},
|
||||
{"jorg_move_stand", &jorg_move_stand},
|
||||
{"boss2_move_death", &boss2_move_death},
|
||||
{"boss2_move_pain_light", &boss2_move_pain_light},
|
||||
{"boss2_move_pain_heavy", &boss2_move_pain_heavy},
|
||||
{"boss2_move_attack_rocket", &boss2_move_attack_rocket},
|
||||
{"boss2_move_attack_post_mg", &boss2_move_attack_post_mg},
|
||||
{"boss2_move_attack_mg", &boss2_move_attack_mg},
|
||||
{"boss2_move_attack_pre_mg", &boss2_move_attack_pre_mg},
|
||||
{"boss2_move_run", &boss2_move_run},
|
||||
{"boss2_move_walk", &boss2_move_walk},
|
||||
{"boss2_move_fidget", &boss2_move_fidget},
|
||||
{"boss2_move_stand", &boss2_move_stand},
|
||||
{"berserk_move_death2", &berserk_move_death2},
|
||||
{"berserk_move_death1", &berserk_move_death1},
|
||||
{"berserk_move_pain2", &berserk_move_pain2},
|
||||
{"berserk_move_pain1", &berserk_move_pain1},
|
||||
{"berserk_move_attack_strike", &berserk_move_attack_strike},
|
||||
{"berserk_move_attack_club", &berserk_move_attack_club},
|
||||
{"berserk_move_attack_spike", &berserk_move_attack_spike},
|
||||
{"berserk_move_run1", &berserk_move_run1},
|
||||
{"berserk_move_walk", &berserk_move_walk},
|
||||
{"berserk_move_stand_fidget", &berserk_move_stand_fidget},
|
||||
{"berserk_move_stand", &berserk_move_stand},
|
||||
{"actor_move_attack", &actor_move_attack},
|
||||
{"actor_move_death2", &actor_move_death2},
|
||||
{"actor_move_death1", &actor_move_death1},
|
||||
{"actor_move_taunt", &actor_move_taunt},
|
||||
{"actor_move_flipoff", &actor_move_flipoff},
|
||||
{"actor_move_pain3", &actor_move_pain3},
|
||||
{"actor_move_pain2", &actor_move_pain2},
|
||||
{"actor_move_pain1", &actor_move_pain1},
|
||||
{"actor_move_run", &actor_move_run},
|
||||
{"actor_move_walk", &actor_move_walk},
|
||||
{"actor_move_stand", &actor_move_stand},
|
||||
{0, 0}
|
15
src/savegame/tables/levelfields.h
Normal file
15
src/savegame/tables/levelfields.h
Normal file
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
* =======================================================================
|
||||
*
|
||||
* Fields inside a level to be saved.
|
||||
*
|
||||
* =======================================================================
|
||||
*/
|
||||
|
||||
{"changemap", LLOFS(changemap), F_LSTRING},
|
||||
{"sight_client", LLOFS(sight_client), F_EDICT},
|
||||
{"sight_entity", LLOFS(sight_entity), F_EDICT},
|
||||
{"sound_entity", LLOFS(sound_entity), F_EDICT},
|
||||
{"sound2_entity", LLOFS(sound2_entity), F_EDICT},
|
||||
{"disguise_violator", LLOFS(disguise_violator), F_EDICT},
|
||||
{NULL, 0, F_INT}
|
Loading…
Reference in a new issue