/*
+----+
|Defs|
+----+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
| Scratch                                      Http://www.admdev.com/scratch |
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
| This contains necessary definitions from the original V1.06 defs.qc file.  |
| This includes some basic constants, the built in function definitions, and |
| some variable's used by the Quake Engine internally.                       |
| Certain lines in this file are hardcoded into Quake engine, and -must- be  |
| present and unchanged, in the order they are shown. Otherwise Quake will   |
| refuse to run.                                                             |
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
*/

#define HANDHELD

// These lines CANNOT be altered/moved
entity      self;
entity		other;
entity		world;
float		time;
float		frametime;
float		force_retouch;		// force all entities to touch triggers
string		mapname;
float		deathmatch;
float		coop;
float		teamplay;
float		serverflags;		// propagated from level to level, used to
float		rounds;
float		rounds_change;
float		parm1, parm2, parm3, parm4, parm5, parm6, parm7, parm8, parm9, parm10, parm11, parm12, parm13, parm14, parm15, parm16;
vector		v_forward, v_up, v_right;	// set by makevectors()
float		trace_allsolid;
float		trace_startsolid;
float		trace_fraction;
vector		trace_endpos;
vector		trace_plane_normal;
float		trace_plane_dist;
entity		trace_ent;
float		trace_inopen;
float		trace_inwater;

entity          msg_entity;                      // destination of single entity writes
void()          main;                            // only for testing
void()		StartFrame;
void()		EndFrame;
void() 		PlayerPreThink;
void() 		PlayerPostThink;
void()		ClientKill;
void()		ClientConnect;
void() 		PutClientInServer;		// call after setting the parm1... parms
void()		ClientDisconnect;
void()		SetNewParms;			// called when a client first connects to
void()		SetChangeParms;			// call to set parms for self so they can
void()		ParseClientCommand;		// special command calls
string 		CMD_STRING;
void()		Soft_Restart;
void		end_sys_globals;		// flag for structure dumping

.float		modelindex;		// *** model index in the precached list
.vector		absmin, absmax;	// *** origin + mins / maxs
.float		ltime;			// local time for entity
.float		movetype;
.float		solid;
.vector		origin;			// ***
.vector		oldorigin;		// ***
.vector		velocity;
.vector		angles;
.vector		avelocity;
.vector		punchangle;		// temp angle adjust from damage or recoil
.string		classname;		// spawn function
.string		model;
.float		frame;
.float		skin;
.float		iframetime;
.float		effects;
.vector		mins, maxs;		// bounding box extents reletive to origin
.vector		size;			// maxs - mins
.void()		touch;
.void()		use;
.void()		think;
.void()		blocked;		// for doors or plats, called when can't push other
.float		nextthink;
.entity		groundentity;
.float		health;
.float		points;
.float		kills;
.float		weapon;			// one of the W_COLT, etc flags
.string		weaponmodel;
.string		weapon2model;
.float		weaponframe;
.float		weapon2frame;
.float		currentammo;
.float		currentmag;
.float		zoom;
.float 		weaponskin;
.float 		weapon2skin;
.float		primary_grenades;
.float		secondary_grenades;
.float		grenades;
.float		perks;			// bit flags
.float		takedamage;
.entity		chain;
.float		deadflag;
.vector		view_ofs;			// add to origin to get eye point
.float		button0;		// 
.float		button1;		// 
.float		button2;		// 
.float		button3;		// 
.float		button4;		// 
.float		button5;		// 
.float		button6;		// 
.float		button7;		// 
.float		button8;		// 
.float		impulse;		// weapon changes
.float		fixangle;
.vector		v_angle;		// view / targeting angle for players
.float		idealpitch;		// calculated pitch angle for lookup up slopes
.string		netname;
.entity 	enemy;
.float		flags;
.float		colormap;
.float		team;
.float		max_health;		// players maximum health is stored here
.float		teleport_time;	// don't back up
.float		waterlevel;		// 0 = not in, 1 = feet, 2 = wast, 3 = eyes
.float		watertype;		// a contents value
.float		ideal_yaw;
.float		yaw_speed;
.entity		aiment;
.entity 	head;
.entity		larm;
.entity 	rarm;
.entity 	goalentity;		// a movetarget or an enemy
//.entity 	goalorigin;		// a movetarget location
.float		spawnflags;
.string		target;
.string		targetname;
.float		bleed_out;
.float		progress_bar;
.entity		dmg_inflictor;
.entity		owner;		// who launched a missile
.vector		movedir;	// mostly for doors, but also used for waterjump
.string		message;		// trigger messages
.float		sounds;		// either a cd track number or sound number
.string     noise, noise1, noise2, noise3;  // contains names of wavs to play
.float		x2_icon;			// double points icon
.float 		insta_icon;
.vector		ADS_Offset;
.vector		Flash_Offset;
.float 		Flash_Size;
.string 	Weapon_Name;
.string		Weapon_Name_Touch;
.float      currentmag2;
.float      maxspeed;
.float      facingenemy;
//.float      scale;
void		end_sys_fields;			// flag for structure dumping
// End. Lines below this MAY be altered, to some extent

