1461 lines
40 KiB
C
1461 lines
40 KiB
C
|
// q_shared.h -- included first by ALL program modules
|
||
|
|
||
|
#define DEMO 0 // enable this when compiling a demo release
|
||
|
|
||
|
// RIDAH, DISABLE THIS BEFORE RELEASE!
|
||
|
#define USE_OLD_CHECKSUM
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
// unknown pragmas are SUPPOSED to be ignored, but....
|
||
|
#pragma warning(disable : 4244) // MIPS
|
||
|
#pragma warning(disable : 4136) // X86
|
||
|
#pragma warning(disable : 4051) // ALPHA
|
||
|
|
||
|
#pragma warning(disable : 4018) // signed/unsigned mismatch
|
||
|
#pragma warning(disable : 4305) // truncation from const double to float
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#include <assert.h>
|
||
|
#include <math.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdarg.h>
|
||
|
#include <string.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <time.h>
|
||
|
|
||
|
#if (defined _M_IX86 || defined __i386__) && !defined C_ONLY
|
||
|
#define id386 1
|
||
|
#else
|
||
|
#define id386 0
|
||
|
#endif
|
||
|
|
||
|
#if defined _M_ALPHA && !defined C_ONLY
|
||
|
#define idaxp 1
|
||
|
#else
|
||
|
#define idaxp 0
|
||
|
#endif
|
||
|
|
||
|
typedef unsigned char byte;
|
||
|
typedef enum {false, true} qboolean;
|
||
|
|
||
|
|
||
|
#ifndef NULL
|
||
|
#define NULL ((void *)0)
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#define RANDOM ( ((float)(rand()) / RAND_MAX)*2.0 - 1.0)
|
||
|
|
||
|
// angle indexes
|
||
|
#define PITCH 0 // up / down
|
||
|
#define YAW 1 // left / right
|
||
|
#define ROLL 2 // fall over
|
||
|
|
||
|
#define MAX_STRING_CHARS 1024 // max length of a string passed to Cmd_TokenizeString
|
||
|
#define MAX_STRING_TOKENS 80 // max tokens resulting from Cmd_TokenizeString
|
||
|
#define MAX_TOKEN_CHARS 128 // max length of an individual token
|
||
|
|
||
|
#define MAX_QPATH 64 // max length of a quake game pathname
|
||
|
#define MAX_OSPATH 128 // max length of a filesystem pathname
|
||
|
|
||
|
//
|
||
|
// per-level limits
|
||
|
//
|
||
|
#define MAX_CLIENTS 256 // absolute limit
|
||
|
#define MAX_EDICTS 2048 // must change protocol to increase more
|
||
|
#define MAX_LIGHTSTYLES 256
|
||
|
#define MAX_MODELS 256 // these are sent over the net as bytes
|
||
|
#define MAX_SOUNDS 384 // so they cannot be blindly increased
|
||
|
#define MAX_IMAGES 256
|
||
|
#define MAX_ITEMS 256
|
||
|
#define MAX_LIGHTFLARES 128
|
||
|
#define MAX_JUNIOR_STRINGS 512
|
||
|
#define MAX_GENERAL (MAX_CLIENTS*2) // general config strings
|
||
|
|
||
|
// game print flags
|
||
|
#define PRINT_LOW 0 // pickup messages
|
||
|
#define PRINT_MEDIUM 1 // death messages
|
||
|
#define PRINT_HIGH 2 // critical messages
|
||
|
#define PRINT_CHAT 3 // chat messages
|
||
|
|
||
|
|
||
|
|
||
|
#define ERR_FATAL 0 // exit the entire game with a popup window
|
||
|
#define ERR_DROP 1 // print to console and disconnect from game
|
||
|
#define ERR_DISCONNECT 2 // don't kill server
|
||
|
|
||
|
#define PRINT_ALL 0
|
||
|
#define PRINT_DEVELOPER 1 // only print when "developer 1"
|
||
|
#define PRINT_ALERT 2
|
||
|
|
||
|
|
||
|
// destination class for gi.multicast()
|
||
|
typedef enum
|
||
|
{
|
||
|
MULTICAST_ALL,
|
||
|
MULTICAST_PHS,
|
||
|
MULTICAST_PVS,
|
||
|
MULTICAST_ALL_R,
|
||
|
MULTICAST_PHS_R,
|
||
|
MULTICAST_PVS_R
|
||
|
} multicast_t;
|
||
|
|
||
|
|
||
|
/*
|
||
|
==============================================================
|
||
|
|
||
|
MATHLIB
|
||
|
|
||
|
==============================================================
|
||
|
*/
|
||
|
|
||
|
typedef float vec_t;
|
||
|
typedef vec_t vec3_t[3];
|
||
|
typedef vec_t vec5_t[5];
|
||
|
|
||
|
typedef int fixed4_t;
|
||
|
typedef int fixed8_t;
|
||
|
typedef int fixed16_t;
|
||
|
|
||
|
#ifndef M_PI
|
||
|
#define M_PI 3.14159265358979323846 // matches value in gcc v2 math.h
|
||
|
#endif
|
||
|
|
||
|
struct cplane_s;
|
||
|
|
||
|
extern vec3_t vec3_origin;
|
||
|
|
||
|
#define nanmask (255<<23)
|
||
|
|
||
|
#define IS_NAN(x) (((*(int *)&x)&nanmask)==nanmask)
|
||
|
|
||
|
// microsoft's fabs seems to be ungodly slow...
|
||
|
//float Q_fabs (float f);
|
||
|
//#define fabs(f) Q_fabs(f)
|
||
|
#if !defined C_ONLY && !defined __linux__
|
||
|
extern long Q_ftol( float f );
|
||
|
#else
|
||
|
#define Q_ftol( f ) ( long ) (f)
|
||
|
#endif
|
||
|
|
||
|
void vectoangles (vec3_t value1, vec3_t angles);
|
||
|
|
||
|
// JOSEPH 6-NOV-98
|
||
|
#ifdef _WIN32
|
||
|
_inline vec_t DotProduct(x,y)
|
||
|
{
|
||
|
float dotprod;
|
||
|
_asm
|
||
|
{
|
||
|
mov ecx, x
|
||
|
mov eax, y
|
||
|
|
||
|
;optimized dot product; 15 cycles
|
||
|
fld dword ptr [eax+0] ;starts & ends on cycle 0
|
||
|
fmul dword ptr [ecx+0] ;starts on cycle 1
|
||
|
fld dword ptr [eax+4] ;starts & ends on cycle 2
|
||
|
fmul dword ptr [ecx+4] ;starts on cycle 3
|
||
|
fld dword ptr [eax+8] ;starts & ends on cycle 4
|
||
|
fmul dword ptr [ecx+8] ;starts on cycle 5
|
||
|
fxch st(1) ;no cost
|
||
|
faddp st(2),st(0) ;starts on cycle 6, stalls for cycles 7-8
|
||
|
faddp st(1),st(0) ;starts on cycle 9, stalls for cycles 10-12
|
||
|
fstp dword ptr [dotprod] ;starts on cycle 13, ends on cycle 14
|
||
|
}
|
||
|
return dotprod;
|
||
|
}
|
||
|
#else
|
||
|
#define DotProduct(x,y) (x[0]*y[0]+x[1]*y[1]+x[2]*y[2])
|
||
|
#endif
|
||
|
// END JOSEPH
|
||
|
|
||
|
#define VectorSubtract(a,b,c) (c[0]=a[0]-b[0],c[1]=a[1]-b[1],c[2]=a[2]-b[2])
|
||
|
#define VectorAdd(a,b,c) (c[0]=a[0]+b[0],c[1]=a[1]+b[1],c[2]=a[2]+b[2])
|
||
|
#define VectorCopy(a,b) (b[0]=a[0],b[1]=a[1],b[2]=a[2])
|
||
|
#define VectorClear(a) (a[0]=a[1]=a[2]=0)
|
||
|
#define VectorNegate(a,b) (b[0]=-a[0],b[1]=-a[1],b[2]=-a[2])
|
||
|
#define VectorSet(v, x, y, z) (v[0]=(x), v[1]=(y), v[2]=(z))
|
||
|
|
||
|
void VectorMA (vec3_t veca, float scale, vec3_t vecb, vec3_t vecc);
|
||
|
|
||
|
// just in case you do't want to use the macros
|
||
|
vec_t _DotProduct (vec3_t v1, vec3_t v2);
|
||
|
void _VectorSubtract (vec3_t veca, vec3_t vecb, vec3_t out);
|
||
|
void _VectorAdd (vec3_t veca, vec3_t vecb, vec3_t out);
|
||
|
void _VectorCopy (vec3_t in, vec3_t out);
|
||
|
|
||
|
void ClearBounds (vec3_t mins, vec3_t maxs);
|
||
|
void AddPointToBounds (vec3_t v, vec3_t mins, vec3_t maxs);
|
||
|
int VectorCompare (vec3_t v1, vec3_t v2);
|
||
|
vec_t VectorLength (vec3_t v);
|
||
|
float VectorDistance(vec3_t vec1, vec3_t vec2);
|
||
|
void CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross);
|
||
|
vec_t VectorNormalize (vec3_t v); // returns vector length
|
||
|
vec_t VectorNormalize2 (vec3_t v, vec3_t out);
|
||
|
void VectorInverse (vec3_t v);
|
||
|
void VectorScale (vec3_t in, vec_t scale, vec3_t out);
|
||
|
int Q_log2(int val);
|
||
|
|
||
|
void R_ConcatRotations (float in1[3][3], float in2[3][3], float out[3][3]);
|
||
|
void R_ConcatTransforms (float in1[3][4], float in2[3][4], float out[3][4]);
|
||
|
|
||
|
void AngleVectors (vec3_t angles, vec3_t forward, vec3_t right, vec3_t up);
|
||
|
int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *plane);
|
||
|
float anglemod(float a);
|
||
|
float LerpAngle (float a1, float a2, float frac);
|
||
|
// Ridah
|
||
|
float AngleDiff (float a2, float a1);
|
||
|
|
||
|
#ifdef WIN32
|
||
|
#define BOX_ON_PLANE_SIDE(emins, emaxs, p) \
|
||
|
(((p)->type < 3)? \
|
||
|
( \
|
||
|
((p)->dist <= (emins)[(p)->type])? \
|
||
|
1 \
|
||
|
: \
|
||
|
( \
|
||
|
((p)->dist >= (emaxs)[(p)->type])?\
|
||
|
2 \
|
||
|
: \
|
||
|
3 \
|
||
|
) \
|
||
|
) \
|
||
|
: \
|
||
|
BoxOnPlaneSide( (emins), (emaxs), (p)))
|
||
|
#endif
|
||
|
|
||
|
void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal );
|
||
|
void PerpendicularVector( vec3_t dst, const vec3_t src );
|
||
|
void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees );
|
||
|
|
||
|
|
||
|
//=============================================
|
||
|
|
||
|
char *COM_SkipPath (char *pathname);
|
||
|
void COM_StripExtension (char *in, char *out);
|
||
|
void COM_FileBase (char *in, char *out);
|
||
|
void COM_FilePath (char *in, char *out);
|
||
|
void COM_DefaultExtension (char *path, char *extension);
|
||
|
|
||
|
char *COM_Parse (char **data_p);
|
||
|
char *COM_Parse256 (char **data_p);
|
||
|
// data is an in/out parm, returns a parsed out token
|
||
|
|
||
|
void Com_sprintf (char *dest, int size, char *fmt, ...);
|
||
|
|
||
|
void Com_PageInMemory (byte *buffer, int size);
|
||
|
|
||
|
//=============================================
|
||
|
|
||
|
// portable case insensitive compare
|
||
|
int Q_stricmp (char *s1, char *s2);
|
||
|
int Q_strcasecmp (char *s1, char *s2);
|
||
|
int Q_strncasecmp (char *s1, char *s2, int n);
|
||
|
|
||
|
//=============================================
|
||
|
|
||
|
short BigShort(short l);
|
||
|
short LittleShort(short l);
|
||
|
int BigLong (int l);
|
||
|
int LittleLong (int l);
|
||
|
float BigFloat (float l);
|
||
|
float LittleFloat (float l);
|
||
|
|
||
|
void Swap_Init (void);
|
||
|
char *va(char *format, ...);
|
||
|
|
||
|
char *kp_strlwr( char *name );
|
||
|
|
||
|
//=============================================
|
||
|
|
||
|
//
|
||
|
// key / value info strings
|
||
|
//
|
||
|
#define MAX_INFO_KEY 64
|
||
|
#define MAX_INFO_VALUE 64
|
||
|
#define MAX_INFO_STRING 512
|
||
|
|
||
|
char *Info_ValueForKey (char *s, char *key);
|
||
|
void Info_RemoveKey (char *s, char *key);
|
||
|
void Info_SetValueForKey (char *s, char *key, char *value);
|
||
|
qboolean Info_Validate (char *s);
|
||
|
|
||
|
/*
|
||
|
==============================================================
|
||
|
|
||
|
SYSTEM SPECIFIC
|
||
|
|
||
|
==============================================================
|
||
|
*/
|
||
|
|
||
|
extern int curtime; // time returned by last Sys_Milliseconds
|
||
|
|
||
|
int Sys_Milliseconds (void);
|
||
|
void Sys_Mkdir (char *path);
|
||
|
|
||
|
// large block stack allocation routines
|
||
|
void *Hunk_Begin (int maxsize);
|
||
|
void *Hunk_Alloc (int size);
|
||
|
void Hunk_Free (void *buf);
|
||
|
int Hunk_End (void);
|
||
|
|
||
|
// directory searching
|
||
|
#define SFF_ARCH 0x01
|
||
|
#define SFF_HIDDEN 0x02
|
||
|
#define SFF_RDONLY 0x04
|
||
|
#define SFF_SUBDIR 0x08
|
||
|
#define SFF_SYSTEM 0x10
|
||
|
|
||
|
/*
|
||
|
** pass in an attribute mask of things you wish to REJECT
|
||
|
*/
|
||
|
char *Sys_FindFirst (char *path, unsigned musthave, unsigned canthave );
|
||
|
char *Sys_FindNext ( unsigned musthave, unsigned canthave );
|
||
|
void Sys_FindClose (void);
|
||
|
|
||
|
|
||
|
// this is only here so the functions in q_shared.c and q_shwin.c can link
|
||
|
void Sys_Error (char *error, ...);
|
||
|
void Com_Printf (char *msg, ...);
|
||
|
|
||
|
|
||
|
/*
|
||
|
==========================================================
|
||
|
|
||
|
CVARS (console variables)
|
||
|
|
||
|
==========================================================
|
||
|
*/
|
||
|
|
||
|
#ifndef CVAR
|
||
|
#define CVAR
|
||
|
|
||
|
#define CVAR_ARCHIVE 1 // set to cause it to be saved to vars.rc
|
||
|
#define CVAR_USERINFO 2 // added to userinfo when changed
|
||
|
#define CVAR_SERVERINFO 4 // added to serverinfo when changed
|
||
|
#define CVAR_NOSET 8 // don't allow change from console at all,
|
||
|
// but can be set from the command line
|
||
|
#define CVAR_LATCH 16 // save changes until server restart
|
||
|
|
||
|
// nothing outside the Cvar_*() functions should modify these fields!
|
||
|
typedef struct cvar_s
|
||
|
{
|
||
|
char *name;
|
||
|
char *string;
|
||
|
char *latched_string; // for CVAR_LATCH vars
|
||
|
int flags;
|
||
|
qboolean modified; // set each time the cvar is changed
|
||
|
float value;
|
||
|
struct cvar_s *next;
|
||
|
} cvar_t;
|
||
|
|
||
|
#endif // CVAR
|
||
|
|
||
|
/*
|
||
|
==============================================================
|
||
|
|
||
|
COLLISION DETECTION
|
||
|
|
||
|
==============================================================
|
||
|
*/
|
||
|
|
||
|
// lower bits are stronger, and will eat weaker brushes completely
|
||
|
#define CONTENTS_SOLID 1 // an eye is never valid in a solid
|
||
|
#define CONTENTS_WINDOW 2 // translucent, but not watery
|
||
|
#define CONTENTS_AUX 4
|
||
|
#define CONTENTS_LAVA 8
|
||
|
#define CONTENTS_SLIME 16
|
||
|
#define CONTENTS_WATER 32
|
||
|
#define CONTENTS_MIST 64
|
||
|
// JOSEPH
|
||
|
#define CONTENTS_ALPHA 128
|
||
|
#define LAST_VISIBLE_CONTENTS 128
|
||
|
// END JOSEPH
|
||
|
// remaining contents are non-visible, and don't eat brushes
|
||
|
|
||
|
#define CONTENTS_AREAPORTAL 0x8000
|
||
|
|
||
|
#define CONTENTS_PLAYERCLIP 0x10000
|
||
|
#define CONTENTS_MONSTERCLIP 0x20000
|
||
|
|
||
|
// currents can be added to any other contents, and may be mixed
|
||
|
#define CONTENTS_CURRENT_0 0x40000
|
||
|
#define CONTENTS_CURRENT_90 0x80000
|
||
|
#define CONTENTS_CURRENT_180 0x100000
|
||
|
#define CONTENTS_CURRENT_270 0x200000
|
||
|
#define CONTENTS_CURRENT_UP 0x400000
|
||
|
#define CONTENTS_CURRENT_DOWN 0x800000
|
||
|
|
||
|
#define CONTENTS_ORIGIN 0x1000000 // removed before bsping an entity
|
||
|
|
||
|
#define CONTENTS_MONSTER 0x2000000 // should never be on a brush, only in game
|
||
|
#define CONTENTS_DEADMONSTER 0x4000000
|
||
|
#define CONTENTS_DETAIL 0x8000000 // brushes to be added after vis leafs
|
||
|
#define CONTENTS_TRANSLUCENT 0x10000000 // auto set if any surface has trans
|
||
|
#define CONTENTS_LADDER 0x20000000
|
||
|
|
||
|
|
||
|
#define SURF_LIGHT 0x1 // value will hold the light strength
|
||
|
|
||
|
#define SURF_SLICK 0x2 // effects game physics
|
||
|
|
||
|
#define SURF_SKY 0x4 // don't draw, but add to skybox
|
||
|
#define SURF_WARP 0x8 // turbulent water warp
|
||
|
#define SURF_TRANS33 0x10
|
||
|
#define SURF_TRANS66 0x20
|
||
|
#define SURF_FLOWING 0x40 // scroll towards angle
|
||
|
#define SURF_NODRAW 0x80 // don't bother referencing the texture
|
||
|
#define SURF_BURNT 0x100 // Ridah, used for rendering, marks this surface as having been burnt or charred
|
||
|
// JOSEPH 29-DEC-98
|
||
|
#define SURF_SPECULAR 0x400 // Ridah, shows specular lighting from light flares
|
||
|
#define SURF_DIFFUSE 0x800 // Ridah, used with specular lighting, makes it bigger and less intense
|
||
|
// END JOSEPH
|
||
|
|
||
|
// JOSEPH 26-JAN-99-C
|
||
|
#define SURF_ALPHA 0x1000 // wire fence effect flag
|
||
|
#define SURF_WATER 0x80000
|
||
|
#define SURF_CONCRETE 0x100000
|
||
|
#define SURF_FABRIC 0x200000
|
||
|
#define SURF_GRAVEL 0x400000
|
||
|
#define SURF_METAL 0x800000
|
||
|
#define SURF_METAL_L 0x1000000
|
||
|
#define SURF_SNOW 0x2000000
|
||
|
#define SURF_TILE 0x4000000
|
||
|
#define SURF_WOOD 0x8000000
|
||
|
// END JOSEPH
|
||
|
|
||
|
// Ridah
|
||
|
#define SURF_REFLECT_FAKE 0x10000000 // Ridah, uses fast (fake) reflections
|
||
|
#define SURF_REFLECT_LIGHT 0x20000000 // Ridah, only reflects SURF_LIGHT surfaces
|
||
|
|
||
|
// content masks
|
||
|
#define MASK_ALL (-1)
|
||
|
#define MASK_SOLID (CONTENTS_SOLID|CONTENTS_WINDOW)
|
||
|
#define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER)
|
||
|
#define MASK_DEADSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW)
|
||
|
#define MASK_MONSTERSOLID (CONTENTS_SOLID|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER)
|
||
|
#define MASK_WATER (CONTENTS_WATER|CONTENTS_LAVA|CONTENTS_SLIME)
|
||
|
#define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_SLIME|CONTENTS_LAVA)
|
||
|
#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEADMONSTER)
|
||
|
#define MASK_CURRENT (CONTENTS_CURRENT_0|CONTENTS_CURRENT_90|CONTENTS_CURRENT_180|CONTENTS_CURRENT_270|CONTENTS_CURRENT_UP|CONTENTS_CURRENT_DOWN)
|
||
|
// JOSEPH
|
||
|
#define MASK_ALPHA (CONTENTS_ALPHA)
|
||
|
// END JOSEPH
|
||
|
|
||
|
|
||
|
// gi.BoxEdicts() can return a list of either solid or trigger entities
|
||
|
// FIXME: eliminate AREA_ distinction?
|
||
|
#define AREA_SOLID 1
|
||
|
#define AREA_TRIGGERS 2
|
||
|
|
||
|
|
||
|
// plane_t structure
|
||
|
// !!! if this is changed, it must be changed in asm code too !!!
|
||
|
typedef struct cplane_s
|
||
|
{
|
||
|
vec3_t normal;
|
||
|
float dist;
|
||
|
byte type; // for fast side tests
|
||
|
byte signbits; // signx + (signy<<1) + (signz<<1)
|
||
|
byte pad[2];
|
||
|
// Ridah
|
||
|
int spec_updateframe; // so we only do each plane once
|
||
|
int spec_updateframe_backface;
|
||
|
byte spec_render, spec_render_back;
|
||
|
} cplane_t;
|
||
|
|
||
|
// structure offset for asm code
|
||
|
#define CPLANE_NORMAL_X 0
|
||
|
#define CPLANE_NORMAL_Y 4
|
||
|
#define CPLANE_NORMAL_Z 8
|
||
|
#define CPLANE_DIST 12
|
||
|
#define CPLANE_TYPE 16
|
||
|
#define CPLANE_SIGNBITS 17
|
||
|
#define CPLANE_PAD0 18
|
||
|
#define CPLANE_PAD1 19
|
||
|
|
||
|
typedef struct cmodel_s
|
||
|
{
|
||
|
vec3_t mins, maxs;
|
||
|
vec3_t origin; // for sounds or lights
|
||
|
int headnode;
|
||
|
} cmodel_t;
|
||
|
|
||
|
typedef struct csurface_s
|
||
|
{
|
||
|
char name[16];
|
||
|
int flags;
|
||
|
int value;
|
||
|
} csurface_t;
|
||
|
|
||
|
typedef struct mapsurface_s // used internally due to name len probs //ZOID
|
||
|
{
|
||
|
csurface_t c;
|
||
|
char rname[32];
|
||
|
} mapsurface_t;
|
||
|
|
||
|
// a trace is returned when a box is swept through the world
|
||
|
typedef struct
|
||
|
{
|
||
|
qboolean allsolid; // if true, plane is not valid
|
||
|
qboolean startsolid; // if true, the initial point was in a solid area
|
||
|
float fraction; // time completed, 1.0 = didn't hit anything
|
||
|
vec3_t endpos; // final position
|
||
|
cplane_t plane; // surface normal at impact
|
||
|
csurface_t *surface; // surface hit
|
||
|
int contents; // contents on other side of surface hit
|
||
|
struct edict_s *ent; // not set by CM_*() functions
|
||
|
} trace_t;
|
||
|
|
||
|
|
||
|
|
||
|
// pmove_state_t is the information necessary for client side movement
|
||
|
// prediction
|
||
|
typedef enum
|
||
|
{
|
||
|
// can accelerate and turn
|
||
|
PM_NORMAL,
|
||
|
PM_NORMAL_WITH_JETPACK,
|
||
|
|
||
|
// Ridah, vehicles
|
||
|
PM_HOVERCAR, // flying hovercar
|
||
|
PM_HOVERCAR_GROUND, // grounded hovercar
|
||
|
PM_BIKE, // motorcycle
|
||
|
PM_CAR, // uses vehicle code
|
||
|
// done.
|
||
|
|
||
|
PM_SPECTATOR,
|
||
|
// no acceleration or turning
|
||
|
PM_DEAD,
|
||
|
PM_GIB, // different bounding box
|
||
|
PM_FREEZE
|
||
|
} pmtype_t;
|
||
|
|
||
|
// pmove->pm_flags
|
||
|
#define PMF_DUCKED 1
|
||
|
#define PMF_JUMP_HELD 2
|
||
|
#define PMF_ON_GROUND 4
|
||
|
#define PMF_TIME_WATERJUMP 8 // pm_time is waterjump
|
||
|
#define PMF_TIME_LAND 16 // pm_time is time before rejump
|
||
|
#define PMF_TIME_TELEPORT 32 // pm_time is non-moving time
|
||
|
#define PMF_NO_PREDICTION 64 // temporarily disables prediction (used for grappling hook)
|
||
|
|
||
|
// Ridah, chasecam
|
||
|
#define PMF_CHASECAM 128
|
||
|
|
||
|
// this structure needs to be communicated bit-accurate
|
||
|
// from the server to the client to guarantee that
|
||
|
// prediction stays in sync, so no floats are used.
|
||
|
// if any part of the game code modifies this struct, it
|
||
|
// will result in a prediction error of some degree.
|
||
|
typedef struct
|
||
|
{
|
||
|
pmtype_t pm_type;
|
||
|
|
||
|
short origin[3]; // 12.3
|
||
|
short velocity[3]; // 12.3
|
||
|
byte pm_flags; // ducked, jump_held, etc
|
||
|
byte pm_time; // each unit = 8 ms
|
||
|
short gravity;
|
||
|
short delta_angles[3]; // add to command angles to get view direction
|
||
|
// changed by spawns, rotating objects, and teleporters
|
||
|
|
||
|
byte runscale; // Ridah, so we can mess with the running speed
|
||
|
} pmove_state_t;
|
||
|
|
||
|
|
||
|
//
|
||
|
// button bits
|
||
|
//
|
||
|
#define BUTTON_ATTACK 1
|
||
|
#define BUTTON_USE 2
|
||
|
#define BUTTON_ACTIVATE 4 // Joseph
|
||
|
|
||
|
#define BUTTON_ANY 128 // any key whatsoever
|
||
|
|
||
|
|
||
|
// usercmd_t is sent to the server each client frame
|
||
|
typedef struct usercmd_s
|
||
|
{
|
||
|
byte msec;
|
||
|
byte buttons;
|
||
|
short angles[3];
|
||
|
short forwardmove, sidemove, upmove;
|
||
|
byte impulse; // remove?
|
||
|
byte lightlevel; // light level the player is standing on
|
||
|
} usercmd_t;
|
||
|
|
||
|
|
||
|
#define MAXTOUCH 32
|
||
|
typedef struct
|
||
|
{
|
||
|
// state (in / out)
|
||
|
pmove_state_t s;
|
||
|
|
||
|
// command (in)
|
||
|
usercmd_t cmd;
|
||
|
qboolean snapinitial; // if s has been changed outside pmove
|
||
|
|
||
|
// results (out)
|
||
|
int numtouch;
|
||
|
struct edict_s *touchents[MAXTOUCH];
|
||
|
|
||
|
vec3_t viewangles; // clamped
|
||
|
float viewheight;
|
||
|
|
||
|
vec3_t mins, maxs; // bounding box size
|
||
|
|
||
|
struct edict_s *groundentity;
|
||
|
int watertype;
|
||
|
int waterlevel;
|
||
|
|
||
|
// callbacks to test the world
|
||
|
trace_t (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end);
|
||
|
int (*pointcontents) (vec3_t point);
|
||
|
|
||
|
// JOSEPH 1-SEP-98
|
||
|
int footsteptype;
|
||
|
|
||
|
// Ridah, bike collisions
|
||
|
int wall_collision;
|
||
|
|
||
|
} pmove_t;
|
||
|
|
||
|
|
||
|
// entity_state_t->effects
|
||
|
// Effects are things handled on the client side (lights, particles, frame animations)
|
||
|
// that happen constantly on the given entity.
|
||
|
// An entity that has effects will be sent to the client
|
||
|
// even if it has a zero index model.
|
||
|
#define EF_ROTATE 0x00000001 // rotate (bonus items)
|
||
|
#define EF_GIB 0x00000002 // leave a trail
|
||
|
#define EF_BLASTER 0x00000008 // redlight + trail
|
||
|
#define EF_ROCKET 0x00000010 // redlight + trail
|
||
|
#define EF_GRENADE 0x00000020
|
||
|
#define EF_HYPERBLASTER 0x00000040
|
||
|
#define EF_BFG 0x00000080
|
||
|
#define EF_COLOR_SHELL 0x00000100
|
||
|
#define EF_POWERSCREEN 0x00000200
|
||
|
#define EF_ANIM01 0x00000400 // automatically cycle between frames 0 and 1 at 2 hz
|
||
|
#define EF_ANIM23 0x00000800 // automatically cycle between frames 2 and 3 at 2 hz
|
||
|
#define EF_ANIM_ALL 0x00001000 // automatically cycle through all frames at 2hz
|
||
|
#define EF_ANIM_ALLFAST 0x00002000 // automatically cycle through all frames at 10hz
|
||
|
#define EF_FLIES 0x00004000
|
||
|
#define EF_QUAD 0x00008000
|
||
|
#define EF_PENT 0x00010000
|
||
|
#define EF_TELEPORTER 0x00020000 // particle fountain
|
||
|
#define EF_FLAG1 0x00040000
|
||
|
#define EF_FLAG2 0x00080000
|
||
|
#define EF_IONRIPPER 0x00100000
|
||
|
#define EF_FLASHLIGHT 0x00200000
|
||
|
#define EF_BLUEHYPERBLASTER 0x00400000
|
||
|
#define EF_SPINNINGLIGHTS 0x00800000
|
||
|
#define EF_PLASMA 0x01000000
|
||
|
#define EF_TRAP 0x02000000
|
||
|
#define EF_REFL 0x04000000
|
||
|
#define EF_FLAMETHROWER 0x08000000
|
||
|
#define EF_ANIM_ALLFAST_NEW 0x10000000 // automatically cycle through all frames at 10hz
|
||
|
|
||
|
// entity_state_t->renderfx flags
|
||
|
#define RF_MINLIGHT 1 // allways have some light (viewmodel)
|
||
|
#define RF_VIEWERMODEL 2 // don't draw through eyes, only mirrors
|
||
|
#define RF_WEAPONMODEL 4 // only draw through eyes
|
||
|
#define RF_FULLBRIGHT 8 // allways draw full intensity
|
||
|
#define RF_DEPTHHACK 16 // for view weapon Z crunching
|
||
|
#define RF_TRANSLUCENT 32
|
||
|
#define RF_FRAMELERP 64
|
||
|
#define RF_BEAM 128
|
||
|
#define RF_CUSTOMSKIN 256 // skin is an index in image_precache
|
||
|
#define RF_GLOW 512 // pulse lighting for bonus items
|
||
|
#define RF_SHELL_RED 1024
|
||
|
#define RF_SHELL_GREEN 2048
|
||
|
#define RF_SHELL_BLUE 4096
|
||
|
#define RF_REFL_MAP 8192 // (1<<13)
|
||
|
#define RF_FACING 16384 // (1<<14)
|
||
|
#define RF_FACINGUP 32768 // (1<<15)
|
||
|
// JOSEPH 21-JAN-99
|
||
|
#define RF_DIMLIGHT (1<<16) // allways draw dim light intensity
|
||
|
// END JOSEPH
|
||
|
|
||
|
// JOSEPH 20-MAY-99
|
||
|
// 1 - 16 must check that RF2_PASSLIGHT is not set
|
||
|
#define RF2_FLAMESHOOTER 1
|
||
|
#define RF2_FLAMESHOOTER_MOD 2
|
||
|
#define RF2_MODULUS_FRAME 4 // if the frame is higher than the max, just do a MODULUS on it
|
||
|
#define RF2_8 8
|
||
|
#define RF2_16 16
|
||
|
// END JOSEPH
|
||
|
|
||
|
#define RF2_ONLY_PARENTAL_LOCKED 32 // Ridah, this entity is visible only to clients who have the parental lock ENABLED (ie. if a player is gibbed, the body remains in the game, but is only visible to client's who can't see the gibs, since they are parental locked)
|
||
|
#define RF2_SCALE50 64 // .5
|
||
|
#define RF2_SCALE25 128 // .25
|
||
|
|
||
|
#define RF2_MONEYBAG 256 // used for Teamplay, shows a moneybag on the player's back, automatically animated
|
||
|
#define RF2_SURF_ALPHA 512
|
||
|
#define RF2_DIR_LIGHTS 1024 // Uses new directional lighting code
|
||
|
#define RF2_FLAMETHROWER 2048 // client-side flamthrower effects (damage done in game code)
|
||
|
#define RF2_PASSALPHA 4096
|
||
|
#define RF2_NOSHADOW 8192
|
||
|
#define RF2_BEAM2 16384
|
||
|
#define RF2_PASSLIGHT 32768
|
||
|
|
||
|
|
||
|
// player_state_t->refdef flags
|
||
|
#define RDF_UNDERWATER 1 // warp the screen as apropriate
|
||
|
#define RDF_NOWORLDMODEL 2 // used for player configuration screen
|
||
|
|
||
|
#define RDF_PAUSED 4 // Ridah, so renderer knows if it's paused
|
||
|
|
||
|
// RAFAEL
|
||
|
#define RDF_NOLERP 8
|
||
|
#define RDF_SKINPLUS 16
|
||
|
#define RDF_SKINPLUSPLUS 32
|
||
|
|
||
|
// JOSEPH 14-JAN-99
|
||
|
#define RDF_NOWORLDMODELALPHA 64 // used for inventory screen
|
||
|
|
||
|
//
|
||
|
// muzzle flashes / player effects
|
||
|
//
|
||
|
#define MZ_BLASTER 0
|
||
|
#define MZ_MACHINEGUN 1
|
||
|
#define MZ_SHOTGUN 2
|
||
|
#define MZ_CHAINGUN1 3
|
||
|
#define MZ_CHAINGUN2 4
|
||
|
#define MZ_CHAINGUN3 5
|
||
|
#define MZ_RAILGUN 6
|
||
|
#define MZ_ROCKET 7
|
||
|
#define MZ_GRENADE 8
|
||
|
#define MZ_LOGIN 9
|
||
|
#define MZ_LOGOUT 10
|
||
|
#define MZ_RESPAWN 11
|
||
|
#define MZ_BFG 12
|
||
|
#define MZ_SSHOTGUN 13
|
||
|
#define MZ_HYPERBLASTER 14
|
||
|
#define MZ_ITEMRESPAWN 15
|
||
|
// RAFAEL
|
||
|
#define MZ_IONRIPPER 16
|
||
|
#define MZ_BLUEHYPERBLASTER 17
|
||
|
#define MZ_PHALANX 18
|
||
|
#define MZ_PISTOL 19
|
||
|
|
||
|
|
||
|
#define MZ_BLACKJACK_SWING 20
|
||
|
#define MZ_BLACKJACK_HIT 21
|
||
|
|
||
|
#define MZ_SPISTOL 22
|
||
|
#define MZ_PISTOL_DAMAGE_MOD 23
|
||
|
|
||
|
// JOSEPH 19-JAN-99
|
||
|
#define MZ_CROWBAR_SWING 24
|
||
|
#define MZ_CROWBAR_HIT 25
|
||
|
// END JOSEPH
|
||
|
|
||
|
#define MZ_BARMACHINEGUN 26
|
||
|
#define MZ_BARMACHINEGUN2 27
|
||
|
|
||
|
#define MZ_SILENCED 128 // bit flag ORed with one of the above numbers
|
||
|
|
||
|
//
|
||
|
// monster muzzle flashes
|
||
|
//
|
||
|
#define MZ2_TANK_BLASTER_1 1
|
||
|
#define MZ2_TANK_BLASTER_2 2
|
||
|
#define MZ2_TANK_BLASTER_3 3
|
||
|
#define MZ2_TANK_MACHINEGUN_1 4
|
||
|
#define MZ2_TANK_MACHINEGUN_2 5
|
||
|
#define MZ2_TANK_MACHINEGUN_3 6
|
||
|
#define MZ2_TANK_MACHINEGUN_4 7
|
||
|
#define MZ2_TANK_MACHINEGUN_5 8
|
||
|
#define MZ2_TANK_MACHINEGUN_6 9
|
||
|
#define MZ2_TANK_MACHINEGUN_7 10
|
||
|
#define MZ2_TANK_MACHINEGUN_8 11
|
||
|
#define MZ2_TANK_MACHINEGUN_9 12
|
||
|
#define MZ2_TANK_MACHINEGUN_10 13
|
||
|
#define MZ2_TANK_MACHINEGUN_11 14
|
||
|
#define MZ2_TANK_MACHINEGUN_12 15
|
||
|
#define MZ2_TANK_MACHINEGUN_13 16
|
||
|
#define MZ2_TANK_MACHINEGUN_14 17
|
||
|
#define MZ2_TANK_MACHINEGUN_15 18
|
||
|
#define MZ2_TANK_MACHINEGUN_16 19
|
||
|
#define MZ2_TANK_MACHINEGUN_17 20
|
||
|
#define MZ2_TANK_MACHINEGUN_18 21
|
||
|
#define MZ2_TANK_MACHINEGUN_19 22
|
||
|
#define MZ2_TANK_ROCKET_1 23
|
||
|
#define MZ2_TANK_ROCKET_2 24
|
||
|
#define MZ2_TANK_ROCKET_3 25
|
||
|
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_1 26
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_2 27
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_3 28
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_4 29
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_5 30
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_6 31
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_7 32
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_8 33
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_9 34
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_10 35
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_11 36
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_12 37
|
||
|
#define MZ2_INFANTRY_MACHINEGUN_13 38
|
||
|
|
||
|
#define MZ2_SOLDIER_BLASTER_1 39
|
||
|
#define MZ2_SOLDIER_BLASTER_2 40
|
||
|
#define MZ2_SOLDIER_SHOTGUN_1 41
|
||
|
#define MZ2_SOLDIER_SHOTGUN_2 42
|
||
|
#define MZ2_SOLDIER_MACHINEGUN_1 43
|
||
|
#define MZ2_SOLDIER_MACHINEGUN_2 44
|
||
|
|
||
|
#define MZ2_GUNNER_MACHINEGUN_1 45
|
||
|
#define MZ2_GUNNER_MACHINEGUN_2 46
|
||
|
#define MZ2_GUNNER_MACHINEGUN_3 47
|
||
|
#define MZ2_GUNNER_MACHINEGUN_4 48
|
||
|
#define MZ2_GUNNER_MACHINEGUN_5 49
|
||
|
#define MZ2_GUNNER_MACHINEGUN_6 50
|
||
|
#define MZ2_GUNNER_MACHINEGUN_7 51
|
||
|
#define MZ2_GUNNER_MACHINEGUN_8 52
|
||
|
#define MZ2_GUNNER_GRENADE_1 53
|
||
|
#define MZ2_GUNNER_GRENADE_2 54
|
||
|
#define MZ2_GUNNER_GRENADE_3 55
|
||
|
#define MZ2_GUNNER_GRENADE_4 56
|
||
|
|
||
|
#define MZ2_CHICK_ROCKET_1 57
|
||
|
|
||
|
#define MZ2_FLYER_BLASTER_1 58
|
||
|
#define MZ2_FLYER_BLASTER_2 59
|
||
|
|
||
|
#define MZ2_MEDIC_BLASTER_1 60
|
||
|
|
||
|
#define MZ2_GLADIATOR_RAILGUN_1 61
|
||
|
|
||
|
#define MZ2_HOVER_BLASTER_1 62
|
||
|
|
||
|
#define MZ2_ACTOR_MACHINEGUN_1 63
|
||
|
|
||
|
#define MZ2_SUPERTANK_MACHINEGUN_1 64
|
||
|
#define MZ2_SUPERTANK_MACHINEGUN_2 65
|
||
|
#define MZ2_SUPERTANK_MACHINEGUN_3 66
|
||
|
#define MZ2_SUPERTANK_MACHINEGUN_4 67
|
||
|
#define MZ2_SUPERTANK_MACHINEGUN_5 68
|
||
|
#define MZ2_SUPERTANK_MACHINEGUN_6 69
|
||
|
#define MZ2_SUPERTANK_ROCKET_1 70
|
||
|
#define MZ2_SUPERTANK_ROCKET_2 71
|
||
|
#define MZ2_SUPERTANK_ROCKET_3 72
|
||
|
|
||
|
#define MZ2_BOSS2_MACHINEGUN_L1 73
|
||
|
#define MZ2_BOSS2_MACHINEGUN_L2 74
|
||
|
#define MZ2_BOSS2_MACHINEGUN_L3 75
|
||
|
#define MZ2_BOSS2_MACHINEGUN_L4 76
|
||
|
#define MZ2_BOSS2_MACHINEGUN_L5 77
|
||
|
#define MZ2_BOSS2_ROCKET_1 78
|
||
|
#define MZ2_BOSS2_ROCKET_2 79
|
||
|
#define MZ2_BOSS2_ROCKET_3 80
|
||
|
#define MZ2_BOSS2_ROCKET_4 81
|
||
|
|
||
|
#define MZ2_FLOAT_BLASTER_1 82
|
||
|
|
||
|
#define MZ2_SOLDIER_BLASTER_3 83
|
||
|
#define MZ2_SOLDIER_SHOTGUN_3 84
|
||
|
#define MZ2_SOLDIER_MACHINEGUN_3 85
|
||
|
#define MZ2_SOLDIER_BLASTER_4 86
|
||
|
#define MZ2_SOLDIER_SHOTGUN_4 87
|
||
|
#define MZ2_SOLDIER_MACHINEGUN_4 88
|
||
|
#define MZ2_SOLDIER_BLASTER_5 89
|
||
|
#define MZ2_SOLDIER_SHOTGUN_5 90
|
||
|
#define MZ2_SOLDIER_MACHINEGUN_5 91
|
||
|
#define MZ2_SOLDIER_BLASTER_6 92
|
||
|
#define MZ2_SOLDIER_SHOTGUN_6 93
|
||
|
#define MZ2_SOLDIER_MACHINEGUN_6 94
|
||
|
#define MZ2_SOLDIER_BLASTER_7 95
|
||
|
#define MZ2_SOLDIER_SHOTGUN_7 96
|
||
|
#define MZ2_SOLDIER_MACHINEGUN_7 97
|
||
|
#define MZ2_SOLDIER_BLASTER_8 98
|
||
|
#define MZ2_SOLDIER_SHOTGUN_8 99
|
||
|
#define MZ2_SOLDIER_MACHINEGUN_8 100
|
||
|
|
||
|
// --- Xian shit below ---
|
||
|
#define MZ2_MAKRON_BFG 101
|
||
|
#define MZ2_MAKRON_BLASTER_1 102
|
||
|
#define MZ2_MAKRON_BLASTER_2 103
|
||
|
#define MZ2_MAKRON_BLASTER_3 104
|
||
|
#define MZ2_MAKRON_BLASTER_4 105
|
||
|
#define MZ2_MAKRON_BLASTER_5 106
|
||
|
#define MZ2_MAKRON_BLASTER_6 107
|
||
|
#define MZ2_MAKRON_BLASTER_7 108
|
||
|
#define MZ2_MAKRON_BLASTER_8 109
|
||
|
#define MZ2_MAKRON_BLASTER_9 110
|
||
|
#define MZ2_MAKRON_BLASTER_10 111
|
||
|
#define MZ2_MAKRON_BLASTER_11 112
|
||
|
#define MZ2_MAKRON_BLASTER_12 113
|
||
|
#define MZ2_MAKRON_BLASTER_13 114
|
||
|
#define MZ2_MAKRON_BLASTER_14 115
|
||
|
#define MZ2_MAKRON_BLASTER_15 116
|
||
|
#define MZ2_MAKRON_BLASTER_16 117
|
||
|
#define MZ2_MAKRON_BLASTER_17 118
|
||
|
#define MZ2_MAKRON_RAILGUN_1 119
|
||
|
#define MZ2_JORG_MACHINEGUN_L1 120
|
||
|
#define MZ2_JORG_MACHINEGUN_L2 121
|
||
|
#define MZ2_JORG_MACHINEGUN_L3 122
|
||
|
#define MZ2_JORG_MACHINEGUN_L4 123
|
||
|
#define MZ2_JORG_MACHINEGUN_L5 124
|
||
|
#define MZ2_JORG_MACHINEGUN_L6 125
|
||
|
#define MZ2_JORG_MACHINEGUN_R1 126
|
||
|
#define MZ2_JORG_MACHINEGUN_R2 127
|
||
|
#define MZ2_JORG_MACHINEGUN_R3 128
|
||
|
#define MZ2_JORG_MACHINEGUN_R4 129
|
||
|
#define MZ2_JORG_MACHINEGUN_R5 130
|
||
|
#define MZ2_JORG_MACHINEGUN_R6 131
|
||
|
#define MZ2_JORG_BFG_1 132
|
||
|
#define MZ2_BOSS2_MACHINEGUN_R1 133
|
||
|
#define MZ2_BOSS2_MACHINEGUN_R2 134
|
||
|
#define MZ2_BOSS2_MACHINEGUN_R3 135
|
||
|
#define MZ2_BOSS2_MACHINEGUN_R4 136
|
||
|
#define MZ2_BOSS2_MACHINEGUN_R5 137
|
||
|
|
||
|
// JOSEPH 2-SEP-98
|
||
|
#define MZ3_LEADHIT_METAL 1
|
||
|
|
||
|
extern vec3_t monster_flash_offset [];
|
||
|
|
||
|
// ----------------------------------------------------------------
|
||
|
// Ridah, Surface Sprite Effects
|
||
|
#define SFX_SPRITE_SURF_BLOOD1 0
|
||
|
#define SFX_SPRITE_SURF_BULLET1 1
|
||
|
#define SFX_SPRITE_SURF_RIPPLE 2
|
||
|
#define SFX_SPRITE_SURF_BLOOD_POOL 5
|
||
|
|
||
|
// need these for each SFX_SPRITE_SURF, so the engine knows what dimensions they are
|
||
|
#define SFX_BLOOD_WIDTH 16
|
||
|
#define SFX_BLOOD_HEIGHT 16
|
||
|
#define SFX_BULLET_WIDTH 1
|
||
|
#define SFX_BULLET_HEIGHT 1
|
||
|
#define SFX_RIPPLE_WIDTH 8
|
||
|
#define SFX_RIPPLE_HEIGHT 8
|
||
|
|
||
|
// SFX flags
|
||
|
#define SFX_FLAG_GRAVITY 1 // velocity is effected by gravity
|
||
|
#define SFX_FLAG_SURFACE_EFFECT 2 // this is a surface effect, therefore velocity is the surface normal, and sprite will use alpha = 1 for "fadein_time"
|
||
|
#define SFX_FLAG_NO_FLIP 4 // this SFX won't have it's S coordinate randomly flipped
|
||
|
#define SFX_FLAG_LIGHTFLARE 8 // no depth checking, align with view
|
||
|
#define SFX_FLAG_DEPTHHACK 16
|
||
|
#define SFX_FLAG_UPRIGHT 32 // used for fire in barrel
|
||
|
#define SFX_FLAG_VEL_IS_ANGLES 64
|
||
|
#define SFX_FLAG_ADDITIVE_BLEND 128
|
||
|
#define SFX_FLAG_ALPHA_IS_FRAME 256
|
||
|
#define SFX_FLAG_VEL_IS_COLOR_MODULATION 512
|
||
|
#define SFX_FLAG_CLOSE_CULL 1024
|
||
|
|
||
|
#define SFX_GRAVITY 100.0 // gravity value for all SFX effected by gravity
|
||
|
|
||
|
// temp entity events
|
||
|
//
|
||
|
// Temp entity events are for things that happen
|
||
|
// at a location seperate from any existing entity.
|
||
|
// Temporary entity messages are explicitly constructed
|
||
|
// and broadcast.
|
||
|
typedef enum
|
||
|
{
|
||
|
TE_GUNSHOT,
|
||
|
TE_GUNSHOT_VISIBLE,
|
||
|
TE_BLOOD,
|
||
|
TE_BLASTER,
|
||
|
TE_RAILTRAIL,
|
||
|
TE_SHOTGUN,
|
||
|
TE_EXPLOSION1,
|
||
|
TE_EXPLOSION2,
|
||
|
TE_ROCKET_EXPLOSION,
|
||
|
TE_GRENADE_EXPLOSION,
|
||
|
TE_METAL_SPARKS,
|
||
|
TE_SPARKS,
|
||
|
TE_SPLASH,
|
||
|
TE_BUBBLETRAIL,
|
||
|
TE_SCREEN_SPARKS,
|
||
|
TE_SHIELD_SPARKS,
|
||
|
TE_BULLET_SPARKS,
|
||
|
TE_LASER_SPARKS,
|
||
|
TE_PARASITE_ATTACK,
|
||
|
TE_ROCKET_EXPLOSION_WATER,
|
||
|
TE_GRENADE_EXPLOSION_WATER,
|
||
|
TE_MEDIC_CABLE_ATTACK,
|
||
|
TE_BFG_EXPLOSION,
|
||
|
TE_BFG_BIGEXPLOSION,
|
||
|
TE_BOSSTPORT, // used as '22' in a map, so DON'T RENUMBER!!!
|
||
|
TE_BFG_LASER,
|
||
|
TE_GRAPPLE_CABLE,
|
||
|
// RAFAEL
|
||
|
TE_WELDING_SPARKS,
|
||
|
TE_GREENBLOOD,
|
||
|
TE_BLUEHYPERBLASTER,
|
||
|
TE_PLASMA_EXPLOSION,
|
||
|
TE_TUNNEL_SPARKS,
|
||
|
// JOSEPH 30-AUG-98
|
||
|
TE_SFXFIRE,
|
||
|
TE_SFXSMOKE,
|
||
|
TE_SFXFIREGO,
|
||
|
TE_SUN_FLARE,
|
||
|
TE_GUN_FLARE,
|
||
|
TE_SNOW,
|
||
|
TE_RAIN,
|
||
|
// END JOSEPH
|
||
|
TE_LIGHT_FLARE,
|
||
|
// Ridah, Surface Sprites
|
||
|
// RAFAEL
|
||
|
TE_BLOOD_DRIP,
|
||
|
TE_BLOOD_SPLAT,
|
||
|
TE_BLOOD_POOL,
|
||
|
TE_SURFACE_SPRITE_ENTITY,
|
||
|
TE_BURN_TO_A_CRISP,
|
||
|
// JOSEPH 18-FEB-99
|
||
|
TE_CONCUSSION_EXPLOSION,
|
||
|
TE_CONCUSSION_EXPLOSION_WATER,
|
||
|
TE_EXPLOSION1B,
|
||
|
// END JOSEPH
|
||
|
// JOSEPH 1-MAR-99
|
||
|
TE_IMPACT,
|
||
|
TE_EXPLOSION1C,
|
||
|
// END JOSEPH
|
||
|
// JOSEPH 19-FEB-99
|
||
|
TE_SFXSTEAM,
|
||
|
// END JOSEPH
|
||
|
// JOSEPH 3-MAR-99
|
||
|
TE_SFXSMOKE2,
|
||
|
// END JOSEPH
|
||
|
// JOSEPH 2-APR-99
|
||
|
TE_IMPACT_CONCUSSION,
|
||
|
// END JOSEPH
|
||
|
TE_ART_BURN, // used to mark surfaces by artists
|
||
|
TE_FOG_BRUSH,
|
||
|
TE_GIBS,
|
||
|
TE_CONCUSSION_EXPLOSION_BIG,
|
||
|
// JOSEPH 9-APR-99
|
||
|
TE_BARMACHINGUN,
|
||
|
TE_SFXFIRET
|
||
|
// END JOSEPH
|
||
|
} temp_event_t;
|
||
|
|
||
|
#define SPLASH_UNKNOWN 0
|
||
|
#define SPLASH_SPARKS 1
|
||
|
#define SPLASH_BLUE_WATER 2
|
||
|
#define SPLASH_BROWN_WATER 3
|
||
|
#define SPLASH_SLIME 4
|
||
|
#define SPLASH_LAVA 5
|
||
|
#define SPLASH_BLOOD 6
|
||
|
// JOSEPH 17-MAY-99
|
||
|
#define SPLASH_SPARKS_P 7
|
||
|
// END JOSEPH
|
||
|
|
||
|
// sound channels
|
||
|
// channel 0 never willingly overrides
|
||
|
// other channels (1-7) allways override a playing sound on that channel
|
||
|
#define CHAN_AUTO 0
|
||
|
#define CHAN_WEAPON 1
|
||
|
#define CHAN_VOICE 2
|
||
|
#define CHAN_ITEM 3
|
||
|
#define CHAN_BODY 4
|
||
|
#define CHAN_SPECIAL 5
|
||
|
// modifier flags
|
||
|
#define CHAN_NO_PHS_ADD 8 // send to all clients, not just ones in PHS (ATTN 0 will also do this)
|
||
|
#define CHAN_RELIABLE 16 // send by reliable message, not datagram
|
||
|
|
||
|
|
||
|
// sound attenuation values
|
||
|
#define ATTN_NONE 0 // full volume the entire level
|
||
|
#define ATTN_NORM 1
|
||
|
#define ATTN_IDLE 2
|
||
|
#define ATTN_STATIC 3 // diminish very rapidly with distance
|
||
|
|
||
|
|
||
|
// player_state->stats[] indexes
|
||
|
#define STAT_CASH_PICKUP 0
|
||
|
#define STAT_HEALTH 1
|
||
|
#define STAT_AMMO_ICON 2
|
||
|
#define STAT_AMMO 3
|
||
|
|
||
|
#define STAT_ARMOR1 4 //previous STAT_ARMOR_ICON
|
||
|
#define STAT_ARMOR2 5 //previous STAT_ARMOR
|
||
|
#define STAT_ARMOR3 6 //previous STAT_SELECTED_ICON
|
||
|
|
||
|
#define STAT_PICKUP_ICON 7
|
||
|
#define STAT_PICKUP_STRING 8
|
||
|
// JOSEPH 12-MAY-99-B
|
||
|
#define STAT_ENDPIC 9 //previous STAT_TIMER_ICON
|
||
|
// END JOSEPH
|
||
|
#define STAT_TIMER 10
|
||
|
#define STAT_HELPICON 11
|
||
|
#define STAT_SELECTED_ITEM 12
|
||
|
#define STAT_LAYOUTS 13
|
||
|
#define STAT_FRAGS 14
|
||
|
#define STAT_FLASHES 15 // cleared each frame, 1 = health, 2 = armor
|
||
|
#define STAT_CASH 16
|
||
|
#define STAT_PICKUP_COUNT 17
|
||
|
|
||
|
// RAFAEL 01-11-99
|
||
|
#define STAT_CLIP 18
|
||
|
#define STAT_CLIP_ICON 19
|
||
|
|
||
|
// JOSEPH 26-JAN-99
|
||
|
#define STAT_HUD_INV 20
|
||
|
// END JOSEPH
|
||
|
|
||
|
// Following are duplicated for deathmatch, so beware if changing!
|
||
|
#define STAT_HUD_ENEMY_TALK 21
|
||
|
#define STAT_HUD_SELF_TALK 22
|
||
|
#define STAT_HUD_ENEMY_TALK_TIME 23
|
||
|
#define STAT_HUD_SELF_TALK_TIME 24
|
||
|
#define STAT_FORCE_HUD 25
|
||
|
|
||
|
#define STAT_HUD_HIRE1 26
|
||
|
#define STAT_HUD_HIRE2 27
|
||
|
#define STAT_HUD_HIRE1_CMD 28
|
||
|
#define STAT_HUD_HIRE2_CMD 29
|
||
|
|
||
|
// Ridah, duplicated these for use in teamplay, since they aren't used at all in multiplay
|
||
|
#define STAT_BAGCASH 21
|
||
|
#define STAT_DEPOSITED 22
|
||
|
//#define STAT_HUD_ENEMY_TALK_TIME 23
|
||
|
//#define STAT_HUD_SELF_TALK_TIME 24
|
||
|
|
||
|
#define STAT_TEAM1_SCORE 26
|
||
|
#define STAT_TEAM2_SCORE 27
|
||
|
#define STAT_TEAM1_FLASH 28 // 0 - no flash, 1 - green, 2 - red
|
||
|
#define STAT_TEAM2_FLASH 29 // 0 - no flash, 1 - green, 2 - red
|
||
|
// done.
|
||
|
|
||
|
|
||
|
#define STAT_HIDE_HUD 30
|
||
|
#define STAT_SWITCH_CAMERA 31
|
||
|
#define MAX_STATS 32
|
||
|
|
||
|
|
||
|
// dmflags->value flags
|
||
|
// Ridah, 26-may-99, disabled those that are not used in Kingpin
|
||
|
#define DF_NO_HEALTH 1
|
||
|
|
||
|
// Ridah, 27-may-99, Not used anymore
|
||
|
//#define DF_NO_ITEMS 2
|
||
|
#define DF_AUTO_JOIN_TEAM 2
|
||
|
|
||
|
#define DF_WEAPONS_STAY 4
|
||
|
#define DF_NO_FALLING 8
|
||
|
|
||
|
// Ridah, 27-may-99, not used
|
||
|
//#define DF_INSTANT_ITEMS 16
|
||
|
|
||
|
#define DF_SAME_LEVEL 32
|
||
|
|
||
|
// Ridah, 27-may-99, not used (teams determined by model and skin
|
||
|
//#define DF_SKINTEAMS 64
|
||
|
|
||
|
#define DF_MODELTEAMS 128
|
||
|
#define DF_NO_FRIENDLY_FIRE 256
|
||
|
#define DF_SPAWN_FARTHEST 512
|
||
|
#define DF_FORCE_RESPAWN 1024
|
||
|
#define DF_NO_ARMOR 2048
|
||
|
#define DF_ALLOW_EXIT 4096
|
||
|
#define DF_INFINITE_AMMO 8192
|
||
|
|
||
|
// Ridah, 27-may-99, not used
|
||
|
//#define DF_QUAD_DROP 16384
|
||
|
|
||
|
#define DF_FIXED_FOV 32768
|
||
|
|
||
|
// Ridah, 27-may-99, not used
|
||
|
//#define DF_QUADFIRE_DROP 65536
|
||
|
|
||
|
/*
|
||
|
==========================================================
|
||
|
|
||
|
ELEMENTS COMMUNICATED ACROSS THE NET
|
||
|
|
||
|
==========================================================
|
||
|
*/
|
||
|
|
||
|
#define ANGLE2SHORT(x) ((int)((x)*65536/360) & 65535)
|
||
|
#define SHORT2ANGLE(x) ((x)*(360.0/65536))
|
||
|
|
||
|
|
||
|
//
|
||
|
// config strings are a general means of communication from
|
||
|
// the server to all connected clients.
|
||
|
// Each config string can be at most MAX_QPATH characters.
|
||
|
//
|
||
|
#define CS_NAME 0
|
||
|
#define CS_CDTRACK 1
|
||
|
|
||
|
#define CS_DENSITY 2
|
||
|
#define CS_FOGVAL 3
|
||
|
|
||
|
#define CS_DENSITY2 4
|
||
|
#define CS_FOGVAL2 5
|
||
|
|
||
|
#define CS_SKY 6
|
||
|
#define CS_STATUSBAR 7 // display program string
|
||
|
|
||
|
// RAFAEL
|
||
|
//#define CS_SKYBOX_ORIGIN 10
|
||
|
/*
|
||
|
#define CS_SKY 2
|
||
|
#define CS_SKYAXIS 3 // %f %f %f format
|
||
|
#define CS_SKYROTATE 4
|
||
|
#define CS_STATUSBAR 5 // display program string
|
||
|
*/
|
||
|
|
||
|
#define CS_SERVER_VERSION 29 // so new clients can decide which version of download code to use
|
||
|
|
||
|
#define CS_MAXCLIENTS 30
|
||
|
#define CS_MAPCHECKSUM 31 // for catching cheater maps
|
||
|
|
||
|
#define CS_MODELS 32
|
||
|
#define CS_SOUNDS (CS_MODELS+MAX_MODELS)
|
||
|
#define CS_IMAGES (CS_SOUNDS+MAX_SOUNDS)
|
||
|
#define CS_MODELSKINS (CS_IMAGES+MAX_IMAGES)
|
||
|
#define CS_LIGHTS (CS_MODELSKINS+MAX_MODELS)
|
||
|
#define CS_ITEMS (CS_LIGHTS+MAX_LIGHTSTYLES)
|
||
|
#define CS_PLAYERSKINS (CS_ITEMS+MAX_ITEMS)
|
||
|
#define CS_LIGHTFLARES (CS_PLAYERSKINS+MAX_CLIENTS)
|
||
|
#define CS_JUNIORS (CS_LIGHTFLARES+MAX_LIGHTFLARES)
|
||
|
#define CS_GENERAL (CS_JUNIORS+MAX_JUNIOR_STRINGS)
|
||
|
#define MAX_CONFIGSTRINGS (CS_GENERAL+MAX_GENERAL)
|
||
|
|
||
|
|
||
|
// Ridah, Lightflares
|
||
|
#define FLARE_NORMAL 0
|
||
|
#define FLARE_SUN 1 // pos is actually the direction vector
|
||
|
#define FLARE_AMBER 2
|
||
|
#define FLARE_RED 3
|
||
|
#define FLARE_BLUE 4
|
||
|
#define FLARE_GREEN 5
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
char lightstyle, type;
|
||
|
vec3_t pos;
|
||
|
float size;
|
||
|
} lightflare_t;
|
||
|
|
||
|
/*
|
||
|
typedef struct
|
||
|
{
|
||
|
char showflare;
|
||
|
vec3_t origin;
|
||
|
vec3_t angles;
|
||
|
} sunflare_t;
|
||
|
*/
|
||
|
|
||
|
char num_flares; // this also goes into the configstring, at the start of the lightflare section
|
||
|
// done.
|
||
|
|
||
|
//==============================================
|
||
|
|
||
|
|
||
|
// entity_state_t->event values
|
||
|
// ertity events are for effects that take place reletive
|
||
|
// to an existing entities origin. Very network efficient.
|
||
|
// All muzzle flashes really should be converted to events...
|
||
|
|
||
|
// JOSEPH 1-SEP-98
|
||
|
typedef enum
|
||
|
{
|
||
|
EV_NONE,
|
||
|
EV_ITEM_RESPAWN,
|
||
|
EV_FOOTSTEP0,
|
||
|
EV_FOOTSTEP1,
|
||
|
EV_FOOTSTEP2,
|
||
|
EV_FOOTSTEP3,
|
||
|
EV_FOOTSTEP4,
|
||
|
EV_FOOTSTEP5,
|
||
|
EV_FOOTSTEP6,
|
||
|
EV_FOOTSTEP7,
|
||
|
// JOSEPH 26-JAN-99
|
||
|
EV_FOOTSTEP8,
|
||
|
// END JOSEPH
|
||
|
EV_FALLSHORT0,
|
||
|
EV_FALLSHORT1,
|
||
|
EV_FALLSHORT2,
|
||
|
EV_FALLSHORT3,
|
||
|
EV_FALLSHORT4,
|
||
|
EV_FALLSHORT5,
|
||
|
EV_FALLSHORT6,
|
||
|
EV_FALLSHORT7,
|
||
|
// JOSEPH 26-JAN-99
|
||
|
EV_FALLSHORT8,
|
||
|
// END JOSEPH
|
||
|
EV_FALL,
|
||
|
EV_FALLFAR,
|
||
|
EV_PLAYER_TELEPORT,
|
||
|
EV_OTHER_TELEPORT
|
||
|
} entity_event_t;
|
||
|
// END JOSEPH
|
||
|
|
||
|
// JOSEPH 18-FEB-99
|
||
|
typedef enum
|
||
|
{
|
||
|
TT_NONE = 0,
|
||
|
TT_POSITIVE,
|
||
|
TT_FIGHT,
|
||
|
TT_NEGATIVE,
|
||
|
TT_QUESTION,
|
||
|
TT_NEUTRAL,
|
||
|
TT_NEWHUD,
|
||
|
TT_NO,
|
||
|
TT_YES,
|
||
|
TT_COMMAND,
|
||
|
} talk_tone;
|
||
|
// END JOSEPH
|
||
|
|
||
|
// Ridah, MDX
|
||
|
typedef struct
|
||
|
{
|
||
|
vec3_t mins, maxs;
|
||
|
} object_bounds_t;
|
||
|
|
||
|
#define MAX_MODEL_PARTS 8 // must change network code to increase this (also savegame code)
|
||
|
#define MAX_MODELPART_OBJECTS 8 // absolutely do not change, bound by "invisible_objects" bit-flags
|
||
|
|
||
|
typedef struct model_part_s
|
||
|
{
|
||
|
// Ridah, MDX, ENABLE the following line when .mdx system goes online
|
||
|
int modelindex; // leave as 0 if blank
|
||
|
|
||
|
// int invisible_objects; // bit flags that define which sub-parts NOT to display when SET
|
||
|
byte invisible_objects; // bit flags that define which sub-parts NOT to display when SET
|
||
|
byte skinnum[MAX_MODELPART_OBJECTS];
|
||
|
|
||
|
// server-only data used for collision detection, etc
|
||
|
int object_bounds[MAX_MODELPART_OBJECTS]; // read in and allocated immediately after setting the modelindex
|
||
|
char *objectbounds_filename; // so we can restore the object bounds data when loading a savegame
|
||
|
|
||
|
int baseskin;
|
||
|
byte hitpoints[MAX_MODELPART_OBJECTS];
|
||
|
byte hit_scale[MAX_MODELPART_OBJECTS]; // 0-250
|
||
|
} model_part_t;
|
||
|
// done.
|
||
|
|
||
|
// entity_state_t is the information conveyed from the server
|
||
|
// in an update message about entities that the client will
|
||
|
// need to render in some way
|
||
|
|
||
|
#define MAX_MODEL_DIR_LIGHTS 3 // bound to 8 by network code
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
int light_indexes[MAX_MODEL_DIR_LIGHTS]; // so we can tell the client to use a certain light index, and it knows the details for that light
|
||
|
|
||
|
vec3_t light_vecs[MAX_MODEL_DIR_LIGHTS]; // static light directions that touch this model (dynamic are added in ref_gl)
|
||
|
vec3_t light_colors[MAX_MODEL_DIR_LIGHTS];
|
||
|
float light_intensities[MAX_MODEL_DIR_LIGHTS]; // 0.0 -> 1.0
|
||
|
byte light_styles[MAX_MODEL_DIR_LIGHTS];
|
||
|
int num_dir_lights;
|
||
|
|
||
|
// below this doesn't get sent to client (only used at server side)
|
||
|
vec3_t light_orgs[MAX_MODEL_DIR_LIGHTS];
|
||
|
|
||
|
} model_lighting_t;
|
||
|
|
||
|
// Ridah, flamethrower
|
||
|
typedef struct flamejunc_s
|
||
|
{
|
||
|
vec3_t org, vel;
|
||
|
float start_width, end_width, start_height, end_height;
|
||
|
float lifetime, fadein_time;
|
||
|
float start_alpha, end_alpha;
|
||
|
|
||
|
// current values
|
||
|
float aged, alpha;
|
||
|
float width, height;
|
||
|
|
||
|
vec3_t unitvel;
|
||
|
int hit_wall;
|
||
|
|
||
|
struct flamejunc_s *next;
|
||
|
} flamejunc_t;
|
||
|
|
||
|
typedef struct entity_state_s
|
||
|
{
|
||
|
int number; // edict index
|
||
|
|
||
|
vec3_t origin;
|
||
|
vec3_t angles;
|
||
|
vec3_t old_origin; // for lerping
|
||
|
int modelindex;
|
||
|
// int modelindex2, modelindex3, modelindex4; // weapons, CTF flags, etc
|
||
|
int frame;
|
||
|
int skinnum;
|
||
|
int effects;
|
||
|
int renderfx;
|
||
|
int solid; // for client side prediction, 8*(bits 0-4) is x/y radius
|
||
|
// 8*(bits 5-9) is z down distance, 8(bits10-15) is z up
|
||
|
// gi.linkentity sets this properly
|
||
|
int sound; // for looping sounds, to guarantee shutoff
|
||
|
int event; // impulse events -- muzzle flashes, footsteps, etc
|
||
|
// events only go out for a single frame, they
|
||
|
// are automatically cleared each frame
|
||
|
|
||
|
int renderfx2;
|
||
|
|
||
|
// Ridah, MDX, making way for .mdx system..
|
||
|
int num_parts;
|
||
|
model_part_t model_parts[MAX_MODEL_PARTS];
|
||
|
// done.
|
||
|
|
||
|
// Ridah, new lighting data
|
||
|
model_lighting_t model_lighting;
|
||
|
|
||
|
vec3_t last_lighting_update_pos; // so we only calculate when a good distance from the last checked position
|
||
|
vec3_t last_lighting_vec_update_pos; // set when we update the vecs
|
||
|
|
||
|
// Ridah, flamethrower (only used on client-side)
|
||
|
flamejunc_t *flamejunc_head;
|
||
|
// JOSEPH 15-APR-99
|
||
|
flamejunc_t *flamejunc_head2;
|
||
|
// END JOSEPH
|
||
|
int last_time, prev_last_time; // time of last call to CL_FlameEffects() for this entity
|
||
|
byte broken_flag; // set if we release the trigger, so next time we fire, we can free all current flames
|
||
|
|
||
|
float alpha; // set in CL_AddPacketEntities() from entity_state->effects
|
||
|
|
||
|
float scale; // ranges from 0.0 -> 2.0
|
||
|
|
||
|
} entity_state_t;
|
||
|
|
||
|
//==============================================
|
||
|
|
||
|
|
||
|
// player_state_t is the information needed in addition to pmove_state_t
|
||
|
// to rendered a view. There will only be 10 player_state_t sent each second,
|
||
|
// but the number of pmove_state_t changes will be reletive to client
|
||
|
// frame rates
|
||
|
typedef struct
|
||
|
{
|
||
|
pmove_state_t pmove; // for prediction
|
||
|
|
||
|
// these fields do not need to be communicated bit-precise
|
||
|
|
||
|
vec3_t viewangles; // for fixed views
|
||
|
vec3_t viewoffset; // add to pmovestate->origin
|
||
|
vec3_t kick_angles; // add to view direction to get render angles
|
||
|
// set by weapon kicks, pain effects, etc
|
||
|
|
||
|
vec3_t gunangles;
|
||
|
vec3_t gunoffset;
|
||
|
int gunindex;
|
||
|
int gunframe;
|
||
|
|
||
|
float blend[4]; // rgba full screen effect
|
||
|
|
||
|
float fov; // horizontal field of view
|
||
|
|
||
|
int rdflags; // refdef flags
|
||
|
|
||
|
short stats[MAX_STATS]; // fast status bar updates
|
||
|
|
||
|
// RAFAEL
|
||
|
// weapon mdx
|
||
|
int num_parts;
|
||
|
model_part_t model_parts[MAX_MODEL_PARTS];
|
||
|
|
||
|
int weapon_usage;
|
||
|
|
||
|
} player_state_t;
|