/*
+----+
|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 STANDARD

// 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	(float level, string s)																	bprint				= #23;
void	(entity client, float level, string s)													sprint				= #24;
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  (vector o, vector d, float color, float count)                                         	particle            = #48;  // start a particle effect
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    (entity plr, float achievement)                                                         achievement         = #79;
float   (string s)                                                                              stof                = #81;  // 2001-09-20 QuakeC string manipulation by FrikaC
//void	(vector where, float set)																multicast			= #82;
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    (vector start, vector min, vector max, vector end, float nomonsters, entity forent)   	tracebox            = #90;
entity  (entity start, .float field, float match)                                               findfloat           = #98;
float   (vector start, vector min, vector max, vector end, float nomonsters, entity forent)     tracemove           = #99;
// 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;
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 file access 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
// DP_QC_STRING_CASE_FUNCTIONS
string  (string s)                                                                              strtolower          = #480;
float   (float caseinsensitive, string s)                                                       crc16               = #494;
void    (string trackname)                                                                    	songegg             = #500;
void    ()                                                                                   	nzp_maxammo         = #501;
void    (entity who)                                                                            grenade_pulse       = #502;
float   ()                                                                                      nzp_maxai           = #503;
void    (entity who)                                                                            nzp_bettyprompt     = #504;
void    (entity who, string name)                                                               nzp_setplayername   = #505;
void    (entity who, float version)                                                             nzp_setdoubletapver = #506;
void    (entity who, float color, float duration, float type)                                   nzp_screenflash     = #507;
void    (entity who, float state)                                                               nzp_lockviewmodel   = #508;
void    (entity who, float low_frequency, float high_frequency, float duration)                 nzp_rumble          = #509;

//
// 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

// 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

#define 	MOVE_HITMODEL               0

// 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

// 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

//doors
#define		STATE_TOP					0
#define		STATE_BOTTOM				1
#define		STATE_UP					2
#define		STATE_DOWN					3

#define     VEC_ORIGIN                  '0 0 0'

// 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 	SVC_LIMBUPDATE  			51 				// naievil -- keep me
#define 	SVC_BSPDECAL    			50				// naievil -- keep me
#define 	SVC_ACHIEVEMENT 			52

#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
// Player uses channel 5 for all weapon reload sfx
#define     CHAN_AUTO                   0
#define     CHAN_WEAPON                 1
#define     CHAN_VOICE                  2
#define     CHAN_ITEM                   3
#define     CHAN_BODY                   4
#define 	CHAN_NO_PHS_ADD				8				// ie: CHAN_BODY+CHAN_NO_PHS_ADD

#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_BLUELIGHT			        1
#define	EF_MUZZLEFLASH 			        2
#define	EF_BRIGHTLIGHT 			        4
#define	EF_REDLIGHT 			        8
#define	EF_ORANGELIGHT			        16
#define	EF_GREENLIGHT			        32
#define	EF_PINKLIGHT			        64				// formerly EF_LIGHT
#define	EF_NODRAW				        128
#define EF_LIMELIGHT			        256				// formerly EF_BRIGHTFIELD
#define EF_FULLBRIGHT			        512
#define EF_CYANLIGHT			        1024			// formerly EF_DARKLIGHT
#define EF_YELLOWLIGHT			        2048			// formerly EF_DARKFIELD
#define EF_PURPLELIGHT    		        4096
#define EF_RAYRED	 			        8196			// red trail for porter x2
#define EF_RAYGREEN  			        16384			// green trail for ray gun

// 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		MSG_MULTICASE				4				// for multicast() call

// message levels
#define     PRINT_LOW					0				// pickup messages
#define     PRINT_MEDIUM				1				// death messages
#define     PRINT_HIGH					2				// critical messages
#define     PRINT_CHAT					3				// also goes to chat console

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

// multicast sets
#define		MULTICAST_ALL				0				// every client
#define		MULTICAST_PHS				1				// within hearing
#define		MULTICAST_PVS				2				// within sight
#define		MULTICAST_ALL_R				3				// every client, reliable
#define		MULTICAST_PHS_R				4				// within hearing, reliable
#define		MULTICAST_PVS_R				5				// within sight, reliable

// file operations
#define		FILE_READ 	 				0
#define		FILE_APPEND 				1
#define		FILE_WRITE 					2