// Built In functions
void(vector ang) makevectors			= #1;	// sets v_forward, etc globals
void(entity e, vector o) setorigin		= #2;
void(entity e, string m) setmodel		= #3;	// set movetype and solid first
void(entity e, vector min, vector max) setsize	= #4;
void() break					= #6;
float() random					= #7;	// returns 0 - 1
void(entity e, float chan, string samp, float vol, float atten) sound = #8;
vector(vector v) normalize			= #9;
void(string e) error				= #10;
void(string e) objerror				= #11;
float(vector v) vlen				= #12;
float(vector v) vectoyaw			= #13;
entity() spawn					= #14;
void(entity e) remove				= #15;
void(vector v1, vector v2, float nomonsters, entity forent) traceline = #16;	
entity() checkclient				= #17;		// returns a client to look for
entity(entity start, .string fld, string match) find = #18;
string(string s) precache_sound			= #19;
string(string s) precache_model			= #20;
void(entity client, string s)stuffcmd		= #21;
entity(vector org, float rad) findradius	= #22;
void(string s) dprint				= #25;
string(float f) ftos				= #26;
string(vector v) vtos				= #27;
void() coredump					= #28;		// prints all edicts
void() traceon					= #29;		// turns statment trace on
void() traceoff					= #30;
void(entity e) eprint				= #31;		// prints an entire edict
float(float yaw, float dist) walkmove		= #32;		// returns TRUE or FALSE
float(entity zombie, float which, entity limb) updateLimb		= #33;
float(float yaw, float dist) droptofloor	= #34;		// TRUE if landed on floor
void(float style, string value) lightstyle	= #35;
float(float v) rint				= #36;		// round to nearest int
float(float v) floor				= #37;		// largest integer <= v
float(float v) ceil				= #38;		// smallest integer >= v
float(entity e) checkbottom			= #40;		// true if self is on ground
float(vector v) pointcontents			= #41;		// returns a CONTENT_*
float(float f) fabs				= #43;
vector(entity e, float speed) aim		= #44;		// returns the shooting vector
float(string s) cvar				= #45;		// return cvar.value
void(string s) localcmd				= #46;		// put string into local que
entity(entity e) nextent			= #47;		// for looping through all ents
void() ChangeYaw 				= #49;		// turn towards self.ideal_yaw
float(string name) getSoundLen			= #50;
vector(vector v) vectoangles			= #51;
void(float to, float f) WriteByte		= #52;
void(float to, float f) WriteChar		= #53;
void(float to, float f) WriteShort		= #54;
void(float to, float f) WriteLong		= #55;
void(float to, float f) WriteCoord		= #56;
void(float to, float f) WriteAngle		= #57;
void(float to, string s) WriteString		= #58;
void(float to, entity s) WriteEntity		= #59;
string(entity s) etos			= #65;
void(float step) movetogoal			= #67;
string(string s) precache_file			= #68;		// no effect except for -copy
void(entity e) makestatic			= #69;
void(string s) changelevel			= #70;
void(float step, vector origin) movetoorigin			= #71;
void(string var, string val) cvar_set		= #72;		// sets cvar.value
void(entity client, string s) centerprint 	= #73;		// sprint, but in middle
void(entity client, string s, string s) centerprint2 = #73;
void(entity client, string s, string s, string s) centerprint3 = #73;
void(entity client, string s, string s, string s, string s) centerprint4 = #73;
void(entity client, string s, string s, string s, string s, string s) centerprint5 = #73;
void(entity client, string s, string s, string s, string s, string s, string s) centerprint6 = #73;
void(entity client, string s, string s, string s, string s, string s, string s, string s) centerprint7 = #73;
void(vector pos, string samp, float vol, float atten) ambientsound = #74;
string(string s) precache_model2		= #75;	// registered version only
string(string s) precache_sound2		= #76;	// registered version only
string(string s) precache_file2			= #77;	// registered version only
void(entity e) setspawnparms			= #78;	// set parm1... to the
void(vector start, vector min, vector max, vector end, float nomonsters, entity forent) tracebox = #90; 
float(vector start, vector min, vector max, vector end, float nomonsters, entity forent) tracemove = #99; 
entity (entity start, .float field, float match) findfloat = #98;
float(string s) stof = #81;	// 2001-09-20 QuakeC string manipulation by FrikaC
vector(entity what) Get_Waypoint_Near = #83;
float(entity zombie, entity target) Do_Pathfind_psp = #84;
void(string s) Open_Waypoint = #85;
vector(entity zombie,vector start,vector min, vector max) Get_Next_Waypoint = #86;
void(entity client, float type, float cost, float weapon) useprint = #87;
vector(entity zombie,vector start,vector min, vector max) Get_First_Waypoint = #88;
void(string s) Close_Waypoint = #89;

