|
|
1.1 root 1:
2: // q_shared.h -- included first by ALL program modules
3:
4: #ifdef _WIN32
5: // unknown pragmas are SUPPOSED to be ignored, but....
6: #pragma warning(disable : 4244) // MIPS
7: #pragma warning(disable : 4136) // X86
8: #pragma warning(disable : 4051) // ALPHA
9:
10: #pragma warning(disable : 4018) // signed/unsigned mismatch
11: #pragma warning(disable : 4305) // truncation from const double to float
12:
13: #endif
14:
15: #include <assert.h>
16: #include <math.h>
17: #include <stdio.h>
18: #include <stdarg.h>
19: #include <string.h>
20: #include <stdlib.h>
21: #include <time.h>
22:
23: #if (defined _M_IX86 || defined __i386__) && !defined C_ONLY && !defined __sun__
24: #define id386 1
25: #else
26: #define id386 0
27: #endif
28:
29: #if defined _M_ALPHA && !defined C_ONLY
30: #define idaxp 1
31: #else
32: #define idaxp 0
33: #endif
34:
35: typedef unsigned char byte;
36: typedef enum {false, true} qboolean;
37:
38:
39: #ifndef NULL
40: #define NULL ((void *)0)
41: #endif
42:
43:
44: // angle indexes
45: #define PITCH 0 // up / down
46: #define YAW 1 // left / right
47: #define ROLL 2 // fall over
48:
49: #define MAX_STRING_CHARS 1024 // max length of a string passed to Cmd_TokenizeString
50: #define MAX_STRING_TOKENS 80 // max tokens resulting from Cmd_TokenizeString
51: #define MAX_TOKEN_CHARS 128 // max length of an individual token
52:
53: #define MAX_QPATH 64 // max length of a quake game pathname
54: #define MAX_OSPATH 128 // max length of a filesystem pathname
55:
56: //
57: // per-level limits
58: //
59: #define MAX_CLIENTS 256 // absolute limit
60: #define MAX_EDICTS 1024 // must change protocol to increase more
61: #define MAX_LIGHTSTYLES 256
62: #define MAX_MODELS 256 // these are sent over the net as bytes
63: #define MAX_SOUNDS 256 // so they cannot be blindly increased
64: #define MAX_IMAGES 256
65: #define MAX_ITEMS 256
66: #define MAX_GENERAL (MAX_CLIENTS*2) // general config strings
67:
68:
69: // game print flags
70: #define PRINT_LOW 0 // pickup messages
71: #define PRINT_MEDIUM 1 // death messages
72: #define PRINT_HIGH 2 // critical messages
73: #define PRINT_CHAT 3 // chat messages
74:
75:
76:
77: #define ERR_FATAL 0 // exit the entire game with a popup window
78: #define ERR_DROP 1 // print to console and disconnect from game
79: #define ERR_DISCONNECT 2 // don't kill server
80:
81: #define PRINT_ALL 0
82: #define PRINT_DEVELOPER 1 // only print when "developer 1"
83: #define PRINT_ALERT 2
84:
85:
86: // destination class for gi.multicast()
87: typedef enum
88: {
89: MULTICAST_ALL,
90: MULTICAST_PHS,
91: MULTICAST_PVS,
92: MULTICAST_ALL_R,
93: MULTICAST_PHS_R,
94: MULTICAST_PVS_R
95: } multicast_t;
96:
97:
98: /*
99: ==============================================================
100:
101: MATHLIB
102:
103: ==============================================================
104: */
105:
106: typedef float vec_t;
107: typedef vec_t vec3_t[3];
108: typedef vec_t vec5_t[5];
109:
110: typedef int fixed4_t;
111: typedef int fixed8_t;
112: typedef int fixed16_t;
113:
114: #ifndef M_PI
115: #define M_PI 3.14159265358979323846 // matches value in gcc v2 math.h
116: #endif
117:
118: struct cplane_s;
119:
120: extern vec3_t vec3_origin;
121:
122: #define nanmask (255<<23)
123:
124: #define IS_NAN(x) (((*(int *)&x)&nanmask)==nanmask)
125:
126: // microsoft's fabs seems to be ungodly slow...
127: //float Q_fabs (float f);
128: //#define fabs(f) Q_fabs(f)
129: #if !defined C_ONLY && !defined __linux__ && !defined __sgi
130: extern long Q_ftol( float f );
131: #else
132: #define Q_ftol( f ) ( long ) (f)
133: #endif
134:
135: #define DotProduct(x,y) (x[0]*y[0]+x[1]*y[1]+x[2]*y[2])
136: #define VectorSubtract(a,b,c) (c[0]=a[0]-b[0],c[1]=a[1]-b[1],c[2]=a[2]-b[2])
137: #define VectorAdd(a,b,c) (c[0]=a[0]+b[0],c[1]=a[1]+b[1],c[2]=a[2]+b[2])
138: #define VectorCopy(a,b) (b[0]=a[0],b[1]=a[1],b[2]=a[2])
139: #define VectorClear(a) (a[0]=a[1]=a[2]=0)
140: #define VectorNegate(a,b) (b[0]=-a[0],b[1]=-a[1],b[2]=-a[2])
141: #define VectorSet(v, x, y, z) (v[0]=(x), v[1]=(y), v[2]=(z))
142:
143: void VectorMA (vec3_t veca, float scale, vec3_t vecb, vec3_t vecc);
144:
145: // just in case you do't want to use the macros
146: vec_t _DotProduct (vec3_t v1, vec3_t v2);
147: void _VectorSubtract (vec3_t veca, vec3_t vecb, vec3_t out);
148: void _VectorAdd (vec3_t veca, vec3_t vecb, vec3_t out);
149: void _VectorCopy (vec3_t in, vec3_t out);
150:
151: void ClearBounds (vec3_t mins, vec3_t maxs);
152: void AddPointToBounds (vec3_t v, vec3_t mins, vec3_t maxs);
153: int VectorCompare (vec3_t v1, vec3_t v2);
154: vec_t VectorLength (vec3_t v);
155: void CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross);
156: vec_t VectorNormalize (vec3_t v); // returns vector length
157: vec_t VectorNormalize2 (vec3_t v, vec3_t out);
158: void VectorInverse (vec3_t v);
159: void VectorScale (vec3_t in, vec_t scale, vec3_t out);
160: int Q_log2(int val);
161:
162: void R_ConcatRotations (float in1[3][3], float in2[3][3], float out[3][3]);
163: void R_ConcatTransforms (float in1[3][4], float in2[3][4], float out[3][4]);
164:
165: void AngleVectors (vec3_t angles, vec3_t forward, vec3_t right, vec3_t up);
166: int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *plane);
167: float anglemod(float a);
168: float LerpAngle (float a1, float a2, float frac);
169:
170: #define BOX_ON_PLANE_SIDE(emins, emaxs, p) \
171: (((p)->type < 3)? \
172: ( \
173: ((p)->dist <= (emins)[(p)->type])? \
174: 1 \
175: : \
176: ( \
177: ((p)->dist >= (emaxs)[(p)->type])?\
178: 2 \
179: : \
180: 3 \
181: ) \
182: ) \
183: : \
184: BoxOnPlaneSide( (emins), (emaxs), (p)))
185:
186: void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal );
187: void PerpendicularVector( vec3_t dst, const vec3_t src );
188: void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees );
189:
190:
191: //=============================================
192:
193: char *COM_SkipPath (char *pathname);
194: void COM_StripExtension (char *in, char *out);
195: void COM_FileBase (char *in, char *out);
196: void COM_FilePath (char *in, char *out);
197: void COM_DefaultExtension (char *path, char *extension);
198:
199: char *COM_Parse (char **data_p);
200: // data is an in/out parm, returns a parsed out token
201:
202: void Com_sprintf (char *dest, int size, char *fmt, ...);
203:
204: void Com_PageInMemory (byte *buffer, int size);
205:
206: //=============================================
207:
208: // portable case insensitive compare
209: int Q_stricmp (char *s1, char *s2);
210: int Q_strcasecmp (char *s1, char *s2);
211: int Q_strncasecmp (char *s1, char *s2, int n);
212:
213: //=============================================
214:
215: short BigShort(short l);
216: short LittleShort(short l);
217: int BigLong (int l);
218: int LittleLong (int l);
219: float BigFloat (float l);
220: float LittleFloat (float l);
221:
222: void Swap_Init (void);
223: char *va(char *format, ...);
224:
225: //=============================================
226:
227: //
228: // key / value info strings
229: //
230: #define MAX_INFO_KEY 64
231: #define MAX_INFO_VALUE 64
232: #define MAX_INFO_STRING 512
233:
234: char *Info_ValueForKey (char *s, char *key);
235: void Info_RemoveKey (char *s, char *key);
236: void Info_SetValueForKey (char *s, char *key, char *value);
237: qboolean Info_Validate (char *s);
238:
239: /*
240: ==============================================================
241:
242: SYSTEM SPECIFIC
243:
244: ==============================================================
245: */
246:
247: extern int curtime; // time returned by last Sys_Milliseconds
248:
249: int Sys_Milliseconds (void);
250: void Sys_Mkdir (char *path);
251:
252: // large block stack allocation routines
253: void *Hunk_Begin (int maxsize);
254: void *Hunk_Alloc (int size);
255: void Hunk_Free (void *buf);
256: int Hunk_End (void);
257:
258: // directory searching
259: #define SFF_ARCH 0x01
260: #define SFF_HIDDEN 0x02
261: #define SFF_RDONLY 0x04
262: #define SFF_SUBDIR 0x08
263: #define SFF_SYSTEM 0x10
264:
265: /*
266: ** pass in an attribute mask of things you wish to REJECT
267: */
268: char *Sys_FindFirst (char *path, unsigned musthave, unsigned canthave );
269: char *Sys_FindNext ( unsigned musthave, unsigned canthave );
270: void Sys_FindClose (void);
271:
272:
273: // this is only here so the functions in q_shared.c and q_shwin.c can link
274: void Sys_Error (char *error, ...);
275: void Com_Printf (char *msg, ...);
276:
277:
278: /*
279: ==========================================================
280:
281: CVARS (console variables)
282:
283: ==========================================================
284: */
285:
286: #ifndef CVAR
287: #define CVAR
288:
289: #define CVAR_ARCHIVE 1 // set to cause it to be saved to vars.rc
290: #define CVAR_USERINFO 2 // added to userinfo when changed
291: #define CVAR_SERVERINFO 4 // added to serverinfo when changed
292: #define CVAR_NOSET 8 // don't allow change from console at all,
293: // but can be set from the command line
294: #define CVAR_LATCH 16 // save changes until server restart
295:
296: // nothing outside the Cvar_*() functions should modify these fields!
297: typedef struct cvar_s
298: {
299: char *name;
300: char *string;
301: char *latched_string; // for CVAR_LATCH vars
302: int flags;
303: qboolean modified; // set each time the cvar is changed
304: float value;
305: struct cvar_s *next;
306: } cvar_t;
307:
308: #endif // CVAR
309:
310: /*
311: ==============================================================
312:
313: COLLISION DETECTION
314:
315: ==============================================================
316: */
317:
318: // lower bits are stronger, and will eat weaker brushes completely
319: #define CONTENTS_SOLID 1 // an eye is never valid in a solid
320: #define CONTENTS_WINDOW 2 // translucent, but not watery
321: #define CONTENTS_AUX 4
322: #define CONTENTS_LAVA 8
323: #define CONTENTS_SLIME 16
324: #define CONTENTS_WATER 32
325: #define CONTENTS_MIST 64
326: #define LAST_VISIBLE_CONTENTS 64
327:
328: // remaining contents are non-visible, and don't eat brushes
329:
330: #define CONTENTS_AREAPORTAL 0x8000
331:
332: #define CONTENTS_PLAYERCLIP 0x10000
333: #define CONTENTS_MONSTERCLIP 0x20000
334:
335: // currents can be added to any other contents, and may be mixed
336: #define CONTENTS_CURRENT_0 0x40000
337: #define CONTENTS_CURRENT_90 0x80000
338: #define CONTENTS_CURRENT_180 0x100000
339: #define CONTENTS_CURRENT_270 0x200000
340: #define CONTENTS_CURRENT_UP 0x400000
341: #define CONTENTS_CURRENT_DOWN 0x800000
342:
343: #define CONTENTS_ORIGIN 0x1000000 // removed before bsping an entity
344:
345: #define CONTENTS_MONSTER 0x2000000 // should never be on a brush, only in game
346: #define CONTENTS_DEADMONSTER 0x4000000
347: #define CONTENTS_DETAIL 0x8000000 // brushes to be added after vis leafs
348: #define CONTENTS_TRANSLUCENT 0x10000000 // auto set if any surface has trans
349: #define CONTENTS_LADDER 0x20000000
350:
351:
352:
353: #define SURF_LIGHT 0x1 // value will hold the light strength
354:
355: #define SURF_SLICK 0x2 // effects game physics
356:
357: #define SURF_SKY 0x4 // don't draw, but add to skybox
358: #define SURF_WARP 0x8 // turbulent water warp
359: #define SURF_TRANS33 0x10
360: #define SURF_TRANS66 0x20
361: #define SURF_FLOWING 0x40 // scroll towards angle
362: #define SURF_NODRAW 0x80 // don't bother referencing the texture
363:
364:
365:
366: // content masks
367: #define MASK_ALL (-1)
368: #define MASK_SOLID (CONTENTS_SOLID|CONTENTS_WINDOW)
369: #define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER)
370: #define MASK_DEADSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW)
371: #define MASK_MONSTERSOLID (CONTENTS_SOLID|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER)
372: #define MASK_WATER (CONTENTS_WATER|CONTENTS_LAVA|CONTENTS_SLIME)
373: #define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_SLIME|CONTENTS_LAVA)
374: #define MASK_SHOT (CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEADMONSTER)
375: #define MASK_CURRENT (CONTENTS_CURRENT_0|CONTENTS_CURRENT_90|CONTENTS_CURRENT_180|CONTENTS_CURRENT_270|CONTENTS_CURRENT_UP|CONTENTS_CURRENT_DOWN)
376:
377:
378: // gi.BoxEdicts() can return a list of either solid or trigger entities
379: // FIXME: eliminate AREA_ distinction?
380: #define AREA_SOLID 1
381: #define AREA_TRIGGERS 2
382:
383:
384: // plane_t structure
385: // !!! if this is changed, it must be changed in asm code too !!!
386: typedef struct cplane_s
387: {
388: vec3_t normal;
389: float dist;
390: byte type; // for fast side tests
391: byte signbits; // signx + (signy<<1) + (signz<<1)
392: byte pad[2];
393: } cplane_t;
394:
395: // structure offset for asm code
396: #define CPLANE_NORMAL_X 0
397: #define CPLANE_NORMAL_Y 4
398: #define CPLANE_NORMAL_Z 8
399: #define CPLANE_DIST 12
400: #define CPLANE_TYPE 16
401: #define CPLANE_SIGNBITS 17
402: #define CPLANE_PAD0 18
403: #define CPLANE_PAD1 19
404:
405: typedef struct cmodel_s
406: {
407: vec3_t mins, maxs;
408: vec3_t origin; // for sounds or lights
409: int headnode;
410: } cmodel_t;
411:
412: typedef struct csurface_s
413: {
414: char name[16];
415: int flags;
416: int value;
417: } csurface_t;
418:
419: typedef struct mapsurface_s // used internally due to name len probs //ZOID
420: {
421: csurface_t c;
422: char rname[32];
423: } mapsurface_t;
424:
425: // a trace is returned when a box is swept through the world
426: typedef struct
427: {
428: qboolean allsolid; // if true, plane is not valid
429: qboolean startsolid; // if true, the initial point was in a solid area
430: float fraction; // time completed, 1.0 = didn't hit anything
431: vec3_t endpos; // final position
432: cplane_t plane; // surface normal at impact
433: csurface_t *surface; // surface hit
434: int contents; // contents on other side of surface hit
435: struct edict_s *ent; // not set by CM_*() functions
436: } trace_t;
437:
438:
439:
440: // pmove_state_t is the information necessary for client side movement
441: // prediction
442: typedef enum
443: {
444: // can accelerate and turn
445: PM_NORMAL,
446: PM_SPECTATOR,
447: // no acceleration or turning
448: PM_DEAD,
449: PM_GIB, // different bounding box
450: PM_FREEZE
451: } pmtype_t;
452:
453: // pmove->pm_flags
454: #define PMF_DUCKED 1
455: #define PMF_JUMP_HELD 2
456: #define PMF_ON_GROUND 4
457: #define PMF_TIME_WATERJUMP 8 // pm_time is waterjump
458: #define PMF_TIME_LAND 16 // pm_time is time before rejump
459: #define PMF_TIME_TELEPORT 32 // pm_time is non-moving time
460: #define PMF_NO_PREDICTION 64 // temporarily disables prediction (used for grappling hook)
461:
462: // this structure needs to be communicated bit-accurate
463: // from the server to the client to guarantee that
464: // prediction stays in sync, so no floats are used.
465: // if any part of the game code modifies this struct, it
466: // will result in a prediction error of some degree.
467: typedef struct
468: {
469: pmtype_t pm_type;
470:
471: short origin[3]; // 12.3
472: short velocity[3]; // 12.3
473: byte pm_flags; // ducked, jump_held, etc
474: byte pm_time; // each unit = 8 ms
475: short gravity;
476: short delta_angles[3]; // add to command angles to get view direction
477: // changed by spawns, rotating objects, and teleporters
478: } pmove_state_t;
479:
480:
481: //
482: // button bits
483: //
484: #define BUTTON_ATTACK 1
485: #define BUTTON_USE 2
486: #define BUTTON_ANY 128 // any key whatsoever
487:
488:
489: // usercmd_t is sent to the server each client frame
490: typedef struct usercmd_s
491: {
492: byte msec;
493: byte buttons;
494: short angles[3];
495: short forwardmove, sidemove, upmove;
496: byte impulse; // remove?
497: byte lightlevel; // light level the player is standing on
498: } usercmd_t;
499:
500:
501: #define MAXTOUCH 32
502: typedef struct
503: {
504: // state (in / out)
505: pmove_state_t s;
506:
507: // command (in)
508: usercmd_t cmd;
509: qboolean snapinitial; // if s has been changed outside pmove
510:
511: // results (out)
512: int numtouch;
513: struct edict_s *touchents[MAXTOUCH];
514:
515: vec3_t viewangles; // clamped
516: float viewheight;
517:
518: vec3_t mins, maxs; // bounding box size
519:
520: struct edict_s *groundentity;
521: int watertype;
522: int waterlevel;
523:
524: // callbacks to test the world
525: trace_t (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end);
526: int (*pointcontents) (vec3_t point);
527: } pmove_t;
528:
529:
530: // entity_state_t->effects
531: // Effects are things handled on the client side (lights, particles, frame animations)
532: // that happen constantly on the given entity.
533: // An entity that has effects will be sent to the client
534: // even if it has a zero index model.
535: #define EF_ROTATE 0x00000001 // rotate (bonus items)
536: #define EF_GIB 0x00000002 // leave a trail
537: #define EF_BLASTER 0x00000008 // redlight + trail
538: #define EF_ROCKET 0x00000010 // redlight + trail
539: #define EF_GRENADE 0x00000020
540: #define EF_HYPERBLASTER 0x00000040
541: #define EF_BFG 0x00000080
542: #define EF_COLOR_SHELL 0x00000100
543: #define EF_POWERSCREEN 0x00000200
544: #define EF_ANIM01 0x00000400 // automatically cycle between frames 0 and 1 at 2 hz
545: #define EF_ANIM23 0x00000800 // automatically cycle between frames 2 and 3 at 2 hz
546: #define EF_ANIM_ALL 0x00001000 // automatically cycle through all frames at 2hz
547: #define EF_ANIM_ALLFAST 0x00002000 // automatically cycle through all frames at 10hz
548: #define EF_FLIES 0x00004000
549: #define EF_QUAD 0x00008000
550: #define EF_PENT 0x00010000
551: #define EF_TELEPORTER 0x00020000 // particle fountain
552: #define EF_FLAG1 0x00040000
553: #define EF_FLAG2 0x00080000
554: // RAFAEL
555: #define EF_IONRIPPER 0x00100000
556: #define EF_GREENGIB 0x00200000
557: #define EF_BLUEHYPERBLASTER 0x00400000
558: #define EF_SPINNINGLIGHTS 0x00800000
559: #define EF_PLASMA 0x01000000
560: #define EF_TRAP 0x02000000
561:
562: //ROGUE
563: #define EF_TRACKER 0x04000000
564: #define EF_DOUBLE 0x08000000
565: #define EF_SPHERETRANS 0x10000000
566: #define EF_TAGTRAIL 0x20000000
567: #define EF_HALF_DAMAGE 0x40000000
568: #define EF_TRACKERTRAIL 0x80000000
569: //ROGUE
570:
571: // entity_state_t->renderfx flags
572: #define RF_MINLIGHT 1 // allways have some light (viewmodel)
573: #define RF_VIEWERMODEL 2 // don't draw through eyes, only mirrors
574: #define RF_WEAPONMODEL 4 // only draw through eyes
575: #define RF_FULLBRIGHT 8 // allways draw full intensity
576: #define RF_DEPTHHACK 16 // for view weapon Z crunching
577: #define RF_TRANSLUCENT 32
578: #define RF_FRAMELERP 64
579: #define RF_BEAM 128
580: #define RF_CUSTOMSKIN 256 // skin is an index in image_precache
581: #define RF_GLOW 512 // pulse lighting for bonus items
582: #define RF_SHELL_RED 1024
583: #define RF_SHELL_GREEN 2048
584: #define RF_SHELL_BLUE 4096
585:
586: //ROGUE
587: #define RF_IR_VISIBLE 0x00008000 // 32768
588: #define RF_SHELL_DOUBLE 0x00010000 // 65536
589: #define RF_SHELL_HALF_DAM 0x00020000
590: #define RF_USE_DISGUISE 0x00040000
591: //ROGUE
592:
593: // player_state_t->refdef flags
594: #define RDF_UNDERWATER 1 // warp the screen as apropriate
595: #define RDF_NOWORLDMODEL 2 // used for player configuration screen
596:
597: //ROGUE
598: #define RDF_IRGOGGLES 4
599: #define RDF_UVGOGGLES 8
600: //ROGUE
601:
602: //
603: // muzzle flashes / player effects
604: //
605: #define MZ_BLASTER 0
606: #define MZ_MACHINEGUN 1
607: #define MZ_SHOTGUN 2
608: #define MZ_CHAINGUN1 3
609: #define MZ_CHAINGUN2 4
610: #define MZ_CHAINGUN3 5
611: #define MZ_RAILGUN 6
612: #define MZ_ROCKET 7
613: #define MZ_GRENADE 8
614: #define MZ_LOGIN 9
615: #define MZ_LOGOUT 10
616: #define MZ_RESPAWN 11
617: #define MZ_BFG 12
618: #define MZ_SSHOTGUN 13
619: #define MZ_HYPERBLASTER 14
620: #define MZ_ITEMRESPAWN 15
621: // RAFAEL
622: #define MZ_IONRIPPER 16
623: #define MZ_BLUEHYPERBLASTER 17
624: #define MZ_PHALANX 18
625: #define MZ_SILENCED 128 // bit flag ORed with one of the above numbers
626:
627: //ROGUE
628: #define MZ_ETF_RIFLE 30
629: #define MZ_UNUSED 31
630: #define MZ_SHOTGUN2 32
631: #define MZ_HEATBEAM 33
632: #define MZ_BLASTER2 34
633: #define MZ_TRACKER 35
634: #define MZ_NUKE1 36
635: #define MZ_NUKE2 37
636: #define MZ_NUKE4 38
637: #define MZ_NUKE8 39
638: //ROGUE
639:
640: //
641: // monster muzzle flashes
642: //
643: #define MZ2_TANK_BLASTER_1 1
644: #define MZ2_TANK_BLASTER_2 2
645: #define MZ2_TANK_BLASTER_3 3
646: #define MZ2_TANK_MACHINEGUN_1 4
647: #define MZ2_TANK_MACHINEGUN_2 5
648: #define MZ2_TANK_MACHINEGUN_3 6
649: #define MZ2_TANK_MACHINEGUN_4 7
650: #define MZ2_TANK_MACHINEGUN_5 8
651: #define MZ2_TANK_MACHINEGUN_6 9
652: #define MZ2_TANK_MACHINEGUN_7 10
653: #define MZ2_TANK_MACHINEGUN_8 11
654: #define MZ2_TANK_MACHINEGUN_9 12
655: #define MZ2_TANK_MACHINEGUN_10 13
656: #define MZ2_TANK_MACHINEGUN_11 14
657: #define MZ2_TANK_MACHINEGUN_12 15
658: #define MZ2_TANK_MACHINEGUN_13 16
659: #define MZ2_TANK_MACHINEGUN_14 17
660: #define MZ2_TANK_MACHINEGUN_15 18
661: #define MZ2_TANK_MACHINEGUN_16 19
662: #define MZ2_TANK_MACHINEGUN_17 20
663: #define MZ2_TANK_MACHINEGUN_18 21
664: #define MZ2_TANK_MACHINEGUN_19 22
665: #define MZ2_TANK_ROCKET_1 23
666: #define MZ2_TANK_ROCKET_2 24
667: #define MZ2_TANK_ROCKET_3 25
668:
669: #define MZ2_INFANTRY_MACHINEGUN_1 26
670: #define MZ2_INFANTRY_MACHINEGUN_2 27
671: #define MZ2_INFANTRY_MACHINEGUN_3 28
672: #define MZ2_INFANTRY_MACHINEGUN_4 29
673: #define MZ2_INFANTRY_MACHINEGUN_5 30
674: #define MZ2_INFANTRY_MACHINEGUN_6 31
675: #define MZ2_INFANTRY_MACHINEGUN_7 32
676: #define MZ2_INFANTRY_MACHINEGUN_8 33
677: #define MZ2_INFANTRY_MACHINEGUN_9 34
678: #define MZ2_INFANTRY_MACHINEGUN_10 35
679: #define MZ2_INFANTRY_MACHINEGUN_11 36
680: #define MZ2_INFANTRY_MACHINEGUN_12 37
681: #define MZ2_INFANTRY_MACHINEGUN_13 38
682:
683: #define MZ2_SOLDIER_BLASTER_1 39
684: #define MZ2_SOLDIER_BLASTER_2 40
685: #define MZ2_SOLDIER_SHOTGUN_1 41
686: #define MZ2_SOLDIER_SHOTGUN_2 42
687: #define MZ2_SOLDIER_MACHINEGUN_1 43
688: #define MZ2_SOLDIER_MACHINEGUN_2 44
689:
690: #define MZ2_GUNNER_MACHINEGUN_1 45
691: #define MZ2_GUNNER_MACHINEGUN_2 46
692: #define MZ2_GUNNER_MACHINEGUN_3 47
693: #define MZ2_GUNNER_MACHINEGUN_4 48
694: #define MZ2_GUNNER_MACHINEGUN_5 49
695: #define MZ2_GUNNER_MACHINEGUN_6 50
696: #define MZ2_GUNNER_MACHINEGUN_7 51
697: #define MZ2_GUNNER_MACHINEGUN_8 52
698: #define MZ2_GUNNER_GRENADE_1 53
699: #define MZ2_GUNNER_GRENADE_2 54
700: #define MZ2_GUNNER_GRENADE_3 55
701: #define MZ2_GUNNER_GRENADE_4 56
702:
703: #define MZ2_CHICK_ROCKET_1 57
704:
705: #define MZ2_FLYER_BLASTER_1 58
706: #define MZ2_FLYER_BLASTER_2 59
707:
708: #define MZ2_MEDIC_BLASTER_1 60
709:
710: #define MZ2_GLADIATOR_RAILGUN_1 61
711:
712: #define MZ2_HOVER_BLASTER_1 62
713:
714: #define MZ2_ACTOR_MACHINEGUN_1 63
715:
716: #define MZ2_SUPERTANK_MACHINEGUN_1 64
717: #define MZ2_SUPERTANK_MACHINEGUN_2 65
718: #define MZ2_SUPERTANK_MACHINEGUN_3 66
719: #define MZ2_SUPERTANK_MACHINEGUN_4 67
720: #define MZ2_SUPERTANK_MACHINEGUN_5 68
721: #define MZ2_SUPERTANK_MACHINEGUN_6 69
722: #define MZ2_SUPERTANK_ROCKET_1 70
723: #define MZ2_SUPERTANK_ROCKET_2 71
724: #define MZ2_SUPERTANK_ROCKET_3 72
725:
726: #define MZ2_BOSS2_MACHINEGUN_L1 73
727: #define MZ2_BOSS2_MACHINEGUN_L2 74
728: #define MZ2_BOSS2_MACHINEGUN_L3 75
729: #define MZ2_BOSS2_MACHINEGUN_L4 76
730: #define MZ2_BOSS2_MACHINEGUN_L5 77
731: #define MZ2_BOSS2_ROCKET_1 78
732: #define MZ2_BOSS2_ROCKET_2 79
733: #define MZ2_BOSS2_ROCKET_3 80
734: #define MZ2_BOSS2_ROCKET_4 81
735:
736: #define MZ2_FLOAT_BLASTER_1 82
737:
738: #define MZ2_SOLDIER_BLASTER_3 83
739: #define MZ2_SOLDIER_SHOTGUN_3 84
740: #define MZ2_SOLDIER_MACHINEGUN_3 85
741: #define MZ2_SOLDIER_BLASTER_4 86
742: #define MZ2_SOLDIER_SHOTGUN_4 87
743: #define MZ2_SOLDIER_MACHINEGUN_4 88
744: #define MZ2_SOLDIER_BLASTER_5 89
745: #define MZ2_SOLDIER_SHOTGUN_5 90
746: #define MZ2_SOLDIER_MACHINEGUN_5 91
747: #define MZ2_SOLDIER_BLASTER_6 92
748: #define MZ2_SOLDIER_SHOTGUN_6 93
749: #define MZ2_SOLDIER_MACHINEGUN_6 94
750: #define MZ2_SOLDIER_BLASTER_7 95
751: #define MZ2_SOLDIER_SHOTGUN_7 96
752: #define MZ2_SOLDIER_MACHINEGUN_7 97
753: #define MZ2_SOLDIER_BLASTER_8 98
754: #define MZ2_SOLDIER_SHOTGUN_8 99
755: #define MZ2_SOLDIER_MACHINEGUN_8 100
756:
757: // --- Xian shit below ---
758: #define MZ2_MAKRON_BFG 101
759: #define MZ2_MAKRON_BLASTER_1 102
760: #define MZ2_MAKRON_BLASTER_2 103
761: #define MZ2_MAKRON_BLASTER_3 104
762: #define MZ2_MAKRON_BLASTER_4 105
763: #define MZ2_MAKRON_BLASTER_5 106
764: #define MZ2_MAKRON_BLASTER_6 107
765: #define MZ2_MAKRON_BLASTER_7 108
766: #define MZ2_MAKRON_BLASTER_8 109
767: #define MZ2_MAKRON_BLASTER_9 110
768: #define MZ2_MAKRON_BLASTER_10 111
769: #define MZ2_MAKRON_BLASTER_11 112
770: #define MZ2_MAKRON_BLASTER_12 113
771: #define MZ2_MAKRON_BLASTER_13 114
772: #define MZ2_MAKRON_BLASTER_14 115
773: #define MZ2_MAKRON_BLASTER_15 116
774: #define MZ2_MAKRON_BLASTER_16 117
775: #define MZ2_MAKRON_BLASTER_17 118
776: #define MZ2_MAKRON_RAILGUN_1 119
777: #define MZ2_JORG_MACHINEGUN_L1 120
778: #define MZ2_JORG_MACHINEGUN_L2 121
779: #define MZ2_JORG_MACHINEGUN_L3 122
780: #define MZ2_JORG_MACHINEGUN_L4 123
781: #define MZ2_JORG_MACHINEGUN_L5 124
782: #define MZ2_JORG_MACHINEGUN_L6 125
783: #define MZ2_JORG_MACHINEGUN_R1 126
784: #define MZ2_JORG_MACHINEGUN_R2 127
785: #define MZ2_JORG_MACHINEGUN_R3 128
786: #define MZ2_JORG_MACHINEGUN_R4 129
787: #define MZ2_JORG_MACHINEGUN_R5 130
788: #define MZ2_JORG_MACHINEGUN_R6 131
789: #define MZ2_JORG_BFG_1 132
790: #define MZ2_BOSS2_MACHINEGUN_R1 133
791: #define MZ2_BOSS2_MACHINEGUN_R2 134
792: #define MZ2_BOSS2_MACHINEGUN_R3 135
793: #define MZ2_BOSS2_MACHINEGUN_R4 136
794: #define MZ2_BOSS2_MACHINEGUN_R5 137
795:
796: //ROGUE
797: #define MZ2_CARRIER_MACHINEGUN_L1 138
798: #define MZ2_CARRIER_MACHINEGUN_R1 139
799: #define MZ2_CARRIER_GRENADE 140
800: #define MZ2_TURRET_MACHINEGUN 141
801: #define MZ2_TURRET_ROCKET 142
802: #define MZ2_TURRET_BLASTER 143
803: #define MZ2_STALKER_BLASTER 144
804: #define MZ2_DAEDALUS_BLASTER 145
805: #define MZ2_MEDIC_BLASTER_2 146
806: #define MZ2_CARRIER_RAILGUN 147
807: #define MZ2_WIDOW_DISRUPTOR 148
808: #define MZ2_WIDOW_BLASTER 149
809: #define MZ2_WIDOW_RAIL 150
810: #define MZ2_WIDOW_PLASMABEAM 151 // PMM - not used
811: #define MZ2_CARRIER_MACHINEGUN_L2 152
812: #define MZ2_CARRIER_MACHINEGUN_R2 153
813: #define MZ2_WIDOW_RAIL_LEFT 154
814: #define MZ2_WIDOW_RAIL_RIGHT 155
815: #define MZ2_WIDOW_BLASTER_SWEEP1 156
816: #define MZ2_WIDOW_BLASTER_SWEEP2 157
817: #define MZ2_WIDOW_BLASTER_SWEEP3 158
818: #define MZ2_WIDOW_BLASTER_SWEEP4 159
819: #define MZ2_WIDOW_BLASTER_SWEEP5 160
820: #define MZ2_WIDOW_BLASTER_SWEEP6 161
821: #define MZ2_WIDOW_BLASTER_SWEEP7 162
822: #define MZ2_WIDOW_BLASTER_SWEEP8 163
823: #define MZ2_WIDOW_BLASTER_SWEEP9 164
824: #define MZ2_WIDOW_BLASTER_100 165
825: #define MZ2_WIDOW_BLASTER_90 166
826: #define MZ2_WIDOW_BLASTER_80 167
827: #define MZ2_WIDOW_BLASTER_70 168
828: #define MZ2_WIDOW_BLASTER_60 169
829: #define MZ2_WIDOW_BLASTER_50 170
830: #define MZ2_WIDOW_BLASTER_40 171
831: #define MZ2_WIDOW_BLASTER_30 172
832: #define MZ2_WIDOW_BLASTER_20 173
833: #define MZ2_WIDOW_BLASTER_10 174
834: #define MZ2_WIDOW_BLASTER_0 175
835: #define MZ2_WIDOW_BLASTER_10L 176
836: #define MZ2_WIDOW_BLASTER_20L 177
837: #define MZ2_WIDOW_BLASTER_30L 178
838: #define MZ2_WIDOW_BLASTER_40L 179
839: #define MZ2_WIDOW_BLASTER_50L 180
840: #define MZ2_WIDOW_BLASTER_60L 181
841: #define MZ2_WIDOW_BLASTER_70L 182
842: #define MZ2_WIDOW_RUN_1 183
843: #define MZ2_WIDOW_RUN_2 184
844: #define MZ2_WIDOW_RUN_3 185
845: #define MZ2_WIDOW_RUN_4 186
846: #define MZ2_WIDOW_RUN_5 187
847: #define MZ2_WIDOW_RUN_6 188
848: #define MZ2_WIDOW_RUN_7 189
849: #define MZ2_WIDOW_RUN_8 190
850: #define MZ2_CARRIER_ROCKET_1 191
851: #define MZ2_CARRIER_ROCKET_2 192
852: #define MZ2_CARRIER_ROCKET_3 193
853: #define MZ2_CARRIER_ROCKET_4 194
854: #define MZ2_WIDOW2_BEAMER_1 195
855: #define MZ2_WIDOW2_BEAMER_2 196
856: #define MZ2_WIDOW2_BEAMER_3 197
857: #define MZ2_WIDOW2_BEAMER_4 198
858: #define MZ2_WIDOW2_BEAMER_5 199
859: #define MZ2_WIDOW2_BEAM_SWEEP_1 200
860: #define MZ2_WIDOW2_BEAM_SWEEP_2 201
861: #define MZ2_WIDOW2_BEAM_SWEEP_3 202
862: #define MZ2_WIDOW2_BEAM_SWEEP_4 203
863: #define MZ2_WIDOW2_BEAM_SWEEP_5 204
864: #define MZ2_WIDOW2_BEAM_SWEEP_6 205
865: #define MZ2_WIDOW2_BEAM_SWEEP_7 206
866: #define MZ2_WIDOW2_BEAM_SWEEP_8 207
867: #define MZ2_WIDOW2_BEAM_SWEEP_9 208
868: #define MZ2_WIDOW2_BEAM_SWEEP_10 209
869: #define MZ2_WIDOW2_BEAM_SWEEP_11 210
870:
871: // ROGUE
872:
873: extern vec3_t monster_flash_offset [];
874:
875:
876: // temp entity events
877: //
878: // Temp entity events are for things that happen
879: // at a location seperate from any existing entity.
880: // Temporary entity messages are explicitly constructed
881: // and broadcast.
882: typedef enum
883: {
884: TE_GUNSHOT,
885: TE_BLOOD,
886: TE_BLASTER,
887: TE_RAILTRAIL,
888: TE_SHOTGUN,
889: TE_EXPLOSION1,
890: TE_EXPLOSION2,
891: TE_ROCKET_EXPLOSION,
892: TE_GRENADE_EXPLOSION,
893: TE_SPARKS,
894: TE_SPLASH,
895: TE_BUBBLETRAIL,
896: TE_SCREEN_SPARKS,
897: TE_SHIELD_SPARKS,
898: TE_BULLET_SPARKS,
899: TE_LASER_SPARKS,
900: TE_PARASITE_ATTACK,
901: TE_ROCKET_EXPLOSION_WATER,
902: TE_GRENADE_EXPLOSION_WATER,
903: TE_MEDIC_CABLE_ATTACK,
904: TE_BFG_EXPLOSION,
905: TE_BFG_BIGEXPLOSION,
906: TE_BOSSTPORT, // used as '22' in a map, so DON'T RENUMBER!!!
907: TE_BFG_LASER,
908: TE_GRAPPLE_CABLE,
909: TE_WELDING_SPARKS,
910: TE_GREENBLOOD,
911: TE_BLUEHYPERBLASTER,
912: TE_PLASMA_EXPLOSION,
913: TE_TUNNEL_SPARKS,
914: //ROGUE
915: TE_BLASTER2,
916: TE_RAILTRAIL2,
917: TE_FLAME,
918: TE_LIGHTNING,
919: TE_DEBUGTRAIL,
920: TE_PLAIN_EXPLOSION,
921: TE_FLASHLIGHT,
922: TE_FORCEWALL,
923: TE_HEATBEAM,
924: TE_MONSTER_HEATBEAM,
925: TE_STEAM,
926: TE_BUBBLETRAIL2,
927: TE_MOREBLOOD,
928: TE_HEATBEAM_SPARKS,
929: TE_HEATBEAM_STEAM,
930: TE_CHAINFIST_SMOKE,
931: TE_ELECTRIC_SPARKS,
932: TE_TRACKER_EXPLOSION,
933: TE_TELEPORT_EFFECT,
934: TE_DBALL_GOAL,
935: TE_WIDOWBEAMOUT,
936: TE_NUKEBLAST,
937: TE_WIDOWSPLASH,
938: TE_EXPLOSION1_BIG,
939: TE_EXPLOSION1_NP,
940: TE_FLECHETTE
941: //ROGUE
942: } temp_event_t;
943:
944: #define SPLASH_UNKNOWN 0
945: #define SPLASH_SPARKS 1
946: #define SPLASH_BLUE_WATER 2
947: #define SPLASH_BROWN_WATER 3
948: #define SPLASH_SLIME 4
949: #define SPLASH_LAVA 5
950: #define SPLASH_BLOOD 6
951:
952:
953: // sound channels
954: // channel 0 never willingly overrides
955: // other channels (1-7) allways override a playing sound on that channel
956: #define CHAN_AUTO 0
957: #define CHAN_WEAPON 1
958: #define CHAN_VOICE 2
959: #define CHAN_ITEM 3
960: #define CHAN_BODY 4
961: // modifier flags
962: #define CHAN_NO_PHS_ADD 8 // send to all clients, not just ones in PHS (ATTN 0 will also do this)
963: #define CHAN_RELIABLE 16 // send by reliable message, not datagram
964:
965:
966: // sound attenuation values
967: #define ATTN_NONE 0 // full volume the entire level
968: #define ATTN_NORM 1
969: #define ATTN_IDLE 2
970: #define ATTN_STATIC 3 // diminish very rapidly with distance
971:
972:
973: // player_state->stats[] indexes
974: #define STAT_HEALTH_ICON 0
975: #define STAT_HEALTH 1
976: #define STAT_AMMO_ICON 2
977: #define STAT_AMMO 3
978: #define STAT_ARMOR_ICON 4
979: #define STAT_ARMOR 5
980: #define STAT_SELECTED_ICON 6
981: #define STAT_PICKUP_ICON 7
982: #define STAT_PICKUP_STRING 8
983: #define STAT_TIMER_ICON 9
984: #define STAT_TIMER 10
985: #define STAT_HELPICON 11
986: #define STAT_SELECTED_ITEM 12
987: #define STAT_LAYOUTS 13
988: #define STAT_FRAGS 14
989: #define STAT_FLASHES 15 // cleared each frame, 1 = health, 2 = armor
990: #define STAT_CHASE 16
991: #define STAT_SPECTATOR 17
992:
993: #define MAX_STATS 32
994:
995:
996: // dmflags->value flags
997: #define DF_NO_HEALTH 0x00000001 // 1
998: #define DF_NO_ITEMS 0x00000002 // 2
999: #define DF_WEAPONS_STAY 0x00000004 // 4
1000: #define DF_NO_FALLING 0x00000008 // 8
1001: #define DF_INSTANT_ITEMS 0x00000010 // 16
1002: #define DF_SAME_LEVEL 0x00000020 // 32
1003: #define DF_SKINTEAMS 0x00000040 // 64
1004: #define DF_MODELTEAMS 0x00000080 // 128
1005: #define DF_NO_FRIENDLY_FIRE 0x00000100 // 256
1006: #define DF_SPAWN_FARTHEST 0x00000200 // 512
1007: #define DF_FORCE_RESPAWN 0x00000400 // 1024
1008: #define DF_NO_ARMOR 0x00000800 // 2048
1009: #define DF_ALLOW_EXIT 0x00001000 // 4096
1010: #define DF_INFINITE_AMMO 0x00002000 // 8192
1011: #define DF_QUAD_DROP 0x00004000 // 16384
1012: #define DF_FIXED_FOV 0x00008000 // 32768
1013:
1014: // RAFAEL
1015: #define DF_QUADFIRE_DROP 0x00010000 // 65536
1016:
1017: //ROGUE
1018: #define DF_NO_MINES 0x00020000
1019: #define DF_NO_STACK_DOUBLE 0x00040000
1020: #define DF_NO_NUKES 0x00080000
1021: #define DF_NO_SPHERES 0x00100000
1022: //ROGUE
1023:
1024: /*
1025: ROGUE - VERSIONS
1026: 1234 08/13/1998 Activision
1027: 1235 08/14/1998 Id Software
1028: 1236 08/15/1998 Steve Tietze
1029: 1237 08/15/1998 Phil Dobranski
1030: 1238 08/15/1998 John Sheley
1031: 1239 08/17/1998 Barrett Alexander
1032: 1230 08/17/1998 Brandon Fish
1033: 1245 08/17/1998 Don MacAskill
1034: 1246 08/17/1998 David "Zoid" Kirsch
1035: 1247 08/17/1998 Manu Smith
1036: 1248 08/17/1998 Geoff Scully
1037: 1249 08/17/1998 Andy Van Fossen
1038: 1240 08/20/1998 Activision Build 2
1039: 1256 08/20/1998 Ranger Clan
1040: 1257 08/20/1998 Ensemble Studios
1041: 1258 08/21/1998 Robert Duffy
1042: 1259 08/21/1998 Stephen Seachord
1043: 1250 08/21/1998 Stephen Heaslip
1044: 1267 08/21/1998 Samir Sandesara
1045: 1268 08/21/1998 Oliver Wyman
1046: 1269 08/21/1998 Steven Marchegiano
1047: 1260 08/21/1998 Build #2 for Nihilistic
1048: 1278 08/21/1998 Build #2 for Ensemble
1049:
1050: 9999 08/20/1998 Internal Use
1051: */
1052: #define ROGUE_VERSION_ID 1278
1053:
1054: #define ROGUE_VERSION_STRING "08/21/1998 Beta 2 for Ensemble"
1055:
1056: // ROGUE
1057: /*
1058: ==========================================================
1059:
1060: ELEMENTS COMMUNICATED ACROSS THE NET
1061:
1062: ==========================================================
1063: */
1064:
1065: #define ANGLE2SHORT(x) ((int)((x)*65536/360) & 65535)
1066: #define SHORT2ANGLE(x) ((x)*(360.0/65536))
1067:
1068:
1069: //
1070: // config strings are a general means of communication from
1071: // the server to all connected clients.
1072: // Each config string can be at most MAX_QPATH characters.
1073: //
1074: #define CS_NAME 0
1075: #define CS_CDTRACK 1
1076: #define CS_SKY 2
1077: #define CS_SKYAXIS 3 // %f %f %f format
1078: #define CS_SKYROTATE 4
1079: #define CS_STATUSBAR 5 // display program string
1080:
1081: #define CS_AIRACCEL 29 // air acceleration control
1082: #define CS_MAXCLIENTS 30
1083: #define CS_MAPCHECKSUM 31 // for catching cheater maps
1084:
1085: #define CS_MODELS 32
1086: #define CS_SOUNDS (CS_MODELS+MAX_MODELS)
1087: #define CS_IMAGES (CS_SOUNDS+MAX_SOUNDS)
1088: #define CS_LIGHTS (CS_IMAGES+MAX_IMAGES)
1089: #define CS_ITEMS (CS_LIGHTS+MAX_LIGHTSTYLES)
1090: #define CS_PLAYERSKINS (CS_ITEMS+MAX_ITEMS)
1091: #define CS_GENERAL (CS_PLAYERSKINS+MAX_CLIENTS)
1092: #define MAX_CONFIGSTRINGS (CS_GENERAL+MAX_GENERAL)
1093:
1094:
1095: //==============================================
1096:
1097:
1098: // entity_state_t->event values
1099: // ertity events are for effects that take place reletive
1100: // to an existing entities origin. Very network efficient.
1101: // All muzzle flashes really should be converted to events...
1102: typedef enum
1103: {
1104: EV_NONE,
1105: EV_ITEM_RESPAWN,
1106: EV_FOOTSTEP,
1107: EV_FALLSHORT,
1108: EV_FALL,
1109: EV_FALLFAR,
1110: EV_PLAYER_TELEPORT,
1111: EV_OTHER_TELEPORT
1112: } entity_event_t;
1113:
1114:
1115: // entity_state_t is the information conveyed from the server
1116: // in an update message about entities that the client will
1117: // need to render in some way
1118: typedef struct entity_state_s
1119: {
1120: int number; // edict index
1121:
1122: vec3_t origin;
1123: vec3_t angles;
1124: vec3_t old_origin; // for lerping
1125: int modelindex;
1126: int modelindex2, modelindex3, modelindex4; // weapons, CTF flags, etc
1127: int frame;
1128: int skinnum;
1129: unsigned int effects; // PGM - we're filling it, so it needs to be unsigned
1130: int renderfx;
1131: int solid; // for client side prediction, 8*(bits 0-4) is x/y radius
1132: // 8*(bits 5-9) is z down distance, 8(bits10-15) is z up
1133: // gi.linkentity sets this properly
1134: int sound; // for looping sounds, to guarantee shutoff
1135: int event; // impulse events -- muzzle flashes, footsteps, etc
1136: // events only go out for a single frame, they
1137: // are automatically cleared each frame
1138: } entity_state_t;
1139:
1140: //==============================================
1141:
1142:
1143: // player_state_t is the information needed in addition to pmove_state_t
1144: // to rendered a view. There will only be 10 player_state_t sent each second,
1145: // but the number of pmove_state_t changes will be reletive to client
1146: // frame rates
1147: typedef struct
1148: {
1149: pmove_state_t pmove; // for prediction
1150:
1151: // these fields do not need to be communicated bit-precise
1152:
1153: vec3_t viewangles; // for fixed views
1154: vec3_t viewoffset; // add to pmovestate->origin
1155: vec3_t kick_angles; // add to view direction to get render angles
1156: // set by weapon kicks, pain effects, etc
1157:
1158: vec3_t gunangles;
1159: vec3_t gunoffset;
1160: int gunindex;
1161: int gunframe;
1162:
1163: float blend[4]; // rgba full screen effect
1164:
1165: float fov; // horizontal field of view
1166:
1167: int rdflags; // refdef flags
1168:
1169: short stats[MAX_STATS]; // fast status bar updates
1170: } player_state_t;
1171:
1172:
1173: // ==================
1174: // PGM
1175: #define VIDREF_GL 1
1176: #define VIDREF_SOFT 2
1177: #define VIDREF_OTHER 3
1178:
1179: extern int vidref_val;
1180: // PGM
1181: // ==================
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.