summaryrefslogtreecommitdiff
path: root/source/q_shared.h
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2007-08-14 20:18:08 +0000
committerAndrey Nazarov <skuller@skuller.net>2007-08-14 20:18:08 +0000
commitf294db4ccf45f6274e65260dd6f9a2c5faa94313 (patch)
treee8cf1ba2bfe9c8417eec17faf912442f52fc4ef2 /source/q_shared.h
Initial import of the new Q2PRO tree.
Diffstat (limited to 'source/q_shared.h')
-rw-r--r--source/q_shared.h1479
1 files changed, 1479 insertions, 0 deletions
diff --git a/source/q_shared.h b/source/q_shared.h
new file mode 100644
index 0000000..c4357c9
--- /dev/null
+++ b/source/q_shared.h
@@ -0,0 +1,1479 @@
+/*
+Copyright (C) 1997-2001 Id Software, Inc.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+// q_shared.h -- included first by ALL program modules
+
+#include <math.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+
+#ifdef __GNUC__
+
+#define q_printf( f, a ) __attribute__(( format( printf, f, a ) ))
+#define q_noreturn __attribute__(( noreturn ))
+#define q_malloc __attribute__(( malloc ))
+
+#define q_likely( x ) __builtin_expect( !!(x), 1 )
+#define q_unlikely( x ) __builtin_expect( !!(x), 0 )
+#if __GNUC__ >= 4
+#define q_offsetof( t, m ) __builtin_offsetof( t, m )
+#else
+#define q_offsetof( t, m ) ((size_t)&((t *)0)->m)
+#endif
+
+#else /* __GNUC__ */
+
+#define q_printf( f, a )
+#define q_noreturn
+#define q_malloc
+
+#define q_likely( x ) !!(x)
+#define q_unlikely( x ) !!(x)
+#define q_offsetof( t, m ) ((size_t)&((t *)0)->m)
+
+#endif /* !__GNUC__ */
+
+typedef unsigned char byte;
+typedef enum { qfalse, qtrue } qboolean;
+typedef int qhandle_t;
+typedef int fileHandle_t;
+
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+
+#ifndef NULL
+#define NULL ((void *)0)
+#endif
+
+// 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 256 // max tokens resulting from Cmd_TokenizeString
+#define MAX_TOKEN_CHARS 1024 // max length of an individual token
+#define MAX_NET_STRING 2048 // max length of a string used in network protocol
+
+#define MAX_QPATH 64 // max length of a quake game pathname
+#define MAX_OSPATH 256 // max length of a filesystem pathname
+
+//
+// per-level limits
+//
+#define MAX_CLIENTS 256 // absolute limit
+#define MAX_EDICTS 1024 // 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 256 // so they cannot be blindly increased
+#define MAX_IMAGES 256
+#define MAX_ITEMS 256
+#define MAX_GENERAL (MAX_CLIENTS*2) // general config strings
+
+#define MAX_CLIENT_NAME 32
+
+typedef enum comErrorType_e {
+ ERR_FATAL, // exit the entire game with a popup window
+ ERR_DROP, // print to console and disconnect from game
+ ERR_DISCONNECT, // don't kill server
+ ERR_SILENT
+} comErrorType_t;
+
+typedef enum comPrintType_e {
+ PRINT_ALL, // general messages
+ PRINT_DEVELOPER, // only print when "developer 1"
+ PRINT_WARNING, // print in yellow color
+ PRINT_ERROR // print in red color
+} comPrintType_t;
+
+// FIXME: move these to com_public.h?
+void Com_Printf( const char *fmt, ... ) q_printf( 1, 2 );
+void Com_DPrintf( const char *fmt, ... ) q_printf( 1, 2 );
+void Com_WPrintf( const char *fmt, ... ) q_printf( 1, 2 );
+void Com_EPrintf( const char *fmt, ... ) q_printf( 1, 2 );
+void Com_Error( comErrorType_t code, const char *fmt, ... )
+ q_noreturn q_printf( 2, 3 );
+
+// 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
+
+// destination class for gi.multicast()
+typedef enum multicast_e {
+ 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 vec2_t[2];
+typedef vec_t vec3_t[3];
+typedef vec_t vec4_t[4];
+typedef vec_t vec5_t[5];
+
+typedef float mat4_t[16];
+
+typedef byte color_t[4];
+
+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 NUMVERTEXNORMALS 162
+
+extern vec3_t bytedirs[NUMVERTEXNORMALS];
+
+extern const color_t colorBlack;
+extern const color_t colorRed;
+extern const color_t colorGreen;
+extern const color_t colorYellow;
+extern const color_t colorBlue;
+extern const color_t colorCyan;
+extern const color_t colorMagenta;
+extern const color_t colorWhite;
+
+extern const color_t colorTable[8];
+
+typedef struct vrect_s {
+ int x, y, width, height;
+} vrect_t;
+
+#define nanmask (255<<23)
+
+#define IS_NAN(x) (((*(int *)&x)&nanmask)==nanmask)
+
+// microsoft's fabs seems to be ungodly slow...
+static inline float Q_fabs( float f ) {
+ uint32 tmp = *( uint32 * )&f;
+ tmp &= 0x7FFFFFFF;
+ return *( float * )&tmp;
+}
+
+#define Q_ftol( f ) ((long)(f))
+
+#define DEG2RAD( a ) ( a * M_PI ) / 180.0F
+
+#define DotProduct(x,y) ((x)[0]*(y)[0]+(x)[1]*(y)[1]+(x)[2]*(y)[2])
+#define CrossProduct(v1,v2,cross) \
+ ((cross)[0]=(v1)[1]*(v2)[2]-(v1)[2]*(v2)[1], \
+ (cross)[1]=(v1)[2]*(v2)[0]-(v1)[0]*(v2)[2], \
+ (cross)[2]=(v1)[0]*(v2)[1]-(v1)[1]*(v2)[0])
+#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 VectorInverse(a) ((a)[0]=-(a)[0],(a)[1]=-(a)[1],(a)[2]=-(a)[2])
+#define VectorSet(v, x, y, z) ((v)[0]=(x),(v)[1]=(y),(v)[2]=(z))
+#define VectorAvg(a,b,c) \
+ ((c)[0]=((a)[0]+(b)[0])*0.5f, \
+ (c)[1]=((a)[1]+(b)[1])*0.5f, \
+ (c)[2]=((a)[2]+(b)[2])*0.5f)
+#define VectorMA(a,b,c,d) \
+ ((d)[0]=(a)[0]+(b)*(c)[0], \
+ (d)[1]=(a)[1]+(b)*(c)[1], \
+ (d)[2]=(a)[2]+(b)*(c)[2])
+#define VectorVectorMA(a,b,c,d) \
+ ((d)[0]=(a)[0]+(b)[0]*(c)[0], \
+ (d)[1]=(a)[1]+(b)[1]*(c)[1], \
+ (d)[2]=(a)[2]+(b)[2]*(c)[2])
+#define VectorCompare(v1,v2) ((v1)[0]==(v2)[0]&&(v1)[1]==(v2)[1]&&(v1)[2]==(v2)[2])
+#define VectorLength(v) (sqrt(DotProduct((v),(v))))
+#define VectorLengthSquared(v) (DotProduct((v),(v)))
+#define VectorScale(in,scale,out) \
+ ((out)[0]=(in)[0]*(scale), \
+ (out)[1]=(in)[1]*(scale), \
+ (out)[2]=(in)[2]*(scale))
+#define VectorVectorScale(in,scale,out) \
+ ((out)[0]=(in)[0]*(scale)[0], \
+ (out)[1]=(in)[1]*(scale)[1], \
+ (out)[2]=(in)[2]*(scale)[2])
+#define DistanceSquared(v1,v2) \
+ (((v1)[0]-(v2)[0])*((v1)[0]-(v2)[0])+ \
+ ((v1)[1]-(v2)[1])*((v1)[1]-(v2)[1])+ \
+ ((v1)[2]-(v2)[2])*((v1)[2]-(v2)[2]))
+#define Distance(v1,v2) (sqrt(DistanceSquared(v1,v2)))
+#define LerpAngles(a,b,c,d) \
+ ((d)[0]=LerpAngle((a)[0],(b)[0],c), \
+ (d)[1]=LerpAngle((a)[1],(b)[1],c), \
+ (d)[2]=LerpAngle((a)[2],(b)[2],c))
+#define LerpVector(a,b,c,d) \
+ ((d)[0]=(a)[0]+(c)*((b)[0]-(a)[0]), \
+ (d)[1]=(a)[1]+(c)*((b)[1]-(a)[1]), \
+ (d)[2]=(a)[2]+(c)*((b)[2]-(a)[2]))
+
+
+#define Vector4Subtract(a,b,c) (c[0]=a[0]-b[0],c[1]=a[1]-b[1],c[2]=a[2]-b[2],c[3]=a[3]-b[3])
+#define Vector4Add(a,b,c) (c[0]=a[0]+b[0],c[1]=a[1]+b[1],c[2]=a[2]+b[2],c[3]=a[3]+b[3])
+#define Vector4Copy(a,b) (b[0]=a[0],b[1]=a[1],b[2]=a[2],b[3]=a[3])
+#define Vector4Clear(a) (a[0]=a[1]=a[2]=a[3]=0)
+#define Vector4Negate(a,b) (b[0]=-a[0],b[1]=-a[1],b[2]=-a[2],b[3]=-a[3])
+#define Vector4Set(v, a, b, c, d) (v[0]=(a),v[1]=(b),v[2]=(c),v[3]=(d))
+
+void ClearBounds (vec3_t mins, vec3_t maxs);
+void AddPointToBounds (const vec3_t v, vec3_t mins, vec3_t maxs);
+vec_t RadiusFromBounds (const vec3_t mins, const vec3_t maxs);
+void UnionBounds( vec3_t a[2], vec3_t b[2], vec3_t c[2] );
+/*vec_t VectorLength (vec3_t v);*/
+vec_t VectorNormalize (vec3_t v); // returns vector length
+vec_t VectorNormalize2 (vec3_t v, vec3_t out);
+
+int Q_log2(int val);
+int Q_CeilPowerOfTwo( int value );
+float Com_CalcFov( float fov_x, float width, float height );
+
+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);
+
+static inline float LerpAngle( float a2, float a1, float frac ) {
+ if (a1 - a2 > 180)
+ a1 -= 360;
+ if (a1 - a2 < -180)
+ a1 += 360;
+ return a2 + frac * (a1 - a2);
+}
+
+static inline float anglemod( float a ) {
+ a = (360.0/65536) * ((int)(a*(65536/360.0)) & 65535);
+ return a;
+}
+
+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 );
+
+int DirToByte( const vec3_t dir );
+void ByteToDir( int index, vec3_t dir );
+
+#define clamp(a,b,c) ((b)>=(c)?(a)=(b):(a)<(b)?(a)=(b):(a)>(c)?(a)=(c):(a))
+
+#ifndef max
+#define max(a,b) ((a)>(b)?(a):(b))
+#endif
+
+#ifndef min
+#define min(a,b) ((a)<(b)?(a):(b))
+#endif
+
+#define frand() ( ( rand() & 32767 ) * ( 1.0 / 32767 ) )
+#define crand() ( ( rand() & 32767 ) * ( 2.0 / 32767 ) - 1 )
+
+#define Q_rint(x) ((x) < 0 ? ((int)((x) - 0.5f)) : ((int)((x) + 0.5f)))
+
+#define Q_IsBitSet( data, bit ) ( ( (data)[(bit) >> 3] & ( 1 << ( (bit) & 7 ) ) ) != 0 )
+#define Q_SetBit( data, bit ) ( (data)[(bit) >> 3] |= ( 1 << ( (bit) & 7 ) ) )
+#define Q_ClearBit( data, bit ) ( (data)[(bit) >> 3] &= ~( 1 << ( (bit) & 7 ) ) )
+
+/* use escape character server will never send */
+#define Q_COLOR_ESCAPE '\x7F'
+#define Q_COLOR_ESCAPE_STRING "\x7F"
+#define Q_IsColorString(p) ( *(p) == Q_COLOR_ESCAPE && *( (p) + 1 ) )
+
+#define COLOR_BLACK '0'
+#define COLOR_RED '1'
+#define COLOR_GREEN '2'
+#define COLOR_YELLOW '3'
+#define COLOR_BLUE '4'
+#define COLOR_CYAN '5'
+#define COLOR_MAGENTA '6'
+#define COLOR_WHITE '7'
+#define ColorIndex(c) ( ( (c) - '0' ) & 7 )
+
+#define COLOR_ALT '8'
+#define COLOR_RESET '9'
+
+#define S_COLOR_BLACK Q_COLOR_ESCAPE_STRING "0"
+#define S_COLOR_RED Q_COLOR_ESCAPE_STRING "1"
+#define S_COLOR_GREEN Q_COLOR_ESCAPE_STRING "2"
+#define S_COLOR_YELLOW Q_COLOR_ESCAPE_STRING "3"
+#define S_COLOR_BLUE Q_COLOR_ESCAPE_STRING "4"
+#define S_COLOR_CYAN Q_COLOR_ESCAPE_STRING "5"
+#define S_COLOR_MAGENTA Q_COLOR_ESCAPE_STRING "6"
+#define S_COLOR_WHITE Q_COLOR_ESCAPE_STRING "7"
+
+#define S_COLOR_ALT Q_COLOR_ESCAPE_STRING "8"
+#define S_COLOR_RESET Q_COLOR_ESCAPE_STRING "9"
+
+#define MAKERGB(v,r,g,b) ((v)[0]=(r),(v)[1]=(g),(v)[2]=(b))
+#define MAKERGBA(v,r,g,b,a) ((v)[0]=(r),(v)[1]=(g),(v)[2]=(b),(v)[3]=(a))
+
+#define SCREEN_WIDTH 640
+#define SCREEN_HEIGHT 480
+
+#define UI_LEFT 0x00000001
+#define UI_RIGHT 0x00000002
+#define UI_CENTER (UI_LEFT|UI_RIGHT)
+#define UI_BOTTOM 0x00000004
+#define UI_TOP 0x00000008
+#define UI_MIDDLE (UI_BOTTOM|UI_TOP)
+#define UI_DROPSHADOW 0x00000010
+#define UI_ALTCOLOR 0x00000020
+#define UI_IGNORECOLOR 0x00000040
+#define UI_ALTESCAPES 0x00000080
+#define UI_AUTOWRAP 0x00000100
+#define UI_MULTILINE 0x00000200
+#define UI_DRAWCURSOR 0x00000400
+
+#define TINYCHAR_WIDTH 8
+#define TINYCHAR_HEIGHT 8
+
+int Q_DrawStrlen( const char *string );
+int Q_DrawStrlenTo( const char *string, int maxChars );
+qboolean Q_IsWhiteSpace( const char *string );
+char *Q_FormatString( const char *string );
+char *Q_UnescapeString( const char *string );
+int Q_ClearColorStr( char *out, const char *in, int bufsize );
+int Q_ClearStr( char *out, const char *in, int bufsize );
+int Q_HighlightStr( char *out, const char *in, int bufsize );
+int Q_EscapeMarkup( char *out, const char *in, int bufsize );
+int Q_EscapeURI( char *out, const char *in, int bufsize );
+int Q_Decode64( char *out, const char *in, int bufsize );
+int Q_Encode64( char *out, const char *in, int bufsize );
+
+//=============================================
+
+#define Q_isupper( c ) ( (c) >= 'A' && (c) <= 'Z' )
+#define Q_islower( c ) ( (c) >= 'a' && (c) <= 'z' )
+#define Q_isdigit( c ) ( (c) >= '0' && (c) <= '9' )
+#define Q_isalpha( c ) ( Q_isupper( c ) || Q_islower( c ) )
+#define Q_isalnum( c ) ( Q_isalpha( c ) || Q_isdigit( c ) )
+#define Q_isprint( c ) ( (c) >= 32 && (c) < 127 )
+
+// tests if specified character is valid quake path character
+#define Q_ispath( c ) ( Q_isalnum( c ) || (c) == '_' || (c) == '-' )
+
+static inline int Q_tolower( int c ) {
+ if( Q_isupper( c ) ) {
+ c += ( 'a' - 'A' );
+ }
+ return c;
+}
+
+static inline int Q_toupper( int c ) {
+ if( Q_islower( c ) ) {
+ c -= ( 'a' - 'A' );
+ }
+ return c;
+}
+
+static inline char *Q_strlwr( char *s ) {
+ char *p = s;
+
+ while( *p ) {
+ *p = Q_tolower( *p );
+ p++;
+ }
+
+ return s;
+}
+
+static inline char *Q_strupr( char *s ) {
+ char *p = s;
+
+ while( *p ) {
+ *p = Q_toupper( *p );
+ p++;
+ }
+
+ return s;
+}
+
+// portable case insensitive compare
+int Q_strcasecmp( const char *s1, const char *s2 );
+int Q_strncasecmp( const char *s1, const char *s2, int n );
+
+#define Q_stricmp Q_strcasecmp
+#define Q_stricmpn Q_strncasecmp
+
+int SortStrcmp( const void *p1, const void *p2 );
+
+char *COM_SkipPath( const char *pathname );
+void COM_StripExtension( const char *in, char *out, int outSize );
+void COM_FileBase (char *in, char *out);
+void COM_FilePath( const char *in, char *out, int outSize );
+void COM_DefaultExtension( char *path, const char *extension, int pathSize );
+char *COM_FileExtension( const char *in );
+
+qboolean COM_IsNumeric( const char *string );
+
+char *COM_SimpleParse( const char **data_p );
+char *COM_Parse( const char **data_p );
+// data is an in/out parm, returns a parsed out token
+int COM_Compress( char *data );
+
+int Com_WildCmp( const char *filter, const char *string, qboolean ignoreCase );
+int SortStrcmp( const void *p1, const void *p2 );
+
+uint32 Com_HashString( const char *string, int hashSize );
+uint32 Com_HashPath( const char *string, int hashSize );
+
+char *Com_ReplaceSeparators( char *s, int separator );
+
+// buffer safe operations
+void Q_strncpyz( char *dest, const char *src, int destsize );
+void Q_strcat( char *dest, int destsize, const char *src );
+int Com_sprintf( char *dest, int destsize, const char *fmt, ... ) q_printf( 3, 4 );
+int Q_vsnprintf( char *dest, int destsize, const char *fmt, va_list argptr );
+
+void Com_PageInMemory (void *buffer, int size);
+
+uint32 COM_ParseHex( const char *string );
+
+char *va( const char *format, ... ) q_printf( 1, 2 );
+
+//=============================================
+
+static inline short ShortSwap( short l ) {
+ byte b1, b2;
+
+ b1 = l & 255;
+ b2 = ( l >> 8 ) & 255;
+
+ return ( b1 << 8 ) + b2;
+}
+
+static inline int LongSwap( int l ) {
+ byte b1, b2, b3, b4;
+
+ b1 = l & 255;
+ b2 = ( l >> 8 ) & 255;
+ b3 = ( l >> 16 ) & 255;
+ b4 = ( l >> 24 ) & 255;
+
+ return ( ( int )b1 << 24 ) +
+ ( ( int )b2 << 16 ) +
+ ( ( int )b3 << 8 ) + b4;
+}
+
+static inline float FloatSwap( float f ) {
+ union {
+ float f;
+ byte b[4];
+ } dat1, dat2;
+
+ dat1.f = f;
+ dat2.b[0] = dat1.b[3];
+ dat2.b[1] = dat1.b[2];
+ dat2.b[2] = dat1.b[1];
+ dat2.b[3] = dat1.b[0];
+ return dat2.f;
+}
+
+#ifdef BIGENDIAN_TARGET
+ #define BigShort
+ #define BigLong
+ #define BigFloat
+ #define LittleShort ShortSwap
+ #define LittleLong LongSwap
+ #define LittleFloat FloatSwap
+ #define MakeLong( b1, b2, b3, b4 ) \
+ ( ( ( b1 ) << 24 ) + ( ( b2 ) << 16 ) + ( ( b3 ) << 8 ) + ( b4 ) )
+ #define MakeShort( b1, b2 ) \
+ ( ( ( b1 ) << 8 ) + ( b2 ) )
+#else
+ #define BigShort ShortSwap
+ #define BigLong LongSwap
+ #define BigFloat FloatSwap
+ #define LittleShort
+ #define LittleLong
+ #define LittleFloat
+ #define MakeLong( b1, b2, b3, b4 ) \
+ ( ( ( b4 ) << 24 ) + ( ( b3 ) << 16 ) + ( ( b2 ) << 8 ) + ( b1 ) )
+ #define MakeShort( b1, b2 ) \
+ ( ( ( b2 ) << 8 ) + ( b1 ) )
+#endif
+
+#define LittleVector(a,b) ((b)[0]=LittleFloat((a)[0]),(b)[1]=LittleFloat((a)[1]),(b)[2]=LittleFloat((a)[2]))
+
+//=============================================
+
+//
+// key / value info strings
+//
+#define MAX_INFO_KEY 64
+#define MAX_INFO_VALUE 64
+#define MAX_INFO_STRING 512
+
+char *Info_ValueForKey( const char *s, const char *key );
+void Info_RemoveKey( char *s, const char *key );
+void Info_SetValueForKey( char *s, const char *key, const char *value );
+qboolean Info_AttemptSetValueForKey( char *s, const char *key, const char *value );
+qboolean Info_Validate( const char *s );
+qboolean Info_ValidateSubstring( const char *s );
+void Info_NextPair( const char **string, char *key, char *value );
+void Info_Print( const char *infostring );
+
+//=============================================
+
+typedef struct tm qtime_t;
+
+void Com_LocalTime( qtime_t *time );
+
+/*
+==========================================================
+
+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;
+
+// ------ new stuff ------
+ int integer;
+ void (*changed)( struct cvar_s *self ); // WARNING: points to static variable
+
+ char *defaultString;
+ const char *description; // WARNING: points to static variable
+ uint32 subsystem;
+
+ struct cvar_s *hashNext;
+} 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
+#define LAST_VISIBLE_CONTENTS 64
+
+// 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
+
+
+
+// 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)
+
+
+// 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];
+} cplane_t;
+
+// 0-2 are axial planes
+#define PLANE_X 0
+#define PLANE_Y 1
+#define PLANE_Z 2
+
+// 3-5 are non-axial planes snapped to the nearest
+#define PLANE_ANYX 3
+#define PLANE_ANYY 4
+#define PLANE_ANYZ 5
+
+// planes (x&~1) and (x&~1)+1 are always opposites
+
+#define PLANE_NON_AXIAL 6
+
+// 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
+
+void SetPlaneType( cplane_t *plane );
+void SetPlaneSignbits( cplane_t *plane );
+
+#define BOX_INFRONT 1
+#define BOX_BEHIND 2
+#define BOX_INTERSECTS 3
+
+int BoxOnPlaneSide( vec3_t emins, vec3_t emaxs, cplane_t *p );
+
+typedef struct csurface_s
+{
+ char name[16];
+ int flags;
+ int value;
+} csurface_t;
+
+// a trace is returned when a box is swept through the world
+typedef struct
+{
+ qboolean allsolid; // if qtrue, plane is not valid
+ qboolean startsolid; // if qtrue, 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_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)
+#define PMF_TELEPORT_BIT 128 // used by q2pro
+
+// 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
+} pmove_state_t;
+
+
+//
+// button bits
+//
+#define BUTTON_ATTACK 1
+#define BUTTON_USE 2
+#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);
+} 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
+// RAFAEL
+#define EF_IONRIPPER 0x00100000
+#define EF_GREENGIB 0x00200000
+#define EF_BLUEHYPERBLASTER 0x00400000
+#define EF_SPINNINGLIGHTS 0x00800000
+#define EF_PLASMA 0x01000000
+#define EF_TRAP 0x02000000
+
+//ROGUE
+#define EF_TRACKER 0x04000000
+#define EF_DOUBLE 0x08000000
+#define EF_SPHERETRANS 0x10000000
+#define EF_TAGTRAIL 0x20000000
+#define EF_HALF_DAMAGE 0x40000000
+#define EF_TRACKERTRAIL 0x80000000
+//ROGUE
+
+// 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
+
+//ROGUE
+#define RF_IR_VISIBLE 0x00008000 // 32768
+#define RF_SHELL_DOUBLE 0x00010000 // 65536
+#define RF_SHELL_HALF_DAM 0x00020000
+#define RF_USE_DISGUISE 0x00040000
+//ROGUE
+
+// player_state_t->refdef flags
+#define RDF_UNDERWATER 1 // warp the screen as apropriate
+#define RDF_NOWORLDMODEL 2 // used for player configuration screen
+
+//ROGUE
+#define RDF_IRGOGGLES 4
+#define RDF_UVGOGGLES 8
+//ROGUE
+
+//
+// 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_SILENCED 128 // bit flag ORed with one of the above numbers
+
+//ROGUE
+#define MZ_ETF_RIFLE 30
+#define MZ_UNUSED 31
+#define MZ_SHOTGUN2 32
+#define MZ_HEATBEAM 33
+#define MZ_BLASTER2 34
+#define MZ_TRACKER 35
+#define MZ_NUKE1 36
+#define MZ_NUKE2 37
+#define MZ_NUKE4 38
+#define MZ_NUKE8 39
+//ROGUE
+
+//
+// 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
+
+//ROGUE
+#define MZ2_CARRIER_MACHINEGUN_L1 138
+#define MZ2_CARRIER_MACHINEGUN_R1 139
+#define MZ2_CARRIER_GRENADE 140
+#define MZ2_TURRET_MACHINEGUN 141
+#define MZ2_TURRET_ROCKET 142
+#define MZ2_TURRET_BLASTER 143
+#define MZ2_STALKER_BLASTER 144
+#define MZ2_DAEDALUS_BLASTER 145
+#define MZ2_MEDIC_BLASTER_2 146
+#define MZ2_CARRIER_RAILGUN 147
+#define MZ2_WIDOW_DISRUPTOR 148
+#define MZ2_WIDOW_BLASTER 149
+#define MZ2_WIDOW_RAIL 150
+#define MZ2_WIDOW_PLASMABEAM 151 // PMM - not used
+#define MZ2_CARRIER_MACHINEGUN_L2 152
+#define MZ2_CARRIER_MACHINEGUN_R2 153
+#define MZ2_WIDOW_RAIL_LEFT 154
+#define MZ2_WIDOW_RAIL_RIGHT 155
+#define MZ2_WIDOW_BLASTER_SWEEP1 156
+#define MZ2_WIDOW_BLASTER_SWEEP2 157
+#define MZ2_WIDOW_BLASTER_SWEEP3 158
+#define MZ2_WIDOW_BLASTER_SWEEP4 159
+#define MZ2_WIDOW_BLASTER_SWEEP5 160
+#define MZ2_WIDOW_BLASTER_SWEEP6 161
+#define MZ2_WIDOW_BLASTER_SWEEP7 162
+#define MZ2_WIDOW_BLASTER_SWEEP8 163
+#define MZ2_WIDOW_BLASTER_SWEEP9 164
+#define MZ2_WIDOW_BLASTER_100 165
+#define MZ2_WIDOW_BLASTER_90 166
+#define MZ2_WIDOW_BLASTER_80 167
+#define MZ2_WIDOW_BLASTER_70 168
+#define MZ2_WIDOW_BLASTER_60 169
+#define MZ2_WIDOW_BLASTER_50 170
+#define MZ2_WIDOW_BLASTER_40 171
+#define MZ2_WIDOW_BLASTER_30 172
+#define MZ2_WIDOW_BLASTER_20 173
+#define MZ2_WIDOW_BLASTER_10 174
+#define MZ2_WIDOW_BLASTER_0 175
+#define MZ2_WIDOW_BLASTER_10L 176
+#define MZ2_WIDOW_BLASTER_20L 177
+#define MZ2_WIDOW_BLASTER_30L 178
+#define MZ2_WIDOW_BLASTER_40L 179
+#define MZ2_WIDOW_BLASTER_50L 180
+#define MZ2_WIDOW_BLASTER_60L 181
+#define MZ2_WIDOW_BLASTER_70L 182
+#define MZ2_WIDOW_RUN_1 183
+#define MZ2_WIDOW_RUN_2 184
+#define MZ2_WIDOW_RUN_3 185
+#define MZ2_WIDOW_RUN_4 186
+#define MZ2_WIDOW_RUN_5 187
+#define MZ2_WIDOW_RUN_6 188
+#define MZ2_WIDOW_RUN_7 189
+#define MZ2_WIDOW_RUN_8 190
+#define MZ2_CARRIER_ROCKET_1 191
+#define MZ2_CARRIER_ROCKET_2 192
+#define MZ2_CARRIER_ROCKET_3 193
+#define MZ2_CARRIER_ROCKET_4 194
+#define MZ2_WIDOW2_BEAMER_1 195
+#define MZ2_WIDOW2_BEAMER_2 196
+#define MZ2_WIDOW2_BEAMER_3 197
+#define MZ2_WIDOW2_BEAMER_4 198
+#define MZ2_WIDOW2_BEAMER_5 199
+#define MZ2_WIDOW2_BEAM_SWEEP_1 200
+#define MZ2_WIDOW2_BEAM_SWEEP_2 201
+#define MZ2_WIDOW2_BEAM_SWEEP_3 202
+#define MZ2_WIDOW2_BEAM_SWEEP_4 203
+#define MZ2_WIDOW2_BEAM_SWEEP_5 204
+#define MZ2_WIDOW2_BEAM_SWEEP_6 205
+#define MZ2_WIDOW2_BEAM_SWEEP_7 206
+#define MZ2_WIDOW2_BEAM_SWEEP_8 207
+#define MZ2_WIDOW2_BEAM_SWEEP_9 208
+#define MZ2_WIDOW2_BEAM_SWEEP_10 209
+#define MZ2_WIDOW2_BEAM_SWEEP_11 210
+
+// ROGUE
+
+extern vec3_t monster_flash_offset [];
+
+
+// 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_BLOOD,
+ TE_BLASTER,
+ TE_RAILTRAIL,
+ TE_SHOTGUN,
+ TE_EXPLOSION1,
+ TE_EXPLOSION2,
+ TE_ROCKET_EXPLOSION,
+ TE_GRENADE_EXPLOSION,
+ 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,
+ TE_WELDING_SPARKS,
+ TE_GREENBLOOD,
+ TE_BLUEHYPERBLASTER,
+ TE_PLASMA_EXPLOSION,
+ TE_TUNNEL_SPARKS,
+//ROGUE
+ TE_BLASTER2,
+ TE_RAILTRAIL2,
+ TE_FLAME,
+ TE_LIGHTNING,
+ TE_DEBUGTRAIL,
+ TE_PLAIN_EXPLOSION,
+ TE_FLASHLIGHT,
+ TE_FORCEWALL,
+ TE_HEATBEAM,
+ TE_MONSTER_HEATBEAM,
+ TE_STEAM,
+ TE_BUBBLETRAIL2,
+ TE_MOREBLOOD,
+ TE_HEATBEAM_SPARKS,
+ TE_HEATBEAM_STEAM,
+ TE_CHAINFIST_SMOKE,
+ TE_ELECTRIC_SPARKS,
+ TE_TRACKER_EXPLOSION,
+ TE_TELEPORT_EFFECT,
+ TE_DBALL_GOAL,
+ TE_WIDOWBEAMOUT,
+ TE_NUKEBLAST,
+ TE_WIDOWSPLASH,
+ TE_EXPLOSION1_BIG,
+ TE_EXPLOSION1_NP,
+ TE_FLECHETTE
+//ROGUE
+} 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
+
+
+// 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
+// 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_HEALTH_ICON 0
+#define STAT_HEALTH 1
+#define STAT_AMMO_ICON 2
+#define STAT_AMMO 3
+#define STAT_ARMOR_ICON 4
+#define STAT_ARMOR 5
+#define STAT_SELECTED_ICON 6
+#define STAT_PICKUP_ICON 7
+#define STAT_PICKUP_STRING 8
+#define STAT_TIMER_ICON 9
+#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_CHASE 16
+#define STAT_SPECTATOR 17
+
+#define MAX_STATS 32
+
+
+// dmflags->value flags
+#define DF_NO_HEALTH 0x00000001 // 1
+#define DF_NO_ITEMS 0x00000002 // 2
+#define DF_WEAPONS_STAY 0x00000004 // 4
+#define DF_NO_FALLING 0x00000008 // 8
+#define DF_INSTANT_ITEMS 0x00000010 // 16
+#define DF_SAME_LEVEL 0x00000020 // 32
+#define DF_SKINTEAMS 0x00000040 // 64
+#define DF_MODELTEAMS 0x00000080 // 128
+#define DF_NO_FRIENDLY_FIRE 0x00000100 // 256
+#define DF_SPAWN_FARTHEST 0x00000200 // 512
+#define DF_FORCE_RESPAWN 0x00000400 // 1024
+#define DF_NO_ARMOR 0x00000800 // 2048
+#define DF_ALLOW_EXIT 0x00001000 // 4096
+#define DF_INFINITE_AMMO 0x00002000 // 8192
+#define DF_QUAD_DROP 0x00004000 // 16384
+#define DF_FIXED_FOV 0x00008000 // 32768
+
+// RAFAEL
+#define DF_QUADFIRE_DROP 0x00010000 // 65536
+
+//ROGUE
+#define DF_NO_MINES 0x00020000
+#define DF_NO_STACK_DOUBLE 0x00040000
+#define DF_NO_NUKES 0x00080000
+#define DF_NO_SPHERES 0x00100000
+//ROGUE
+
+/*
+ROGUE - VERSIONS
+1234 08/13/1998 Activision
+1235 08/14/1998 Id Software
+1236 08/15/1998 Steve Tietze
+1237 08/15/1998 Phil Dobranski
+1238 08/15/1998 John Sheley
+1239 08/17/1998 Barrett Alexander
+1230 08/17/1998 Brandon Fish
+1245 08/17/1998 Don MacAskill
+1246 08/17/1998 David "Zoid" Kirsch
+1247 08/17/1998 Manu Smith
+1248 08/17/1998 Geoff Scully
+1249 08/17/1998 Andy Van Fossen
+1240 08/20/1998 Activision Build 2
+1256 08/20/1998 Ranger Clan
+1257 08/20/1998 Ensemble Studios
+1258 08/21/1998 Robert Duffy
+1259 08/21/1998 Stephen Seachord
+1250 08/21/1998 Stephen Heaslip
+1267 08/21/1998 Samir Sandesara
+1268 08/21/1998 Oliver Wyman
+1269 08/21/1998 Steven Marchegiano
+1260 08/21/1998 Build #2 for Nihilistic
+1278 08/21/1998 Build #2 for Ensemble
+
+9999 08/20/1998 Internal Use
+*/
+#define ROGUE_VERSION_ID 1278
+
+#define ROGUE_VERSION_STRING "08/21/1998 Beta 2 for Ensemble"
+
+// ROGUE
+/*
+==========================================================
+
+ 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_SKY 2
+#define CS_SKYAXIS 3 // %f %f %f format
+#define CS_SKYROTATE 4
+#define CS_STATUSBAR 5 // display program string
+
+#define CS_AIRACCEL 29 // air acceleration control
+#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_LIGHTS (CS_IMAGES+MAX_IMAGES)
+#define CS_ITEMS (CS_LIGHTS+MAX_LIGHTSTYLES)
+#define CS_PLAYERSKINS (CS_ITEMS+MAX_ITEMS)
+#define CS_GENERAL (CS_PLAYERSKINS+MAX_CLIENTS)
+#define MAX_CONFIGSTRINGS (CS_GENERAL+MAX_GENERAL)
+
+
+//==============================================
+
+
+// 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...
+typedef enum
+{
+ EV_NONE,
+ EV_ITEM_RESPAWN,
+ EV_FOOTSTEP,
+ EV_FALLSHORT,
+ EV_FALL,
+ EV_FALLFAR,
+ EV_PLAYER_TELEPORT,
+ EV_OTHER_TELEPORT
+} entity_event_t;
+
+
+// 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
+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;
+ unsigned int effects; // PGM - we're filling it, so it needs to be unsigned
+ 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
+} 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
+} player_state_t;
+
+
+