demo-reader 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/README.rdoc +1 -1
- data/Rakefile +3 -2
- data/VERSION +1 -1
- data/demo-reader.gemspec +30 -7
- data/ext/dm68/README.txt +14 -0
- data/ext/dm68/common.c +797 -0
- data/ext/dm68/common.h +568 -0
- data/ext/dm68/dm68.c +57 -0
- data/ext/dm68/dump.c +196 -0
- data/ext/dm68/extconf.rb +16 -0
- data/ext/dm68/huff.c +542 -0
- data/ext/dm68/huff.h +34 -0
- data/ext/dm68/main.c +175 -0
- data/ext/dm68/main.h +126 -0
- data/ext/dm68/msg.c +1082 -0
- data/ext/dm68/msg.h +114 -0
- data/ext/dm68/parse.c +393 -0
- data/lib/demo-reader.rb +11 -3
- data/lib/demo_reader_defrag.rb +106 -0
- data/lib/demo_reader_warsow.rb +3 -5
- data/test/demo_reader_defrag_dm_68_cpm_test.rb +29 -0
- data/test/demo_reader_defrag_dm_68_vq3_test.rb +29 -0
- data/test/fixtures/defrag/dm_68/cpm/pornchronostar_mdf.cpm_00.49.216_tyaz.germany.dm_68 +0 -0
- data/test/fixtures/defrag/dm_68/cpm/puremotion_df.cpm_00.10.600_eS-Rody.russia.dm_68 +0 -0
- data/test/fixtures/defrag/dm_68/vq3/runkull2_df.vq3_01.05.904_XunderBIRD.Germany.dm_68 +0 -0
- data/test/fixtures/defrag/dm_68/vq3/un-dead029_df.vq3_00.16.912_uN-DeaD!WiNTeR.ru.dm_68 +0 -0
- metadata +43 -9
data/ext/dm68/common.h
ADDED
@@ -0,0 +1,568 @@
|
|
1
|
+
// Copyright (C) 1999-2000 Id Software, Inc.
|
2
|
+
//
|
3
|
+
// q_shared.c -- stateless support routines that are included in each code dll
|
4
|
+
|
5
|
+
#include <stdio.h>
|
6
|
+
#include <stdlib.h>
|
7
|
+
#include <math.h>
|
8
|
+
#include <ctype.h>
|
9
|
+
#include <stdarg.h>
|
10
|
+
#include <string.h>
|
11
|
+
|
12
|
+
#define ID_INLINE
|
13
|
+
|
14
|
+
#ifdef WIN32
|
15
|
+
# pragma warning(disable:4018)
|
16
|
+
#endif
|
17
|
+
|
18
|
+
#ifdef WIN32
|
19
|
+
# undef ID_INLINE
|
20
|
+
# define ID_INLINE __inline
|
21
|
+
#endif
|
22
|
+
|
23
|
+
#define LittleLong
|
24
|
+
|
25
|
+
typedef enum {qfalse, qtrue} qboolean;
|
26
|
+
typedef unsigned char byte;
|
27
|
+
typedef float vec3_t[3];
|
28
|
+
|
29
|
+
#ifndef NULL
|
30
|
+
#define NULL ((void *)0)
|
31
|
+
#endif
|
32
|
+
|
33
|
+
#define MAXPRINTMSG 16284
|
34
|
+
|
35
|
+
// the game guarantees that no string from the network will ever
|
36
|
+
// exceed MAX_STRING_CHARS
|
37
|
+
#define MAX_STRING_CHARS 1024 // max length of a string passed to Cmd_TokenizeString
|
38
|
+
#define MAX_STRING_TOKENS 1024 // max tokens resulting from Cmd_TokenizeString
|
39
|
+
#define MAX_TOKEN_CHARS 1024 // max length of an individual token
|
40
|
+
|
41
|
+
#define MAX_INFO_STRING 1024
|
42
|
+
#define MAX_INFO_KEY 1024
|
43
|
+
#define MAX_INFO_VALUE 1024
|
44
|
+
|
45
|
+
#define BIG_INFO_STRING 8192 // used for system info key only
|
46
|
+
#define BIG_INFO_KEY 8192
|
47
|
+
#define BIG_INFO_VALUE 8192
|
48
|
+
|
49
|
+
|
50
|
+
#define MAX_QPATH 64 // max length of a quake game pathname
|
51
|
+
#ifdef PATH_MAX
|
52
|
+
#define MAX_OSPATH PATH_MAX
|
53
|
+
#else
|
54
|
+
#define MAX_OSPATH 256 // max length of a filesystem pathname
|
55
|
+
#endif
|
56
|
+
|
57
|
+
#define MAX_MAP_AREA_BYTES 32 // bit vector of area visibility
|
58
|
+
|
59
|
+
|
60
|
+
#ifdef ERR_FATAL
|
61
|
+
#undef ERR_FATAL // this is be defined in malloc.h
|
62
|
+
#endif
|
63
|
+
|
64
|
+
// parameters to the main Error routine
|
65
|
+
typedef enum {
|
66
|
+
ERR_FATAL, // exit the entire game with a popup window
|
67
|
+
ERR_DROP, // print to console and disconnect from game
|
68
|
+
ERR_SERVERDISCONNECT, // don't kill server
|
69
|
+
ERR_DISCONNECT, // client disconnected from the server
|
70
|
+
ERR_NEED_CD // pop up the need-cd dialog
|
71
|
+
} errorParm_t;
|
72
|
+
|
73
|
+
void Com_Error( errorParm_t level, const char *error, ... );
|
74
|
+
void Com_Printf( const char *text, ... );
|
75
|
+
|
76
|
+
void Com_sprintf (char *dest, int size, const char *fmt, ...);
|
77
|
+
char *va(char *format, ...);
|
78
|
+
|
79
|
+
// buffer size safe library replacements
|
80
|
+
void Q_strncpyz( char *dest, const char *src, int destsize );
|
81
|
+
void Q_strcat( char *dest, int size, const char *src );
|
82
|
+
|
83
|
+
int Q_stricmpn (const char *s1, const char *s2, int n);
|
84
|
+
int Q_strncmp (const char *s1, const char *s2, int n);
|
85
|
+
int Q_stricmp (const char *s1, const char *s2);
|
86
|
+
void Q_strcat( char *dest, int size, const char *src );
|
87
|
+
|
88
|
+
//
|
89
|
+
// key / value info strings
|
90
|
+
//
|
91
|
+
char *Info_ValueForKey( const char *s, const char *key );
|
92
|
+
void Info_RemoveKey( char *s, const char *key );
|
93
|
+
void Info_RemoveKey_big( char *s, const char *key );
|
94
|
+
void Info_SetValueForKey( char *s, const char *key, const char *value );
|
95
|
+
void Info_SetValueForKey_Big( char *s, const char *key, const char *value );
|
96
|
+
qboolean Info_Validate( const char *s );
|
97
|
+
void Info_NextPair( const char **s, char *key, char *value );
|
98
|
+
|
99
|
+
|
100
|
+
/*
|
101
|
+
========================================================================
|
102
|
+
|
103
|
+
ELEMENTS COMMUNICATED ACROSS THE NET
|
104
|
+
|
105
|
+
========================================================================
|
106
|
+
*/
|
107
|
+
|
108
|
+
#define ANGLE2SHORT(x) ((int)((x)*65536/360) & 65535)
|
109
|
+
#define SHORT2ANGLE(x) ((x)*(360.0/65536))
|
110
|
+
|
111
|
+
#define SNAPFLAG_RATE_DELAYED 1
|
112
|
+
#define SNAPFLAG_NOT_ACTIVE 2 // snapshot used during connection and for zombies
|
113
|
+
#define SNAPFLAG_SERVERCOUNT 4 // toggled every map_restart so transitions can be detected
|
114
|
+
|
115
|
+
//
|
116
|
+
// per-level limits
|
117
|
+
//
|
118
|
+
#define MAX_CLIENTS 64 // absolute limit
|
119
|
+
#define MAX_LOCATIONS 64
|
120
|
+
|
121
|
+
#define GENTITYNUM_BITS 10 // don't need to send any more
|
122
|
+
#define MAX_GENTITIES (1<<GENTITYNUM_BITS)
|
123
|
+
|
124
|
+
// entitynums are communicated with GENTITY_BITS, so any reserved
|
125
|
+
// values that are going to be communcated over the net need to
|
126
|
+
// also be in this range
|
127
|
+
#define ENTITYNUM_NONE (MAX_GENTITIES-1)
|
128
|
+
#define ENTITYNUM_WORLD (MAX_GENTITIES-2)
|
129
|
+
#define ENTITYNUM_MAX_NORMAL (MAX_GENTITIES-2)
|
130
|
+
|
131
|
+
|
132
|
+
#define MAX_MODELS 256 // these are sent over the net as 8 bits
|
133
|
+
#define MAX_SOUNDS 256 // so they cannot be blindly increased
|
134
|
+
|
135
|
+
|
136
|
+
#define MAX_CONFIGSTRINGS 1024
|
137
|
+
|
138
|
+
// these are the only configstrings that the system reserves, all the
|
139
|
+
// other ones are strictly for servergame to clientgame communication
|
140
|
+
#define CS_SERVERINFO 0 // an info string with all the serverinfo cvars
|
141
|
+
#define CS_SYSTEMINFO 1 // an info string for server system to client system configuration (timescale, etc)
|
142
|
+
|
143
|
+
#define RESERVED_CONFIGSTRINGS 2 // game can't modify below this, only the system can
|
144
|
+
|
145
|
+
#define MAX_GAMESTATE_CHARS 16000
|
146
|
+
typedef struct {
|
147
|
+
int stringOffsets[MAX_CONFIGSTRINGS];
|
148
|
+
char stringData[MAX_GAMESTATE_CHARS];
|
149
|
+
int dataCount;
|
150
|
+
} gameState_t;
|
151
|
+
|
152
|
+
//=========================================================
|
153
|
+
|
154
|
+
// bit field limits
|
155
|
+
#define MAX_STATS 16
|
156
|
+
#define MAX_PERSISTANT 16
|
157
|
+
#define MAX_POWERUPS 16
|
158
|
+
#define MAX_WEAPONS 16
|
159
|
+
|
160
|
+
#define MAX_PS_EVENTS 2
|
161
|
+
|
162
|
+
#define PS_PMOVEFRAMECOUNTBITS 6
|
163
|
+
|
164
|
+
// playerState_t is the information needed by both the client and server
|
165
|
+
// to predict player motion and actions
|
166
|
+
// nothing outside of pmove should modify these, or some degree of prediction error
|
167
|
+
// will occur
|
168
|
+
|
169
|
+
// you can't add anything to this without modifying the code in msg.c
|
170
|
+
|
171
|
+
// playerState_t is a full superset of entityState_t as it is used by players,
|
172
|
+
// so if a playerState_t is transmitted, the entityState_t can be fully derived
|
173
|
+
// from it.
|
174
|
+
typedef struct playerState_s {
|
175
|
+
int commandTime; // cmd->serverTime of last executed command
|
176
|
+
int pm_type;
|
177
|
+
int bobCycle; // for view bobbing and footstep generation
|
178
|
+
int pm_flags; // ducked, jump_held, etc
|
179
|
+
int pm_time;
|
180
|
+
|
181
|
+
vec3_t origin;
|
182
|
+
vec3_t velocity;
|
183
|
+
int weaponTime;
|
184
|
+
int gravity;
|
185
|
+
int speed;
|
186
|
+
int delta_angles[3]; // add to command angles to get view direction
|
187
|
+
// changed by spawns, rotating objects, and teleporters
|
188
|
+
|
189
|
+
int groundEntityNum;// ENTITYNUM_NONE = in air
|
190
|
+
|
191
|
+
int legsTimer; // don't change low priority animations until this runs out
|
192
|
+
int legsAnim; // mask off ANIM_TOGGLEBIT
|
193
|
+
|
194
|
+
int torsoTimer; // don't change low priority animations until this runs out
|
195
|
+
int torsoAnim; // mask off ANIM_TOGGLEBIT
|
196
|
+
|
197
|
+
int movementDir; // a number 0 to 7 that represents the reletive angle
|
198
|
+
// of movement to the view angle (axial and diagonals)
|
199
|
+
// when at rest, the value will remain unchanged
|
200
|
+
// used to twist the legs during strafing
|
201
|
+
|
202
|
+
vec3_t grapplePoint; // location of grapple to pull towards if PMF_GRAPPLE_PULL
|
203
|
+
|
204
|
+
int eFlags; // copied to entityState_t->eFlags
|
205
|
+
|
206
|
+
int eventSequence; // pmove generated events
|
207
|
+
int events[MAX_PS_EVENTS];
|
208
|
+
int eventParms[MAX_PS_EVENTS];
|
209
|
+
|
210
|
+
int externalEvent; // events set on player from another source
|
211
|
+
int externalEventParm;
|
212
|
+
int externalEventTime;
|
213
|
+
|
214
|
+
int clientNum; // ranges from 0 to MAX_CLIENTS-1
|
215
|
+
int weapon; // copied to entityState_t->weapon
|
216
|
+
int weaponstate;
|
217
|
+
|
218
|
+
vec3_t viewangles; // for fixed views
|
219
|
+
int viewheight;
|
220
|
+
|
221
|
+
// damage feedback
|
222
|
+
int damageEvent; // when it changes, latch the other parms
|
223
|
+
int damageYaw;
|
224
|
+
int damagePitch;
|
225
|
+
int damageCount;
|
226
|
+
|
227
|
+
int stats[MAX_STATS];
|
228
|
+
int persistant[MAX_PERSISTANT]; // stats that aren't cleared on death
|
229
|
+
int powerups[MAX_POWERUPS]; // level.time that the powerup runs out
|
230
|
+
int ammo[MAX_WEAPONS];
|
231
|
+
|
232
|
+
int generic1;
|
233
|
+
int loopSound;
|
234
|
+
int jumppad_ent; // jumppad entity hit this frame
|
235
|
+
|
236
|
+
// not communicated over the net at all
|
237
|
+
int ping; // server to game info for scoreboard
|
238
|
+
int pmove_framecount; // FIXME: don't transmit over the network
|
239
|
+
int jumppad_frame;
|
240
|
+
int entityEventSequence;
|
241
|
+
} playerState_t;
|
242
|
+
|
243
|
+
//===================================================================
|
244
|
+
|
245
|
+
// if entityState->solid == SOLID_BMODEL, modelindex is an inline model number
|
246
|
+
#define SOLID_BMODEL 0xffffff
|
247
|
+
|
248
|
+
typedef enum {
|
249
|
+
TR_STATIONARY,
|
250
|
+
TR_INTERPOLATE, // non-parametric, but interpolate between snapshots
|
251
|
+
TR_LINEAR,
|
252
|
+
TR_LINEAR_STOP,
|
253
|
+
TR_SINE, // value = base + sin( time / duration ) * delta
|
254
|
+
TR_GRAVITY
|
255
|
+
} trType_t;
|
256
|
+
|
257
|
+
typedef struct {
|
258
|
+
trType_t trType;
|
259
|
+
int trTime;
|
260
|
+
int trDuration; // if non 0, trTime + trDuration = stop time
|
261
|
+
vec3_t trBase;
|
262
|
+
vec3_t trDelta; // velocity, etc
|
263
|
+
} trajectory_t;
|
264
|
+
|
265
|
+
// entityState_t is the information conveyed from the server
|
266
|
+
// in an update message about entities that the client will
|
267
|
+
// need to render in some way
|
268
|
+
// Different eTypes may use the information in different ways
|
269
|
+
// The messages are delta compressed, so it doesn't really matter if
|
270
|
+
// the structure size is fairly large
|
271
|
+
|
272
|
+
typedef struct entityState_s {
|
273
|
+
int number; // entity index
|
274
|
+
int eType; // entityType_t
|
275
|
+
int eFlags;
|
276
|
+
|
277
|
+
trajectory_t pos; // for calculating position
|
278
|
+
trajectory_t apos; // for calculating angles
|
279
|
+
|
280
|
+
int time;
|
281
|
+
int time2;
|
282
|
+
|
283
|
+
vec3_t origin;
|
284
|
+
vec3_t origin2;
|
285
|
+
|
286
|
+
vec3_t angles;
|
287
|
+
vec3_t angles2;
|
288
|
+
|
289
|
+
int otherEntityNum; // shotgun sources, etc
|
290
|
+
int otherEntityNum2;
|
291
|
+
|
292
|
+
int groundEntityNum; // -1 = in air
|
293
|
+
|
294
|
+
int constantLight; // r + (g<<8) + (b<<16) + (intensity<<24)
|
295
|
+
int loopSound; // constantly loop this sound
|
296
|
+
|
297
|
+
int modelindex;
|
298
|
+
int modelindex2;
|
299
|
+
int clientNum; // 0 to (MAX_CLIENTS - 1), for players and corpses
|
300
|
+
int frame;
|
301
|
+
|
302
|
+
int solid; // for client side prediction, trap_linkentity sets this properly
|
303
|
+
|
304
|
+
int event; // impulse events -- muzzle flashes, footsteps, etc
|
305
|
+
int eventParm;
|
306
|
+
|
307
|
+
// for players
|
308
|
+
int powerups; // bit flags
|
309
|
+
int weapon; // determines weapon and flash model, etc
|
310
|
+
int legsAnim; // mask off ANIM_TOGGLEBIT
|
311
|
+
int torsoAnim; // mask off ANIM_TOGGLEBIT
|
312
|
+
|
313
|
+
int generic1;
|
314
|
+
} entityState_t;
|
315
|
+
|
316
|
+
// ========================================================================================
|
317
|
+
|
318
|
+
//
|
319
|
+
// config strings are a general means of communicating variable length strings
|
320
|
+
// from the server to all connected clients.
|
321
|
+
//
|
322
|
+
|
323
|
+
// CS_SERVERINFO and CS_SYSTEMINFO are defined in q_shared.h
|
324
|
+
#define CS_MUSIC 2
|
325
|
+
#define CS_MESSAGE 3 // from the map worldspawn's message field
|
326
|
+
#define CS_MOTD 4 // g_motd string for server message of the day
|
327
|
+
#define CS_WARMUP 5 // server time when the match will be restarted
|
328
|
+
#define CS_SCORES1 6
|
329
|
+
#define CS_SCORES2 7
|
330
|
+
#define CS_VOTE_TIME 8
|
331
|
+
#define CS_VOTE_STRING 9
|
332
|
+
#define CS_VOTE_YES 10
|
333
|
+
#define CS_VOTE_NO 11
|
334
|
+
|
335
|
+
#define CS_TEAMVOTE_TIME 12
|
336
|
+
#define CS_TEAMVOTE_STRING 14
|
337
|
+
#define CS_TEAMVOTE_YES 16
|
338
|
+
#define CS_TEAMVOTE_NO 18
|
339
|
+
|
340
|
+
#define CS_GAME_VERSION 20
|
341
|
+
#define CS_LEVEL_START_TIME 21 // so the timer only shows the current level
|
342
|
+
#define CS_INTERMISSION 22 // when 1, fraglimit/timelimit has been hit and intermission will start in a second or two
|
343
|
+
#define CS_FLAGSTATUS 23 // string indicating flag status in CTF
|
344
|
+
#define CS_SHADERSTATE 24
|
345
|
+
#define CS_BOTINFO 25
|
346
|
+
|
347
|
+
#define CS_ITEMS 27 // string of 0's and 1's that tell which items are present
|
348
|
+
|
349
|
+
#define CS_MODELS 32
|
350
|
+
#define CS_SOUNDS (CS_MODELS+MAX_MODELS)
|
351
|
+
#define CS_PLAYERS (CS_SOUNDS+MAX_SOUNDS)
|
352
|
+
#define CS_LOCATIONS (CS_PLAYERS+MAX_CLIENTS)
|
353
|
+
#define CS_PARTICLES (CS_LOCATIONS+MAX_LOCATIONS)
|
354
|
+
|
355
|
+
#define CS_MAX (CS_PARTICLES+MAX_LOCATIONS)
|
356
|
+
|
357
|
+
#if (CS_MAX) > MAX_CONFIGSTRINGS
|
358
|
+
#error overflow: (CS_MAX) > MAX_CONFIGSTRINGS
|
359
|
+
#endif
|
360
|
+
|
361
|
+
typedef enum {
|
362
|
+
GT_FFA, // free for all
|
363
|
+
GT_TOURNAMENT, // one on one tournament
|
364
|
+
GT_SINGLE_PLAYER, // single player ffa
|
365
|
+
|
366
|
+
//-- team games go after this --
|
367
|
+
|
368
|
+
GT_TEAM, // team deathmatch
|
369
|
+
GT_CTF, // capture the flag
|
370
|
+
GT_1FCTF,
|
371
|
+
GT_OBELISK,
|
372
|
+
GT_HARVESTER,
|
373
|
+
GT_MAX_GAME_TYPE
|
374
|
+
} gametype_t;
|
375
|
+
|
376
|
+
typedef enum { GENDER_MALE, GENDER_FEMALE, GENDER_NEUTER } gender_t;
|
377
|
+
|
378
|
+
// entityState_t->event values
|
379
|
+
// entity events are for effects that take place reletive
|
380
|
+
// to an existing entities origin. Very network efficient.
|
381
|
+
|
382
|
+
// two bits at the top of the entityState->event field
|
383
|
+
// will be incremented with each change in the event so
|
384
|
+
// that an identical event started twice in a row can
|
385
|
+
// be distinguished. And off the value with ~EV_EVENT_BITS
|
386
|
+
// to retrieve the actual event number
|
387
|
+
#define EV_EVENT_BIT1 0x00000100
|
388
|
+
#define EV_EVENT_BIT2 0x00000200
|
389
|
+
#define EV_EVENT_BITS (EV_EVENT_BIT1|EV_EVENT_BIT2)
|
390
|
+
|
391
|
+
#define EVENT_VALID_MSEC 300
|
392
|
+
|
393
|
+
typedef enum {
|
394
|
+
EV_NONE,
|
395
|
+
|
396
|
+
EV_FOOTSTEP,
|
397
|
+
EV_FOOTSTEP_METAL,
|
398
|
+
EV_FOOTSPLASH,
|
399
|
+
EV_FOOTWADE,
|
400
|
+
EV_SWIM,
|
401
|
+
|
402
|
+
EV_STEP_4,
|
403
|
+
EV_STEP_8,
|
404
|
+
EV_STEP_12,
|
405
|
+
EV_STEP_16,
|
406
|
+
|
407
|
+
EV_FALL_SHORT,
|
408
|
+
EV_FALL_MEDIUM,
|
409
|
+
EV_FALL_FAR,
|
410
|
+
|
411
|
+
EV_JUMP_PAD, // boing sound at origin, jump sound on player
|
412
|
+
|
413
|
+
EV_JUMP,
|
414
|
+
EV_WATER_TOUCH, // foot touches
|
415
|
+
EV_WATER_LEAVE, // foot leaves
|
416
|
+
EV_WATER_UNDER, // head touches
|
417
|
+
EV_WATER_CLEAR, // head leaves
|
418
|
+
|
419
|
+
EV_ITEM_PICKUP, // normal item pickups are predictable
|
420
|
+
EV_GLOBAL_ITEM_PICKUP, // powerup / team sounds are broadcast to everyone
|
421
|
+
|
422
|
+
EV_NOAMMO,
|
423
|
+
EV_CHANGE_WEAPON,
|
424
|
+
EV_FIRE_WEAPON,
|
425
|
+
|
426
|
+
EV_USE_ITEM0,
|
427
|
+
EV_USE_ITEM1,
|
428
|
+
EV_USE_ITEM2,
|
429
|
+
EV_USE_ITEM3,
|
430
|
+
EV_USE_ITEM4,
|
431
|
+
EV_USE_ITEM5,
|
432
|
+
EV_USE_ITEM6,
|
433
|
+
EV_USE_ITEM7,
|
434
|
+
EV_USE_ITEM8,
|
435
|
+
EV_USE_ITEM9,
|
436
|
+
EV_USE_ITEM10,
|
437
|
+
EV_USE_ITEM11,
|
438
|
+
EV_USE_ITEM12,
|
439
|
+
EV_USE_ITEM13,
|
440
|
+
EV_USE_ITEM14,
|
441
|
+
EV_USE_ITEM15,
|
442
|
+
|
443
|
+
EV_ITEM_RESPAWN,
|
444
|
+
EV_ITEM_POP,
|
445
|
+
EV_PLAYER_TELEPORT_IN,
|
446
|
+
EV_PLAYER_TELEPORT_OUT,
|
447
|
+
|
448
|
+
EV_GRENADE_BOUNCE, // eventParm will be the soundindex
|
449
|
+
|
450
|
+
EV_GENERAL_SOUND,
|
451
|
+
EV_GLOBAL_SOUND, // no attenuation
|
452
|
+
EV_GLOBAL_TEAM_SOUND,
|
453
|
+
|
454
|
+
EV_BULLET_HIT_FLESH,
|
455
|
+
EV_BULLET_HIT_WALL,
|
456
|
+
|
457
|
+
EV_MISSILE_HIT,
|
458
|
+
EV_MISSILE_MISS,
|
459
|
+
EV_MISSILE_MISS_METAL,
|
460
|
+
EV_RAILTRAIL,
|
461
|
+
EV_SHOTGUN,
|
462
|
+
EV_BULLET, // otherEntity is the shooter
|
463
|
+
|
464
|
+
EV_PAIN,
|
465
|
+
EV_DEATH1,
|
466
|
+
EV_DEATH2,
|
467
|
+
EV_DEATH3,
|
468
|
+
EV_OBITUARY,
|
469
|
+
|
470
|
+
EV_POWERUP_QUAD,
|
471
|
+
EV_POWERUP_BATTLESUIT,
|
472
|
+
EV_POWERUP_REGEN,
|
473
|
+
|
474
|
+
EV_GIB_PLAYER, // gib a previously living player
|
475
|
+
EV_SCOREPLUM, // score plum
|
476
|
+
|
477
|
+
//#ifdef MISSIONPACK
|
478
|
+
EV_PROXIMITY_MINE_STICK,
|
479
|
+
EV_PROXIMITY_MINE_TRIGGER,
|
480
|
+
EV_KAMIKAZE, // kamikaze explodes
|
481
|
+
EV_OBELISKEXPLODE, // obelisk explodes
|
482
|
+
EV_OBELISKPAIN, // obelisk is in pain
|
483
|
+
EV_INVUL_IMPACT, // invulnerability sphere impact
|
484
|
+
EV_JUICED, // invulnerability juiced effect
|
485
|
+
EV_LIGHTNINGBOLT, // lightning bolt bounced of invulnerability sphere
|
486
|
+
//#endif
|
487
|
+
|
488
|
+
EV_DEBUG_LINE,
|
489
|
+
EV_STOPLOOPINGSOUND,
|
490
|
+
EV_TAUNT,
|
491
|
+
EV_TAUNT_YES,
|
492
|
+
EV_TAUNT_NO,
|
493
|
+
EV_TAUNT_FOLLOWME,
|
494
|
+
EV_TAUNT_GETFLAG,
|
495
|
+
EV_TAUNT_GUARDBASE,
|
496
|
+
EV_TAUNT_PATROL
|
497
|
+
|
498
|
+
} entity_event_t;
|
499
|
+
|
500
|
+
// means of death
|
501
|
+
typedef enum {
|
502
|
+
MOD_UNKNOWN,
|
503
|
+
MOD_SHOTGUN,
|
504
|
+
MOD_GAUNTLET,
|
505
|
+
MOD_MACHINEGUN,
|
506
|
+
MOD_GRENADE,
|
507
|
+
MOD_GRENADE_SPLASH,
|
508
|
+
MOD_ROCKET,
|
509
|
+
MOD_ROCKET_SPLASH,
|
510
|
+
MOD_PLASMA,
|
511
|
+
MOD_PLASMA_SPLASH,
|
512
|
+
MOD_RAILGUN,
|
513
|
+
MOD_LIGHTNING,
|
514
|
+
MOD_BFG,
|
515
|
+
MOD_BFG_SPLASH,
|
516
|
+
MOD_WATER,
|
517
|
+
MOD_SLIME,
|
518
|
+
MOD_LAVA,
|
519
|
+
MOD_CRUSH,
|
520
|
+
MOD_TELEFRAG,
|
521
|
+
MOD_FALLING,
|
522
|
+
MOD_SUICIDE,
|
523
|
+
MOD_TARGET_LASER,
|
524
|
+
MOD_TRIGGER_HURT,
|
525
|
+
#ifdef MISSIONPACK
|
526
|
+
MOD_NAIL,
|
527
|
+
MOD_CHAINGUN,
|
528
|
+
MOD_PROXIMITY_MINE,
|
529
|
+
MOD_KAMIKAZE,
|
530
|
+
MOD_JUICED,
|
531
|
+
#endif
|
532
|
+
MOD_GRAPPLE
|
533
|
+
} meansOfDeath_t;
|
534
|
+
|
535
|
+
//
|
536
|
+
// entityState_t->eType
|
537
|
+
//
|
538
|
+
typedef enum {
|
539
|
+
ET_GENERAL,
|
540
|
+
ET_PLAYER,
|
541
|
+
ET_ITEM,
|
542
|
+
ET_MISSILE,
|
543
|
+
ET_MOVER,
|
544
|
+
ET_BEAM,
|
545
|
+
ET_PORTAL,
|
546
|
+
ET_SPEAKER,
|
547
|
+
ET_PUSH_TRIGGER,
|
548
|
+
ET_TELEPORT_TRIGGER,
|
549
|
+
ET_INVISIBLE,
|
550
|
+
ET_GRAPPLE, // grapple hooked on wall
|
551
|
+
ET_TEAM,
|
552
|
+
|
553
|
+
ET_EVENTS // any of the EV_* events can be added freestanding
|
554
|
+
// by setting eType to ET_EVENTS + eventNum
|
555
|
+
// this avoids having to set eFlags and eventNum
|
556
|
+
} entityType_t;
|
557
|
+
|
558
|
+
char * COM_Parse( char **data_p );
|
559
|
+
|
560
|
+
char * CopyString( const char *in );
|
561
|
+
|
562
|
+
int Cmd_Argc( void );
|
563
|
+
char * Cmd_Argv( int arg );
|
564
|
+
char * Cmd_Args( void );
|
565
|
+
void Cmd_TokenizeString( char *text );
|
566
|
+
|
567
|
+
void Info_Print( const char *s );
|
568
|
+
|