Port the new savegame system from quake 2

This commit is contained in:
Yamagi Burmeister 2011-10-11 10:53:48 +00:00
parent e4b136c168
commit d1c7849ef1
11 changed files with 4967 additions and 797 deletions

View file

@ -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

View file

@ -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

View file

@ -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

File diff suppressed because it is too large Load diff

View 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}

View 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}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View 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 ;

View 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", &parasite_move_death},
{"parasite_move_jump_down", &parasite_move_jump_down},
{"parasite_move_jump_up", &parasite_move_jump_up},
{"parasite_move_break", &parasite_move_break},
{"parasite_move_drain", &parasite_move_drain},
{"parasite_move_pain1", &parasite_move_pain1},
{"parasite_move_stop_walk", &parasite_move_stop_walk},
{"parasite_move_start_walk", &parasite_move_start_walk},
{"parasite_move_walk", &parasite_move_walk},
{"parasite_move_stop_run", &parasite_move_stop_run},
{"parasite_move_start_run", &parasite_move_start_run},
{"parasite_move_run", &parasite_move_run},
{"parasite_move_stand", &parasite_move_stand},
{"parasite_move_end_fidget", &parasite_move_end_fidget},
{"parasite_move_fidget", &parasite_move_fidget},
{"parasite_move_start_fidget", &parasite_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}

View 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}