void(entity plr, float achievement) achievement = #79;

void(string trackname) songegg = #500;
void() nzp_maxammo             = #501;
/*
type 0 = clear
type 1 = buy door
type 2 = buy debris
type 3 = Buy ammo
type 4 = buy weapon
type 5 = repair window
type 6 = use box
type 7 = use trap
type 8 = require power
*/


// 2001-09-20 QuakeC file access by FrikaC  start
float(string filename, float mode) fopen = #110;
void(float fhandle) fclose = #111;
string(float fhandle) fgets = #112;
void(float fhandle, string s) fputs = #113;
// 2001-09-20 QuakeC file access by FrikaC  end

// 2001-09-20 QuakeC string manipulation by FrikaC  start
float(string s) strlen = #114;
string(string s1, string s2) strcat = #115;
string(string s, float start, float length) substring = #116;
vector(string s) stov = #117;
string(string s) strzone = #118;
string(string s) strunzone = #119;
string(string s) strtrim = #120;
// 2001-09-20 QuakeC string manipulation by FrikaC  end

// 2001-11-15 DarkPlaces general builtin functions by Lord Havoc  start
float(string s) tokenize = #441;
string(float num) argv = #442;
// 2001-11-15 DarkPlaces general builtin functions by Lord Havoc  end

//
// constants
//

#define		FALSE					0
#define 	TRUE					1

// edict.flags
#define	FL_FLY					  1
#define	FL_SWIM					  2
#define	FL_CLIENT				  8		// set for all client edicts
#define	FL_INWATER				  16	// for enter / leave water splash
#define	FL_MONSTER				  32
#define	FL_GODMODE				  64	// player cheat
#define	FL_NOTARGET				  128	// player cheat
#define	FL_ITEM					  256	// extra wide size for bonus items
#define	FL_ONGROUND				  512	// standing on something
#define	FL_PARTIALGROUND		  1024	// not all corners are valid
#define	FL_WATERJUMP			  2048	// player jumping out of water
//#define	FL_JUMPRELEASED			  4096	// for jump debouncing

// edict.movetype values
#define		MOVETYPE_NONE				0	// never moves
#define   	MOVETYPE_ANGLENOCLIP    	1
#define   	MOVETYPE_ANGLECLIP        	2
#define		MOVETYPE_WALK				3	// players only
#define		MOVETYPE_STEP				4	// discrete, not real time unless fall
#define		MOVETYPE_FLY				5
#define		MOVETYPE_TOSS				6	// gravity
#define		MOVETYPE_PUSH				7	// no clip to world, push and crush
#define		MOVETYPE_NOCLIP				8
#define		MOVETYPE_FLYMISSILE			9	// fly with extra size against monsters
#define		MOVETYPE_BOUNCE				10
#define		MOVETYPE_BOUNCEMISSILE		11	// bounce with extra size
#define		MOVETYPE_FOLLOW				12	

