sin-2015/game.h
1999-04-22 00:00:00 +00:00

569 lines
17 KiB
C

//-----------------------------------------------------------------------------
//
// $Logfile:: /Quake 2 Engine/Sin/code/game/game.h $
// $Revision:: 52 $
// $Author:: Markd $
// $Date:: 1/27/99 10:02p $
//
// Copyright (C) 1998 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source is may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// $Log:: /Quake 2 Engine/Sin/code/game/game.h $
//
// 52 1/27/99 10:02p Markd
// Merged 2015 source into main code base
//
// 51 12/18/98 11:05p Jimdose
// added definitions of server side stuff to get rid of qcommon.h includes
//
// 50 11/11/98 10:04p Jimdose
// Removed comment
//
// 49 11/11/98 10:02p Jimdose
// added SVF_MONSTERCLIP and SVF_PLAYERCLIP
//
// 48 10/20/98 9:46p Jimdose
// made CalcCRC take a const char *
//
// 47 10/20/98 9:39p Jimdose
// Added CalcCRC
// Upped GAME_API_VERSION
//
// 46 10/16/98 1:56a Jimdose
// Added autosave to WriteLevel function
// Increased GAME_API_VERSION
//
// 45 10/10/98 5:58p Aldie
// More quantumdestab fixes
//
// 44 10/08/98 7:42p Jimdose
// Added ServerCommand
//
// 43 9/08/98 7:09p Jimdose
// added printf to game_import_t
//
// 42 9/07/98 8:29p Markd
// Added fullmins fullmaxs and fullradius
//
// 41 9/05/98 11:55a Markd
// Upped game api version
//
// 40 9/01/98 7:47p Aldie
// Added itemname to inventory stuff
//
// 39 8/31/98 7:45p Aldie
// Updated surface data structure and removed surfinfo field
//
// 38 8/29/98 9:51p Jimdose
// made netconsole_s, netconbuffer_s, and netsurface_s visible to game dll to
// get rid of it in g_local.h
//
// 37 8/29/98 2:53p Aldie
// Added status meter for loading levels.
//
// 36 8/28/98 3:46p Markd
// Added centroid to edict_s
//
// 35 8/25/98 7:55p Markd
// Added SVF_ONLYPARENT flag
//
// 34 8/18/98 11:08p Markd
// Added new Alias System
//
// 33 8/02/98 9:00p Markd
// Merged code 3.17
//
// 32 7/17/98 7:58p Markd
// Added radius to fulltrace, also added SVF_USEBBOX
//
// 31 6/27/98 6:40p Markd
// Added SoundLength
//
// 30 6/20/98 7:50p Markd
// Added BoneGroupName function
//
// 29 6/15/98 10:06p Jimdose
// added gi.fulltrace
//
// 28 6/15/98 7:57p Markd
// Put in Group_Flags
//
// 27 6/08/98 7:23p Aldie
// Added some surface in the game import
//
// 26 5/26/98 8:42p Markd
// Added NumGroups to interface
//
// 25 5/24/98 4:48p Jimdose
// Made char *'s const
//
// 24 5/24/98 2:46p Markd
// Made char *'s into const char *'s
//
// 23 5/23/98 12:53p Aldie
// Updated surfaces networking.
//
// 22 5/20/98 11:12a Markd
// removed char * dependency
//
// 21 5/13/98 4:47p Aldie
// Update damage surfaces
//
// 20 5/09/98 8:01p Jimdose
// added GameDir, PlayerDir, and CreatePath to the import list for the dll
//
// 19 5/05/98 2:44p Aldie
// Added server side surface states
//
// 18 4/30/98 4:48p Aldie
// Server side console states
//
// 17 4/28/98 7:00p Aldie
// Added sever side console buffer
//
// 16 4/27/98 3:20p Jimdose
// Added DebugLines
//
// 15 4/27/98 1:51p Aldie
// Added server side console states.
//
// 14 4/09/98 1:40p Markd
// Added SVF_SHOOTABLE
//
// 13 4/07/98 8:01p Markd
// Changed all SINMDL commands to non-SINMDL prefix
//
// 12 3/30/98 6:12p Markd
// Added Alias commands
//
// 11 3/29/98 8:33p Markd
// Changed nature of InitCmds and FrameCommands
//
// 10 3/27/98 7:00p Markd
// Changed Bone functions a bit
//
// 9 3/25/98 1:22p Markd
//
// 8 3/24/98 9:59a Markd
// Added new bone, and group stuff for models
//
// 7 3/18/98 8:01p Markd
// Accidentally made fadetime an int instead of a float
//
// 6 3/18/98 7:15p Markd
// Changed sound code stuff
//
// 5 3/05/98 6:44p Markd
// Added SINMDL stuff
//
// 4 2/03/98 11:08a Jimdose
// Converted to work with Sin progs
// Could use a little clean up.
//
// 3 12/30/97 6:04p Jimdose
// Added header text
//
// DESCRIPTION:
// game dll information visible to server
//
#ifndef __GAME_H__
#define __GAME_H__
#ifdef __cplusplus
extern "C" {
#endif
#define GAME_API_VERSION 13
// edict->svflags
#define FRAMETIME 0.1
#define SVF_NOCLIENT 0x00000001 // don't send entity to clients, even if it has effects
#define SVF_DEADMONSTER 0x00000002 // treat as CONTENTS_DEADMONSTER for collision
#define SVF_MONSTER 0x00000004 // treat as CONTENTS_MONSTER for collision
#define SVF_SHOOTABLE 0x00000008 // treat as CONTENTS_SHOOTABLE for collision
#define SVF_USEBBOX 0x00000010 // do not perform perfect collision use the bbox instead
#define SVF_ONLYPARENT 0x00000020 // only send this entity to its parent
#define SVF_HIDEOWNER 0x00000040 // hide the owner of the client
#define SVF_MONSTERCLIP 0x00000080 // treat as CONTENTS_MONSTERCLIP for collision
#define SVF_PLAYERCLIP 0x00000100 // treat as CONTENTS_PLAYERCLIP for collision
// 2015 code
#define SVF_NOTOWNER 0x00000200 // don't draw for owner
// edict->solid values
typedef enum
{
SOLID_NOT, // no interaction with other objects
SOLID_TRIGGER, // only touch when inside, after moving
SOLID_BBOX, // touch on edge
SOLID_BSP // bsp clip, touch on edge
} solid_t;
//===============================================================
// link_t is only used for entity area links now
typedef struct link_s
{
struct link_s *prev, *next;
} link_t;
#define MAX_ENT_CLUSTERS 16
typedef struct edict_s edict_t;
typedef struct gclient_s gclient_t;
typedef struct netconsole_s netconsole_t;
typedef struct netconbuffer_s netconbuffer_t;
typedef struct netsurface_s netsurface_t;
#ifndef QCOMMON
// If this is modified in qcommon.h, it must be reflected here.
#define MAX_MSGLEN 1400 // max length of a message
// If this is modified in qcommon.h, it must be reflected here.
enum svc_ops_e
{
svc_bad,
svc_muzzleflash,
svc_muzzleflash2,
svc_temp_entity,
svc_layout,
svc_inventory,
svc_console_command
};
#endif
#ifndef GAME_INCLUDE
typedef struct gclient_s
{
player_state_t ps; // communicated by server to clients
int ping;
// the game dll can add anything it wants after
// this point in the structure
} gclient_t;
struct edict_s
{
entity_state_t s;
struct gclient_s *client;
qboolean inuse;
int linkcount;
// FIXME: move these fields to a server private sv_entity_t
link_t area; // linked to a division node or leaf
int num_clusters; // if -1, use headnode instead
int clusternums[MAX_ENT_CLUSTERS];
int headnode; // unused if num_clusters != -1
int areanum, areanum2;
//================================
int svflags; // SVF_NOCLIENT, SVF_DEADMONSTER, SVF_MONSTER, etc
vec3_t mins, maxs;
vec3_t absmin, absmax, size;
vec3_t fullmins, fullmaxs;
float fullradius;
vec3_t centroid;
solid_t solid;
int clipmask;
edict_t *owner;
// the game dll can add anything it wants after
// this point in the structure
};
#endif // GAME_INCLUDE
struct netconsole_s
{
console_state_t s;
qboolean inuse;
};
struct netconbuffer_s
{
console_buffer_state_t s;
};
struct netsurface_s
{
surface_state_t s;
qboolean inuse;
};
//===============================================================
//
// functions provided by the main engine
//
typedef struct
{
// special messages
void (*bprintf) (int printlevel, const char *fmt, ...);
void (*dprintf) (const char *fmt, ...);
void (*printf) (const char *fmt, ...);
void (*cprintf) (edict_t *ent, int printlevel, const char *fmt, ...);
void (*centerprintf) (edict_t *ent, const char *fmt, ...);
void (*sound) (edict_t *ent, int channel, int soundindex, float volume, float attenuation, float timeofs, float pitch, float fadetime, int flags);
void (*positioned_sound) (vec3_t origin, edict_t *ent, int channel, int soundinedex, float volume, float attenuation, float timeofs, float pitch, float fadetime, int flags);
// config strings hold all the index strings, the lightstyles,
// and misc data like the sky definition and cdtrack.
// All of the current configstrings are sent to clients when
// they connect, and changes are sent to all connected clients.
void (*configstring) (int num, const char *string);
void (*error) (const char *fmt, ...);
// new names can only be added during spawning
// existing names can be looked up at any time
int (*modelindex) (const char *name);
int (*soundindex) (const char *name);
int (*imageindex) (const char *name);
int (*itemindex) (const char *name);
void (*setmodel) (edict_t *ent, const char *name);
// collision detection against world and bboxes of a-models
trace_t (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passent, int contentmask);
// for full ray intersection tests against a-model polys and world
trace_t (*fulltrace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, float radius, edict_t *passent, int contentmask);
int (*pointcontents) (vec3_t point);
qboolean (*inPVS) (vec3_t p1, vec3_t p2);
qboolean (*inPHS) (vec3_t p1, vec3_t p2);
void (*SetAreaPortalState) (int portalnum, qboolean open);
qboolean (*AreasConnected) (int area1, int area2);
// an entity will never be sent to a client or used for collision
// if it is not passed to linkentity. If the size, position, or
// solidity changes, it must be relinked.
void (*linkentity) (edict_t *ent);
void (*unlinkentity) (edict_t *ent); // call before removing an interactive edict
int (*BoxEdicts) (vec3_t mins, vec3_t maxs, edict_t **list, int maxcount, int areatype);
void (*Pmove) (pmove_t *pmove); // player movement code common with client prediction
// network messaging
void (*multicast) (vec3_t origin, multicast_t to);
void (*unicast) (edict_t *ent, qboolean reliable);
void (*WriteChar) (int c);
void (*WriteByte) (int c);
void (*WriteShort) (int c);
void (*WriteLong) (int c);
void (*WriteFloat) (float f);
void (*WriteString) (const char *s);
void (*WritePosition) (vec3_t pos); // some fractional bits
void (*WriteDir) (vec3_t pos); // single byte encoded, very coarse
void (*WriteAngle) (float f);
// managed memory allocation
void *(*TagMalloc) (int size, int tag);
void (*TagFree) (void *block);
void (*FreeTags) (int tag);
// console variable interaction
cvar_t *(*cvar) (const char *var_name, const char *value, int flags);
cvar_t *(*cvar_set) (const char *var_name, const char *value);
cvar_t *(*cvar_forceset) (const char *var_name, const char *value);
// ClientCommand and coneole command parameter checking
int (*argc) (void);
const char *(*argv) (int n);
const char *(*args) (void);
// add commands to the server console as if they were typed in
// for map changing, etc
void (*AddCommandString) (const char *text);
void (*DebugGraph) (float value, int color);
int (*LoadFile) ( const char *path, void **buffer, int tag);
const char *(*GameDir)( void );
const char *(*PlayerDir)( void );
void (*CreatePath)(const char *path);
float (*SoundLength) ( const char *path );
//
// Model support
//
qboolean (*IsModel) ( int index );
//
// MODEL UTILITY FUNCTIONS
//
// DEF SPECIFIC STUFF
int (*NumAnims) ( int modelindex );
int (*NumSkins) ( int modelindex );
int (*NumGroups) ( int modelindex );
sinmdl_cmd_t * (*InitCommands) ( int modelindex );
void (*CalculateBounds) ( int modelindex, float scale, vec3_t mins, vec3_t maxs );
// ANIM SPECIFIC STUFF
const char * (*Anim_NameForNum) ( int modelindex, int animnum );
int (*Anim_NumForName) ( int modelindex, const char * name );
int (*Anim_Random) ( int modelindex, const char * name );
int (*Anim_NumFrames) ( int modelindex, int animnum );
float (*Anim_Time) ( int modelindex, int animnum );
void (*Anim_Delta) ( int modelindex, int animnum, vec3_t delta );
// FRAME SPECIFIC STUFF
sinmdl_cmd_t * (*Frame_Commands) ( int modelindex, int animnum, int framenum );
void (*Frame_Delta) ( int modelindex, int animnum, int framenum, vec3_t delta );
float (*Frame_Time) ( int modelindex, int animnum, int framenum );
// SKIN SPECIFIC STUFF
const char * (*Skin_NameForNum) ( int modelindex, int skinnum );
int (*Skin_NumForName) ( int modelindex, const char * name );
// GROUP SPECIFIC STUFF
int (*Group_NameToNum) ( int modelindex, const char * name );
const char * (*Group_NumToName) ( int modelindex, int num );
float (*Group_DamageMultiplier) ( int modelindex, int num );
int (*Group_Flags) ( int modelindex, int num );
// BONE SPECIFIC STUFF
qboolean (*GetBoneInfo)
(
int modelindex,
const char * bonename,
int * groupindex,
int * tri_num,
vec3_t orientation
);
const char * (*GetBoneGroupName)
(
int modelindex,
const char * bonename
);
qboolean (*GetBoneTransform)
(
int modelindex,
int groupindex,
int tri_num,
vec3_t orientation,
int anim,
int frame,
float scale,
vec3_t trans[3],
vec3_t pos
);
//
// ALIAS SYSTEM
//
qboolean (*Alias_Add)( int modelindex, const char * alias, const char * name, float weight );
const char * (*Alias_FindRandom)( int modelindex, const char * alias );
void (*Alias_Dump)( int modelindex );
void (*Alias_Clear)( int modelindex );
//
// GLOBAL ALIAS SYSTEM
//
qboolean (*GlobalAlias_Add)( const char * alias, const char * name, float weight );
const char * (*GlobalAlias_FindRandom)( const char * alias );
void (*GlobalAlias_Dump)( void );
void (*GlobalAlias_Clear)( void );
unsigned short ( *CalcCRC )( const char *start, int count );
//
// SURFACES
//
int (*Surf_NumSurfaces)( void );
csurface_t * (*Surf_Surfaces)( void );
void (*IncrementStatusCount)( int i );
debugline_t **DebugLines;
int *numDebugLines;
} game_import_t;
//
// functions exported by the game subsystem
//
typedef struct
{
int apiversion;
// the init function will only be called when a game starts,
// not each time a level is loaded. Persistant data for clients
// and the server can be allocated in init
void (*Init) (void);
void (*Shutdown) (void);
// each new level entered will cause a call to SpawnEntities
void (*SpawnEntities) (const char *mapname, const char *entstring, const char *spawnpoint);
// Read/Write Game is for storing persistant cross level information
// about the world state and the clients.
// WriteGame is called every time a level is exited.
// ReadGame is called on a loadgame.
void (*WriteGame) (const char *filename, qboolean autosave);
void (*ReadGame) (const char *filename);
// ReadLevel is called after the default map information has been
// loaded with SpawnEntities, so any stored client spawn spots will
// be used when the clients reconnect.
void (*WriteLevel) (const char *filename, qboolean autosave );
void (*ReadLevel) (const char *filename);
qboolean (*ClientConnect) (edict_t *ent, const char *userinfo );
void (*ClientBegin) (edict_t *ent, qboolean loadgame);
void (*ClientUserinfoChanged) (edict_t *ent, const char *userinfo);
void (*ClientDisconnect) (edict_t *ent);
void (*ClientCommand) (edict_t *ent);
void (*ClientThink) (edict_t *ent, usercmd_t *cmd);
void (*RunFrame) (void);
// ServerCommand will be called when an "sv <command>" command is issued on the
// server console.
// The game can issue gi.argc() / gi.argv() commands to get the rest
// of the parameters
void (*ServerCommand) (void);
void (*CreateSurfaces) (csurface_t *surfaces, int count);
//
// global variables shared between game and server
//
// The edict array is allocated in the game dll so it
// can vary in size from one game to another.
//
// The size will be fixed when ge->Init() is called
struct edict_s *edicts;
int edict_size;
int num_edicts; // current number, <= max_edicts
int max_edicts;
struct netconsole_s *consoles;
int console_size;
int num_consoles;
int max_consoles;
struct netconbuffer_s *conbuffers;
int conbuffer_size;
struct netsurface_s *surfaces;
int surface_size;
int max_surfaces;
int num_surfaces;
} game_export_t;
game_export_t *GetGameApi (game_import_t *import);
#ifdef __cplusplus
}
#endif
#endif