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