// edict.solid values
#define	SOLID_NOT				  0	// no interaction with other objects
#define	SOLID_TRIGGER			  1	// touch on edge, but not blocking
#define	SOLID_BBOX				  2	// touch on edge, block
#define	SOLID_SLIDEBOX			  3	// touch on edge, but not an onground
#define	SOLID_BSP				  4	// bsp clip, touch on edge, block
#define	SOLID_CORPSE			  5	// bsp clip, touch on edge, block

// range values
#define	RANGE_MELEE				  0
#define	RANGE_NEAR				  1
#define	RANGE_MID				  2
#define	RANGE_FAR				  3

// deadflag values

#define	DEAD_NO					  0
#define	DEAD_DYING				  1
#define	DEAD_DEAD				  2
#define	DEAD_RESPAWNABLE		  3

// takedamage values

#define	DAMAGE_NO				  0
#define	DAMAGE_YES				  1
#define	DAMAGE_AIM				  2
#define	DAMAGE_NOMARKER			  3

/*.void()		th_stand;
.void()		th_walk;
.void()		th_run;
.void(entity attacker, float damage)		th_pain;*/
.void()		th_die;
//.void()         th_missile;
.void()         th_melee;

// point content values

#define		CONTENT_EMPTY				 -1
#define		CONTENT_SOLID				 -2
#define		CONTENT_WATER				 -3
#define		CONTENT_SLIME				 -4
#define		CONTENT_LAVA				 -5
#define   	CONTENT_SKY                  -6


#define	VEC_ORIGIN 	 '0 0 0'

//Standard Quake View Offset
//vector VEC_VIEW_OFS = '0 0 22';

//Half Life View Offset is 64
//64 units above ground, for our purposes it's, 64 - (how low bounding box goes)
//vector VEC_VIEW_OFS = '0 0 32';

//Standard Quake Hull
//vector	VEC_HULL_MIN = '-16 -16 -24';
//vector	VEC_HULL_MAX = '16 16 32';

//Half Life 1 Hull Sizes ADDED BY BLUBS, COMMENTED ORIGINAL QUAKE BBOX SIZS OUT
#define	VEC_HULL_MIN  '-16 -16 -32'
#define	VEC_HULL_MAX  '16 16 40'

#define	VEC_HULL2_MIN  '-32 -32 -24'
#define	VEC_HULL2_MAX  '32 32 64'

// protocol bytes
#define	SVC_BAD					 0
#define	SVC_NOP					 1
#define	SVC_DISCONNECT			 2
#define	SVC_UPDATESTAT			 3
#define	SVC_VERSION				 4
#define	SVC_SETVIEW				 5
#define	SVC_SOUND				 6
#define	SVC_TIME				 7
#define	SVC_PRINT				 8
#define	SVC_STUFFTEXT			 9
#define	SVC_SETANGLE			 10
#define	SVC_SERVERINFO			 11
#define	SVC_LIGHTSTYLE			 12
#define	SVC_UPDATENAME			 13
#define	SVC_UPDATEPOINTS		 14
#define	SVC_CLIENTDATA			 15
#define	SVC_STOPSOUND			 16
#define	SVC_PARTICLE			 18
#define	SVC_DAMAGE				 19
#define	SVC_SPAWNSTATIC			 20
#define	SVC_SPAWNBINARY			 21
#define	SVC_SPAWNBASELINE		 22
#define	SVC_TEMPENTITY			 23
#define	SVC_SETPAUSE			 24
#define	SVC_SIGNONNUM			 25
#define	SVC_CENTERPRINT			 26
#define	SVC_SPAWNSTATICSOUND	 29	// 1998-08-08 Complete SVC list by Zhenga
#define	SVC_INTERMISSION		 30
#define	SVC_FINALE				 31
#define	SVC_CDTRACK				 32
#define	SVC_SELLSCREEN			 33
#define	SVC_CUTSCENE			 34	// 1998-08-08 Complete SVC list by Zhenga
#define	SVC_WEAPONFIRE			 35
#define	SVC_HITMARK				 36
#define	SVC_USEPRINT			 38

