#ifndef MISC_qh
#define MISC_qh 1

/* Random miscellaneous functions */

@extern {
	entity (string clname) spawn;

	string (entity e) name;	/* Returns the pretty entity name */

	#define crandom()	(2.0 * (random () - 0.5))

	void (entity e) makestatic;
	void (vector pos, string samp, float vol, float atten) ambientsound;

	void () SUB_remove;
	void (entity e) safe_remove;

	void () SUB_makestatic;
	void (entity e) safe_makestatic;

	void (vector org, string samp, float vol, float atten) sound_vector;
	entity (string clname, string mod, vector org, vector dir, float speed) spawn_missile;

	/* :) */
	void (.string fld, string match, void (entity e) func) foreach;
	void (.string fld, string match, .void () func) foreach_field;

	/* swaps self/other temporarily */
	float (entity newself, entity newother, float() func) switcheroo;

	/* Returns new value */
	float (float current, float increment, float max) increase_bound;

	/* Returns FALSE if not increased */
	float (.float fld, float increment, float max) increase_field;

	/* Calculate the player's current maximum speed, taking water/air in to account */
	float (entity e) calc_max_speed;

	/* sprint one string at a time, and get them all to the destination */
	void (entity client, float level) xprint_start;
	void (string str) xprint_str;

	#define is_activeplayer(e)	(e.flags & FL_CLIENT)

	#define is_cl(e)	(e.flags & FL_CLIENT)
	#define is_autothink(e)	(e.flags & FL_AUTOTHINK)

	/* Return a random entity that matches, or world */
	entity (.string fld, string str) find_random;

	/* Return something from the .enemy chain */
	entity (entity ech) random_enemy_chain;

	#define vieworigin(e) (e.origin + e.view_ofs)
	#define center(e) ((e.absmin + e.absmax) * 0.5)

	/* FIXME: Make this an mdl func? */
	#define shootorigin(e)	(vieworigin(e) - '0 0 6')

	/* Stuff for traceline "projectiles" to hit triggers like normal projectiles */
	void () tl_proj_begin;
	void () tl_proj_end;
	void (entity trigger, entity fake_proj) tl_touch;

	.float tl_notsolid;
	#define tl_issolid(ent) (!ent.tl_notsolid)
};

#endif
