mirror of
https://github.com/UberGames/EF2GameSource.git
synced 2024-11-14 16:30:34 +00:00
1926 lines
61 KiB
C
1926 lines
61 KiB
C
//-----------------------------------------------------------------------------
|
|
//
|
|
// $Logfile:: /Code/DLLs/game/q_shared.h $
|
|
// $Revision:: 167 $
|
|
// $Author:: Steven $
|
|
// $Date:: 10/13/03 9:42a $
|
|
//
|
|
// Copyright (C) 1998 by Ritual Entertainment, Inc.
|
|
// All rights reserved.
|
|
//
|
|
// This source may not be distributed and/or modified without
|
|
// expressly written permission by Ritual Entertainment, Inc.
|
|
//
|
|
//
|
|
// DESCRIPTION:
|
|
// included first by ALL program modules. A user mod should never modify
|
|
// this file
|
|
|
|
#ifndef __Q_SHARED_H__
|
|
#define __Q_SHARED_H__
|
|
|
|
// q_shared.h -- included first by ALL program modules.
|
|
// A user mod should never modify this file
|
|
|
|
|
|
#include <gamedefs.h>
|
|
|
|
#define DEVELOPER_NAME "Ritual Entertainment"
|
|
|
|
#define QDECL
|
|
// __cdecl // added for bot code
|
|
|
|
#ifdef _WIN32
|
|
|
|
//#pragma warning(disable : 4018) // signed/unsigned mismatch
|
|
//#pragma warning(disable : 4032) // formal parameter 'number' has different type when promoted
|
|
//#pragma warning(disable : 4051) // type conversion, possible loss of data
|
|
//#pragma warning(disable : 4057) // slightly different base types
|
|
//#pragma warning(disable : 4100) // unreferenced formal parameter
|
|
#pragma warning(disable : 4115) // 'type' : named type definition in parentheses
|
|
//#pragma warning(disable : 4125) // decimal digit terminates octal escape sequence
|
|
#pragma warning(disable : 4127) // conditional expression is constant
|
|
//#pragma warning(disable : 4131) // 'function' : uses old-style declarator
|
|
#pragma warning(disable : 4136) // conversion between different floating-point types
|
|
#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
|
|
//#pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int
|
|
//#pragma warning(disable : 4220) // varargs matches remaining parameters
|
|
//#pragma warning(disable : 4239) // nonstandard extension used, conversion from class b to class & b
|
|
#pragma warning(disable : 4244) // 'conversion' conversion from 'type1' to 'type2', possible loss of data
|
|
#pragma warning(disable : 4305) // truncation from const double to float
|
|
//#pragma warning(disable : 4310) // cast truncates constant value
|
|
#pragma warning(disable : 4389)
|
|
#pragma warning(disable : 4512) // 'Class' : assignment operator could not be generated
|
|
#pragma warning(disable : 4514) // unreferenced inline/local function has been removed
|
|
//#pragma warning(disable : 4611) // interaction between '_setjmp' and C++ object destruction is non-portable
|
|
#pragma warning(disable : 4710) // did not inline this function
|
|
#pragma warning(disable : 4711) // selected for automatic inline expansion
|
|
#pragma warning(disable : 4996) // unsecure function warnings
|
|
|
|
|
|
// shut up warnings with Intel Compiler
|
|
/*ARGSUSED*/
|
|
/*NOTREACHED*/
|
|
/*VARARGS*/
|
|
#endif
|
|
|
|
#include <assert.h>
|
|
#include <math.h>
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <ctype.h>
|
|
|
|
#ifdef _WIN32
|
|
|
|
//#pragma intrinsic( memset, memcpy )
|
|
|
|
#endif
|
|
|
|
|
|
// this is the define for determining if we have an asm version of a C function
|
|
#if (defined _M_IX86 || defined __i386__) && !defined C_ONLY && !defined __sun__
|
|
#define id386 1
|
|
#else
|
|
#define id386 0
|
|
#endif
|
|
|
|
//======================= WIN32 DEFINES =================================
|
|
|
|
#ifdef WIN32
|
|
|
|
#define MAC_STATIC
|
|
|
|
// buildstring will be incorporated into the version string
|
|
#ifdef NDEBUG
|
|
#ifdef _M_IX86
|
|
#define CPUSTRING "win-x86"
|
|
#elif defined _M_ALPHA
|
|
#define CPUSTRING "win-AXP"
|
|
#endif
|
|
#else
|
|
#ifdef _M_IX86
|
|
#define CPUSTRING "win-x86-debug"
|
|
#elif defined _M_ALPHA
|
|
#define CPUSTRING "win-AXP-debug"
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#define PATH_SEP '\\'
|
|
|
|
#endif
|
|
|
|
//======================= MAC OS X SERVER DEFINES =====================
|
|
|
|
#if defined(__MACH__) && defined(__APPLE__)
|
|
|
|
#define MAC_STATIC
|
|
|
|
#ifdef __ppc__
|
|
#define CPUSTRING "MacOSXS-ppc"
|
|
#elif defined __i386__
|
|
#define CPUSTRING "MacOSXS-i386"
|
|
#else
|
|
#define CPUSTRING "MacOSXS-other"
|
|
#endif
|
|
|
|
#define PATH_SEP '/'
|
|
|
|
#define GAME_HARD_LINKED
|
|
#define CGAME_HARD_LINKED
|
|
#define UI_HARD_LINKED
|
|
#define BOTLIB_HARD_LINKED
|
|
|
|
#endif
|
|
|
|
//======================= MAC DEFINES =================================
|
|
|
|
#ifdef __MACOS__
|
|
|
|
#define MAC_STATIC static
|
|
|
|
#define CPUSTRING "MacOS-PPC"
|
|
|
|
#define PATH_SEP ':'
|
|
|
|
#define GAME_HARD_LINKED
|
|
#define CGAME_HARD_LINKED
|
|
#define UI_HARD_LINKED
|
|
#define BOTLIB_HARD_LINKED
|
|
|
|
void Sys_PumpEvents( void );
|
|
|
|
#endif
|
|
|
|
//======================= LINUX DEFINES =================================
|
|
|
|
// the mac compiler can't handle >32k of locals, so we
|
|
// just waste space and make big arrays static...
|
|
#ifdef __linux__
|
|
|
|
#define MAC_STATIC
|
|
|
|
#ifdef __i386__
|
|
#define CPUSTRING "linux-i386"
|
|
#elif defined __axp__
|
|
#define CPUSTRING "linux-alpha"
|
|
#else
|
|
#define CPUSTRING "linux-other"
|
|
#endif
|
|
|
|
#define PATH_SEP '/'
|
|
|
|
#endif
|
|
|
|
#define Q_UNUSED(x) (void)x
|
|
|
|
//=============================================================
|
|
|
|
#define DATATYPE_SCHAR_MIN -128
|
|
#define DATATYPE_SCHAR_MAX 127
|
|
|
|
#define DATATYPE_UCHAR_MIN 0
|
|
#define DATATYPE_UCHAR_MAX 255
|
|
|
|
#define DATATYPE_SSHORT_MIN -32768
|
|
#define DATATYPE_SSHORT_MAX 32767
|
|
|
|
#define DATATYPE_USHORT_MIN 0
|
|
#define DATATYPE_USHORT_MAX 65535
|
|
|
|
#define DATATYPE_SINT_MIN -2147483648
|
|
#define DATATYPE_SINT_MAX 2147483647
|
|
|
|
#define DATATYPE_UINT_MIN 0
|
|
#define DATATYPE_UINT_MAX 4294967295
|
|
|
|
#define DATATYPE_SLONG_MIN -2147483648
|
|
#define DATATYPE_SLONG_MAX 2147483647
|
|
|
|
#define DATATYPE_ULONG_MIN 0
|
|
#define DATATYPE_ULONG_MAX 4294967295
|
|
|
|
//======================= C++ DEFINES =================================
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
#ifndef min
|
|
#define min(a,b) (((a) < (b)) ? (a) : (b))
|
|
#endif
|
|
#ifndef max
|
|
#define max(a,b) (((a) > (b)) ? (a) : (b))
|
|
#endif
|
|
|
|
#define bound(a,minval,maxval) ( ((a) > (minval)) ? ( ((a) < (maxval)) ? (a) : (maxval) ) : (minval) )
|
|
|
|
typedef unsigned char byte;
|
|
|
|
#ifdef __cplusplus
|
|
typedef int qboolean;
|
|
#define qfalse (0)
|
|
#define qtrue (!qfalse)
|
|
#else
|
|
typedef enum {qfalse, qtrue} qboolean;
|
|
#endif
|
|
|
|
typedef int qhandle_t;
|
|
typedef int sfxHandle_t;
|
|
typedef int fileHandle_t;
|
|
typedef int clipHandle_t;
|
|
|
|
|
|
#ifndef NULL
|
|
#define NULL ((void *)0)
|
|
#endif
|
|
|
|
#define MAX_QINT 0x7fffffff
|
|
#define MIN_QINT (-MAX_QINT-1)
|
|
|
|
|
|
// angle indexes
|
|
#define PITCH 0 // up / down
|
|
#define YAW 1 // left / right
|
|
#define ROLL 2 // fall over
|
|
|
|
// Axis vector indexes
|
|
#define AXIS_FORWARD_VECTOR 0
|
|
#define AXIS_RIGHT_VECTOR 1
|
|
#define AXIS_UP_VECTOR 2
|
|
|
|
// the game guarantees that no string from the network will ever
|
|
// exceed MAX_STRING_CHARS
|
|
#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_ARGUMENTS 512 // max number of arguments for commands
|
|
|
|
#define MAX_INFO_STRING 1024
|
|
#define MAX_INFO_KEY 1024
|
|
#define MAX_INFO_VALUE 1024
|
|
|
|
#define BIG_INFO_STRING 8192 // used for system info key only
|
|
#define BIG_INFO_KEY 8192
|
|
#define BIG_INFO_VALUE 8192
|
|
|
|
#define MAX_QPATH 64 // max length of a pathname
|
|
#define MAX_OSPATH 256 // max length of a filesystem pathname
|
|
|
|
#define MAX_NAME_LENGTH 32 // max length of a client name
|
|
|
|
#define MAX_LIGHTING_GROUPS 32
|
|
#define MAX_STATIC_LOD_MODLES 256
|
|
|
|
#define MAX_EXTRA_ENTITIES_FROM_GAME 100
|
|
|
|
typedef enum {
|
|
CENTERPRINT_IMPORTANCE_NORMAL,
|
|
CENTERPRINT_IMPORTANCE_HIGH,
|
|
CENTERPRINT_IMPORTANCE_CRITICAL
|
|
} CenterPrintImportance;
|
|
|
|
|
|
// server browser sources
|
|
#define AS_LOCAL 0
|
|
#define AS_GLOBAL 1
|
|
#define AS_FAVORITES 2
|
|
|
|
// paramters for command buffer stuffing
|
|
typedef enum {
|
|
EXEC_NOW, // don't return until completed, a VM should NEVER use this,
|
|
// because some commands might cause the VM to be unloaded...
|
|
EXEC_INSERT, // insert at current position, but don't run yet
|
|
EXEC_APPEND // add to end of the command buffer (normal case)
|
|
} cbufExec_t;
|
|
|
|
|
|
//
|
|
// these aren't needed by any of the VMs. put in another header?
|
|
//
|
|
#define MAX_MAP_AREA_BYTES 32 // bit vector of area visibility
|
|
|
|
|
|
// print levels from renderer (FIXME: set up for game / cgame?)
|
|
typedef enum {
|
|
PRINT_ALL,
|
|
PRINT_DEVELOPER, // only print when "developer 1"
|
|
PRINT_DEVELOPER_2, // only print when "developer 2"
|
|
PRINT_WARNING,
|
|
PRINT_ERROR
|
|
} printParm_t;
|
|
|
|
|
|
// parameters to the main Error routine
|
|
typedef enum {
|
|
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_NEED_CD // pop up the need-cd dialog
|
|
} errorParm_t;
|
|
|
|
#define CIN_system 1
|
|
#define CIN_loop 2
|
|
#define CIN_hold 4
|
|
#define CIN_silent 8
|
|
#define CIN_shader 16
|
|
|
|
/*
|
|
==============================================================
|
|
|
|
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 struct
|
|
{
|
|
float radius;
|
|
float height;
|
|
vec3_t center;
|
|
}cylinder_t;
|
|
|
|
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
|
|
|
|
#define NUMVERTEXNORMALS 162
|
|
extern vec3_t bytedirs[NUMVERTEXNORMALS];
|
|
|
|
// all drawing is done to a 640*480 virtual screen size
|
|
// and will be automatically scaled to the real resolution
|
|
#define SCREEN_WIDTH 640
|
|
#define SCREEN_HEIGHT 480
|
|
|
|
#define TINYCHAR_WIDTH (SMALLCHAR_WIDTH)
|
|
#define TINYCHAR_HEIGHT (SMALLCHAR_HEIGHT/2)
|
|
|
|
#define SMALLCHAR_WIDTH 8
|
|
#define SMALLCHAR_HEIGHT 16
|
|
|
|
#define BIGCHAR_WIDTH 16
|
|
#define BIGCHAR_HEIGHT 16
|
|
|
|
#define GIANTCHAR_WIDTH 32
|
|
#define GIANTCHAR_HEIGHT 48
|
|
|
|
extern vec4_t colorBlack;
|
|
extern vec4_t colorRed;
|
|
extern vec4_t colorGreen;
|
|
extern vec4_t colorBlue;
|
|
extern vec4_t colorYellow;
|
|
extern vec4_t colorMagenta;
|
|
extern vec4_t colorCyan;
|
|
extern vec4_t colorWhite;
|
|
extern vec4_t colorLtGrey;
|
|
extern vec4_t colorMdGrey;
|
|
extern vec4_t colorDkGrey;
|
|
|
|
#define Q_COLOR_ESCAPE '^'
|
|
#define Q_IsColorString(p) ( p && ( *(p) == Q_COLOR_ESCAPE ) && ( *((p)+1) ) && ( *((p)+1) != Q_COLOR_ESCAPE ) )
|
|
|
|
#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 COLOR_NONE '8'
|
|
#define ColorIndex(c) ( ( (c) - '0' ) & 7 )
|
|
|
|
#define S_COLOR_BLACK "^0"
|
|
#define S_COLOR_RED "^1"
|
|
#define S_COLOR_GREEN "^2"
|
|
#define S_COLOR_YELLOW "^3"
|
|
#define S_COLOR_BLUE "^4"
|
|
#define S_COLOR_CYAN "^5"
|
|
#define S_COLOR_MAGENTA "^6"
|
|
#define S_COLOR_WHITE "^7"
|
|
|
|
extern vec4_t g_color_table[8];
|
|
|
|
#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 DEG2RAD( a ) ( ( (a) * M_PI ) / 180.0F )
|
|
#define RAD2DEG( a ) ( ( (a) * 180.0f ) / M_PI )
|
|
|
|
struct cplane_s;
|
|
|
|
extern vec3_t vec3_origin;
|
|
extern vec3_t axisDefault[3];
|
|
|
|
#define nanmask (255<<23)
|
|
|
|
#define IS_NAN(x) (((*(int *)&x)&nanmask)==nanmask)
|
|
|
|
#ifndef __Q_FABS__
|
|
#define __Q_FABS__
|
|
#endif
|
|
|
|
float Q_fabs( float f );
|
|
float Q_rsqrt( float f ); // reciprocal square root
|
|
|
|
#define SQRTFAST( x ) ( 1.0f / Q_rsqrt( x ) )
|
|
|
|
signed char ClampChar( int i );
|
|
signed short ClampShort( int i );
|
|
|
|
double dEpsilon( void );
|
|
double dIdentity( void );
|
|
double dSign( const double number );
|
|
double dClamp( const double value, const double min, const double max );
|
|
double dDistance (const double value1, const double value2 );
|
|
qboolean dCloseEnough( const double value1, const double value2, const double epsilon );
|
|
qboolean dSmallEnough( const double value, const double epsilon );
|
|
|
|
float fEpsilon( void );
|
|
float fIdentity( void );
|
|
float fSign( const float number );
|
|
float fClamp( const float value, const float min, const float max );
|
|
float fDistance (const float value1, const float value2 );
|
|
qboolean fCloseEnough( const float value1, const float value2, const float epsilon );
|
|
qboolean fSmallEnough( const float value, const float epsilon );
|
|
|
|
int iSign( const int number);
|
|
int iClamp( const int value, const int min, const int max);
|
|
|
|
|
|
// this isn't a real cheap function to call!
|
|
int DirToByte( const vec3_t dir );
|
|
void ByteToDir( int b, vec3_t dir );
|
|
|
|
#if 1
|
|
|
|
#define DotProduct(x,y) ( ((x)[0]*(y)[0]) + ((x)[1]*(y)[1]) + ((x)[2]*(y)[2]) )
|
|
#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 VectorScale(v, s, o) ((o)[0]=(v)[0]*(s),(o)[1]=(v)[1]*(s),(o)[2]=(v)[2]*(s))
|
|
#define VectorMA(v, s, b, o) ((o)[0]= (v)[0] + ((b)[0]*(s)), (o)[1] = (v)[1] + ((b)[1]*(s)), (o)[2] = (v)[2] + ((b)[2]*(s)))
|
|
#define Round(a) (int)(a + 0.5f)
|
|
#else
|
|
|
|
#define DotProduct(x,y) _DotProduct(x,y)
|
|
|
|
#ifdef MSVC_BUILD
|
|
//intel change to accomodate manual CPU dispatch. if using intel compiler, this header
|
|
//show up in q_math.c instead of here.
|
|
void _VectorSubtract( const vec3_t veca, const vec3_t vecb, vec3_t out );
|
|
void _VectorAdd( const vec3_t veca, const vec3_t vecb, vec3_t out );
|
|
#endif
|
|
|
|
#define VectorCopy(a,b) _VectorCopy(a,b)
|
|
#define VectorScale(v, s, o) _VectorScale(v,s,o)
|
|
#define VectorMA(v, s, b, o) _VectorMA(v,s,b,o)
|
|
|
|
#endif
|
|
|
|
#ifdef __LCC__
|
|
#ifdef VectorCopy
|
|
#undef VectorCopy
|
|
// this is a little hack to get more efficient copies
|
|
typedef struct {
|
|
float v[3];
|
|
} vec3struct_t;
|
|
#define VectorCopy(a,b) *(vec3struct_t *)b=*(vec3struct_t *)a;
|
|
#endif
|
|
#endif
|
|
|
|
#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))
|
|
#define Vector4Copy(a,b) ((b)[0]=(a)[0],(b)[1]=(a)[1],(b)[2]=(a)[2],(b)[3]=(a)[3])
|
|
|
|
#define OrientClear( orient ) \
|
|
( VectorSet( orient.origin, 0, 0, 0 ), \
|
|
VectorSet( orient.axis[ 0 ], 1, 0, 0 ), \
|
|
VectorSet( orient.axis[ 1 ], 0, 1, 0 ), \
|
|
VectorSet( orient.axis[ 2 ], 0, 0, 1 ) )
|
|
#define OrientCopy( a, b ) \
|
|
( VectorCopy( (a).origin, (b).origin ), \
|
|
VectorCopy( (a).axis[ 0 ], (b).axis[ 0 ] ), \
|
|
VectorCopy( (a).axis[ 1 ], (b).axis[ 1 ] ), \
|
|
VectorCopy( (a).axis[ 2 ], (b).axis[ 2 ] ) )
|
|
|
|
#define QuatSet( q, x, y, z, w ) ((q)[0]=(x),(q)[1]=(y),(q)[2]=(z),(q)[3]=(w))
|
|
#define QuatCopy( a,b ) ((b)[0]=(a)[0],(b)[1]=(a)[1],(b)[2]=(a)[2],(b)[3]=(a)[3])
|
|
|
|
#define uint_cast(X) ( *(unsigned int *) &(X) )
|
|
#define int_cast(X) ( *(int *) &(X) )
|
|
#define IsNegative(X) ( uint_cast(X) >> 31 )
|
|
#define USES_CLAMP_ZERO const unsigned s_clamp0table[2] = { 0xFFFFFFFF, 0x00000000 }
|
|
#define ClampZero(X) ( uint_cast(X) &= s_clamp0table[IsNegative(X)] )
|
|
#define ClampNormalFloat255Byte(dst,X) { \
|
|
float _f_ = X; \
|
|
unsigned mask = ~ ( (int) ( uint_cast(_f_) - 1 ) >> 31 ); \
|
|
\
|
|
uint_cast(_f_) += (unsigned) ( 0x04000000 - 0x437F0000 ); \
|
|
uint_cast(_f_) &= ( (int) uint_cast(_f_) ) >> 31; \
|
|
uint_cast(_f_) += (unsigned) 0x437F0000; \
|
|
uint_cast(_f_) &= mask; \
|
|
dst = (unsigned char) _f_; \
|
|
}
|
|
|
|
#define SetHighest(type, dst,upperbound) { \
|
|
type _ff_=dst-upperbound;\
|
|
ClampZero ( _ff_ );\
|
|
dst = dst - _ff_;\
|
|
}
|
|
|
|
#define SetLowest(type, dst,lowerbound) { \
|
|
type _ff_= dst - lowerbound;\
|
|
ClampZero ( _ff_ );\
|
|
dst = lowerbound + _ff_;\
|
|
}
|
|
|
|
#define SetLowestFloat(dst,l) ( dst = ( ( dst < l ) ? l : dst ) )
|
|
#define SetHighestFloat(dst,l) ( dst = ( ( dst > l ) ? l : dst ) )
|
|
//#define SetLowestFloat(dst,l) SetLowest ( float, dst, l )
|
|
//#define SetHighestFloat(dst,l) SetHighest ( float, dst, l )
|
|
#define SetLowestInt(dst,l) SetLowest ( int, dst, l )
|
|
#define SetHighestInt(dst,l) SetHighest ( int, dst, l )
|
|
|
|
#ifdef __cplusplus
|
|
inline bool VectorFromString ( const char *ss, vec3_t v ) {
|
|
return sscanf ( ss, "%f %f %f", &v[0], &v[1], &v[2] ) == 3;
|
|
}
|
|
#else
|
|
#define VectorFromString(ss,v) ( sscanf ( (ss), "%f %f %f", &(v)[0], &(v)[1], &(v)[2] ) == 3 )
|
|
#endif
|
|
|
|
#define SnapVector(v) {v[0]=(int)v[0];v[1]=(int)v[1];v[2]=(int)v[2];}
|
|
|
|
// just in case you do't want to use the macros
|
|
vec_t _DotProduct( const vec3_t v1, const vec3_t v2 );
|
|
void _VectorSubtract( const vec3_t veca, const vec3_t vecb, vec3_t out );
|
|
void _VectorAdd( const vec3_t veca, const vec3_t vecb, vec3_t out );
|
|
void _VectorCopy( const vec3_t in, vec3_t out );
|
|
void _VectorScale( const vec3_t in, float scale, vec3_t out );
|
|
void _VectorMA( const vec3_t veca, float scale, const vec3_t vecb, vec3_t vecc );
|
|
|
|
unsigned ColorBytes3 (float r, float g, float b);
|
|
unsigned ColorBytes4 (float r, float g, float b, float a);
|
|
|
|
float NormalizeColor( const vec3_t in, vec3_t out );
|
|
|
|
float RadiusFromBounds( const vec3_t mins, const vec3_t maxs );
|
|
void ClearBounds( vec3_t mins, vec3_t maxs );
|
|
qboolean BoundsClear( const vec3_t mins, const vec3_t maxs );
|
|
void AddPointToBounds( const vec3_t v, vec3_t mins, vec3_t maxs );
|
|
int VectorCompare( const vec3_t v1, const vec3_t v2 );
|
|
vec_t VectorLength( const vec3_t v );
|
|
vec_t VectorLengthSquared( const vec3_t v );
|
|
vec_t Distance( const vec3_t p1, const vec3_t p2 );
|
|
vec_t DistanceSquared( const vec3_t p1, const vec3_t p2 );
|
|
void CrossProduct( const vec3_t v1, const vec3_t v2, vec3_t cross );
|
|
vec_t VectorNormalize (vec3_t v); // returns vector length
|
|
void VectorNormalizeFast(vec3_t v); // does NOT return vector length, uses rsqrt approximation
|
|
vec_t VectorNormalize2( const vec3_t v, vec3_t out );
|
|
void VectorInverse (vec3_t v);
|
|
void Vector4Scale( const vec4_t in, vec_t scale, vec4_t out );
|
|
void VectorRotate( const vec3_t in, const vec3_t matrix[3], vec3_t out );
|
|
int Q_log2(int val);
|
|
unsigned short NormalToLatLong( const vec3_t normal );
|
|
|
|
|
|
int Q_rand( int *seed );
|
|
float Q_random( int *seed );
|
|
float Q_crandom( int *seed );
|
|
|
|
#define random() ((rand () & 0x7fff) / ((float)0x7fff))
|
|
#define crandom() (2.0f * (random() - 0.5f))
|
|
|
|
float randomrange( float min, float max );
|
|
float crandomrange( float min, float max );
|
|
float grandom( float average, float deviation );
|
|
float erandom( float mean );
|
|
|
|
void AccumulateTransform( vec3_t dstLocation, vec3_t dstAxes[3],
|
|
const vec3_t childLocation, const vec3_t childAxes[3],
|
|
const vec3_t parentLocation, const vec3_t parentAxes[3] );
|
|
void AccumulatePosition( vec3_t dstOrigin, const vec3_t childOrigin, const vec3_t parentOrigin, const vec3_t parentAxes[3] );
|
|
|
|
void vectoangles( const vec3_t value1, vec3_t angles);
|
|
float vectoyaw( const vec3_t vec );
|
|
|
|
//FIXME
|
|
// get rid of all references to AnglesToMat
|
|
#define AnglesToMat AnglesToAxis
|
|
|
|
void AxisClear( vec3_t axis[3] );
|
|
void AxisCopy( const vec3_t in[3], vec3_t out[3] );
|
|
|
|
void SetPlaneSignbits( struct cplane_s *out );
|
|
int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *plane);
|
|
|
|
float AngleMod(float a);
|
|
float LerpAngle (float from, float to, float frac);
|
|
float LerpAngleFromCurrent (float from, float to, float current, float frac);
|
|
float AngleSubtract( float a1, float a2 );
|
|
void AnglesSubtract( const vec3_t v1, const vec3_t v2, vec3_t v3 );
|
|
|
|
float AngleNormalize360 ( float angle );
|
|
float AngleNormalize180 ( float angle );
|
|
float AngleNormalizeArbitrary ( const float angle, const float minimumAngle );
|
|
float AngleDelta ( float angle1, float angle2 );
|
|
|
|
qboolean PlaneFromPoints( vec4_t plane, const vec3_t a, const vec3_t b, const vec3_t c );
|
|
void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal );
|
|
void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees );
|
|
void RotateAroundDirection( vec3_t axis[3], float yaw );
|
|
void MakeNormalVectors( const vec3_t forward, vec3_t right, vec3_t up );
|
|
|
|
float noise(float vec[], int len);
|
|
float noise1(float arg);
|
|
float noise2(const float arg[2]);
|
|
float noise3(const float arg[3]);
|
|
// perpendicular vector could be replaced by this
|
|
|
|
void R_ConcatRotations ( const float in1[3][3], const float in2[3][3], float out[3][3] );
|
|
void R_ConcatTransforms ( const float in1[3][4], const float in2[3][4], float out[3][4] );
|
|
float anglemod(float a);
|
|
float angledist( float ang );
|
|
int BoxOnPlaneSide2 ( const vec3_t emins, const vec3_t emaxs, const struct cplane_s *p );
|
|
void CalculateRotatedBounds( const vec3_t angles, vec3_t mins, vec3_t maxs );
|
|
void CalculateRotatedBounds2( float trans[3][3], vec3_t mins, vec3_t maxs );
|
|
int BoundingBoxToInteger( const vec3_t mins, const vec3_t maxs );
|
|
void IntegerToBoundingBox( int num, vec3_t mins, vec3_t maxs );
|
|
void MatrixTransformVector( const vec3_t in, const float mat[ 3 ][ 3 ], vec3_t out );
|
|
void Matrix4TransformVector( const vec3_t in, const float mat[ 4 ][ 4 ], vec3_t out );
|
|
//void MatrixToEulerAngles( float mat[ 3 ][ 3 ], vec3_t ang );
|
|
void TransposeMatrix( const float in[ 3 ][ 3 ], float out[ 3 ][ 3 ] );
|
|
void OrthoNormalize( float mat[3][3] );
|
|
float NormalizeQuat( float q[ 4 ] );
|
|
//void MatToQuat( float srcMatrix[ 3 ][ 3 ], float destQuat[ 4 ] );
|
|
void RotateAxis( const float axis[ 3 ], float angle, float q[ 4 ] );
|
|
void MultQuat( const float q1[ 4 ], const float q2[ 4 ], float out[ 4 ] );
|
|
//void QuatToMat( float q[ 4 ], float m[ 3 ][ 3 ] );
|
|
void SlerpQuaternion( const float from[ 4 ], const float to[ 4 ], float t, float res[ 4 ] );
|
|
//void EulerToQuat( float ang[ 3 ], float q[ 4 ] );
|
|
int PlaneTypeForNormal ( const vec3_t normal );
|
|
|
|
|
|
|
|
//=============================================
|
|
|
|
float Com_Clamp( float min, float max, float value );
|
|
|
|
void COM_FilePath (const char *in, char *out);
|
|
void COM_FileBase (const char *in, char *out);
|
|
void COM_FileName (const char *in, char *out);
|
|
|
|
const char *COM_SkipPath( const char *pathname );
|
|
void COM_StripExtension( const char *in, char *out );
|
|
void COM_DefaultExtension( char *path, int maxSize, const char *extension );
|
|
void Com_BackslashToSlash( char *str );
|
|
|
|
void COM_BeginParseSession( void );
|
|
int COM_GetCurrentParseLine( void );
|
|
const char *COM_Parse( const char **data_p );
|
|
char *COM_ParseExt( char **data_p, qboolean allowLineBreak );
|
|
const char *COM_GetToken(const char **data_p, qboolean crossline);
|
|
int COM_GetParseLineNumber(void);
|
|
|
|
// data is an in/out parm, returns a parsed out token
|
|
|
|
void COM_MatchToken( char**buf_p, char *match );
|
|
|
|
qboolean SkipBracedSection (char **program);
|
|
void SkipRestOfLine ( char **data );
|
|
|
|
void Parse1DMatrix (char **buf_p, int x, float *m);
|
|
void Parse2DMatrix (char **buf_p, int y, int x, float *m);
|
|
void Parse3DMatrix (char **buf_p, int z, int y, int x, float *m);
|
|
|
|
void Com_sprintf (char *dest, int size, const char *fmt, ...);
|
|
|
|
|
|
// mode parm for FS_FOpenFile
|
|
typedef enum {
|
|
FS_READ,
|
|
FS_WRITE,
|
|
FS_APPEND,
|
|
FS_APPEND_SYNC
|
|
} fsMode_t;
|
|
|
|
typedef enum {
|
|
FS_SEEK_CUR,
|
|
FS_SEEK_END,
|
|
FS_SEEK_SET
|
|
} fsOrigin_t;
|
|
|
|
//=============================================
|
|
|
|
int Q_isprint( int c );
|
|
int Q_islower( int c );
|
|
int Q_isupper( int c );
|
|
int Q_isalpha( int c );
|
|
|
|
// portable case insensitive compare
|
|
int Q_stricmp (const char *s1, const char *s2);
|
|
int Q_strncmp (const char *s1, const char *s2, int n);
|
|
int Q_stricmpn (const char *s1, const char *s2, int n);
|
|
char *Q_strlwr( char *s1 );
|
|
char *Q_strupr( char *s1 );
|
|
char *Q_strrchr( const char* string, int c );
|
|
|
|
// buffer size safe library replacements
|
|
void Q_strncpyz( char *dest, const char *src, int destsize );
|
|
void Q_strcat( char *dest, int size, const char *src );
|
|
char *Q_CleanStr( char *string );
|
|
|
|
//=============================================
|
|
|
|
extern qboolean bigendian;
|
|
|
|
short BigShort(short l);
|
|
short LittleShort(short l);
|
|
int BigLong (int l);
|
|
int LittleLong (int l);
|
|
float BigFloat (float l);
|
|
float LittleFloat (float l);
|
|
unsigned short LittleUnsignedShort(unsigned short l);
|
|
unsigned short BigUnsignedShort(unsigned short l);
|
|
|
|
void Swap_Init (void);
|
|
const char *va(const char *format, ...);
|
|
|
|
//=============================================
|
|
|
|
int MusicMood_NameToNum( const char * name );
|
|
const char * MusicMood_NumToName( int num );
|
|
int EAXMode_NameToNum( const char * name );
|
|
const char * EAXMode_NumToName( int num );
|
|
|
|
unsigned int GenerateHashForName( const char* name, qboolean caseSensitive, unsigned int maxHash );
|
|
|
|
int PlayerStat_NameToNum( const char * name );
|
|
const char * PlayerStat_NumToName( int num );
|
|
|
|
//
|
|
// key / value info strings
|
|
//
|
|
const 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_Validate( const char *s );
|
|
void Info_NextPair( const char **s, char key[MAX_INFO_KEY], char value[MAX_INFO_VALUE] );
|
|
|
|
void ParseMapName( const char *fullName, char *mapName, char *spawnposName, char *movieName );
|
|
|
|
// this is only here so the functions in q_shared.c and bg_*.c can link
|
|
void Com_Error( int level, const char *error, ... );
|
|
void Com_Printf( const char *msg, ... );
|
|
void Com_WPrintf( const char *msg, ... );
|
|
|
|
void Com_WidgetPrintf ( const char *widgetName, const char *fmt, ... );
|
|
|
|
/*
|
|
==========================================================
|
|
|
|
CVARS (console variables)
|
|
|
|
Many variables can be used for cheating purposes, so when
|
|
cheats is zero, force all unspecified variables to their
|
|
default values.
|
|
==========================================================
|
|
*/
|
|
|
|
#define CVAR_ARCHIVE 1 // set to cause it to be saved to vars.rc
|
|
// used for system variables, not for player
|
|
// specific configurations
|
|
#define CVAR_USERINFO 2 // sent to server on connect or change
|
|
#define CVAR_SERVERINFO 4 // sent in response to front end requests
|
|
#define CVAR_SYSTEMINFO 8 // these cvars will be duplicated on all clients
|
|
#define CVAR_INIT 16 // don't allow change from console at all,
|
|
// but can be set from the command line
|
|
#define CVAR_LATCH 32 // will only change when C code next does
|
|
// a Cvar_Get(), so it can't be changed
|
|
// without proper initialization. modified
|
|
// will be set, even though the value hasn't
|
|
// changed yet
|
|
#define CVAR_ROM 64 // display only, cannot be set by user at all
|
|
#define CVAR_USER_CREATED 128 // created by a set command
|
|
#define CVAR_TEMP 256 // can be set even when cheats are disabled, but is not archived
|
|
#define CVAR_CHEAT 512 // can not be changed if cheats are disabled
|
|
#define CVAR_NORESTART 1024 // do not clear when a cvar_restart is issued
|
|
#define CVAR_RESETSTRING 2048 // force the cvar's reset string to be set
|
|
#define CVAR_SOUND_LATCH 4096 // specifically for sound will only change
|
|
#define CVAR_UNDEFINED 8192
|
|
// when C code next does a Cvar_Get(), so it
|
|
// can't be changed without proper initialization.
|
|
// modified will be set, even though the value hasn't
|
|
// changed yet
|
|
|
|
#define CVAR_UNDEFINED_STRING "UNDEFINED"
|
|
|
|
// nothing outside the Cvar_*() functions should modify these fields!
|
|
typedef struct cvar_s {
|
|
char *name;
|
|
char *string;
|
|
char *resetString; // cvar_restart will reset to this value
|
|
char *latchedString; // for CVAR_LATCH vars
|
|
int flags;
|
|
qboolean modified; // set each time the cvar is changed
|
|
int modificationCount; // incremented each time the cvar is changed
|
|
float value; // atof( string )
|
|
int integer; // atoi( string )
|
|
struct cvar_s *next;
|
|
qboolean defaultSet; // set when setd creates the default value
|
|
} cvar_t;
|
|
|
|
#define MAX_CVAR_VALUE_STRING 256
|
|
|
|
typedef int cvarHandle_t;
|
|
|
|
// the modules that run in the virtual machine can't access the cvar_t directly,
|
|
// so they must ask for structured updates
|
|
typedef struct {
|
|
cvarHandle_t handle;
|
|
int modificationCount;
|
|
float value;
|
|
int integer;
|
|
char string[MAX_CVAR_VALUE_STRING];
|
|
} vmCvar_t;
|
|
|
|
/*
|
|
==============================================================
|
|
|
|
COLLISION DETECTION
|
|
|
|
==============================================================
|
|
*/
|
|
|
|
#include "surfaceflags.h" // shared with the q3map utility
|
|
|
|
// plane types are used to speed some tests
|
|
// 0-2 are axial planes
|
|
#define PLANE_X 0
|
|
#define PLANE_Y 1
|
|
#define PLANE_Z 2
|
|
#define PLANE_NON_AXIAL 3
|
|
|
|
|
|
// 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: 0,1,2 = axial, 3 = nonaxial
|
|
byte signbits; // signx + (signy<<1) + (signz<<2), used as lookup during collision
|
|
byte pad[2];
|
|
} cplane_t;
|
|
|
|
typedef struct
|
|
{
|
|
qboolean valid;
|
|
int surface;
|
|
int bone;
|
|
vec3_t position;
|
|
vec3_t normal;
|
|
float damage_multiplier;
|
|
} tikimdl_intersection_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, transformed to world space
|
|
int surfaceFlags; // surface hit
|
|
int contents; // contents on other side of surface hit
|
|
int entityNum; // entity the contacted surface is a part of
|
|
struct gentity_s *ent; // Pointer to entity hit
|
|
tikimdl_intersection_t intersect; // set if the trace hit a specific polygon
|
|
} trace_t;
|
|
|
|
typedef struct {
|
|
vec3_t boxmins, boxmaxs;// enclose the test object along entire move
|
|
const float *mins;
|
|
const float *maxs; // size of the moving object
|
|
const float *start;
|
|
vec3_t end;
|
|
trace_t trace;
|
|
int passEntityNum;
|
|
int contentmask;
|
|
qboolean cylinder;
|
|
qboolean fulltrace;
|
|
} moveclip_t;
|
|
|
|
// trace->entityNum can also be 0 to (MAX_GENTITIES-1)
|
|
// or ENTITYNUM_NONE, ENTITYNUM_WORLD
|
|
|
|
|
|
// markfragments are returned by CM_MarkFragments()
|
|
typedef struct {
|
|
int firstPoint;
|
|
int numPoints;
|
|
|
|
vec3_t normal;
|
|
float dist;
|
|
} markFragment_t;
|
|
|
|
typedef struct {
|
|
vec3_t origin;
|
|
vec3_t axis[3];
|
|
} orientation_t;
|
|
|
|
typedef struct {
|
|
int time; // real time of day
|
|
int serverTime; // time in the game
|
|
int totalGameTime; // total time playing the game
|
|
char comment[ MAX_QPATH ]; // user comment
|
|
char mapName[ MAX_QPATH ]; // name of map
|
|
char saveName[ MAX_QPATH ]; // local name of savegame
|
|
} savegamestruct_t;
|
|
|
|
//=====================================================================
|
|
|
|
// in order from highest priority to lowest
|
|
// if none of the catchers are active, bound key strings will be executed
|
|
#define KEYCATCH_CONSOLE 1
|
|
#define KEYCATCH_UI 2
|
|
#define KEYCATCH_MESSAGE 4
|
|
#define KEYCATCH_HUD 8
|
|
|
|
|
|
// sound channels
|
|
// channel 0 never willingly overrides
|
|
// other channels will allways override a playing sound on that channel
|
|
typedef enum {
|
|
CHAN_AUTO,
|
|
CHAN_LOCAL,
|
|
CHAN_WEAPON,
|
|
CHAN_VOICE,
|
|
CHAN_ITEM,
|
|
CHAN_BODY,
|
|
CHAN_DIALOG,
|
|
CHAN_DIALOG_SECONDARY,
|
|
CHAN_WEAPONIDLE,
|
|
CHAN_MENU,
|
|
CHAN_CINEMATIC,
|
|
CHAN_MUSIC,
|
|
CHAN_TAUNT,
|
|
CHAN_MENU2,
|
|
CHAN_COMBAT1 = 20,
|
|
CHAN_COMBAT2 = 21,
|
|
CHAN_COMBAT3 = 22,
|
|
CHAN_COMBAT4 = 23
|
|
} soundChannel_t;
|
|
|
|
#define DEFAULT_MIN_DIST -1.0f
|
|
#define DEFAULT_VOL -1.0f
|
|
|
|
#define CONTEXT_WIDE_MIN_DIST 1024
|
|
#define LEVEL_WIDE_MIN_DIST_CUTOFF 10000
|
|
#define LEVEL_WIDE_MIN_DIST 1000000 // full volume the entire level
|
|
#define LEVEL_WIDE_STRING "levelwide"
|
|
|
|
#define SOUND_SYNCH 0x1
|
|
#define SOUND_SYNCH_FADE 0x2
|
|
#define SOUND_RANDOM_PITCH_20 0x4
|
|
#define SOUND_RANDOM_PITCH_40 0x8
|
|
#define SOUND_LOCAL_DIALOG 0x10
|
|
|
|
typedef enum
|
|
{
|
|
mood_none,
|
|
mood_normal,
|
|
mood_action,
|
|
mood_suspense,
|
|
mood_mystery,
|
|
mood_success,
|
|
mood_failure,
|
|
mood_surprise,
|
|
mood_special,
|
|
mood_aux1,
|
|
mood_aux2,
|
|
mood_aux3,
|
|
mood_aux4,
|
|
mood_aux5,
|
|
mood_aux6,
|
|
mood_aux7,
|
|
mood_totalnumber
|
|
} music_mood_t;
|
|
|
|
typedef enum
|
|
{
|
|
eax_generic,
|
|
eax_paddedcell,
|
|
eax_room,
|
|
eax_bathroom,
|
|
eax_livingroom,
|
|
eax_stoneroom,
|
|
eax_auditorium,
|
|
eax_concerthall,
|
|
eax_cave,
|
|
eax_arena,
|
|
eax_hangar,
|
|
eax_carpetedhallway,
|
|
eax_hallway,
|
|
eax_stonecorridor,
|
|
eax_alley,
|
|
eax_forest,
|
|
eax_city,
|
|
eax_mountains,
|
|
eax_quarry,
|
|
eax_plain,
|
|
eax_parkinglot,
|
|
eax_sewerpipe,
|
|
eax_underwater,
|
|
eax_drugged,
|
|
eax_dizzy,
|
|
eax_psychotic,
|
|
eax_totalnumber
|
|
} eax_mode_t;
|
|
|
|
#define LIP_SYNC_HZ 20.0f
|
|
|
|
typedef enum {
|
|
MORPH_CHAN_NONE,
|
|
MORPH_CHAN_MOUTH,
|
|
MORPH_CHAN_BROW,
|
|
MORPH_CHAN_LEFT_BROW,
|
|
MORPH_CHAN_RIGHT_BROW,
|
|
MORPH_CHAN_EYES,
|
|
MORPH_CHAN_LEFT_LID,
|
|
MORPH_CHAN_RIGHT_LID
|
|
} morphChannel_t;
|
|
|
|
/* #define MAX_EXPRESSION_NAME_LENGTH 32
|
|
|
|
typedef struct
|
|
{
|
|
int morph_index;
|
|
float percent;
|
|
} dtikimorphtarget_t;
|
|
|
|
typedef struct
|
|
{
|
|
char alias[ MAX_EXPRESSION_NAME_LENGTH ];
|
|
int num_morph_targets;
|
|
int ofs_morph_targets;
|
|
} dtikiexpression_t; */
|
|
|
|
/*
|
|
========================================================================
|
|
|
|
ELEMENTS COMMUNICATED ACROSS THE NET
|
|
|
|
========================================================================
|
|
*/
|
|
|
|
#define ANGLE2SHORT(x) ((int)((x)*65536/360) & 65535)
|
|
#define SHORT2ANGLE(x) ((x)*(360.0/65536))
|
|
|
|
#define SNAPFLAG_RATE_DELAYED 1
|
|
#define SNAPFLAG_NOT_ACTIVE 2 // snapshot used during connection and for zombies
|
|
#define SNAPFLAG_SERVERCOUNT 4 // toggled every map_restart so transitions can be detected
|
|
|
|
//
|
|
// per-level limits
|
|
//
|
|
#define MAX_CLIENTS 128 // absolute limit
|
|
#define MAX_LOCATIONS 64
|
|
|
|
#define GENTITYNUM_BITS 10 // don't need to send any more
|
|
#define MAX_GENTITIES (1<<GENTITYNUM_BITS)
|
|
|
|
// entitynums are communicated with GENTITY_BITS, so any reserved
|
|
// values thatare going to be communcated over the net need to
|
|
// also be in this range
|
|
#define ENTITYNUM_NONE (MAX_GENTITIES-1)
|
|
#define ENTITYNUM_WORLD (MAX_GENTITIES-2)
|
|
#define ENTITYNUM_MAX_NORMAL (MAX_GENTITIES-2)
|
|
|
|
//
|
|
// Some of these are sent over the net with a fixed number of bits so they cannot be blindly increased
|
|
//
|
|
|
|
#define MAX_MODEL_BITS 9
|
|
#define MAX_MODELS (1 << MAX_MODEL_BITS) // 512
|
|
|
|
#define MAX_IMAGES 128
|
|
#define IMAGE_BITS 7
|
|
|
|
#define MAX_ACTIVE_ITEMS 8
|
|
#define MAX_INVENTORY 32
|
|
#define MAX_AMMO 16
|
|
#define MAX_ITEMS (MAX_INVENTORY + MAX_AMMO + 16)
|
|
#define MAX_AMMOCOUNT 16
|
|
#define MAX_SOUNDS_BITS 9 //Was 8
|
|
#define MAX_SOUNDS (1<<MAX_SOUNDS_BITS)
|
|
#define MAX_LIGHTSTYLES 32
|
|
#define MAX_ARENA_INFO 32
|
|
#define MAX_TEAM_INFO 64
|
|
#define MAX_ARCHETYPES 383
|
|
#define MAX_OBJECTIVE_NAMES 5
|
|
#define MAX_GENERAL_STRINGS 256
|
|
|
|
#define MAX_CONFIGSTRINGS 2300 //Was 1800
|
|
|
|
// these are the only configstrings that the system reserves, all the
|
|
// other ones are strictly for servergame to clientgame communication
|
|
#define CS_SERVERINFO 0 // an info string with all the serverinfo cvars
|
|
#define CS_SYSTEMINFO 1 // an info string for server system to client system configuration (timescale, etc)
|
|
#define CS_NAME 2 // A descriptive name of the current level
|
|
|
|
#define MAX_GAMESTATE_CHARS 36000
|
|
typedef struct {
|
|
int stringOffsets[MAX_CONFIGSTRINGS];
|
|
char stringData[MAX_GAMESTATE_CHARS];
|
|
int dataCount;
|
|
} gameState_t;
|
|
|
|
#define Square(x) ((x)*(x)) // added for bot code
|
|
|
|
typedef enum {
|
|
GT_SINGLE_PLAYER,
|
|
GT_MULTIPLAYER,
|
|
GT_BOT_SINGLE_PLAYER,
|
|
|
|
// BOTLIB ================= added to get bot code up, these are set by querying multiplayermanager when bot first loads
|
|
GT_FFA, // free for all
|
|
GT_TOURNAMENT, // one on one tournament
|
|
|
|
//-- team games go after this --
|
|
|
|
GT_TEAM, // team deathmatch
|
|
GT_CTF, // capture the flag
|
|
#ifdef MISSIONPACK
|
|
GT_1FCTF, // tikitech oneflag
|
|
GT_OBELISK, // tikitech destruction
|
|
GT_HARVESTER,
|
|
#endif
|
|
// ============================
|
|
|
|
GT_MAX_GAME_TYPE
|
|
} gametype_t;
|
|
|
|
|
|
//=========================================================
|
|
|
|
typedef enum
|
|
{
|
|
STAT_HEALTH,
|
|
STAT_DEAD_YAW, // cleared each frame
|
|
STAT_AMMO_LEFT, // ammo in current weapon in left hand or primary ammo in 2 handed weapons
|
|
STAT_CLIPAMMO_LEFT, // ammo in left weapon clip
|
|
STAT_NUM_SHOTS_LEFT, // amount of shots for the left hand weapon or primary fire.
|
|
STAT_MAX_NUM_SHOTS_LEFT, // max amount of shots for the left hand weapon or primary fire.
|
|
STAT_AMMO_RIGHT, // ammo in current weapon in right hand or alternate ammo in 2 handed weapons
|
|
STAT_CLIPAMMO_RIGHT, // ammo in right weapon clip
|
|
STAT_NUM_SHOTS_RIGHT, // amount of shots for the right hand or alternate fire
|
|
STAT_ARMOR_LEVEL, // amount of armor the player has
|
|
STAT_MAXAMMO_LEFT, // maxammo for left weapon
|
|
STAT_MAXAMMO_RIGHT, // maxammo for right weapon
|
|
STAT_MAXCLIPAMMO_LEFT, // maxammo in left weapon clip
|
|
STAT_MAXCLIPAMMO_RIGHT, // maxammo in right weapon clip
|
|
STAT_AMMO_TYPE1, // ammount of ammo type 1
|
|
STAT_AMMO_TYPE2, // ammount of ammo type 2
|
|
STAT_AMMO_TYPE3, // ammount of ammo type 3
|
|
STAT_AMMO_TYPE4, // ammount of ammo type 4
|
|
STAT_LAST_PAIN, // Last amount of damage the player took
|
|
STAT_ACCUMULATED_PAIN, // Accumulated damage
|
|
STAT_BOSSHEALTH, // if we are fighting a boss, how much health he currently has
|
|
STAT_BOSSNAME_CONFIGINDEX, // this is the index of the config string that has the boss name
|
|
STAT_CINEMATIC, // This is set when we go into cinematics
|
|
STAT_ADDFADE, // This is set when we need to do an addblend for the fade
|
|
STAT_LETTERBOX, // This is set to the fraction of the letterbox
|
|
STAT_POWERUPTIME, // The time the powerup has remaining
|
|
|
|
STAT_WEAPON_GENERIC1,
|
|
STAT_WEAPON_GENERIC2,
|
|
|
|
STAT_ITEMICON,
|
|
STAT_ITEMTEXT,
|
|
|
|
STAT_VOTETEXT,
|
|
|
|
// Stats for the Mission Status Screen
|
|
STAT_ENEMIES_KILLED, // Number of enemies the player has killed on this level
|
|
STAT_TEAMMATES_KILLED, // Number of teammates the player has killed on this level.
|
|
STAT_SHOTS_FIRED, // Number of shots the player has fired on this level
|
|
STAT_SHOTS_HIT, // Number of shots that have hit an actor
|
|
STAT_ACCURACY, // Accuracy
|
|
STAT_MISSION_DURATION, // How much time has been spent on this level
|
|
|
|
STAT_GENERIC, // Stat for generic use
|
|
|
|
STAT_NUM_OBJECTIVES, // The number objectives for the level
|
|
STAT_COMPLETE_OBJECTIVES, //The number of completed objectives for the level
|
|
STAT_FAILED_OBJECTIVES, // The number of failed objectives for the level.
|
|
STAT_INCOMPLETE_OBJECTIVES, // The number of incomplete objectives for the level.
|
|
|
|
STAT_SPECIALMOVETIMER, // Time for the special move timer
|
|
STAT_POINTS, // Number of points the player has
|
|
|
|
STAT_SECRETS_TOTAL, // Total Number of Secrets in the Level
|
|
STAT_SECRETS_FOUND, // Number of secrets uncovered by the player
|
|
STAT_ITEMS_TOTAL, // Total Number of Items in the Level
|
|
STAT_ITEMS_FOUND, // Number of Items found by the player
|
|
|
|
STAT_RED_TEAM_SCORE,
|
|
STAT_BLUE_TEAM_SCORE,
|
|
//STAT_ARENA, // Current arena id number the player is in
|
|
STAT_TEAM, // Current team number
|
|
//STAT_QUEUE_PLACE, // Place in the Queue for Deathmatch
|
|
STAT_SCORE, // Number of kills
|
|
STAT_KILLS, // Number of deaths
|
|
STAT_DEATHS, // Number of deaths
|
|
// STAT_TIMELEFT_MINUTES, // Timeleft in minutes
|
|
STAT_TIMELEFT_SECONDS, // Timeleft in seconds
|
|
STAT_WON_MATCHES, // Num matches won (for arena mode)
|
|
STAT_LOST_MATCHES, // Num matches lost (for arena mode)
|
|
|
|
STAT_MP_GENERIC1,
|
|
STAT_MP_GENERIC2,
|
|
STAT_MP_GENERIC3,
|
|
STAT_MP_GENERIC4,
|
|
STAT_MP_GENERIC5,
|
|
STAT_MP_GENERIC6,
|
|
STAT_MP_GENERIC7,
|
|
STAT_MP_GENERIC8,
|
|
|
|
STAT_MP_SPECTATING_ENTNUM,
|
|
|
|
STAT_MP_MODE_ICON,
|
|
STAT_MP_TEAM_ICON,
|
|
STAT_MP_TEAMHUD_ICON,
|
|
STAT_MP_OTHERTEAM_ICON,
|
|
STAT_MP_SPECIALTY_ICON,
|
|
STAT_MP_HOLDABLEITEM_ICON,
|
|
STAT_MP_RUNE_ICON,
|
|
STAT_MP_POWERUP_ICON,
|
|
|
|
STAT_MP_AWARD_ICON,
|
|
STAT_MP_AWARD_COUNT,
|
|
|
|
STAT_MP_STATE,
|
|
|
|
STAT_LAST_STAT // Last stat
|
|
|
|
} playerstat_t;
|
|
|
|
typedef enum
|
|
{
|
|
SPECTATOR_TYPE_NONE,
|
|
SPECTATOR_TYPE_NORMAL,
|
|
SPECTATOR_TYPE_FREEFORM,
|
|
SPECTATOR_TYPE_FOLLOW,
|
|
SPECTATOR_TYPE_ANY
|
|
} SpectatorTypes;
|
|
|
|
// bit field limits
|
|
|
|
// If MAX_STATS is raised the transmitting of stats across the networking layer needs to be fixed
|
|
#define MAX_STATS 96
|
|
#define MAX_PERSISTANT 16
|
|
#define MAX_POWERUPS 16
|
|
#define MAX_WEAPONS 16
|
|
|
|
#define MAX_PS_EVENTS 2
|
|
|
|
|
|
//========================================================================
|
|
//
|
|
// Flags for Objective States
|
|
//
|
|
//========================================================================
|
|
#define OBJECTIVE1_SHOW ( 1<<0 )
|
|
#define OBJECTIVE1_COMPLETE ( 1<<1 )
|
|
#define OBJECTIVE1_FAILED ( 1<<2 )
|
|
|
|
#define OBJECTIVE2_SHOW ( 1<<3 )
|
|
#define OBJECTIVE2_COMPLETE ( 1<<4 )
|
|
#define OBJECTIVE2_FAILED ( 1<<5 )
|
|
|
|
#define OBJECTIVE3_SHOW ( 1<<6 )
|
|
#define OBJECTIVE3_COMPLETE ( 1<<7 )
|
|
#define OBJECTIVE3_FAILED ( 1<<8 )
|
|
|
|
#define OBJECTIVE4_SHOW ( 1<<9 )
|
|
#define OBJECTIVE4_COMPLETE ( 1<<10 )
|
|
#define OBJECTIVE4_FAILED ( 1<<11 )
|
|
|
|
#define OBJECTIVE5_SHOW ( 1<<12 )
|
|
#define OBJECTIVE5_COMPLETE ( 1<<13 )
|
|
#define OBJECTIVE5_FAILED ( 1<<14 )
|
|
|
|
#define OBJECTIVE6_SHOW ( 1<<15 )
|
|
#define OBJECTIVE6_COMPLETE ( 1<<16 )
|
|
#define OBJECTIVE6_FAILED ( 1<<17 )
|
|
|
|
#define OBJECTIVE7_SHOW ( 1<<18 )
|
|
#define OBJECTIVE7_COMPLETE ( 1<<19 )
|
|
#define OBJECTIVE7_FAILED ( 1<<20 )
|
|
|
|
#define OBJECTIVE8_SHOW ( 1<<21 )
|
|
#define OBJECTIVE8_COMPLETE ( 1<<22 )
|
|
#define OBJECTIVE8_FAILED ( 1<<23 )
|
|
|
|
#define OBJECTIVE1 1
|
|
#define OBJECTIVE2 2
|
|
#define OBJECTIVE3 3
|
|
#define OBJECTIVE4 4
|
|
#define OBJECTIVE5 5
|
|
#define OBJECTIVE6 6
|
|
#define OBJECTIVE7 7
|
|
#define OBJECTIVE8 8
|
|
|
|
|
|
//========================================================================
|
|
//
|
|
// Flags for Information States
|
|
//
|
|
//========================================================================
|
|
#define INFORMATION1_SHOW ( 1<<0 )
|
|
#define INFORMATION2_SHOW ( 1<<1 )
|
|
#define INFORMATION3_SHOW ( 1<<2 )
|
|
#define INFORMATION4_SHOW ( 1<<3 )
|
|
#define INFORMATION5_SHOW ( 1<<4 )
|
|
#define INFORMATION6_SHOW ( 1<<5 )
|
|
#define INFORMATION7_SHOW ( 1<<6 )
|
|
#define INFORMATION8_SHOW ( 1<<7 )
|
|
|
|
#define INFORMATION1 1
|
|
#define INFORMATION2 2
|
|
#define INFORMATION3 3
|
|
#define INFORMATION4 4
|
|
#define INFORMATION5 5
|
|
#define INFORMATION6 6
|
|
#define INFORMATION7 7
|
|
#define INFORMATION8 8
|
|
|
|
|
|
#define MISSION_FAILED 1
|
|
#define MISSION_SUCCESS 2
|
|
//========================================================================
|
|
|
|
|
|
// playerState_t is the information needed by both the client and server
|
|
// to predict player motion and actions
|
|
// nothing outside of pmove should modify these, or some degree of prediction error
|
|
// will occur
|
|
|
|
// you can't add anything to this without modifying the code in msg.c
|
|
|
|
// playerState_t is a full superset of entityState_t as it is used by players,
|
|
// so if a playerState_t is transmitted, the entityState_t can be fully derived
|
|
// from it.
|
|
typedef struct playerState_s {
|
|
int commandTime; // cmd->serverTime of last executed command
|
|
int pm_type;
|
|
int bobCycle; // for view bobbing and footstep generation
|
|
int pm_flags; // ducked, jump_held, etc
|
|
int pm_time;
|
|
int pm_runtime; // used to keep track of how long player has been running
|
|
/* jhefty/jwaters -- another strafe-jump fix
|
|
int pm_landtime; // used to record land time, to prevent strafe jumping proper-like
|
|
*/
|
|
vec3_t origin;
|
|
vec3_t velocity;
|
|
int gravity;
|
|
int speed;
|
|
int jumpvelocity;
|
|
int crouchjumpvelocity;
|
|
qboolean crouchjumpset;
|
|
int pm_stopspeed;
|
|
int pm_airaccelerate;
|
|
int pm_wateraccelerate;
|
|
int pm_friction;
|
|
int pm_waterfriction;
|
|
int pm_accelerate;
|
|
|
|
int pm_defaultviewheight;
|
|
|
|
int delta_angles[3]; // add to command angles to get view direction
|
|
// changed by spawns, rotating objects, and teleporters
|
|
//lean amount
|
|
float leanDelta;
|
|
|
|
int groundEntityNum;// ENTITYNUM_NONE = in air
|
|
qboolean walking;
|
|
qboolean jumped;
|
|
qboolean groundPlane;
|
|
qboolean instantJump;
|
|
qboolean strafeJumpingAllowed;
|
|
int feetfalling;
|
|
vec3_t falldir;
|
|
trace_t groundTrace;
|
|
|
|
int clientNum; // ranges from 0 to MAX_CLIENTS-1
|
|
|
|
vec3_t viewangles; // for fixed views
|
|
int viewheight;
|
|
|
|
int stats[MAX_STATS];
|
|
int activeItems[MAX_ACTIVE_ITEMS];
|
|
int inventory_name_index[MAX_INVENTORY];
|
|
int inventory_weapon_ammo_index[MAX_INVENTORY];
|
|
int inventory_weapon_required_ammo[MAX_INVENTORY];
|
|
int ammo_in_clip[MAX_INVENTORY];
|
|
int ammo_name_index[MAX_AMMO];
|
|
int ammo_amount[MAX_AMMOCOUNT];
|
|
int max_ammo_amount[MAX_AMMOCOUNT];
|
|
|
|
int current_music_mood;
|
|
int fallback_music_mood;
|
|
float music_volume;
|
|
float music_volume_fade_time;
|
|
qboolean allowMusicDucking;
|
|
|
|
int reverb_type;
|
|
float reverb_level;
|
|
|
|
float blend[4]; // rgba full screen effect
|
|
float fov; // fov of the player
|
|
|
|
vec3_t camera_origin; // origin for camera view
|
|
vec3_t cameraFocalPoint;
|
|
qboolean useCameraFocalPoint;
|
|
vec3_t camera_angles; // angles for camera view
|
|
float camera_time; // time to switch between camera and normal view
|
|
|
|
vec3_t camera_offset; // angular offset for camera
|
|
vec3_t damage_angles; // these angles are added directly to the view, without lerping
|
|
int camera_flags; // third-person camera flags
|
|
vec3_t vehicleoffset;
|
|
qboolean in_vehicle;
|
|
|
|
int dialogEntnum;
|
|
int dialogSoundIndex;
|
|
int dialogTextSoundIndex;
|
|
|
|
int objectiveNameIndex;
|
|
unsigned int objectiveStates;
|
|
unsigned int informationStates;
|
|
|
|
unsigned int missionStatus;
|
|
|
|
unsigned int viewMode;
|
|
|
|
// not communicated over the net at all
|
|
int ping; // server to game info for scoreboard
|
|
} playerState_t;
|
|
|
|
typedef enum {
|
|
WEATHER_NONE,
|
|
WEATHER_RAIN,
|
|
WEATHER_RAIN_PLAIN,
|
|
WEATHER_SNOW
|
|
} weather_t;
|
|
|
|
#define DYNAMIC_LIGHT_NO_DEFAULT 255
|
|
#define DYNAMIC_LIGHT_MAX_INTENSITY 254
|
|
|
|
typedef struct worldState_s {
|
|
byte dynamic_light_intensities[ MAX_LIGHTING_GROUPS ];
|
|
|
|
byte dynamic_light_default_intensities[ MAX_LIGHTING_GROUPS ];
|
|
|
|
vec3_t wind_direction;
|
|
float wind_intensity;
|
|
|
|
weather_t weather_type;
|
|
int weather_intensity;
|
|
|
|
float time_scale;
|
|
} worldState_t;
|
|
|
|
#define MAX_SERVER_SOUNDS 32
|
|
#define MAX_SERVER_SOUNDS_BITS 6
|
|
|
|
typedef struct
|
|
{
|
|
vec3_t origin;
|
|
int entity_number;
|
|
int channel;
|
|
short sound_index;
|
|
float volume;
|
|
float min_dist;
|
|
qboolean stop_flag;
|
|
float pitch_modifier;
|
|
} server_sound_t;
|
|
|
|
//====================================================================
|
|
|
|
|
|
//
|
|
// usercmd_t->button bits, many of which are generated by the client system,
|
|
// so they aren't game-only definitions
|
|
//
|
|
#define BUTTON_ATTACKRIGHT_BITINDEX 0
|
|
#define BUTTON_ATTACKLEFT_BITINDEX 1
|
|
//#define BUTTON_SNEAK_BITINDEX 7
|
|
#define BUTTON_RELOAD_BITINDEX 2 // weapon reload key
|
|
#define BUTTON_RUN_BITINDEX 3
|
|
#define BUTTON_HOLSTERWEAPON_BITINDEX 4
|
|
#define BUTTON_USE_BITINDEX 5
|
|
#define BUTTON_TALK_BITINDEX 6 // displays talk balloon and disables actions
|
|
#define BUTTON_ANY_BITINDEX 7 // any key whatsoever
|
|
#define BUTTON_DROP_RUNE_BITINDEX 8
|
|
#define BUTTON_TRANSFER_ENERGY_BITINDEX 8
|
|
|
|
// This should always be at least 1 larger than the highest above
|
|
// Also if this number needs to be larger the buttons var in usercmd_t might need to be larger
|
|
#define USERCMD_BUTTON_MAX 16
|
|
|
|
#define BUTTON_ATTACKRIGHT ( 1 << BUTTON_ATTACKRIGHT_BITINDEX )
|
|
#define BUTTON_ATTACKLEFT ( 1 << BUTTON_ATTACKLEFT_BITINDEX )
|
|
//#define BUTTON_SNEAK ( 1 << BUTTON_SNEAK_BITINDEX )
|
|
#define BUTTON_RUN ( 1 << BUTTON_RUN_BITINDEX )
|
|
#define BUTTON_HOLSTERWEAPON ( 1 << BUTTON_HOLSTERWEAPON_BITINDEX )
|
|
#define BUTTON_USE ( 1 << BUTTON_USE_BITINDEX )
|
|
#define BUTTON_TALK ( 1 << BUTTON_TALK_BITINDEX ) // displays talk balloon and disables actions
|
|
#define BUTTON_RELOAD ( 1 << BUTTON_RELOAD_BITINDEX ) // weapon reload key
|
|
#define BUTTON_ANY ( 1 << BUTTON_ANY_BITINDEX ) // any key whatsoever
|
|
#define BUTTON_DROP_RUNE ( 1 << BUTTON_DROP_RUNE_BITINDEX )
|
|
#define BUTTON_TRANSFER_ENERGY ( 1 << BUTTON_TRANSFER_ENERGY_BITINDEX )
|
|
|
|
|
|
|
|
// usercmd_t is sent to the server each client frame
|
|
typedef struct usercmd_s {
|
|
int serverTime;
|
|
byte msec;
|
|
short buttons;
|
|
byte weapon;
|
|
short angles[3];
|
|
short deltaAngles[3]; //the absolute number of angles the player has moved.
|
|
short choffset[2];
|
|
vec3_t realvieworigin;
|
|
vec3_t realviewangles;
|
|
qboolean thirdperson;
|
|
signed char forwardmove, rightmove, upmove, lean;
|
|
|
|
} usercmd_t;
|
|
|
|
//===================================================================
|
|
|
|
//
|
|
// Animation flags
|
|
//
|
|
#define MDL_ANIM_DELTA_DRIVEN ( 1 << 0 )
|
|
#define MDL_ANIM_DEFAULT_ANGLES ( 1 << 3 )
|
|
#define MDL_ANIM_NO_TIMECHECK ( 1 << 4 )
|
|
|
|
// if entityState->solid == SOLID_BMODEL, modelindex is an inline model number
|
|
#define SOLID_BMODEL 0xffffff
|
|
|
|
#define RF_THIRD_PERSON (1<<0) // don't draw through eyes, only mirrors (player bodies, chat sprites)
|
|
#define RF_FIRST_PERSON (1<<1) // only draw through eyes (view weapon, damage blood blob)
|
|
#define RF_DEPTHHACK (1<<2) // hack the z-depth so that view weapons do not clip into walls
|
|
#define RF_VIEWLENSFLARE (1<<3) // View dependent lensflare
|
|
#define RF_FRAMELERP (1<<4) // interpolate between current and next state
|
|
#define RF_BEAM (1<<5) // draw a beam between origin and origin2
|
|
#define RF_SHADOW_FROM_BIP01 (1<<6)
|
|
#define RF_DONTDRAW (1<<7) // don't draw this entity but send it over
|
|
#define RF_LENSFLARE (1<<8) // add a lens flare to this
|
|
#define RF_EXTRALIGHT (1<<9) // use good lighting on this entity
|
|
#define RF_DETAIL (1<<10) // Culls a model based on the distance away from you
|
|
#define RF_SHADOW (1<<11) // whether or not to draw a shadow
|
|
#define RF_PORTALSURFACE (1<<12) // don't draw, but use to set portal views
|
|
#define RF_SKYORIGIN (1<<13) // don't draw, but use to set sky portal origin and coordinate system
|
|
#define RF_SKYENTITY (1<<14) // this entity is only visible through a skyportal
|
|
#define RF_LIGHTOFFSET (1<<15) // this entity has a light offset
|
|
#define RF_CUSTOMSHADERPASS (1<<16) // draw the custom shader on top of the base geometry
|
|
#define RF_MINLIGHT (1<<17) // allways have some light (viewmodel, some items)
|
|
#define RF_FULLBRIGHT (1<<18) // allways have full lighting
|
|
#define RF_LIGHTING_ORIGIN (1<<19) // use refEntity->lightingOrigin instead of refEntity->origin
|
|
// for lighting. This allows entities to sink into the floor
|
|
// with their origin going solid, and allows all parts of a
|
|
// player to get the same lighting
|
|
#define RF_SHADOW_PLANE (1<<20) // use refEntity->shadowPlane
|
|
#define RF_WRAP_FRAMES (1<<21) // mod the model frames by the maxframes to allow continuous
|
|
// animation without needing to know the frame count
|
|
#define RF_PORTALENTITY (1<<22) // this entity should only be drawn from a portal
|
|
#define RF_DUALENTITY (1<<23) // this entity is drawn both in the portal and outside it.
|
|
#define RF_ADDITIVE_DLIGHT (1<<24) // this entity has an additive dynamic light
|
|
#define RF_LIGHTSTYLE_DLIGHT (1<<25) // this entity has a dynamic light that uses a light style
|
|
#define RF_SHADOW_PRECISE (1<<26) // this entity can have a precise shadow applied to it
|
|
#define RF_INVISIBLE (1<<27) // This entity is invisible, and only negative lights will light it up
|
|
#define RF_WEAPONMODEL (1<<28) // This entity is a weapon model which is attached to players
|
|
#define RF_FORCE_ALPHA (1<<29) // Force alpha on model
|
|
#define RF_FORCE_ALPHA_EFFECTS (1<<30) // Force alpha on effects
|
|
#define RF_CHILDREN_DONT_INHERIT_ALPHA (1<<31)
|
|
|
|
//
|
|
// use this mask when propagating renderfx from one entity to another
|
|
//
|
|
#define RF_FLAGS_NOT_INHERITED ( RF_LENSFLARE | RF_VIEWLENSFLARE | RF_BEAM | RF_EXTRALIGHT | RF_SKYORIGIN | RF_SHADOW | RF_SHADOW_PRECISE | RF_SHADOW_PLANE | RF_LIGHTOFFSET | RF_CHILDREN_DONT_INHERIT_ALPHA )
|
|
|
|
//
|
|
// the following flag is used by the server and is also defined in bg_public.h
|
|
//
|
|
#define PMF_CAMERA_VIEW ( 1<<8 ) // use camera view instead of ps view
|
|
|
|
#define BEAM_LIGHTNING_EFFECT (1<<0)
|
|
#define BEAM_USEMODEL (1<<1)
|
|
#define BEAM_PERSIST_EFFECT (1<<2)
|
|
#define BEAM_SPHERE_EFFECT (1<<3)
|
|
#define BEAM_RANDOM_DELAY (1<<4)
|
|
#define BEAM_TOGGLE (1<<5)
|
|
#define BEAM_RANDOM_TOGGLEDELAY (1<<6)
|
|
#define BEAM_WAVE_EFFECT (1<<7)
|
|
#define BEAM_USE_NOISE (1<<8)
|
|
#define BEAM_PARENT (1<<9)
|
|
#define BEAM_TILESHADER (1<<10)
|
|
#define BEAM_OFFSET_ENDPOINTS (1<<11)
|
|
#define BEAM_WAVE_EFFECT2 (1<<12)
|
|
#define BEAM_FULLWAVE_EFFECT (1<<13)
|
|
|
|
|
|
typedef enum {
|
|
TR_STATIONARY,
|
|
TR_INTERPOLATE, // non-parametric, but interpolate between snapshots
|
|
TR_LINEAR,
|
|
TR_LINEAR_STOP,
|
|
TR_SINE, // value = base + sin( time / duration ) * delta
|
|
TR_GRAVITY,
|
|
TR_LERP // Lerp between current origin and last origin
|
|
} trType_t;
|
|
|
|
typedef struct {
|
|
trType_t trType;
|
|
int trTime;
|
|
int trDuration; // if non 0, trTime + trDuration = stop time
|
|
vec3_t trBase;
|
|
vec3_t trDelta; // velocity, etc
|
|
} trajectory_t;
|
|
|
|
#define MAX_MODEL_SURFACES 32 // this needs to be the same in qfiles.h for TIKI_MAX_SURFACES
|
|
|
|
#define MDL_SURFACE_SKINOFFSET_BIT0 ( 1 << 0 )
|
|
#define MDL_SURFACE_SKINOFFSET_BIT1 ( 1 << 1 )
|
|
#define MDL_SURFACE_NODRAW ( 1 << 2 )
|
|
#define MDL_SURFACE_SURFACETYPE_BIT0 ( 1 << 3 )
|
|
#define MDL_SURFACE_SURFACETYPE_BIT1 ( 1 << 4 )
|
|
#define MDL_SURFACE_SURFACETYPE_BIT2 ( 1 << 5 )
|
|
#define MDL_SURFACE_CROSSFADE_SKINS ( 1 << 6 )
|
|
#define MDL_SURFACE_SKIN_NO_DAMAGE ( 1 << 7 )
|
|
|
|
#define CROUCH_HEIGHT 36
|
|
#define CROUCH_EYE_HEIGHT 30
|
|
#define STAND_HEIGHT 72
|
|
#define STAND_EYE_HEIGHT 66
|
|
|
|
#define NUM_BONE_CONTROLLERS 5
|
|
|
|
#define NUM_MORPH_CONTROLLERS 10
|
|
|
|
#define NUM_EFFECTS_ANIMS 4
|
|
|
|
typedef struct {
|
|
int index;
|
|
float percent;
|
|
} morph_controller_t;
|
|
|
|
// entityState_t is the information conveyed from the server
|
|
// in an update message about entities that the client will
|
|
// need to render in some way
|
|
// Different eTypes may use the information in different ways
|
|
// The messages are delta compressed, so it doesn't really matter if
|
|
// the structure size is fairly large
|
|
|
|
typedef struct entityState_s {
|
|
int number; // entity index
|
|
int instanceNumber;
|
|
int eType; // entityType_t
|
|
int eFlags;
|
|
|
|
trajectory_t pos; // for calculating position
|
|
trajectory_t apos; // for calculating angles
|
|
|
|
vec3_t netorigin; // these are the ones actually sent over
|
|
vec3_t origin;
|
|
vec3_t origin2;
|
|
|
|
vec3_t netangles; // these are the ones actually sent over
|
|
vec3_t angles;
|
|
|
|
vec3_t viewangles ; // player's view angles.
|
|
|
|
unsigned int constantLight; // r + (g<<8) + (b<<16) + (intensity<<24)
|
|
|
|
int loopSound; // constantly loop this sound
|
|
float loopSoundVolume;
|
|
float loopSoundMinDist;
|
|
|
|
int parent; // if this entity is attached, this is non-zero
|
|
int tag_num; // if attached, the tag number it is attached to on the parent
|
|
qboolean attach_use_angles;
|
|
vec3_t attach_offset;
|
|
vec3_t attach_angles_offset;
|
|
|
|
int modelindex;
|
|
int viewmodelindex;
|
|
int skinNum;
|
|
int customShader;
|
|
int customEmitter;
|
|
float animationRate;
|
|
int anim;
|
|
int frame;
|
|
int crossblend_time; // in milliseconds so it can be transmitted as a short
|
|
|
|
int torso_anim;
|
|
int torso_frame;
|
|
int torso_crossblend_time; // in milliseconds so it can be transmitted as a short
|
|
|
|
int bone_tag[ NUM_BONE_CONTROLLERS ];
|
|
vec3_t bone_angles[ NUM_BONE_CONTROLLERS ];
|
|
vec4_t bone_quat[ NUM_BONE_CONTROLLERS ]; // not sent over
|
|
|
|
morph_controller_t morph_controllers[ NUM_MORPH_CONTROLLERS ];
|
|
|
|
byte surfaces[MAX_MODEL_SURFACES];
|
|
|
|
int clientNum; // 0 to (MAX_CLIENTS - 1), for players and corpses
|
|
|
|
int groundEntityNum; // -1 = in air
|
|
int solid; // for client side prediction, trap_linkentity sets this properly
|
|
|
|
float scale;
|
|
float alpha;
|
|
|
|
int renderfx;
|
|
|
|
unsigned int affectingViewModes;
|
|
|
|
int archeTypeIndex;
|
|
int missionObjective;
|
|
|
|
int infoIcon;
|
|
|
|
// This enables additional effects to be combined from other anims
|
|
int effectsAnims[ NUM_EFFECTS_ANIMS ];
|
|
|
|
int bindparent; // not sent over
|
|
float quat[4]; // not sent over
|
|
float mat[3][3]; // not sent over
|
|
} entityState_t;
|
|
|
|
typedef enum {
|
|
CA_UNINITIALIZED,
|
|
CA_DISCONNECTED, // not talking to a server
|
|
CA_AUTHORIZING, // not used any more, was checking cd key
|
|
CA_CONNECTING, // sending request packets to the server
|
|
CA_CHALLENGING, // sending challenge packets to the server
|
|
CA_CONNECTED, // netchan_t established, getting gamestate
|
|
CA_LOADING, // only during cg.CG_GameStateReceived, never during main loop
|
|
CA_PRIMED, // got gamestate, waiting for first frame
|
|
CA_ACTIVE, // game views should be displayed
|
|
CA_CINEMATIC // playing a cinematic or a static pic, not connected to a server
|
|
} connstate_t;
|
|
|
|
/*
|
|
========================================================================
|
|
|
|
SYSTEM MATH
|
|
|
|
========================================================================
|
|
*/
|
|
|
|
void MatrixMultiply( const float in1[3][3], const float in2[3][3], float out[3][3] );
|
|
void AnglesToAxis( const vec3_t angles, vec3_t axis[3] );
|
|
void AxisToAngles( vec3_t axis[3], vec3_t angles );
|
|
void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t left, vec3_t up);
|
|
void PerpendicularVector( vec3_t dst, const vec3_t src );
|
|
void EulerToQuat( float ang[ 3 ], float q[ 4 ] );
|
|
void MatToQuat( const float srcMatrix[ 3 ][ 3 ], float destQuat[ 4 ] );
|
|
void QuatToMat( const float q[ 4 ], float m[ 3 ][ 3 ] );
|
|
void MatrixToEulerAngles( const float mat[ 3 ][ 3 ], vec3_t ang );
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
|
|
TIKI
|
|
|
|
========================================================================
|
|
*/
|
|
|
|
#define TIKI_CMD_MAX_CMDS 256
|
|
#define TIKI_CMD_MAX_ARGS 12
|
|
|
|
typedef struct
|
|
{
|
|
int num_args;
|
|
char *args[TIKI_CMD_MAX_ARGS];
|
|
} tiki_singlecmd_t;
|
|
|
|
typedef struct
|
|
{
|
|
int num_cmds;
|
|
tiki_singlecmd_t cmds[ TIKI_CMD_MAX_CMDS ];
|
|
} tiki_cmd_t;
|
|
|
|
typedef struct
|
|
{
|
|
vec3_t start;
|
|
vec3_t end;
|
|
vec3_t color;
|
|
float alpha;
|
|
float width;
|
|
unsigned short factor;
|
|
unsigned short pattern;
|
|
} debugline_t;
|
|
|
|
// Added for FAKK2
|
|
#define FLOAT_TO_INT( x, fracbits ) ( ( x ) * ( 1 << ( fracbits ) ) )
|
|
|
|
#define FLOAT_TO_PKT( x, dest, wholebits, fracbits ) \
|
|
{ \
|
|
if ( ( x ) >= ( 1 << ( wholebits ) ) ) \
|
|
{ \
|
|
( dest ) = FLOAT_TO_INT( ( 1 << ( wholebits ) ), ( fracbits ) ) - 1; \
|
|
} \
|
|
else if ( ( x ) < 0 ) \
|
|
{ \
|
|
( dest ) = 0; \
|
|
} \
|
|
else \
|
|
{ \
|
|
( dest ) = FLOAT_TO_INT( ( x ), ( fracbits ) ); \
|
|
} \
|
|
}
|
|
|
|
#define SIGNED_FLOAT_TO_PKT( x, dest, wholebits, fracbits ) \
|
|
{ \
|
|
float temp_x; \
|
|
temp_x = ( x ) + ( 1 << ( wholebits ) ); \
|
|
if ( temp_x >= ( 1 << ( ( wholebits ) + 1 ) ) ) \
|
|
( dest ) = FLOAT_TO_INT( ( 1 << ( ( wholebits ) + 1 ) ), ( fracbits ) ) - 1; \
|
|
else if ( temp_x < 0 ) \
|
|
(dest) = 0; \
|
|
else \
|
|
( dest ) = FLOAT_TO_INT( temp_x, ( fracbits ) ); \
|
|
}
|
|
|
|
#define INT_TO_FLOAT( x, wholebits, fracbits ) ( ( float )( ( ( float )( x ) ) / ( float )( 1 << ( fracbits ) ) - ( float )( 1 << ( wholebits ) ) ) )
|
|
#define UINT_TO_FLOAT( x, fracbits ) ( ( float )( ( ( float )( x ) ) / ( float )( 1 << ( fracbits ) ) ) )
|
|
|
|
#define TRANSLATION_TO_PKT( x, dest ) FLOAT_TO_PKT( ( x ), ( dest ), 4, 11 )
|
|
#define PKT_TO_TRANSLATION( x ) UINT_TO_FLOAT( ( x ), 11 )
|
|
|
|
#define OFFSET_TO_PKT( x, dest ) FLOAT_TO_PKT( ( x ), ( dest ), 1, 14 )
|
|
#define PKT_TO_OFFSET( x ) UINT_TO_FLOAT( ( x ), 14 )
|
|
|
|
#define ROTATE_TO_PKT( x, dest ) FLOAT_TO_PKT( ( x ), ( dest ), 9, 6 )
|
|
#define PKT_TO_ROTATE( x ) UINT_TO_FLOAT( ( x ), 6 )
|
|
|
|
#define BASE_TO_PKT( x, dest ) SIGNED_FLOAT_TO_PKT( ( x ), ( dest ), 3, 4 )
|
|
#define PKT_TO_BASE( x ) INT_TO_FLOAT( ( x ), 3, 4 )
|
|
|
|
#define AMPLITUDE_TO_PKT( x, dest ) FLOAT_TO_PKT( ( x ), ( dest ), 4, 4 )
|
|
#define PKT_TO_AMPLITUDE( x ) UINT_TO_FLOAT( ( x ), 4 )
|
|
|
|
#define PHASE_TO_PKT( x, dest ) SIGNED_FLOAT_TO_PKT( ( x ), ( dest ), 3, 4 )
|
|
#define PKT_TO_PHASE( x ) INT_TO_FLOAT( ( x ), 3, 4 )
|
|
|
|
#define FREQUENCY_TO_PKT( x, dest ) FLOAT_TO_PKT( ( x ), ( dest ), 4, 4 )
|
|
#define PKT_TO_FREQUENCY( x ) UINT_TO_FLOAT( ( x ), 4 )
|
|
|
|
#define BEAM_PARM_TO_PKT( x, dest ) FLOAT_TO_PKT( ( x ), ( dest ), 4, 4 )
|
|
#define PKT_TO_BEAM_PARM( x ) UINT_TO_FLOAT( ( x ), 4 )
|
|
|
|
// cinematic states
|
|
typedef enum {
|
|
FMV_IDLE,
|
|
FMV_PLAY, // play
|
|
FMV_EOF, // all other conditions, i.e. stop/EOF/abort
|
|
FMV_ID_BLT,
|
|
FMV_ID_IDLE,
|
|
FMV_LOOPED,
|
|
FMV_ID_WAIT
|
|
} e_status;
|
|
|
|
//CDKey defines
|
|
#define CDKEY_LEN 16
|
|
#define CDCHKSUM_LEN 2
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // __Q_SHARED_H__
|