1 // g_local.h -- local definitions for game module
2 
3 #include "q_shared.h"
4 
5 // define GAME_INCLUDE so that game.h does not define the
6 // short, server-visible gclient_t and edict_t structures,
7 // because we define the full size ones in this file
8 #define	GAME_INCLUDE
9 #include "game.h"
10 
11 // the "gameversion" client command will print this plus compile date
12 #define	GAMEVERSION	"baseq2"
13 
14 // protocol bytes that can be directly added to messages
15 #define	svc_muzzleflash		1
16 #define	svc_muzzleflash2	2
17 #define	svc_temp_entity		3
18 #define	svc_layout			4
19 #define	svc_inventory		5
20 #define	svc_stufftext		11
21 
22 //==================================================================
23 
24 #ifndef _WIN32
25 #define min(a,b) ((a) < (b) ? (a) : (b))
26 #define max(a,b) ((a) > (b) ? (a) : (b))
27 #ifdef __sun__
28 #define _isnan(a) (NaN((a)))
29 #else
30 #define _isnan(a) (isnan(a))
31 #endif
32 #endif
33 
34 //==================================================================
35 
36 // view pitching times
37 #define DAMAGE_TIME		0.5
38 #define	FALL_TIME		0.3
39 
40 // ROGUE- id killed this weapon
41 #define	KILL_DISRUPTOR	1
42 // rogue
43 
44 // edict->spawnflags
45 // these are set with checkboxes on each entity in the map editor
46 #define	SPAWNFLAG_NOT_EASY			0x00000100
47 #define	SPAWNFLAG_NOT_MEDIUM		0x00000200
48 #define	SPAWNFLAG_NOT_HARD			0x00000400
49 #define	SPAWNFLAG_NOT_DEATHMATCH	0x00000800
50 #define	SPAWNFLAG_NOT_COOP			0x00001000
51 
52 // edict->flags
53 #define	FL_FLY					0x00000001
54 #define	FL_SWIM					0x00000002	// implied immunity to drowining
55 #define FL_IMMUNE_LASER			0x00000004
56 #define	FL_INWATER				0x00000008
57 #define	FL_GODMODE				0x00000010
58 #define	FL_NOTARGET				0x00000020
59 #define FL_IMMUNE_SLIME			0x00000040
60 #define FL_IMMUNE_LAVA			0x00000080
61 #define	FL_PARTIALGROUND		0x00000100	// not all corners are valid
62 #define	FL_WATERJUMP			0x00000200	// player jumping out of water
63 #define	FL_TEAMSLAVE			0x00000400	// not the first on the team
64 #define FL_NO_KNOCKBACK			0x00000800
65 #define FL_POWER_ARMOR			0x00001000	// power armor (if any) is active
66 #define FL_RESPAWN				0x80000000	// used for item respawning
67 
68 //ROGUE
69 #define FL_MECHANICAL			0x00002000	// entity is mechanical, use sparks not blood
70 #define FL_SAM_RAIMI			0x00004000	// entity is in sam raimi cam mode
71 #define FL_DISGUISED			0x00008000	// entity is in disguise, monsters will not recognize.
72 #define	FL_NOGIB				0x00010000	// player has been vaporized by a nuke, drop no gibs
73 //ROGUE
74 
75 #define	FRAMETIME		0.1
76 
77 // memory tags to allow dynamic memory to be cleaned up
78 #define	TAG_GAME	765		// clear when unloading the dll
79 #define	TAG_LEVEL	766		// clear when loading a new level
80 
81 
82 #define MELEE_DISTANCE	80
83 
84 #define BODY_QUEUE_SIZE		8
85 
86 typedef enum
87 {
88 	DAMAGE_NO,
89 	DAMAGE_YES,			// will take damage if hit
90 	DAMAGE_AIM			// auto targeting recognizes this
91 } damage_t;
92 
93 typedef enum
94 {
95 	WEAPON_READY,
96 	WEAPON_ACTIVATING,
97 	WEAPON_DROPPING,
98 	WEAPON_FIRING
99 } weaponstate_t;
100 
101 typedef enum
102 {
103 	AMMO_BULLETS,
104 	AMMO_SHELLS,
105 	AMMO_ROCKETS,
106 	AMMO_GRENADES,
107 	AMMO_CELLS,
108 	AMMO_SLUGS,
109 
110 	//ROGUE
111 	AMMO_FLECHETTES,
112 	AMMO_TESLA,
113 #ifdef KILL_DISRUPTOR
114 	AMMO_PROX
115 #else
116 	AMMO_PROX,
117 	AMMO_DISRUPTOR
118 #endif
119 } ammo_t;
120 
121 
122 //deadflag
123 #define DEAD_NO					0
124 #define DEAD_DYING				1
125 #define DEAD_DEAD				2
126 #define DEAD_RESPAWNABLE		3
127 
128 //range
129 #define RANGE_MELEE				0
130 #define RANGE_NEAR				1
131 #define RANGE_MID				2
132 #define RANGE_FAR				3
133 
134 //gib types
135 #define GIB_ORGANIC				0
136 #define GIB_METALLIC			1
137 
138 //monster ai flags
139 #define AI_STAND_GROUND			0x00000001
140 #define AI_TEMP_STAND_GROUND	0x00000002
141 #define AI_SOUND_TARGET			0x00000004
142 #define AI_LOST_SIGHT			0x00000008
143 #define AI_PURSUIT_LAST_SEEN	0x00000010
144 #define AI_PURSUE_NEXT			0x00000020
145 #define AI_PURSUE_TEMP			0x00000040
146 #define AI_HOLD_FRAME			0x00000080
147 #define AI_GOOD_GUY				0x00000100
148 #define AI_BRUTAL				0x00000200
149 #define AI_NOSTEP				0x00000400
150 #define AI_DUCKED				0x00000800
151 #define AI_COMBAT_POINT			0x00001000
152 #define AI_MEDIC				0x00002000
153 #define AI_RESURRECTING			0x00004000
154 
155 //ROGUE
156 #define AI_WALK_WALLS			0x00008000
157 #define AI_MANUAL_STEERING		0x00010000
158 #define AI_TARGET_ANGER			0x00020000
159 #define AI_DODGING				0x00040000
160 #define AI_CHARGING				0x00080000
161 #define AI_HINT_PATH			0x00100000
162 #define	AI_IGNORE_SHOTS			0x00200000
163 // PMM - FIXME - last second added for E3 .. there's probably a better way to do this, but
164 // this works
165 #define	AI_DO_NOT_COUNT			0x00400000	// set for healed monsters
166 #define	AI_SPAWNED_CARRIER		0x00800000	// both do_not_count and spawned are set for spawned monsters
167 #define	AI_SPAWNED_MEDIC_C		0x01000000	// both do_not_count and spawned are set for spawned monsters
168 #define	AI_SPAWNED_WIDOW		0x02000000	// both do_not_count and spawned are set for spawned monsters
169 #define AI_SPAWNED_MASK			0x03800000	// mask to catch all three flavors of spawned
170 #define	AI_BLOCKED				0x04000000	// used by blocked_checkattack: set to say I'm attacking while blocked
171 											// (prevents run-attacks)
172 //ROGUE
173 
174 //monster attack state
175 #define AS_STRAIGHT				1
176 #define AS_SLIDING				2
177 #define	AS_MELEE				3
178 #define	AS_MISSILE				4
179 #define	AS_BLIND				5	// PMM - used by boss code to do nasty things even if it can't see you
180 
181 // armor types
182 #define ARMOR_NONE				0
183 #define ARMOR_JACKET			1
184 #define ARMOR_COMBAT			2
185 #define ARMOR_BODY				3
186 #define ARMOR_SHARD				4
187 
188 // power armor types
189 #define POWER_ARMOR_NONE		0
190 #define POWER_ARMOR_SCREEN		1
191 #define POWER_ARMOR_SHIELD		2
192 
193 // handedness values
194 #define RIGHT_HANDED			0
195 #define LEFT_HANDED				1
196 #define CENTER_HANDED			2
197 
198 
199 // game.serverflags values
200 #define SFL_CROSS_TRIGGER_1		0x00000001
201 #define SFL_CROSS_TRIGGER_2		0x00000002
202 #define SFL_CROSS_TRIGGER_3		0x00000004
203 #define SFL_CROSS_TRIGGER_4		0x00000008
204 #define SFL_CROSS_TRIGGER_5		0x00000010
205 #define SFL_CROSS_TRIGGER_6		0x00000020
206 #define SFL_CROSS_TRIGGER_7		0x00000040
207 #define SFL_CROSS_TRIGGER_8		0x00000080
208 #define SFL_CROSS_TRIGGER_MASK	0x000000ff
209 
210 
211 // noise types for PlayerNoise
212 #define PNOISE_SELF				0
213 #define PNOISE_WEAPON			1
214 #define PNOISE_IMPACT			2
215 
216 
217 // edict->movetype values
218 typedef enum
219 {
220 MOVETYPE_NONE,			// never moves
221 MOVETYPE_NOCLIP,		// origin and angles change with no interaction
222 MOVETYPE_PUSH,			// no clip to world, push on box contact
223 MOVETYPE_STOP,			// no clip to world, stops on box contact
224 
225 MOVETYPE_WALK,			// gravity
226 MOVETYPE_STEP,			// gravity, special edge handling
227 MOVETYPE_FLY,
228 MOVETYPE_TOSS,			// gravity
229 MOVETYPE_FLYMISSILE,	// extra size to monsters
230 MOVETYPE_BOUNCE,
231 MOVETYPE_NEWTOSS		// PGM - for deathball
232 } movetype_t;
233 
234 
235 
236 typedef struct
237 {
238 	int		base_count;
239 	int		max_count;
240 	float	normal_protection;
241 	float	energy_protection;
242 	int		armor;
243 } gitem_armor_t;
244 
245 
246 // gitem_t->flags
247 #define	IT_WEAPON			0x00000001		// use makes active weapon
248 #define	IT_AMMO				0x00000002
249 #define IT_ARMOR			0x00000004
250 #define IT_STAY_COOP		0x00000008
251 #define IT_KEY				0x00000010
252 #define IT_POWERUP			0x00000020
253 
254 // ROGUE
255 #define IT_MELEE			0x00000040
256 #define IT_NOT_GIVEABLE		0x00000080	// item can not be given
257 // ROGUE
258 
259 // gitem_t->weapmodel for weapons indicates model index
260 #define WEAP_BLASTER			1
261 #define WEAP_SHOTGUN			2
262 #define WEAP_SUPERSHOTGUN		3
263 #define WEAP_MACHINEGUN			4
264 #define WEAP_CHAINGUN			5
265 #define WEAP_GRENADES			6
266 #define WEAP_GRENADELAUNCHER	7
267 #define WEAP_ROCKETLAUNCHER		8
268 #define WEAP_HYPERBLASTER		9
269 #define WEAP_RAILGUN			10
270 #define WEAP_BFG				11
271 
272 #define WEAP_DISRUPTOR			12		// PGM
273 #define WEAP_ETFRIFLE			13		// PGM
274 #define WEAP_PLASMA				14		// PGM
275 #define WEAP_PROXLAUNCH			15		// PGM
276 #define WEAP_CHAINFIST			16		// PGM
277 
278 typedef struct gitem_s
279 {
280 	char		*classname;	// spawning name
281 	qboolean	(*pickup)(struct edict_s *ent, struct edict_s *other);
282 	void		(*use)(struct edict_s *ent, struct gitem_s *item);
283 	void		(*drop)(struct edict_s *ent, struct gitem_s *item);
284 	void		(*weaponthink)(struct edict_s *ent);
285 	char		*pickup_sound;
286 	char		*world_model;
287 	int			world_model_flags;
288 	char		*view_model;
289 
290 	// client side info
291 	char		*icon;
292 	char		*pickup_name;	// for printing on pickup
293 	int			count_width;		// number of digits to display by icon
294 
295 	int			quantity;		// for ammo how much, for weapons how much is used per shot
296 	char		*ammo;			// for weapons
297 	int			flags;			// IT_* flags
298 
299 	int			weapmodel;		// weapon model index (for weapons)
300 
301 	void		*info;
302 	int			tag;
303 
304 	char		*precaches;		// string of all models, sounds, and images this item will use
305 } gitem_t;
306 
307 
308 
309 //
310 // this structure is left intact through an entire game
311 // it should be initialized at dll load time, and read/written to
312 // the server.ssv file for savegames
313 //
314 typedef struct
315 {
316 	char		helpmessage1[512];
317 	char		helpmessage2[512];
318 	int			helpchanged;	// flash F1 icon if non 0, play sound
319 								// and increment only if 1, 2, or 3
320 
321 	gclient_t	*clients;		// [maxclients]
322 
323 	// can't store spawnpoint in level, because
324 	// it would get overwritten by the savegame restore
325 	char		spawnpoint[512];	// needed for coop respawns
326 
327 	// store latched cvars here that we want to get at often
328 	int			maxclients;
329 	int			maxentities;
330 
331 	// cross level triggers
332 	int			serverflags;
333 
334 	// items
335 	int			num_items;
336 
337 	qboolean	autosaved;
338 } game_locals_t;
339 
340 
341 //
342 // this structure is cleared as each map is entered
343 // it is read/written to the level.sav file for savegames
344 //
345 typedef struct
346 {
347 	int			framenum;
348 	float		time;
349 
350 	char		level_name[MAX_QPATH];	// the descriptive name (Outer Base, etc)
351 	char		mapname[MAX_QPATH];		// the server name (base1, etc)
352 	char		nextmap[MAX_QPATH];		// go here when fraglimit is hit
353 
354 	// intermission state
355 	float		intermissiontime;		// time the intermission was started
356 	char		*changemap;
357 	int			exitintermission;
358 	vec3_t		intermission_origin;
359 	vec3_t		intermission_angle;
360 
361 	edict_t		*sight_client;	// changed once each frame for coop games
362 
363 	edict_t		*sight_entity;
364 	int			sight_entity_framenum;
365 	edict_t		*sound_entity;
366 	int			sound_entity_framenum;
367 	edict_t		*sound2_entity;
368 	int			sound2_entity_framenum;
369 
370 	int			pic_health;
371 
372 	int			total_secrets;
373 	int			found_secrets;
374 
375 	int			total_goals;
376 	int			found_goals;
377 
378 	int			total_monsters;
379 	int			killed_monsters;
380 
381 	edict_t		*current_entity;	// entity running from G_RunFrame
382 	int			body_que;			// dead bodies
383 
384 	int			power_cubes;		// ugly necessity for coop
385 
386 	// ROGUE
387 	edict_t		*disguise_violator;
388 	int			disguise_violation_framenum;
389 	// ROGUE
390 } level_locals_t;
391 
392 
393 // spawn_temp_t is only used to hold entity field values that
394 // can be set from the editor, but aren't actualy present
395 // in edict_t during gameplay
396 typedef struct
397 {
398 	// world vars
399 	char		*sky;
400 	float		skyrotate;
401 	vec3_t		skyaxis;
402 	char		*nextmap;
403 
404 	int			lip;
405 	int			distance;
406 	int			height;
407 	char		*noise;
408 	float		pausetime;
409 	char		*item;
410 	char		*gravity;
411 
412 	float		minyaw;
413 	float		maxyaw;
414 	float		minpitch;
415 	float		maxpitch;
416 } spawn_temp_t;
417 
418 
419 typedef struct
420 {
421 	// fixed data
422 	vec3_t		start_origin;
423 	vec3_t		start_angles;
424 	vec3_t		end_origin;
425 	vec3_t		end_angles;
426 
427 	int			sound_start;
428 	int			sound_middle;
429 	int			sound_end;
430 
431 	float		accel;
432 	float		speed;
433 	float		decel;
434 	float		distance;
435 
436 	float		wait;
437 
438 	// state data
439 	int			state;
440 	vec3_t		dir;
441 	float		current_speed;
442 	float		move_speed;
443 	float		next_speed;
444 	float		remaining_distance;
445 	float		decel_distance;
446 	void		(*endfunc)(edict_t *);
447 } moveinfo_t;
448 
449 
450 typedef struct
451 {
452 	void	(*aifunc)(edict_t *self, float dist);
453 	float	dist;
454 	void	(*thinkfunc)(edict_t *self);
455 } mframe_t;
456 
457 typedef struct
458 {
459 	int			firstframe;
460 	int			lastframe;
461 	mframe_t	*frame;
462 	void		(*endfunc)(edict_t *self);
463 } mmove_t;
464 
465 typedef struct
466 {
467 	mmove_t		*currentmove;
468 	unsigned int	aiflags;		// PGM - unsigned, since we're close to the max
469 	int			nextframe;
470 	float		scale;
471 
472 	void		(*stand)(edict_t *self);
473 	void		(*idle)(edict_t *self);
474 	void		(*search)(edict_t *self);
475 	void		(*walk)(edict_t *self);
476 	void		(*run)(edict_t *self);
477 	void		(*dodge)(edict_t *self, edict_t *other, float eta, trace_t *tr);
478 	void		(*attack)(edict_t *self);
479 	void		(*melee)(edict_t *self);
480 	void		(*sight)(edict_t *self, edict_t *other);
481 	qboolean	(*checkattack)(edict_t *self);
482 
483 	float		pausetime;
484 	float		attack_finished;
485 
486 	vec3_t		saved_goal;
487 	float		search_time;
488 	float		trail_time;
489 	vec3_t		last_sighting;
490 	int			attack_state;
491 	int			lefty;
492 	float		idle_time;
493 	int			linkcount;
494 
495 	int			power_armor_type;
496 	int			power_armor_power;
497 
498 //ROGUE
499 	qboolean	(*blocked)(edict_t *self, float dist);
500 //	edict_t		*last_hint;			// last hint_path the monster touched
501 	float		last_hint_time;		// last time the monster checked for hintpaths.
502 	edict_t		*goal_hint;			// which hint_path we're trying to get to
503 	int			medicTries;
504 	edict_t		*badMedic1, *badMedic2;	// these medics have declared this monster "unhealable"
505 	edict_t		*healer;	// this is who is healing this monster
506 	void		(*duck)(edict_t *self, float eta);
507 	void		(*unduck)(edict_t *self);
508 	void		(*sidestep)(edict_t *self);
509 	//  while abort_duck would be nice, only monsters which duck but don't sidestep would use it .. only the brain
510 	//  not really worth it.  sidestep is an implied abort_duck
511 //	void		(*abort_duck)(edict_t *self);
512 	float		base_height;
513 	float		next_duck_time;
514 	float		duck_wait_time;
515 	edict_t		*last_player_enemy;
516 	// blindfire stuff .. the boolean says whether the monster will do it, and blind_fire_time is the timing
517 	// (set in the monster) of the next shot
518 	qboolean	blindfire;		// will the monster blindfire?
519 	float		blind_fire_delay;
520 	vec3_t		blind_fire_target;
521 	// used by the spawners to not spawn too much and keep track of #s of monsters spawned
522 	int			monster_slots;
523 	int			monster_used;
524 	edict_t		*commander;
525 	// powerup timers, used by widow, our friend
526 	float		quad_framenum;
527 	float		invincible_framenum;
528 	float		double_framenum;
529 //ROGUE
530 } monsterinfo_t;
531 
532 // ROGUE
533 // this determines how long to wait after a duck to duck again.  this needs to be longer than
534 // the time after the monster_duck_up in all of the animation sequences
535 #define	DUCK_INTERVAL	0.5
536 // ROGUE
537 
538 extern	game_locals_t	game;
539 extern	level_locals_t	level;
540 extern	game_import_t	gi;
541 extern	game_export_t	globals;
542 extern	spawn_temp_t	st;
543 
544 extern	int	sm_meat_index;
545 extern	int	snd_fry;
546 
547 extern	int	jacket_armor_index;
548 extern	int	combat_armor_index;
549 extern	int	body_armor_index;
550 
551 
552 // means of death
553 #define MOD_UNKNOWN			0
554 #define MOD_BLASTER			1
555 #define MOD_SHOTGUN			2
556 #define MOD_SSHOTGUN		3
557 #define MOD_MACHINEGUN		4
558 #define MOD_CHAINGUN		5
559 #define MOD_GRENADE			6
560 #define MOD_G_SPLASH		7
561 #define MOD_ROCKET			8
562 #define MOD_R_SPLASH		9
563 #define MOD_HYPERBLASTER	10
564 #define MOD_RAILGUN			11
565 #define MOD_BFG_LASER		12
566 #define MOD_BFG_BLAST		13
567 #define MOD_BFG_EFFECT		14
568 #define MOD_HANDGRENADE		15
569 #define MOD_HG_SPLASH		16
570 #define MOD_WATER			17
571 #define MOD_SLIME			18
572 #define MOD_LAVA			19
573 #define MOD_CRUSH			20
574 #define MOD_TELEFRAG		21
575 #define MOD_FALLING			22
576 #define MOD_SUICIDE			23
577 #define MOD_HELD_GRENADE	24
578 #define MOD_EXPLOSIVE		25
579 #define MOD_BARREL			26
580 #define MOD_BOMB			27
581 #define MOD_EXIT			28
582 #define MOD_SPLASH			29
583 #define MOD_TARGET_LASER	30
584 #define MOD_TRIGGER_HURT	31
585 #define MOD_HIT				32
586 #define MOD_TARGET_BLASTER	33
587 #define MOD_FRIENDLY_FIRE	0x8000000
588 
589 //========
590 //ROGUE
591 #define MOD_CHAINFIST			40
592 #define MOD_DISINTEGRATOR		41
593 #define MOD_ETF_RIFLE			42
594 #define MOD_BLASTER2			43
595 #define MOD_HEATBEAM			44
596 #define MOD_TESLA				45
597 #define MOD_PROX				46
598 #define MOD_NUKE				47
599 #define MOD_VENGEANCE_SPHERE	48
600 #define MOD_HUNTER_SPHERE		49
601 #define MOD_DEFENDER_SPHERE		50
602 #define MOD_TRACKER				51
603 #define MOD_DBALL_CRUSH			52
604 #define MOD_DOPPLE_EXPLODE		53
605 #define MOD_DOPPLE_VENGEANCE	54
606 #define MOD_DOPPLE_HUNTER		55
607 //ROGUE
608 //========
609 
610 extern	int	meansOfDeath;
611 
612 
613 extern	edict_t			*g_edicts;
614 
615 #define	FOFS(x) (int)&(((edict_t *)0)->x)
616 #define	STOFS(x) (int)&(((spawn_temp_t *)0)->x)
617 #define	LLOFS(x) (int)&(((level_locals_t *)0)->x)
618 #define	CLOFS(x) (int)&(((gclient_t *)0)->x)
619 
620 #define random()	((rand () & 0x7fff) / ((float)0x7fff))
621 #define crandom()	(2.0 * (random() - 0.5))
622 
623 extern	cvar_t	*maxentities;
624 extern	cvar_t	*deathmatch;
625 extern	cvar_t	*coop;
626 extern	cvar_t	*dmflags;
627 extern	cvar_t	*skill;
628 extern	cvar_t	*fraglimit;
629 extern	cvar_t	*timelimit;
630 extern	cvar_t	*password;
631 extern	cvar_t	*spectator_password;
632 extern	cvar_t	*g_select_empty;
633 extern	cvar_t	*dedicated;
634 
635 extern	cvar_t	*filterban;
636 
637 extern	cvar_t	*sv_gravity;
638 extern	cvar_t	*sv_maxvelocity;
639 
640 extern	cvar_t	*gun_x, *gun_y, *gun_z;
641 extern	cvar_t	*sv_rollspeed;
642 extern	cvar_t	*sv_rollangle;
643 
644 extern	cvar_t	*run_pitch;
645 extern	cvar_t	*run_roll;
646 extern	cvar_t	*bob_up;
647 extern	cvar_t	*bob_pitch;
648 extern	cvar_t	*bob_roll;
649 
650 extern	cvar_t	*sv_cheats;
651 extern	cvar_t	*maxclients;
652 extern	cvar_t	*maxspectators;
653 
654 extern	cvar_t	*flood_msgs;
655 extern	cvar_t	*flood_persecond;
656 extern	cvar_t	*flood_waitdelay;
657 
658 extern	cvar_t	*sv_maplist;
659 
660 extern	cvar_t	*sv_stopspeed;		// PGM - this was a define in g_phys.c
661 
662 //ROGUE
663 extern	cvar_t	*g_showlogic;
664 extern	cvar_t	*gamerules;
665 extern	cvar_t	*huntercam;
666 extern	cvar_t	*strong_mines;
667 extern	cvar_t	*randomrespawn;
668 
669 // this is for the count of monsters
670 #define ENT_SLOTS_LEFT		(ent->monsterinfo.monster_slots - ent->monsterinfo.monster_used)
671 #define SELF_SLOTS_LEFT		(self->monsterinfo.monster_slots - self->monsterinfo.monster_used)
672 //ROGUE
673 
674 #define world	(&g_edicts[0])
675 
676 // item spawnflags
677 #define ITEM_TRIGGER_SPAWN		0x00000001
678 #define ITEM_NO_TOUCH			0x00000002
679 // 6 bits reserved for editor flags
680 // 8 bits used as power cube id bits for coop games
681 #define DROPPED_ITEM			0x00010000
682 #define	DROPPED_PLAYER_ITEM		0x00020000
683 #define ITEM_TARGETS_USED		0x00040000
684 
685 //
686 // fields are needed for spawning from the entity string
687 // and saving / loading games
688 //
689 #define FFL_SPAWNTEMP		1
690 #define FFL_NOSPAWN			2
691 
692 typedef enum {
693 	F_INT,
694 	F_FLOAT,
695 	F_LSTRING,			// string on disk, pointer in memory, TAG_LEVEL
696 	F_GSTRING,			// string on disk, pointer in memory, TAG_GAME
697 	F_VECTOR,
698 	F_ANGLEHACK,
699 	F_EDICT,			// index on disk, pointer in memory
700 	F_ITEM,				// index on disk, pointer in memory
701 	F_CLIENT,			// index on disk, pointer in memory
702 	F_FUNCTION,
703 	F_MMOVE,
704 	F_IGNORE
705 } fieldtype_t;
706 
707 typedef struct
708 {
709 	char	*name;
710 	int		ofs;
711 	fieldtype_t	type;
712 	int		flags;
713 } field_t;
714 
715 
716 extern	field_t fields[];
717 extern	gitem_t	itemlist[];
718 
719 
720 //
721 // g_cmds.c
722 //
723 void Cmd_Help_f (edict_t *ent);
724 void Cmd_Score_f (edict_t *ent);
725 
726 //
727 // g_items.c
728 //
729 void PrecacheItem (gitem_t *it);
730 void InitItems (void);
731 void SetItemNames (void);
732 gitem_t	*FindItem (char *pickup_name);
733 gitem_t	*FindItemByClassname (char *classname);
734 #define	ITEM_INDEX(x) ((x)-itemlist)
735 edict_t *Drop_Item (edict_t *ent, gitem_t *item);
736 void SetRespawn (edict_t *ent, float delay);
737 void ChangeWeapon (edict_t *ent);
738 void SpawnItem (edict_t *ent, gitem_t *item);
739 void Think_Weapon (edict_t *ent);
740 int ArmorIndex (edict_t *ent);
741 int PowerArmorType (edict_t *ent);
742 gitem_t	*GetItemByIndex (int index);
743 qboolean Add_Ammo (edict_t *ent, gitem_t *item, int count);
744 void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf);
745 
746 //
747 // g_utils.c
748 //
749 qboolean	KillBox (edict_t *ent);
750 void	G_ProjectSource (vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result);
751 edict_t *G_Find (edict_t *from, int fieldofs, char *match);
752 edict_t *findradius (edict_t *from, vec3_t org, float rad);
753 edict_t *G_PickTarget (char *targetname);
754 void	G_UseTargets (edict_t *ent, edict_t *activator);
755 void	G_SetMovedir (vec3_t angles, vec3_t movedir);
756 
757 void	G_InitEdict (edict_t *e);
758 edict_t	*G_Spawn (void);
759 void	G_FreeEdict (edict_t *e);
760 
761 void	G_TouchTriggers (edict_t *ent);
762 void	G_TouchSolids (edict_t *ent);
763 
764 char	*G_CopyString (char *in);
765 
766 float	*tv (float x, float y, float z);
767 char	*vtos (vec3_t v);
768 
769 float vectoyaw (vec3_t vec);
770 void vectoangles (vec3_t vec, vec3_t angles);
771 
772 //ROGUE
773 void	G_ProjectSource2 (vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t up, vec3_t result);
774 float	vectoyaw2 (vec3_t vec);
775 void	vectoangles2 (vec3_t vec, vec3_t angles);
776 edict_t *findradius2 (edict_t *from, vec3_t org, float rad);
777 //ROGUE
778 
779 //
780 // g_combat.c
781 //
782 qboolean OnSameTeam (edict_t *ent1, edict_t *ent2);
783 qboolean CanDamage (edict_t *targ, edict_t *inflictor);
784 void T_Damage (edict_t *targ, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t normal, int damage, int knockback, int dflags, int mod);
785 void T_RadiusDamage (edict_t *inflictor, edict_t *attacker, float damage, edict_t *ignore, float radius, int mod);
786 
787 //ROGUE
788 void T_RadiusNukeDamage (edict_t *inflictor, edict_t *attacker, float damage, edict_t *ignore, float radius, int mod);
789 void T_RadiusClassDamage (edict_t *inflictor, edict_t *attacker, float damage, char *ignoreClass, float radius, int mod);
790 void cleanupHealTarget (edict_t *ent);
791 //ROGUE
792 
793 // damage flags
794 #define DAMAGE_RADIUS			0x00000001	// damage was indirect
795 #define DAMAGE_NO_ARMOR			0x00000002	// armour does not protect from this damage
796 #define DAMAGE_ENERGY			0x00000004	// damage is from an energy based weapon
797 #define DAMAGE_NO_KNOCKBACK		0x00000008	// do not affect velocity, just view angles
798 #define DAMAGE_BULLET			0x00000010  // damage is from a bullet (used for ricochets)
799 #define DAMAGE_NO_PROTECTION	0x00000020  // armor, shields, invulnerability, and godmode have no effect
800 //ROGUE
801 #define DAMAGE_DESTROY_ARMOR	0x00000040	// damage is done to armor and health.
802 #define DAMAGE_NO_REG_ARMOR		0x00000080	// damage skips regular armor
803 #define DAMAGE_NO_POWER_ARMOR	0x00000100	// damage skips power armor
804 //ROGUE
805 
806 
807 #define DEFAULT_BULLET_HSPREAD	300
808 #define DEFAULT_BULLET_VSPREAD	500
809 #define DEFAULT_SHOTGUN_HSPREAD	1000
810 #define DEFAULT_SHOTGUN_VSPREAD	500
811 #define DEFAULT_DEATHMATCH_SHOTGUN_COUNT	12
812 #define DEFAULT_SHOTGUN_COUNT	12
813 #define DEFAULT_SSHOTGUN_COUNT	20
814 
815 //
816 // g_monster.c
817 //
818 void monster_fire_bullet (edict_t *self, vec3_t start, vec3_t dir, int damage, int kick, int hspread, int vspread, int flashtype);
819 void monster_fire_shotgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int count, int flashtype);
820 void monster_fire_blaster (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype, int effect);
821 void monster_fire_grenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int flashtype);
822 void monster_fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype);
823 void monster_fire_railgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int flashtype);
824 void monster_fire_bfg (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int kick, float damage_radius, int flashtype);
825 void M_droptofloor (edict_t *ent);
826 void monster_think (edict_t *self);
827 void walkmonster_start (edict_t *self);
828 void swimmonster_start (edict_t *self);
829 void flymonster_start (edict_t *self);
830 void AttackFinished (edict_t *self, float time);
831 void monster_death_use (edict_t *self);
832 void M_CatagorizePosition (edict_t *ent);
833 qboolean M_CheckAttack (edict_t *self);
834 void M_FlyCheck (edict_t *self);
835 void M_CheckGround (edict_t *ent);
836 //ROGUE
837 void monster_fire_blaster2 (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype, int effect);
838 void monster_fire_tracker (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, edict_t *enemy, int flashtype);
839 void monster_fire_heat (edict_t *self, vec3_t start, vec3_t dir, vec3_t offset, int damage, int kick, int flashtype);
840 void stationarymonster_start (edict_t *self);
841 void monster_done_dodge (edict_t *self);
842 //ROGUE
843 
844 
845 //
846 // g_misc.c
847 //
848 void ThrowHead (edict_t *self, char *gibname, int damage, int type);
849 void ThrowClientHead (edict_t *self, int damage);
850 void ThrowGib (edict_t *self, char *gibname, int damage, int type);
851 void BecomeExplosion1(edict_t *self);
852 
853 //
854 // g_ai.c
855 //
856 void AI_SetSightClient (void);
857 
858 void ai_stand (edict_t *self, float dist);
859 void ai_move (edict_t *self, float dist);
860 void ai_walk (edict_t *self, float dist);
861 void ai_turn (edict_t *self, float dist);
862 void ai_run (edict_t *self, float dist);
863 void ai_charge (edict_t *self, float dist);
864 int range (edict_t *self, edict_t *other);
865 
866 void FoundTarget (edict_t *self);
867 qboolean infront (edict_t *self, edict_t *other);
868 qboolean visible (edict_t *self, edict_t *other);
869 qboolean FacingIdeal(edict_t *self);
870 
871 //
872 // g_weapon.c
873 //
874 void ThrowDebris (edict_t *self, char *modelname, float speed, vec3_t origin);
875 qboolean fire_hit (edict_t *self, vec3_t aim, int damage, int kick);
876 void fire_bullet (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int mod);
877 void fire_shotgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int count, int mod);
878 void fire_blaster (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int effect, qboolean hyper);
879 void fire_grenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius);
880 void fire_grenade2 (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius, qboolean held);
881 void fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage);
882 void fire_rail (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick);
883 void fire_bfg (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius);
884 
885 //
886 // g_ptrail.c
887 //
888 void PlayerTrail_Init (void);
889 void PlayerTrail_Add (vec3_t spot);
890 void PlayerTrail_New (vec3_t spot);
891 edict_t *PlayerTrail_PickFirst (edict_t *self);
892 edict_t *PlayerTrail_PickNext (edict_t *self);
893 edict_t	*PlayerTrail_LastSpot (void);
894 
895 //
896 // g_client.c
897 //
898 void respawn (edict_t *ent);
899 void BeginIntermission (edict_t *targ);
900 void PutClientInServer (edict_t *ent);
901 void InitClientPersistant (gclient_t *client);
902 void InitClientResp (gclient_t *client);
903 void InitBodyQue (void);
904 void ClientBeginServerFrame (edict_t *ent);
905 
906 //
907 // g_player.c
908 //
909 void player_pain (edict_t *self, edict_t *other, float kick, int damage);
910 void player_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
911 
912 //
913 // g_svcmds.c
914 //
915 void	ServerCommand (void);
916 qboolean SV_FilterPacket (char *from);
917 
918 //
919 // p_view.c
920 //
921 void ClientEndServerFrame (edict_t *ent);
922 
923 //
924 // p_hud.c
925 //
926 void MoveClientToIntermission (edict_t *client);
927 void G_SetStats (edict_t *ent);
928 void G_SetSpectatorStats (edict_t *ent);
929 void G_CheckChaseStats (edict_t *ent);
930 void ValidateSelectedItem (edict_t *ent);
931 void DeathmatchScoreboardMessage (edict_t *client, edict_t *killer);
932 
933 //
934 // g_pweapon.c
935 //
936 void PlayerNoise(edict_t *who, vec3_t where, int type);
937 
938 //
939 // m_move.c
940 //
941 qboolean M_CheckBottom (edict_t *ent);
942 qboolean M_walkmove (edict_t *ent, float yaw, float dist);
943 void M_MoveToGoal (edict_t *ent, float dist);
944 void M_ChangeYaw (edict_t *ent);
945 
946 //
947 // g_phys.c
948 //
949 void G_RunEntity (edict_t *ent);
950 
951 //
952 // g_main.c
953 //
954 void SaveClientData (void);
955 void FetchClientEntData (edict_t *ent);
956 
957 //
958 // g_chase.c
959 //
960 void UpdateChaseCam(edict_t *ent);
961 void ChaseNext(edict_t *ent);
962 void ChasePrev(edict_t *ent);
963 void GetChaseTarget(edict_t *ent);
964 
965 
966 //====================
967 // ROGUE PROTOTYPES
968 //
969 // g_newweap.c
970 //
971 //extern float nuke_framenum;
972 
973 void fire_flechette (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int kick);
974 void fire_prox (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed);
975 void fire_nuke (edict_t *self, vec3_t start, vec3_t aimdir, int speed);
976 void fire_flame (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed);
977 void fire_burst (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed);
978 void fire_maintain (edict_t *, edict_t *, vec3_t start, vec3_t aimdir, int damage, int speed);
979 void fire_incendiary_grenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius);
980 void fire_player_melee (edict_t *self, vec3_t start, vec3_t aim, int reach, int damage, int kick, int quiet, int mod);
981 void fire_tesla (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed);
982 void fire_blaster2 (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int effect, qboolean hyper);
983 void fire_heat (edict_t *self, vec3_t start, vec3_t aimdir, vec3_t offset, int damage, int kick, qboolean monster);
984 void fire_tracker (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, edict_t *enemy);
985 
986 //
987 // g_newai.c
988 //
989 qboolean blocked_checkshot (edict_t *self, float shotChance);
990 qboolean blocked_checkplat (edict_t *self, float dist);
991 qboolean blocked_checkjump (edict_t *self, float dist, float maxDown, float maxUp);
992 qboolean blocked_checknewenemy (edict_t *self);
993 qboolean monsterlost_checkhint (edict_t *self);
994 qboolean inback (edict_t *self, edict_t *other);
995 float realrange (edict_t *self, edict_t *other);
996 edict_t *SpawnBadArea(vec3_t mins, vec3_t maxs, float lifespan, edict_t *owner);
997 edict_t *CheckForBadArea(edict_t *ent);
998 qboolean MarkTeslaArea(edict_t *self, edict_t *tesla);
999 void InitHintPaths (void);
1000 void PredictAim (edict_t *target, vec3_t start, float bolt_speed, qboolean eye_height, float offset, vec3_t aimdir, vec3_t aimpoint);
1001 qboolean below (edict_t *self, edict_t *other);
1002 void drawbbox (edict_t *self);
1003 void M_MonsterDodge (edict_t *self, edict_t *attacker, float eta, trace_t *tr);
1004 void monster_duck_down (edict_t *self);
1005 void monster_duck_hold (edict_t *self);
1006 void monster_duck_up (edict_t *self);
1007 qboolean has_valid_enemy (edict_t *self);
1008 void TargetTesla (edict_t *self, edict_t *tesla);
1009 void hintpath_stop (edict_t *self);
1010 edict_t * PickCoopTarget (edict_t *self);
1011 int CountPlayers (void);
1012 void monster_jump_start (edict_t *self);
1013 qboolean monster_jump_finished (edict_t *self);
1014 
1015 
1016 //
1017 // g_sphere.c
1018 //
1019 void Defender_Launch (edict_t *self);
1020 void Vengeance_Launch (edict_t *self);
1021 void Hunter_Launch (edict_t *self);
1022 
1023 //
1024 // g_newdm.c
1025 //
1026 void InitGameRules(void);
1027 edict_t *DoRandomRespawn (edict_t *ent);
1028 void PrecacheForRandomRespawn (void);
1029 qboolean Tag_PickupToken (edict_t *ent, edict_t *other);
1030 void Tag_DropToken (edict_t *ent, gitem_t *item);
1031 void Tag_PlayerDeath(edict_t *targ, edict_t *inflictor, edict_t *attacker);
1032 void fire_doppleganger (edict_t *ent, vec3_t start, vec3_t aimdir);
1033 
1034 //
1035 // g_spawn.c
1036 //
1037 edict_t *CreateMonster(vec3_t origin, vec3_t angles, char *classname);
1038 edict_t *CreateFlyMonster (vec3_t origin, vec3_t angles, vec3_t mins, vec3_t maxs, char *classname);
1039 edict_t *CreateGroundMonster (vec3_t origin, vec3_t angles, vec3_t mins, vec3_t maxs, char *classname, int height);
1040 qboolean FindSpawnPoint (vec3_t startpoint, vec3_t mins, vec3_t maxs, vec3_t spawnpoint, float maxMoveUp);
1041 qboolean CheckSpawnPoint (vec3_t origin, vec3_t mins, vec3_t maxs);
1042 qboolean CheckGroundSpawnPoint (vec3_t origin, vec3_t entMins, vec3_t entMaxs, float height, float gravity);
1043 void DetermineBBox (char *classname, vec3_t mins, vec3_t maxs);
1044 void SpawnGrow_Spawn (vec3_t startpos, int size);
1045 void Widowlegs_Spawn (vec3_t startpos, vec3_t angles);
1046 
1047 //
1048 // p_client.c
1049 //
1050 void RemoveAttackingPainDaemons (edict_t *self);
1051 
1052 
1053 // ROGUE PROTOTYPES
1054 //====================
1055 
1056 //============================================================================
1057 
1058 // client_t->anim_priority
1059 #define	ANIM_BASIC		0		// stand / run
1060 #define	ANIM_WAVE		1
1061 #define	ANIM_JUMP		2
1062 #define	ANIM_PAIN		3
1063 #define	ANIM_ATTACK		4
1064 #define	ANIM_DEATH		5
1065 #define	ANIM_REVERSE	6
1066 
1067 
1068 // client data that stays across multiple level loads
1069 typedef struct
1070 {
1071 	char		userinfo[MAX_INFO_STRING];
1072 	char		netname[16];
1073 	int			hand;
1074 
1075 	qboolean	connected;			// a loadgame will leave valid entities that
1076 									// just don't have a connection yet
1077 
1078 	// values saved and restored from edicts when changing levels
1079 	int			health;
1080 	int			max_health;
1081 	int			savedFlags;
1082 
1083 	int			selected_item;
1084 	int			inventory[MAX_ITEMS];
1085 
1086 	// ammo capacities
1087 	int			max_bullets;
1088 	int			max_shells;
1089 	int			max_rockets;
1090 	int			max_grenades;
1091 	int			max_cells;
1092 	int			max_slugs;
1093 
1094 	gitem_t		*weapon;
1095 	gitem_t		*lastweapon;
1096 
1097 	int			power_cubes;	// used for tracking the cubes in coop games
1098 	int			score;			// for calculating total unit score in coop games
1099 
1100 	int			game_helpchanged;
1101 	int			helpchanged;
1102 
1103 	qboolean	spectator;			// client is a spectator
1104 
1105 //=========
1106 //ROGUE
1107 	int			max_tesla;
1108 	int			max_prox;
1109 	int			max_mines;
1110 	int			max_flechettes;
1111 #ifndef KILL_DISRUPTOR
1112 	int			max_rounds;
1113 #endif
1114 //ROGUE
1115 //=========
1116 } client_persistant_t;
1117 
1118 // client data that stays across deathmatch respawns
1119 typedef struct
1120 {
1121 	client_persistant_t	coop_respawn;	// what to set client->pers to on a respawn
1122 	int			enterframe;			// level.framenum the client entered the game
1123 	int			score;				// frags, etc
1124 	vec3_t		cmd_angles;			// angles sent over in the last command
1125 
1126 	qboolean	spectator;			// client is a spectator
1127 } client_respawn_t;
1128 
1129 // this structure is cleared on each PutClientInServer(),
1130 // except for 'client->pers'
1131 struct gclient_s
1132 {
1133 	// known to server
1134 	player_state_t	ps;				// communicated by server to clients
1135 	int				ping;
1136 
1137 	// private to game
1138 	client_persistant_t	pers;
1139 	client_respawn_t	resp;
1140 	pmove_state_t		old_pmove;	// for detecting out-of-pmove changes
1141 
1142 	qboolean	showscores;			// set layout stat
1143 	qboolean	showinventory;		// set layout stat
1144 	qboolean	showhelp;
1145 	qboolean	showhelpicon;
1146 
1147 	int			ammo_index;
1148 
1149 	int			buttons;
1150 	int			oldbuttons;
1151 	int			latched_buttons;
1152 
1153 	qboolean	weapon_thunk;
1154 
1155 	gitem_t		*newweapon;
1156 
1157 	// sum up damage over an entire frame, so
1158 	// shotgun blasts give a single big kick
1159 	int			damage_armor;		// damage absorbed by armor
1160 	int			damage_parmor;		// damage absorbed by power armor
1161 	int			damage_blood;		// damage taken out of health
1162 	int			damage_knockback;	// impact damage
1163 	vec3_t		damage_from;		// origin for vector calculation
1164 
1165 	float		killer_yaw;			// when dead, look at killer
1166 
1167 	weaponstate_t	weaponstate;
1168 	vec3_t		kick_angles;	// weapon kicks
1169 	vec3_t		kick_origin;
1170 	float		v_dmg_roll, v_dmg_pitch, v_dmg_time;	// damage kicks
1171 	float		fall_time, fall_value;		// for view drop on fall
1172 	float		damage_alpha;
1173 	float		bonus_alpha;
1174 	vec3_t		damage_blend;
1175 	vec3_t		v_angle;			// aiming direction
1176 	float		bobtime;			// so off-ground doesn't change it
1177 	vec3_t		oldviewangles;
1178 	vec3_t		oldvelocity;
1179 
1180 	float		next_drown_time;
1181 	int			old_waterlevel;
1182 	int			breather_sound;
1183 
1184 	int			machinegun_shots;	// for weapon raising
1185 
1186 	// animation vars
1187 	int			anim_end;
1188 	int			anim_priority;
1189 	qboolean	anim_duck;
1190 	qboolean	anim_run;
1191 
1192 	// powerup timers
1193 	float		quad_framenum;
1194 	float		invincible_framenum;
1195 	float		breather_framenum;
1196 	float		enviro_framenum;
1197 
1198 	qboolean	grenade_blew_up;
1199 	float		grenade_time;
1200 	int			silencer_shots;
1201 	int			weapon_sound;
1202 
1203 	float		pickup_msg_time;
1204 
1205 	float		flood_locktill;		// locked from talking
1206 	float		flood_when[10];		// when messages were said
1207 	int			flood_whenhead;		// head pointer for when said
1208 
1209 	float		respawn_time;		// can respawn when time > this
1210 
1211 	edict_t		*chase_target;		// player we are chasing
1212 	qboolean	update_chase;		// need to update chase info?
1213 
1214 //=======
1215 //ROGUE
1216 	float		double_framenum;
1217 	float		ir_framenum;
1218 //	float		torch_framenum;
1219 	float		nuke_framenum;
1220 	float		tracker_pain_framenum;
1221 
1222 	edict_t		*owned_sphere;		// this points to the player's sphere
1223 //ROGUE
1224 //=======
1225 };
1226 
1227 
1228 struct edict_s
1229 {
1230 	entity_state_t	s;
1231 	struct gclient_s	*client;	// NULL if not a player
1232 									// the server expects the first part
1233 									// of gclient_s to be a player_state_t
1234 									// but the rest of it is opaque
1235 
1236 	qboolean	inuse;
1237 	int			linkcount;
1238 
1239 	// FIXME: move these fields to a server private sv_entity_t
1240 	link_t		area;				// linked to a division node or leaf
1241 
1242 	int			num_clusters;		// if -1, use headnode instead
1243 	int			clusternums[MAX_ENT_CLUSTERS];
1244 	int			headnode;			// unused if num_clusters != -1
1245 	int			areanum, areanum2;
1246 
1247 	//================================
1248 
1249 	int			svflags;
1250 	vec3_t		mins, maxs;
1251 	vec3_t		absmin, absmax, size;
1252 	solid_t		solid;
1253 	int			clipmask;
1254 	edict_t		*owner;
1255 
1256 
1257 	// DO NOT MODIFY ANYTHING ABOVE THIS, THE SERVER
1258 	// EXPECTS THE FIELDS IN THAT ORDER!
1259 
1260 	//================================
1261 	int			movetype;
1262 	int			flags;
1263 
1264 	char		*model;
1265 	float		freetime;			// sv.time when the object was freed
1266 
1267 	//
1268 	// only used locally in game, not by server
1269 	//
1270 	char		*message;
1271 	char		*classname;
1272 	int			spawnflags;
1273 
1274 	float		timestamp;
1275 
1276 	float		angle;			// set in qe3, -1 = up, -2 = down
1277 	char		*target;
1278 	char		*targetname;
1279 	char		*killtarget;
1280 	char		*team;
1281 	char		*pathtarget;
1282 	char		*deathtarget;
1283 	char		*combattarget;
1284 	edict_t		*target_ent;
1285 
1286 	float		speed, accel, decel;
1287 	vec3_t		movedir;
1288 	vec3_t		pos1, pos2;
1289 
1290 	vec3_t		velocity;
1291 	vec3_t		avelocity;
1292 	int			mass;
1293 	float		air_finished;
1294 	float		gravity;		// per entity gravity multiplier (1.0 is normal)
1295 								// use for lowgrav artifact, flares
1296 
1297 	edict_t		*goalentity;
1298 	edict_t		*movetarget;
1299 	float		yaw_speed;
1300 	float		ideal_yaw;
1301 
1302 	float		nextthink;
1303 	void		(*prethink) (edict_t *ent);
1304 	void		(*think)(edict_t *self);
1305 	void		(*blocked)(edict_t *self, edict_t *other);	//move to moveinfo?
1306 	void		(*touch)(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf);
1307 	void		(*use)(edict_t *self, edict_t *other, edict_t *activator);
1308 	void		(*pain)(edict_t *self, edict_t *other, float kick, int damage);
1309 	void		(*die)(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
1310 
1311 	float		touch_debounce_time;		// are all these legit?  do we need more/less of them?
1312 	float		pain_debounce_time;
1313 	float		damage_debounce_time;
1314 	float		fly_sound_debounce_time;	//move to clientinfo
1315 	float		last_move_time;
1316 
1317 	int			health;
1318 	int			max_health;
1319 	int			gib_health;
1320 	int			deadflag;
1321 	qboolean	show_hostile;
1322 
1323 	float		powerarmor_time;
1324 
1325 	char		*map;			// target_changelevel
1326 
1327 	int			viewheight;		// height above origin where eyesight is determined
1328 	int			takedamage;
1329 	int			dmg;
1330 	int			radius_dmg;
1331 	float		dmg_radius;
1332 	int			sounds;			//make this a spawntemp var?
1333 	int			count;
1334 
1335 	edict_t		*chain;
1336 	edict_t		*enemy;
1337 	edict_t		*oldenemy;
1338 	edict_t		*activator;
1339 	edict_t		*groundentity;
1340 	int			groundentity_linkcount;
1341 	edict_t		*teamchain;
1342 	edict_t		*teammaster;
1343 
1344 	edict_t		*mynoise;		// can go in client only
1345 	edict_t		*mynoise2;
1346 
1347 	int			noise_index;
1348 	int			noise_index2;
1349 	float		volume;
1350 	float		attenuation;
1351 
1352 	// timing variables
1353 	float		wait;
1354 	float		delay;			// before firing targets
1355 	float		random;
1356 
1357 	float		teleport_time;
1358 
1359 	int			watertype;
1360 	int			waterlevel;
1361 
1362 	vec3_t		move_origin;
1363 	vec3_t		move_angles;
1364 
1365 	// move this to clientinfo?
1366 	int			light_level;
1367 
1368 	int			style;			// also used as areaportal number
1369 
1370 	gitem_t		*item;			// for bonus items
1371 
1372 	// common data blocks
1373 	moveinfo_t		moveinfo;
1374 	monsterinfo_t	monsterinfo;
1375 
1376 //=========
1377 //ROGUE
1378 	int			plat2flags;
1379 	vec3_t		offset;
1380 	vec3_t		gravityVector;
1381 	edict_t		*bad_area;
1382 	edict_t		*hint_chain;
1383 	edict_t		*monster_hint_chain;
1384 	edict_t		*target_hint_chain;
1385 	int			hint_chain_id;
1386 	// FIXME - debug help!
1387 	float		lastMoveTime;
1388 //ROGUE
1389 //=========
1390 };
1391 
1392 //=============
1393 //ROGUE
1394 #define ROGUE_GRAVITY	1
1395 
1396 #define SPHERE_DEFENDER			0x0001
1397 #define SPHERE_HUNTER			0x0002
1398 #define SPHERE_VENGEANCE		0x0004
1399 #define SPHERE_DOPPLEGANGER		0x0100
1400 
1401 #define SPHERE_TYPE				0x00FF
1402 #define SPHERE_FLAGS			0xFF00
1403 
1404 //
1405 // deathmatch games
1406 //
1407 #define		RDM_TAG			2
1408 #define		RDM_DEATHBALL	3
1409 
1410 typedef struct dm_game_rs
1411 {
1412 	void		(*GameInit)(void);
1413 	void		(*PostInitSetup)(void);
1414 	void		(*ClientBegin) (edict_t *ent);
1415 	void		(*SelectSpawnPoint) (edict_t *ent, vec3_t origin, vec3_t angles);
1416 	void		(*PlayerDeath)(edict_t *targ, edict_t *inflictor, edict_t *attacker);
1417 	void		(*Score)(edict_t *attacker, edict_t *victim, int scoreChange);
1418 	void		(*PlayerEffects)(edict_t *ent);
1419 	void		(*DogTag)(edict_t *ent, edict_t *killer, char **pic);
1420 	void		(*PlayerDisconnect)(edict_t *ent);
1421 	int			(*ChangeDamage)(edict_t *targ, edict_t *attacker, int damage, int mod);
1422 	int			(*ChangeKnockback)(edict_t *targ, edict_t *attacker, int knockback, int mod);
1423 	int			(*CheckDMRules)(void);
1424 } dm_game_rt;
1425 
1426 extern dm_game_rt	DMGame;
1427 
1428 void Tag_GameInit (void);
1429 void Tag_PostInitSetup (void);
1430 void Tag_PlayerDeath (edict_t *targ, edict_t *inflictor, edict_t *attacker);
1431 void Tag_Score (edict_t *attacker, edict_t *victim, int scoreChange);
1432 void Tag_PlayerEffects (edict_t *ent);
1433 void Tag_DogTag (edict_t *ent, edict_t *killer, char **pic);
1434 void Tag_PlayerDisconnect (edict_t *ent);
1435 int  Tag_ChangeDamage (edict_t *targ, edict_t *attacker, int damage, int mod);
1436 
1437 void DBall_GameInit (void);
1438 void DBall_ClientBegin (edict_t *ent);
1439 void DBall_SelectSpawnPoint (edict_t *ent, vec3_t origin, vec3_t angles);
1440 int  DBall_ChangeKnockback (edict_t *targ, edict_t *attacker, int knockback, int mod);
1441 int  DBall_ChangeDamage (edict_t *targ, edict_t *attacker, int damage, int mod);
1442 void DBall_PostInitSetup (void);
1443 int  DBall_CheckDMRules (void);
1444 //void Tag_PlayerDeath (edict_t *targ, edict_t *inflictor, edict_t *attacker);
1445 //void Tag_Score (edict_t *attacker, edict_t *victim, int scoreChange);
1446 //void Tag_PlayerEffects (edict_t *ent);
1447 //void Tag_DogTag (edict_t *ent, edict_t *killer, char **pic);
1448 //void Tag_PlayerDisconnect (edict_t *ent);
1449 //int  Tag_ChangeDamage (edict_t *targ, edict_t *attacker, int damage);
1450 
1451 //ROGUE
1452 //============
1453