#define	TE_SPIKE		 0
#define	TE_SUPERSPIKE	 	 1
#define	TE_GUNSHOT		 2
#define	TE_EXPLOSION	 	 3
#define	TE_TAREXPLOSION	 	 4
#define	TE_LIGHTNING1	 	 5
#define	TE_LIGHTNING2	 	 6
#define	TE_WIZSPIKE		 7
#define	TE_KNIGHTSPIKE	 	 8
#define	TE_LIGHTNING3	 	 9
#define	TE_LAVASPLASH	 	 10
#define	TE_TELEPORT		 11
#define TE_RAYSPLASHGREEN 	 14
#define TE_RAYSPLASHRED 	 15

// sound channels
// channel 0 never willingly overrides
// other channels (1-7) allways override a playing sound on that channel
#define	CHAN_AUTO		 0
#define	CHAN_WEAPON		 1
#define	CHAN_VOICE		 2
#define	CHAN_ITEM		 3
#define	CHAN_BODY		 4
//Player uses channel 5 for all weapon reload sfx

#define	ATTN_NONE		 0
#define	ATTN_NORM		 1
#define	ATTN_IDLE		 2
#define	ATTN_STATIC		 3

// update types

#define	UPDATE_GENERAL	 0
#define	UPDATE_STATIC	 1
#define	UPDATE_BINARY	 2
#define	UPDATE_TEMP		 3

// entity effects

#define	EF_BLUE					1
#define	EF_MUZZLEFLASH 			2
#define	EF_BRIGHTLIGHT 			4
#define	EF_RED		 			8
#define	EF_ORANGELIGHT			16
#define	EF_GREEN				32
#define	EF_LIGHT				64
#define	EF_NODRAW				128
#define EF_BRIGHTFIELD			256
#define EF_FULLBRIGHT 			512
#define EF_DARKLIGHT			1024
#define EF_DARKFIELD			2048
#define EF_PURPLELIGHT    		4096
#define EF_RAYRED		 	8196
#define EF_RAYGREEN		 	16384

// messages
#define	MSG_BROADCAST	 0		// unreliable to all
#define	MSG_ONE			 1		// reliable to one (msg_entity)
#define	MSG_ALL			 2		// reliable to all
#define	MSG_INIT		 3		// write to the init string

#define	AS_STRAIGHT		 1
#define	AS_SLIDING		 2
#define	AS_MELEE		 3
#define	AS_MISSILE		 4

// Quake assumes these are defined.

//.string         wad, map;
.float /*worldtype,*/ delay, wait, lip, /*light_lev,*/ speed, style/*, skill*/;
.string killtarget;
.void() think1;
.vector finaldest;
.vector pos1, pos2/*, mangle*/;

void(vector o, vector d, float color, float count) particle = #48;// start a particle effect
void(string s) bprint_psp					= #23;
void(entity client, string s) sprint_psp	= #24;
// End

void(string s) println = {bprint_psp(s);} //just when brain decided to think this is c
void(float ignore, string s) bprint = {bprint_psp(s);};
void(entity client, float type, string s) sprint = {sprint_psp(client, s);};
void(string s) print = {bprint_psp(s);};

//doors
.float		state;
#define 	STATE_TOP		0
#define		STATE_BOTTOM	1
#define		STATE_UP		2
#define		STATE_DOWN		3

string mappath;
#define PRINT_HIGH  	0

.float isspec;

#define		FILE_READ 	 	0
#define		FILE_APPEND 	1
#define		FILE_WRITE 		2

#define 	MOVE_HITMODEL   0 // must be different for this engine!

.float recoil_delay;
.float gravity;

.float renderamt;
.float rendermode;
.vector rendercolor;
.string mapversion;
.float ammo;

void(string com) SV_ParseClientCommand;

.float currentHitBoxSetup;
.vector		bbmins, bbmaxs;		// Used for zombie hitboxes

.float achievements;