#ifndef QSHARED_H #define QSHARED_H // q_shared.h -- included first by ALL program modules (unfortuantly this is true for all code from id) // unknown pragmas are SUPPOSED to be ignored, but.... #pragma warning(disable : 4244) // MIPS -- truncation from double to float in MSDEV #pragma warning(disable : 4018) // signed/unsigned mismatch #pragma warning(disable : 4305) // truncation from const double to float #include #include #include #include #include #include #include #include #include "H2Common.h" #include "q_Typedef.h" //#include "player.h" #define DEMO_CODE 0 #ifdef QUAKE2_STATIC #define QUAKE2_API #else #ifdef QUAKE2 #define QUAKE2_API __declspec(dllexport) #else #define QUAKE2_API __declspec(dllimport) #endif #endif // These are the only 2 references to C_ONLY // id386 could do with removing #define C_ONLY 1 #if defined _M_IX86 && !defined C_ONLY #define id386 1 #else #define id386 0 #endif #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 80 // max tokens resulting from Cmd_TokenizeString #define MAX_TOKEN_CHARS 128 // max length of an individual token #define MAX_QPATH 64 // max length of a quake game pathname #define MAX_OSPATH 128 // max length of a filesystem pathname // game print flags #define PRINT_LOW 0 // pickup messages #define PRINT_MEDIUM 1 // death messages #define PRINT_HIGH 2 // critical messages #define PRINT_CHAT 3 // chat messages #define PRINT_CAPTION 4 // captioning at bottom #define PRINT_TEAM 5 // chat message to team members #define ERR_FATAL 0 // exit the entire game with a popup window #define ERR_DROP 1 // print to console and disconnect from game #define ERR_DISCONNECT 2 // don't kill server #define PRINT_ALL 0 #define PRINT_DEVELOPER 1 // only print when "developer 1" #define PRINT_ALERT 2 #ifndef M_PI #define M_PI 3.14159265358979323846 // matches value in gcc v2 math.h #endif #define SQRT2 1.414213562 #define TIME_EPSILON 0.01 #define VectorCopy_Macro(a,b) (b[0]=a[0],b[1]=a[1],b[2]=a[2]) #define VectorSubtract_Macro(a,b,c) (c[0]=a[0]-b[0],c[1]=a[1]-b[1],c[2]=a[2]-b[2]) H2COMMON_API int Q_log2(int val); H2COMMON_API void ClearBounds (vec3_t mins, vec3_t maxs); H2COMMON_API void AddPointToBounds (vec3_t v, vec3_t mins, vec3_t maxs); H2COMMON_API float anglemod(float a); H2COMMON_API float anglemod_old(float a); H2COMMON_API float LerpAngle (float a1, float a2, float frac); int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *plane); #define BOX_ON_PLANE_SIDE(emins, emaxs, p) \ (((p)->type < 3)? \ ( \ ((p)->dist <= (emins)[(p)->type])? \ 1 \ : \ ( \ ((p)->dist >= (emaxs)[(p)->type])?\ 2 \ : \ 3 \ ) \ ) \ : \ BoxOnPlaneSide( (emins), (emaxs), (p))) //============================================= #define MAX_COLORS 33 extern H2COMMON_API paletteRGBA_t TextPalette[MAX_COLORS]; typedef enum { P_BLACK , P_RED , P_GREEN , P_YELLOW , P_BLUE , P_PURPLE , P_CYAN , P_WHITE , P_HBLACK , P_HRED , P_HGREEN , P_HYELLOW , P_HBLUE , P_HPURPLE , P_HCYAN , P_HWHITE , P_DESIGNER , P_PROGRAMMER , P_OBJ_NORMAL , P_OBJ_BOLD , P_OBIT , P_CAPTION , P_CHAT , P_TEAM , P_VERSION , P_FRAGS , P_ALTFRAGS , P_MENUFIELD , P_MSGBOX , P_HEADER , P_CRED_TITLE , P_CRED_CONTENT , P_FRAGNAME } PalIdx_t; //============================================= H2COMMON_API char *COM_SkipPath (char *pathname); H2COMMON_API void COM_StripExtension (char *in, char *out); H2COMMON_API void COM_FileBase (char *in, char *out); H2COMMON_API void COM_FilePath (char *in, char *out); H2COMMON_API void COM_DefaultExtension (char *path, char *extension); H2COMMON_API char *COM_Parse (char **data_p); H2COMMON_API void Com_sprintf (char *dest, int size, char *fmt, ...); H2COMMON_API void Com_PageInMemory (byte *buffer, int size); //============================================= H2COMMON_API short BigShort(short l); H2COMMON_API int BigLong(int l); H2COMMON_API float BigFloat(float f); #define LittleShort(x) (x) #define LittleLong(x) (x) #define LittleFloat(x) (x) H2COMMON_API float Clamp(float src, float min, float max); H2COMMON_API int ClampI(int src, int min, int max); H2COMMON_API float Approach(float curr, float dest, float rate); H2COMMON_API char *va(char *format, ...); //============================================= // // key / value info strings // #define MAX_INFO_KEY 64 #define MAX_INFO_VALUE 64 #define MAX_INFO_STRING 512 #ifdef __cplusplus extern "C" { #endif H2COMMON_API char *Info_ValueForKey (char *s, char *key); H2COMMON_API void Info_RemoveKey (char *s, char *key); H2COMMON_API void Info_SetValueForKey (char *s, char *key, char *value); H2COMMON_API qboolean Info_Validate (char *s); H2COMMON_API void Set_Com_Printf(void (*toSet) (char *fmt, ...)); /* ============================================================== SYSTEM SPECIFIC ============================================================== */ struct cplane_s; extern H2COMMON_API vec3_t vec3_origin; extern H2COMMON_API vec3_t vec3_up; extern int curtime; // time returned by last Sys_Milliseconds int Sys_Milliseconds (void); void Sys_Mkdir (char *path); // large block stack allocation routines void *Hunk_Begin (int maxsize); void *Hunk_Alloc (int size); void Hunk_Free (void *buf); int Hunk_End (void); // directory searching #define SFF_ARCH 0x01 #define SFF_HIDDEN 0x02 #define SFF_RDONLY 0x04 #define SFF_SUBDIR 0x08 #define SFF_SYSTEM 0x10 /* ** pass in an attribute mask of things you wish to REJECT */ char *Sys_FindFirst (char *path, unsigned musthave, unsigned canthave ); char *Sys_FindNext ( unsigned musthave, unsigned canthave ); void Sys_FindClose (void); // this is only here so the functions in q_shared.c and q_shwin.c can link void Sys_Error (char *error, ...); void Com_Printf (char *msg, ...); void Com_ColourPrintf (PalIdx_t colour, char *msg, ...); #ifdef __cplusplus } #endif /* ========================================================== CVARS (console variables) ========================================================== */ #ifndef CVAR #define CVAR #define CVAR_ARCHIVE 1 // set to cause it to be saved to vars.rc #define CVAR_USERINFO 2 // added to userinfo when changed #define CVAR_SERVERINFO 4 // added to serverinfo when changed #define CVAR_NOSET 8 // don't allow change from console at all, // but can be set from the command line #define CVAR_LATCH 16 // save changes until server restart // nothing outside the Cvar_*() functions should modify these fields! typedef struct cvar_s { char *name; char *string; char *latched_string; // for CVAR_LATCH vars int flags; qboolean modified; // set each time the cvar is changed float value; struct cvar_s *next; } cvar_t; #endif // CVAR cvar_t *Cvar_Get (char *var_name, char *value, int flags); /************************************************************** * palette info **************************************************************/ typedef struct paletteRGB_s { struct { byte r,g,b; }; } paletteRGB_t; /************************************************************** * additional info for flex models with mesh nodes **************************************************************/ #define MAX_FM_MESH_NODES 16 // also defined in ref_gl/fmodel.h typedef struct { int frame; paletteRGBA_t color; byte flags; int skin; } fmnodeinfo_t; // flags #define FMNI_USE_FRAME (1<<0) #define FMNI_USE_COLOR (1<<1) #define FMNI_USE_SKIN (1<<2) #define FMNI_NO_LERP (1<<3) #define FMNI_NO_DRAW (1<<4) #define FMNI_USE_REFLECT (1<<5) /* ============================================================== COLLISION DETECTION ============================================================== */ // ************************************************************************************************ // CONTENTS_XXX // ------------ // Contents flags. // ************************************************************************************************ // Lower bits are stronger, and will eat weaker brushes completely. #define CONTENTS_EMPTY 0x00000000 // nothing #define CONTENTS_SOLID 0x00000001 // An eye is never valid in a solid. #define CONTENTS_WINDOW 0x00000002 // Translucent, but not watery. #define CONTENTS_ILLUSIONARY 0x00000004 // Was CONTENTS_AUX. #define CONTENTS_LAVA 0x00000008 #define CONTENTS_SLIME 0x00000010 #define CONTENTS_WATER 0x00000020 #define CONTENTS_MIST 0x00000040 #define LAST_VISIBLE_CONTENTS CONTENTS_MIST // Remaining contents are non-visible, and don't eat brushes. #define CONTENTS_AREAPORTAL 0x00008000 #define CONTENTS_PLAYERCLIP 0x00010000 #define CONTENTS_MONSTERCLIP 0x00020000 // Currents can be added to any other contents, and may be mixed. #define CONTENTS_CURRENT_0 0x00040000 #define CONTENTS_CURRENT_90 0x00080000 #define CONTENTS_CURRENT_180 0x00100000 #define CONTENTS_CURRENT_270 0x00200000 #define CONTENTS_CURRENT_UP 0x00400000 #define CONTENTS_CURRENT_DOWN 0x00800000 // Removed before bsping an entity. #define CONTENTS_ORIGIN 0x01000000 // Should never be on a brush, only in game (i.e. set by CM_ functions at map load time). #define CONTENTS_MONSTER 0x02000000 #define CONTENTS_DEADMONSTER 0x04000000 // Brushes to be added after vis leaves. #define CONTENTS_DETAIL 0x08000000 // Auto set if any surface has transparency, e.g. water. #define CONTENTS_TRANSLUCENT 0x10000000 // This flag is special in that it is not stored in the .bsp by QuakeEd. It is passed into the trace // functions to say that anything with CONTENTS_CAMERANOBLOCK should be ignored. So we can get away // with defining it = CONTENTS_CAMERANOBLOCK. #define CONTENTS_CAMERABLOCK 0x20000000 // Was CONTENTS_LADDER. // This flag is special in that it is NOT passed into the trace functions, but may be stored in the //.bsp by QuakeEd to say that traces with CONTENTS_CAMERABLOCK as the mask will ignore any brushes // with this flag. #define CONTENTS_CAMERANOBLOCK 0x40000000 // Only do the trace against the world, not entities within it. Not stored in the .bsp and passed // only as an argument to trace fucntions. #define CONTENTS_WORLD_ONLY 0x80000000 // ************************************************************************************************ // MASK_XXX // -------- // Contents masks. // ************************************************************************************************ #define MASK_ALL 0x7fffffff #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) #define MASK_DRIP (CONTENTS_SOLID|CONTENTS_WATER|CONTENTS_LAVA|CONTENTS_SLIME|CONTENTS_WINDOW) // ************************************************************************************************ // SURF_XXX // -------- // ************************************************************************************************ #define SURF_LIGHT 0x1 // Value will hold the light strength. #define SURF_SLICK 0x2 // Affects game physics. #define SURF_SKY 0x4 // Don't draw, but add to skybox. #define SURF_WARP 0x8 // Turbulent water warp. #define SURF_TRANS33 0x10 #define SURF_TRANS66 0x20 #define SURF_FLOWING 0x40 // Scroll towards angle. #define SURF_NODRAW 0x80 // Don't bother referencing the texture. #define SURF_TALL_WALL 0x00000400 // Face doesn't get broken up as normal. #define SURF_ALPHA_TEXTURE 0x00000800 // texture has alpha in it, and should show through in bsp process #define SURF_ANIMSPEED 0x00001000 // value will hold the anim speed in fps #define SURF_UNDULATE 0x00002000 // rock surface up and down... #define SURF_QUAKE 0x00004000 // rock surface up and down when quake value on // 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; // structure offset for asm code #define CPLANE_NORMAL_X 0 #define CPLANE_NORMAL_Y 4 #define CPLANE_NORMAL_Z 8 #define CPLANE_DIST 12 #define CPLANE_TYPE 16 #define CPLANE_SIGNBITS 17 #define CPLANE_PAD0 18 #define CPLANE_PAD1 19 typedef struct cmodel_s { vec3_t mins, maxs; vec3_t origin; // for sounds or lights int headnode; } cmodel_t; typedef struct csurface_s { char name[40]; int flags; int value; } csurface_t; // ************************************************************************************************ // trace_t // ------- // A trace is returned when a box is swept through the world. // ************************************************************************************************ typedef struct trace_s { byte allsolid; // if true, plane is not valid byte startsolid; // if true, the initial point was in a solid area byte succeeded; // not always set, just in special cases, subjective byte architecture; // set if the moved collided with world (not entities) // needed because the player move code doesn`t know anything // about the location or nature of edicts 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; // ************************************************************************************************ // pmtype_t // -------- // ************************************************************************************************ typedef enum { PM_NORMAL, // Can accelerate and turn, clips. PM_SPECTATOR, // Can accelerate and turn, no clip. PM_DEAD, // No acceleration or turning, dead. PM_GIB, // No acceleration or turning, dead, different bounding box. PM_FREEZE, // Running a server demo. PM_INTERMISSION, // An existing remote camera view is already underway. } pmtype_t; // ************************************************************************************************ // PMF_XXX // ------- // These are pmove->pm_flags. // ************************************************************************************************ #define PMF_STANDSTILL 0x0001 #define PMF_ON_GROUND 0x0004 #define PMF_TIME_LAND 0x0008 // pm_time is time before rejump #define PMF_TIME_TELEPORT 0x0010 // pm_time is non-moving time #define PMF_NO_PREDICTION 0x0020 // temporarily disables prediction (used for grappling hook) #define PMF_LOCKMOVE 0x0040 #define PMF_LOCKTURN 0x0080 #define PC_COLLISION 0x0001 // collided on a move #define PC_SLIDING 0x0002 // sliding down a steep slope #define WF_SURFACE 0x0001 // On the surface #define WF_DIVE 0x0002 // Dive on next animation #define WF_DIVING 0x0004 // Currently diving #define WF_SWIMFREE 0x0008 // Currently swimming freely underwater #define WF_SINK 0x0010 // Sink below the surface of the water // ************************************************************************************************ // pmove_state_t // ------------- // This structure contains the information necessary for client side movement prediction. It MUST // 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 w_flags; // water state byte c_flags; // collision byte pm_time; // each unit = 8 ms short gravity; short delta_angles[3];// Added to command angles to get view direction. Changed by spawns, // rotating objects and teleporters. short camera_delta_angles[3];// Added to command angles to get view direction. Changed by spawns, // rotating objects and teleporters. } pmove_state_t; // ************************************************************************************************ // BUTTON_XXX // ---------- // ************************************************************************************************ #define BUTTON_ATTACK 1 #define BUTTON_DEFEND 2 #define BUTTON_ACTION 4 #define BUTTON_CREEP 8 #define BUTTON_RUN 16 #define BUTTON_AUTOAIM 32 #define BUTTON_LOOKAROUND 64 #define BUTTON_QUICKTURN 128 #define BUTTON_INVENTORY 256 #define BUTTON_ANY 512 // Any key whatsoever. // ************************************************************************************************ // usercmd_t // --------- // Sent to the server each client frame. // ************************************************************************************************ typedef struct usercmd_s { byte msec; short buttons; short angles[3], aimangles[3], camera_vieworigin[3],camera_viewangles[3], forwardmove,sidemove,upmove; byte prediction; byte lightlevel; // Light level the player is standing on. } usercmd_t; // ************************************************************************************************ // pmove_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. qboolean run_shrine; qboolean high_max; // In and out. float waterheight; float desiredWaterHeight; // Results (out). int numtouch; struct edict_s *touchents[MAXTOUCH]; float viewheight; vec3_t viewangles; // Clamped. vec3_t camera_viewangles; // Camera angles from client. float *origin, *velocity; vec3_t mins, maxs; // Bounding-box size. float *intentMins, *intentMaxs; struct edict_s *groundentity; csurface_t *GroundSurface; cplane_t GroundPlane; int GroundContents; int watertype; int waterlevel; float knockbackfactor; // Callbacks to test the world. void (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end,trace_t *trace); int (*pointcontents) (vec3_t point); struct edict_s *self; } pmove_t; // entity_state_t->renderfx flags #define RF_MINLIGHT 0x00000001 // allways have some light (viewmodel) #define RF_REFLECTION 0x00000002 // Use GL spherical mapping, if available #define RF_WEAPONMODEL 0x00000004 // only draw through eyes #define RF_FULLBRIGHT 0x00000008 // allways draw full intensity #define RF_DEPTHHACK 0x00000010 // for view weapon Z crunching #define RF_TRANSLUCENT 0x00000020 #define RF_FRAMELERP 0x00000040 #define RF_CUSTOMSKIN 0x00000080 // skin is an index in image_precache #define RF_GLOW 0x00000100 // pulse lighting for bonus items #define RF_SCALE_XYZ 0x00000200 #define RF_SCALE_XY 0x00000400 #define RF_SCALE_Z 0x00000800 #define RF_PRIMITIVE 0x00001000 // line, or other primitive runtime generated by the render DLL #define RF_FIXED 0x00002000 // the sprite has a fixed direction // and up vector, by default, a // sprite is always oriented to the // view (no effect on models) #define RF_TRANS_ADD 0x00004000 // Additive transparency #define RF_TRANS_ADD_ALPHA 0x00008000 // Adds emulation of alpha for additive transparent objects using tint #define RF_TRANS_GHOST 0x00010000 // Like subtractive translucency #define RF_ALPHA_TEXTURE 0x00020000 // Object has an alpha texture map #define RF_NODEPTHTEST 0x00080000 // Turns off depth testing for sprites only #define RF_IGNORE_REFS 0x00100000 // don't update the ref points for a model #define RF_NODRAW 0x00200000 #define RF_CULL_LARGE 0x00400000 // If set on a poly that is really close to the near clip plane and occupies // a signifiant amount of screen real-estate, the poly will be culled. Used // for particles in software. #define RF_TRANS_ANY (RF_TRANS_ADD | RF_TRANS_GHOST | RF_TRANSLUCENT) // player_state_t->refdef flags #define RDF_UNDERWATER 0x00000001 // warp the screen as apropriate #define RDF_NOWORLDMODEL 0x00000002 // used for player configuration screen // sound channels // channel 0 never willingly overrides // other channels (1-7) allways override a playing sound on that channel #define CHAN_AUTO 0 #define CHAN_WEAPON 1 #define CHAN_VOICE 2 #define CHAN_ITEM 3 #define CHAN_BODY 4 #define CHAN_FOOTSTEP 5 #define CHAN_FOOTSTEP2 6 #define CHAN_WEAPON2 7 // 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 #define ATTN_VERYSTATIC 4 #define ATTN_LEFT 256 #define ATTN_RIGHT 512 // player_state->stats[] indexes // * - MUST BE SEQUENTIAL !!!!!!!! #define STAT_HEALTH_ICON 0 // Icon for health #define STAT_HEALTH 1 // Health value #define STAT_AMMO_ICON 2 // Icon for ammo #define STAT_AMMO 3 // Amount of ammo #define STAT_WEAPON_ICON 4 // Current offensive weapon #define STAT_WEAPON 5 #define STAT_DEFENCE_ICON 6 // Current defensive weapon #define STAT_DEFENCE 7 #define STAT_OFFMANA_ICON 8 // * Icon describing offensive mana #define STAT_OFFMANA_BACK 9 // Amount of offensive mana #define STAT_OFFMANA 10 // Icon describing defensive mana #define STAT_DEFMANA_ICON 11 // * Amount of defensive mana #define STAT_DEFMANA_BACK 12 #define STAT_DEFMANA 13 #define STAT_FRAGS_ICON 14 // cleared each frame, 1 = health, 2 = armor #define STAT_FRAGS 15 // which status to print #define STAT_FLASHES 16 #define STAT_LAYOUTS 17 #define STAT_PUZZLE_ITEM1 18 #define STAT_PUZZLE_ITEM2 19 #define STAT_PUZZLE_ITEM3 20 #define STAT_PUZZLE_ITEM4 21 #define STAT_PUZZLE_COUNT 22 #define STAT_POWERUP_ICON 23 // * THESE MUST BE SEQUENTIAL !!!!! #define STAT_POWERUP_BACK 24 #define STAT_POWERUP_TIMER 25 #define STAT_LUNG_ICON 26 // * #define STAT_LUNG_BACK 27 #define STAT_LUNG_TIMER 28 #define STAT_LIFEBAR_XSIZE 29 // * #define STAT_LIFEBAR_YSIZE 30 #define STAT_LIFEBAR_ICON 31 #define STAT_LIFEBAR_BACK 32 #define STAT_LIFEBAR_VALUE 33 #define STAT_ARMOUR_ICON 34 #define STAT_ARMOUR 35 #define MAX_STATS 48 // dmflags->value flags #define DF_WEAPONS_STAY 0x0001 #define DF_NO_SHRINE 0x0002 #define DF_NONAMES 0x0004 #define DF_NO_HEALTH 0x0008 #define DF_SHOW_LEADER 0x0010 #define DF_SHRINE_CHAOS 0x0020 #define DF_SAME_LEVEL 0x0040 #define DF_FORCE_RESPAWN 0x0080 #define DF_SKINTEAMS 0x0100 #define DF_MODELTEAMS 0x0200 #define DF_ALLOW_EXIT 0x0400 #define DF_INFINITE_MANA 0x0800 #define DF_HURT_FRIENDS 0x1000 #define DF_NO_OFFENSIVE_SPELL 0x2000 // This means staff-only combat!!! #define DF_NO_DEFENSIVE_SPELL 0x4000 #define DF_DISMEMBER 0x8000 #define DF_DEATHMATCH_SET 0x80000000 // High bit indicates deathmatch, so that it can be transmitted in playerinfo. /* ========================================================== ELEMENTS COMMUNICATED ACROSS THE NET ========================================================== */ #define ANGLE2SHORT(x) ((int)((x)*65536/360) & 65535) #define SHORT2ANGLE(x) ((x)*(360.0/65536)) #define DEG2RAD( a ) ( a * M_PI ) / 180.0F // // 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_LEVEL_NUMBER 5 #define CS_STATUSBAR 6 // display program string (this seems to take up several slots - hence must be last) #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_WELCOME (CS_PLAYERSKINS+MAX_CLIENTS) // give us 4 welcome string messages so we can have a total of 256 characters per message #define MAX_CONFIGSTRINGS CS_WELCOME + 4 // ************************************************************************************************ // EffectsBuffer_t // --------------- // ************************************************************************************************ #define ENTITY_FX_BUF_SIZE 192 #define ENTITY_FX_BUF_BLOCK_SIZE 256 #define MAX_PERSISTANT_EFFECTS 512 typedef struct EffectsBuffer_s { byte *buf; int bufSize; int freeBlock; int numEffects; } EffectsBuffer_t; typedef struct PerEffectsBuffer_s { byte buf[ENTITY_FX_BUF_SIZE]; int bufSize; int freeBlock; int numEffects; int send_mask; int demo_send_mask; int fx_num; } PerEffectsBuffer_t; // ************************************************************************************************ // entity_state_t // -------------- // This is the information conveyed from the server to clients in an update message, about entities // that the client will need to render. // ************************************************************************************************ typedef struct entity_state_s { // Edict index. short number; // Model's current animation frame index. short frame; // Model's position and orientation in the world. vec3_t origin; vec3_t angles; vec3_t old_origin; // Used for lerping (and hijacked for other uses). // Tells client which model do draw. byte modelindex; // byte Padding here. short clientnum; // In Quake 2, the client num was passed in skinnum. We need this value, however. // For specific path to skin. char skinname[MAX_QPATH]; int skinnum; // Model scale. float scale; // EF_XXX. int effects; // RF_XXX. int renderfx; // What's this exactly? paletteRGBA_t color; // Entire absLight gets sent if any component changes. paletteRGB_t absLight; // Client prediction: 8*(bits 0-4) is x/y radius, 8*(bits 5-9) is z min, 8*(bits 10-15) is z max. // Note that gi.linkentity() sets this up. short solid; // For looping sounds, to guarantee shutoff. byte sound; // For looping sounds, so we can set volume and attenuation. byte sound_data; // required so we can place sounds for bmodels correctly in 3d space vec3_t bmodel_origin; // Header block for list of all client effects attatched to this entity. EffectsBuffer_t clientEffects; // Specifies which parts (nodes) of the model are on/off, node colors etc. fmnodeinfo_t fmnodeinfo[MAX_FM_MESH_NODES]; // Skeletal info. Only relevant for player models (i.e. have U_JOINTED). short skeletalType; short rootJoint; short swapFrame; // Used by the client to verify is this still the same entity it last had. byte usageCount; } entity_state_t; // ************************************************************************************************ // player_state_t // -------------- // This is the information needed in addition to the 'pmove_state_t' to render a view. There will // only be 10 'player_state_t's sent each second, but the number of pmove_state_t changes will be // relative to client frame rates. // ************************************************************************************************ typedef struct { // For prediction (must be communicated bit precise). pmove_state_t pmove; // For fixed views and serverdemos. vec3_t viewangles; // For remote camera views. vec3_t remote_vieworigin, remote_viewangles; int remote_id; // Z displacement of player's head from origin. short viewheight; // Deltas added to the player model's client determined angles. vec3_t offsetangles; // Horizontal field of view. float fov; // Refdef flags used during rendering. int rdflags; // Index of edict currently targeted by the player's auto-targeting facility. int AutotargetEntityNum; // For showing the amount of current level completed. byte map_percentage; // Current fog density for the player. float fog_density; // Id number for primary and secondary mission statments in strings.txt. short mission_num1; short mission_num2; byte cinematicfreeze; // Shows if currently in a cinematic // Current state of players in this clients view (one bit per player). int PIV; // Fast status bar updates. short stats[MAX_STATS]; // These are NEVER sent accross the net, but are purely client-side repositiories needed by // prediction and are filled from the player's entity_state_t. int frame,swapFrame; vec3_t angles; int effects, skinnum, renderfx, clientnum; fmnodeinfo_t fmnodeinfo[MAX_FM_MESH_NODES]; // ******************************************************************************************** // All the stuff below is required for client prediction to function. NOTE still working on // this... expect additions / removals / packet size reduction. // ******************************************************************************************** // Player's acurate mins and maxs. vec3_t mins,maxs; // Inventory changes. byte NoOfItems, inventory_changes[256], inventory_remaining[256]; // Ground attributes. byte NonNullgroundentity; // boolean cplane_t GroundPlane; int GroundContents; csurface_t GroundSurface; // Water attributes. int watertype; int waterlevel; float waterheight; // Grabbing / pullup stuff. vec3_t grabloc; float grabangle; // Velocities imparted on a per animation frame basis. float fwdvel,sidevel,upvel; // PLAYER_FLAG_XXX. int flags; // FL_XXX. int edictflags; // Player edict's oldvelocity. float oldvelocity_z; // Animation sequencing state. int upperseq,lowerseq; int upperframe,lowerframe; byte upperidle,loweridle; // boolean int uppermove_index,lowermove_index; byte weapon,defense,lastweapon,lastdefense; int weaponready; int switchtoweapon; byte newweapon; int weap_ammo_index,def_ammo_index; byte weaponcharge; byte advancedstaff; int armortype; byte bowtype; byte stafflevel; byte helltype; byte meteor_count; byte handfxtype; byte plaguelevel; short skintype; unsigned int altparts; int deadflag; float ideal_yaw; float leveltime; float idletime; float quickturnEndTime; float quickturn_rate; float powerup_timer; // Deathmatch flags. int dmflags; } player_state_t; // ************************************************************* // Inlines // ************************************************************* // microsoft's fabs seems to be ungodly slow... _inline float Q_fabs (float _X) { *((long*)&_X) &= 0x7fffffff; return (_X); } // Quick version of float to long (trunc/round undefined) #pragma warning (disable:4035) _inline __declspec( naked ) long Q_ftol( float f ) { static int tmp; __asm fld dword ptr [esp+4] __asm fistp tmp __asm mov eax, tmp __asm ret } #pragma warning (default:4035) _inline int Q_stricmp (char *s1, char *s2) { #if defined(WIN32) return _stricmp (s1, s2); #else return strcasecmp (s1, s2); #endif } _inline int Q_strncasecmp (char *s1, char *s2, int n) { return strnicmp (s1, s2, n); } _inline int Q_strcasecmp (char *s1, char *s2) { return stricmp (s1, s2); } // For ambient sounds. typedef enum AmbientSoundID_e { AS_NOTHING = 0, AS_FIRE, AS_WATERLAPPING, AS_SEAGULLS, AS_OCEAN, AS_BIRDS, AS_CRICKETS, AS_FROGS, AS_CRYING, AS_MOSQUITOES, AS_BUBBLES, // 10 AS_BELL, AS_FOOTSTEPS, AS_MOANS, AS_SEWERDRIPS, AS_WATERDRIPS, AS_HEAVYDRIPS, AS_SMALLFOUNTAIN, AS_LARGEFOUNTAIN, AS_SEWERWATER, AS_OUTSIDEWATERWAY, // 20 AS_WINDCHIME, AS_BIRD1, AS_BIRD2, AS_CAULDRONBUBBLE, AS_HUGEWATERFALL, AS_GONG, AS_MUDPOOL, AS_ROCKS, AS_WINDEERIE, AS_WINDNOISY, // 30 AS_WINDSOFTHI, AS_WINDSOFTLO, AS_WINDSTRONG1, AS_WINDSTRONG2, AS_WINDWHISTLE, AS_CONVEYOR, AS_BUCKETCONVEYOR, AS_CAVECREAK, AS_SPIT, // 39 AS_MAX } AmbientSoundID_t; typedef enum DoorSoundID_e { DS_NONE = 0, DS_GENERIC, DS_HEAVYSTONE, DS_SWINGARM, DS_SWINGBRIDGE, DS_MEDIUMWOOD, DS_HUGEWOOD, DS_MEDIUMSTONE, DS_LARGESTONE, DS_MEDIUMMETAL, DS_FASTSLIDING, DS_METALSLIDING, DS_HUGESTONE, DS_HUGEELEVATOR, DS_CRANEWAREHOUSE, DS_HAMMERPUMP, DS_METALTABLE, DS_LABTABLE, DS_PISTON, DS_CLANG, DS_UNDERWATER, DS_BAM, DS_MAX } DoorSoundID_t; // EAX sound presets enum { EAX_ENVIRONMENT_GENERIC, // factory default EAX_ENVIRONMENT_PADDEDCELL, EAX_ENVIRONMENT_ROOM, // standard environments EAX_ENVIRONMENT_BATHROOM, EAX_ENVIRONMENT_LIVINGROOM, EAX_ENVIRONMENT_STONEROOM, EAX_ENVIRONMENT_AUDITORIUM, EAX_ENVIRONMENT_CONCERTHALL, EAX_ENVIRONMENT_CAVE, EAX_ENVIRONMENT_ARENA, EAX_ENVIRONMENT_HANGAR, EAX_ENVIRONMENT_CARPETEDHALLWAY, EAX_ENVIRONMENT_HALLWAY, EAX_ENVIRONMENT_STONECORRIDOR, EAX_ENVIRONMENT_ALLEY, EAX_ENVIRONMENT_FOREST, EAX_ENVIRONMENT_CITY, EAX_ENVIRONMENT_MOUNTAINS, EAX_ENVIRONMENT_QUARRY, EAX_ENVIRONMENT_PLAIN, EAX_ENVIRONMENT_PARKINGLOT, EAX_ENVIRONMENT_SEWERPIPE, EAX_ENVIRONMENT_UNDERWATER, EAX_ENVIRONMENT_DRUGGED, EAX_ENVIRONMENT_DIZZY, EAX_ENVIRONMENT_PSYCHOTIC, EAX_ENVIRONMENT_COUNT // total number of environments }; // EAX world preset types enum { EAX_GENERIC, EAX_ALL_STONE, EAX_ARENA, EAX_CITY_AND_SEWERS, EAX_CITY_AND_ALLEYS, EAX_FOREST, EAX_PSYCHOTIC, }; // ************************************************************************************************ // Skin defines // ----------- // Indicates what skin Corvus has. // When indicated on the model, each odd-numbered skin is the damaged version of the previous skin. // ************************************************************************************************ // For code clarity #define PLAGUE_NUM_LEVELS 3 #define DAMAGE_NUM_LEVELS 2 #define SKIN_DAMAGED 1 #define SKIN_PLAGUE1 (DAMAGE_NUM_LEVELS * 1) #define SKIN_PLAGUE2 (DAMAGE_NUM_LEVELS * 2) //#define SKIN_REFLECTION (DAMAGE_NUM_LEVELS * PLAGUE_NUM_LEVELS) #define SKIN_REFLECTION (DAMAGE_NUM_LEVELS) // We don't maintain a skin for every plague level anymore. #define SKIN_MAX (SKIN_REFLECTION + 1) #endif // QSHARED_H