// Copyright (C) 1999-2000 Id Software, Inc.
//
// bg_public.h -- definitions shared by both the server game and client game modules

// because games can change separately from the main system version, we need a
// second version that must match between game and cgame

#ifndef _BG_PUBLIC_H_
#define	_BG_PUBLIC_H_


#ifdef MISSIONPACK
	#define	GAMEVERSION	"TA newexpert 1.0.1"
#else
	#define	GAMEVERSION	"newexpert 1.0.1"
#endif
//#endif
//#define	GAME_VERSION		 "newexpert"//"baseq3-1"

#define	DEFAULT_GRAVITY		800
#define	GIB_HEALTH			-40
#define	ARMOR_PROTECTION	0.66

#define	MAX_ITEMS			256

#define	RANK_TIED_FLAG		0x4000

//BB MVP Scoring - Banshee - points for appropriate action
//#define MVP_DEFENSE_BONUS   10
//#define MVP_OFFENSE_BONUS   10
#define MVP_OFFENSE_FPICKUP_BONUS 1
#define MVP_OFFENSE_DK_BONUS 3
#define MVP_DEFENSE_ECK_BONUS 6
#define MVP_DEFENSE_CD_BONUS 4
#define MVP_DEFENSE_CS_BONUS 5
#define MVP_DEFENSE_BD_BONUS 7
#define MVP_OFFENSE_FH_BONUS 4
#define MVP_DEFENSE_FD_BONUS 3
#define MVP_DEFENSE_FR_BONUS 10
#define MVP_OFFENSE_FC_BONUS 10
#define MVP_OFFENSE_AECK_BONUS 2
//End Banshee

#define DEFAULT_SHOTGUN_SPREAD	700
#define DEFAULT_SHOTGUN_COUNT	11

#define	ITEM_RADIUS			15		// item sizes are needed for client side pickup detection

#define	LIGHTNING_RANGE		768

#define	SCORE_NOT_PRESENT	-9999	// for the CS_SCORES[12] when only one player is present

#define	VOTE_TIME			30000	// 30 seconds before vote times out

#define	MINS_Z				-24
#define	DEFAULT_VIEWHEIGHT	26
#define CROUCH_VIEWHEIGHT	12
#define	DEAD_VIEWHEIGHT		-16

//
// config strings are a general means of communicating variable length strings
// from the server to all connected clients.
//

// CS_SERVERINFO and CS_SYSTEMINFO are defined in q_shared.h
#define	CS_MUSIC				2
#define	CS_MESSAGE				3		// from the map worldspawn's message field
#define	CS_MOTD					4		// g_motd string for server message of the day
#define	CS_WARMUP				5		// server time when the match will be restarted
#define	CS_SCORES1				6
#define	CS_SCORES2				7
#define CS_VOTE_TIME			8
#define CS_VOTE_STRING			9
#define	CS_VOTE_YES				10
#define	CS_VOTE_NO				11

#define CS_TEAMVOTE_TIME		12
#define CS_TEAMVOTE_STRING		14
#define	CS_TEAMVOTE_YES			16
#define	CS_TEAMVOTE_NO			18

#define	CS_GAME_VERSION			20
#define	CS_LEVEL_START_TIME		21		// so the timer only shows the current level
#define	CS_INTERMISSION			22		// when 1, fraglimit/timelimit has been hit and intermission will start in a second or two
#define CS_FLAGSTATUS			23		// string indicating flag status in CTF
#define CS_SHADERSTATE			24
//#define CS_BOTINFO				25

#define	CS_ITEMS				25	//27		// string of 0's and 1's that tell which items are present
//#define	CS_ATMOSEFFECT 	  	  	28 	  	// Atmospheric effect, if any.--- INCIN


#define	CS_MODELS				26   //32
#define	CS_SOUNDS				(CS_MODELS+MAX_MODELS)
#define	CS_PLAYERS				(CS_SOUNDS+MAX_SOUNDS)
#define CS_LOCATIONS			(CS_PLAYERS+MAX_CLIENTS)
#define CS_PARTICLES			(CS_LOCATIONS+MAX_LOCATIONS)

#define CS_MAX					(CS_PARTICLES+MAX_LOCATIONS)

// BB begin BOTHUD
//#define CS_MAX				(CS_LOCATIONS+MAX_LOCATIONS)
//#define BB_BOTHUD_CS_BOTS	(CS_LOCATIONS+MAX_LOCATIONS)
//#define BB_CS_MAX				(BB_BOTHUD_CS_BOTS+MAX_CLIENTS)
// BB end BOTHUD

#if (CS_MAX) > MAX_CONFIGSTRINGS
#error overflow: (CS_MAX) > MAX_CONFIGSTRINGS
#endif

typedef enum {
    GT_FFA,				// free for all
    GT_TOURNAMENT,		// one on one tournament
    GT_SINGLE_PLAYER,	// single player ffa

    //-- team games go after this --

    GT_TEAM,			// team deathmatch
    GT_CTF,				// capture the flag
    GT_RTF,				//Return the Flag
#ifdef MISSIONPACK
    GT_1FCTF,
    GT_OBELISK,
    GT_HARVESTER,
#endif

    GT_MAX_GAME_TYPE
} gametype_t;

typedef enum {
    GM_DEFAULT,
    GM_BATTLE,
    GM_MAX_GAME_MODE
} gamemode_t;


typedef enum { GENDER_MALE, GENDER_FEMALE, GENDER_NEUTER } gender_t;

/*
===================================================================================
 
PMOVE MODULE
 
The pmove code takes a player_state_t and a usercmd_t and generates a new player_state_t
and some other output data.  Used for local prediction on the client game and true
movement on the server game.
===================================================================================
*/

typedef enum {
    PM_NORMAL,		// can accelerate and turn
    PM_NOCLIP,		// noclip movement
    PM_SPECTATOR,	// still run into walls
    PM_DEAD,		// no acceleration or turning, but free falling
    PM_FREEZE,		// stuck in place with no control
    PM_INTERMISSION,	// no movement or status bar
    PM_SPINTERMISSION	// no movement or status bar
} pmtype_t;

typedef enum {
    WEAPON_READY,
    WEAPON_RAISING,
    WEAPON_DROPPING,
    WEAPON_FIRING
} weaponstate_t;

// pmove->pm_flags
#define	PMF_DUCKED			1
#define	PMF_JUMP_HELD		2
#define	PMF_BACKWARDS_JUMP	8		// go into backwards land
#define	PMF_BACKWARDS_RUN	16		// coast down to backwards run
#define	PMF_TIME_LAND		32		// pm_time is time before rejump
#define	PMF_TIME_KNOCKBACK	64		// pm_time is an air-accelerate only time
#define	PMF_TIME_WATERJUMP	256		// pm_time is waterjump
#define	PMF_RESPAWNED		512		// clear after attack and jump buttons come up
#define	PMF_USE_ITEM_HELD	1024
#define PMF_GRAPPLE_PULL	2048	// pull towards offhand grapple location
#define PMF_FOLLOW			4096	// spectate following another player
#define PMF_SCOREBOARD		8192	// spectate as a scoreboard
#define PMF_INVULEXPAND		16384	// invulnerability sphere set to full size
//#define PMF_GRAPPLE_PULL    32768	// ID Grapple

#define	PMF_ALL_TIMES	(PMF_TIME_WATERJUMP|PMF_TIME_LAND|PMF_TIME_KNOCKBACK)

#define	MAXTOUCH	32
typedef struct {
    // state (in / out)
    playerState_t	*ps;

    // command (in)
    usercmd_t	cmd;
    int			tracemask;			// collide against these types of surfaces
    int			debugLevel;			// if set, diagnostic output will be printed
    qboolean	noFootsteps;		// if the game is setup for no footsteps by the server
    qboolean	gauntletHit;		// true if a gauntlet attack would actually hit something

    int			framecount;

    // results (out)
    int			numtouch;
    int			touchents[MAXTOUCH];

    vec3_t		mins, maxs;			// bounding box size

    int			watertype;
    int			waterlevel;

    float		xyspeed;

    // for fixed msec Pmove
    int			pmove_fixed;
    int			pmove_msec;

    // callbacks to test the world
    // these will be different functions during game and cgame
    void		(*trace)( trace_t *results, const vec3_t start, /*const*/ vec3_t mins, /*const*/ vec3_t maxs, const vec3_t end, int passEntityNum, int contentMask );
    int			(*pointcontents)( const vec3_t point, int passEntityNum );
}
pmove_t;

// if a full pmove isn't done on the client, you can just update the angles
//void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd );
//void Pmove (pmove_t *pmove);

//===================================================================================


// player_state->stats[] indexes
// NOTE: may not have more than 16
typedef enum {
    STAT_HEALTH,
    STAT_HOLDABLE_ITEM,
    //BB
    //#ifdef MISSIONPACK
    STAT_PERSISTANT_POWERUP,
    //#endif
    STAT_WEAPONS,					// 16 bit fields
    STAT_ARMOR,
    STAT_DEAD_YAW,					// look this direction when dead (FIXME: get rid of?)
    STAT_CLIENTS_READY,				// bit mask of clients wishing to exit the intermission (FIXME: configstring?)
    STAT_MAX_HEALTH,				// health / armor limit, changable by handicap
    STAT_GRAPPLE,					// (1 bit) Alliance: does player have grapple?
    // Joe - try to prevent repeating sounds
    STAT_REPEAT_WEAPONS,      // 2 bits needed, 0-2 rail, 0-1 shotgun

    // Joe - hate to do this, but putting it in player ent->s.entityNum to
    // cent->currentState.entityNum
    // isn't working
    STAT_HOOK_ENTNUM,         // 10 bits needed

    // Joe - wish I had a million of these, these are each 32 bits (int)
    // if we have to combine them later
    // this is for grapple pull predict & handgrenade
    // #14
    STAT_LASTBUTTONS,    // 8 bits
    STAT_MAX_ARMOR,
    STAT_FRAGS,
    STAT_FLAGRETURN


} statIndex_t;


// player_state->persistant[] indexes
// these fields are the only part of player_state that isn't
// cleared on respawn
// NOTE: may not have more than 16
typedef enum {
    PERS_SCORE,						// !!! MUST NOT CHANGE, SERVER AND GAME BOTH REFERENCE !!!
    PERS_HITS,						// total points damage inflicted so damage beeps can sound on change
    PERS_RANK,						// player rank or team rank
    PERS_TEAM,						// player team
    PERS_SPAWN_COUNT,				// incremented every respawn
    PERS_PLAYEREVENTS,				// 16 bits that can be flipped for events
    PERS_ATTACKER,					// clientnum of last damage inflicter
    PERS_ATTACKEE_ARMOR,			// health/armor of last person we attacked
    PERS_KILLED,					// count of the number of times you died
    // player awards tracking
    PERS_IMPRESSIVE_COUNT,			// two railgun hits in a row
    PERS_EXCELLENT_COUNT,			// two successive kills in a short amount of time
    PERS_DEFEND_COUNT,				// defend awards
    PERS_ASSIST_COUNT,				// assist awards
    PERS_GAUNTLET_FRAG_COUNT,		// kills with the guantlet
    PERS_CAPTURES,					// captures
	PERS_RETURNS//,					//flag return counts for each player
    //BB
//    PERS_FC_KILLS

} persEnum_t;

// entityState_t->eFlags
#define	EF_DEAD				0x00000001		// don't draw a foe marker over players with EF_DEAD
#ifdef MISSIONPACK
#define EF_TICKING			0x00000002		// used to make players play the prox mine ticking sound
#endif
#define	EF_TELEPORT_BIT		0x00000004		// toggled every time the origin abruptly changes
#define	EF_AWARD_EXCELLENT	0x00000008		// draw an excellent sprite
#define EF_PLAYER_EVENT		0x00000010
#define	EF_BOUNCE			0x00000010		// for missiles
#define	EF_BOUNCE_HALF		0x00000020		// for missiles
#define	EF_AWARD_GAUNTLET	0x00000040		// draw a gauntlet sprite
#define	EF_NODRAW			0x00000080		// may have an event, but no model (unspawned items)
#define	EF_FIRING			0x00000100		// for lightning gun
#define	EF_KAMIKAZE			0x00000200
#define	EF_MOVER_STOP		0x00000400		// will push otherwise
#define EF_AWARD_CAP		0x00000800		// draw the capture sprite
#define	EF_TALK				0x00001000		// draw a talk balloon
#define	EF_CONNECTION		0x00002000		// draw a connection trouble sprite
#define	EF_VOTED			0x00004000		// already cast a vote
#define	EF_AWARD_IMPRESSIVE	0x00008000		// draw an impressive sprite
#define	EF_AWARD_DEFEND		0x00010000		// draw a defend sprite
#define	EF_AWARD_ASSIST		0x00020000		// draw a assist sprite
#define EF_AWARD_DENIED		0x00040000		// denied
#define EF_TEAMVOTED		0x00080000		// already cast a team vote

// NOTE: may not have more than 16
//must do this for inv.h to work right with bots
typedef enum {
    PW_NONE,

    PW_QUAD,
    PW_BATTLESUIT,
    PW_HASTE,
    PW_INVIS,
    PW_REGEN,
    PW_FLIGHT,

    PW_REDFLAG,
    PW_BLUEFLAG,
//Edited by dio
#ifdef MISSIONPACK
    PW_NEUTRALFLAG,
    PW_SCOUT,
    PW_GUARD,
    PW_DOUBLER,
    PW_AMMOREGEN,
    PW_INVULNERABILITY,
#endif
//#ifndef MISSIONPACK
	PW_RUNEDAMAGE,
	PW_RUNERESIST,
	PW_RUNEHASTE,
	PW_RUNEREGEN,
	PW_RUNEVAMPIRE,
	PW_RUNEAMMOREGEN,
//#endif

    PW_NUM_POWERUPS

} powerup_t;

//Edited by Dio
/*
typedef enum {
	PW_NOPW,
    PW_RUNEDAMAGE,
    PW_RUNERESIST,
    PW_RUNEHASTE,
    PW_RUNEREGEN,
    PW_RUNEVAMPIRE,
    PW_RUNEAMMOREGEN,
	PW_MAX_POWERUPS
}runepowerup_t;
*/


typedef enum {
    HI_NONE,

    HI_TELEPORTER,
    HI_MEDKIT,
    HI_KAMIKAZE,
    HI_PORTAL,
    HI_INVULNERABILITY,

    HI_NUM_HOLDABLE
} holdable_t;

#ifdef MISSIONPACK

typedef enum {
    WP_NONE,
    WP_GAUNTLET,
    WP_MACHINEGUN,
    WP_SHOTGUN,
    WP_GRENADE_LAUNCHER,
    WP_ROCKET_LAUNCHER,
    WP_LIGHTNING,
    WP_RAILGUN,
    WP_PLASMAGUN,
    WP_BFG,
    WP_HANDGRENADE,		//INCIN swapped positions with grapple -- seems to solve weapon numbering
    WP_NAILGUN,
    WP_PROX_LAUNCHER,
    WP_CHAINGUN,
//  WP_OFFHAND_GRAPPLING_HOOK,	//incin swapped with grenade now offhand
    WP_GRAPPLING_HOOK,			//INCIN -- OLD Grapple
    WP_NUM_WEAPONS
} weapon_t;

#else

typedef enum {
    WP_NONE,
    WP_GAUNTLET,
    WP_MACHINEGUN,
    WP_SHOTGUN,
    WP_GRENADE_LAUNCHER,
    WP_ROCKET_LAUNCHER,
    WP_LIGHTNING,
    WP_RAILGUN,
    WP_PLASMAGUN,
    WP_BFG,
    WP_HANDGRENADE,		//INCIN swapped positions with grapple -- seems to solve weapon numbering
 //   WP_OFFHAND_GRAPPLING_HOOK,	//incin swapped with grenade now offhand
    WP_GRAPPLING_HOOK,			//INCIN -- OLD Grapple
    WP_NUM_WEAPONS
} weapon_t;

#endif


// reward sounds (stored in ps->persistant[PERS_PLAYEREVENTS])
#define	PLAYEREVENT_DENIEDREWARD		0x0001
#define	PLAYEREVENT_GAUNTLETREWARD		0x0002
#define PLAYEREVENT_HOLYSHIT			0x0004

// entityState_t->event values
// entity events are for effects that take place reletive
// to an existing entities origin.  Very network efficient.

// two bits at the top of the entityState->event field
// will be incremented with each change in the event so
// that an identical event started twice in a row can
// be distinguished.  And off the value with ~EV_EVENT_BITS
// to retrieve the actual event number
#define	EV_EVENT_BIT1		0x00000100
#define	EV_EVENT_BIT2		0x00000200
#define	EV_EVENT_BITS		(EV_EVENT_BIT1|EV_EVENT_BIT2)

#define	EVENT_VALID_MSEC	300

typedef enum {
    EV_NONE,			//0

    EV_FOOTSTEP,//1
    EV_FOOTSTEP_METAL,	//2
    EV_FOOTSPLASH,		//3
    EV_FOOTWADE,		//4
    EV_SWIM,//5

    EV_STEP_4,			//6
    EV_STEP_8,			//7
    EV_STEP_12,			//8
    EV_STEP_16,			//9

    EV_FALL_SHORT,//10
    EV_FALL_MEDIUM,		//11
    EV_FALL_FAR,		//12

    EV_JUMP_PAD,			// boing sound at origin, jump sound on player

    EV_JUMP,
    EV_WATER_TOUCH,	// foot touches
    EV_WATER_LEAVE,	// foot leaves
    EV_WATER_UNDER,	// head touches
    EV_WATER_CLEAR,	// head leaves

    EV_ITEM_PICKUP,			// normal item pickups are predictable
    EV_GLOBAL_ITEM_PICKUP, //20	// powerup / team sounds are broadcast to everyone

    EV_NOAMMO,
    EV_CHANGE_WEAPON,
    EV_FIRE_WEAPON,

    EV_USE_ITEM0,
    EV_USE_ITEM1,//25
    EV_USE_ITEM2,
    EV_USE_ITEM3,
    EV_USE_ITEM4,
    EV_USE_ITEM5,
    EV_USE_ITEM6,//30
    EV_USE_ITEM7,
    EV_USE_ITEM8,
    EV_USE_ITEM9,
    EV_USE_ITEM10,
    EV_USE_ITEM11,//35
    EV_USE_ITEM12,
    EV_USE_ITEM13,
    EV_USE_ITEM14,
    EV_USE_ITEM15,

    EV_ITEM_RESPAWN,//40
    EV_ITEM_POP,
    EV_PLAYER_TELEPORT_IN,
    EV_PLAYER_TELEPORT_OUT,

    EV_GRENADE_BOUNCE,		// eventParm will be the soundindex

    EV_GENERAL_SOUND, //45
    EV_GLOBAL_SOUND,		// no attenuation
    EV_GLOBAL_TEAM_SOUND,

    EV_BULLET_HIT_FLESH,
    EV_BULLET_HIT_WALL,

    EV_MISSILE_HIT,//50
    EV_MISSILE_MISS,
    EV_MISSILE_MISS_METAL,
    EV_RAILTRAIL,
    EV_SHOTGUN,
    EV_BULLET,	//55			// otherEntity is the shooter

    EV_PAIN,
    EV_DEATH1,
    EV_DEATH2,
    EV_DEATH3,
    EV_OBITUARY,//60

    EV_POWERUP_QUAD,
    EV_POWERUP_BATTLESUIT,
    EV_POWERUP_REGEN,
    EV_POWERUP_HASTE,
    EV_POWERUP_AMMOREGEN,
    EV_POWERUP_VAMPIRE,

    EV_GIB_PLAYER,			// gib a previously living player
    EV_SCOREPLUM,//65			// score plum

#ifdef MISSIONPACK
    EV_PROXIMITY_MINE_STICK,
    EV_PROXIMITY_MINE_TRIGGER,
    EV_KAMIKAZE,			// kamikaze explodes
    EV_OBELISKEXPLODE,		// obelisk explodes
    EV_OBELISKPAIN,			// obelisk is in pain
    EV_INVUL_IMPACT,		// invulnerability sphere impact
    EV_JUICED,				// invulnerability juiced effect
    EV_LIGHTNINGBOLT,		// lightning bolt bounced of invulnerability sphere
#endif

    EV_DEBUG_LINE,
    EV_STOPLOOPINGSOUND,
    EV_TAUNT,

#ifdef MISSIONPACK
    EV_TAUNT_YES,
    EV_TAUNT_NO,
    EV_TAUNT_FOLLOWME,
    EV_TAUNT_GETFLAG,
    EV_TAUNT_GUARDBASE,
    EV_TAUNT_PATROL,
#endif
    // Alliance: Myrkul: step down events
    EV_DOWNSTEP_4,
    EV_DOWNSTEP_8,//70
    EV_DOWNSTEP_12,
    EV_DOWNSTEP_16,

    EV_RUNE_PICKUP,
    //BB
    EV_CTF_BONUS,
    // Alliance: new events
    // (which are unfortunately incompatible with id cgame)
    // Joe - put back in, release too
    EV_FIRE_OFFHAND_GRAPPLE,		//87 Unknown event? causes cgame shutdown
    EV_RELEASE_OFFHAND_GRAPPLE,		//88

    EV_FIRE_GRAPPLE,		//87 Unknown event? causes cgame shutdown
    EV_RELEASE_GRAPPLE,

    EV_HANDGRENADE_START,
    EV_HANDGRENADE_TICK,
    EV_HANDGRENADE_CHARGED,

    EV_PLASMA_BOUNCE,
    EV_ALTWEAP_BOUNCE,
    EV_TEAM_SOUND,
    EV_VOICE_SOUND			//80

} entity_event_t;


typedef enum {
    GTS_RED_CAPTURE,
    GTS_BLUE_CAPTURE,
    GTS_RED_RETURN,
    GTS_BLUE_RETURN,
    GTS_RED_TAKEN,
    GTS_BLUE_TAKEN,
    GTS_BLUE_TAKEN_OWN,
    GTS_RED_TAKEN_OWN,
    GTS_REDOBELISK_ATTACKED,
    GTS_BLUEOBELISK_ATTACKED,
    GTS_REDTEAM_SCORED,
    GTS_BLUETEAM_SCORED,
    GTS_REDTEAM_TOOK_LEAD,
    GTS_BLUETEAM_TOOK_LEAD,
    GTS_TEAMS_ARE_TIED,
    GTS_KAMIKAZE
} global_team_sound_t;

// animations
typedef enum {
    BOTH_DEATH1,
    BOTH_DEAD1,
    BOTH_DEATH2,
    BOTH_DEAD2,
    BOTH_DEATH3,
    BOTH_DEAD3,

    TORSO_GESTURE,

    TORSO_ATTACK,
    TORSO_ATTACK2,

    TORSO_DROP,
    TORSO_RAISE,

    TORSO_STAND,
    TORSO_STAND2,

    LEGS_WALKCR,
    LEGS_WALK,
    LEGS_RUN,
    LEGS_BACK,
    LEGS_SWIM,

    LEGS_JUMP,
    LEGS_LAND,

    LEGS_JUMPB,
    LEGS_LANDB,

    LEGS_IDLE,
    LEGS_IDLECR,

    LEGS_TURN,

    TORSO_GETFLAG,
    TORSO_GUARDBASE,
    TORSO_PATROL,
    TORSO_FOLLOWME,
    TORSO_AFFIRMATIVE,
    TORSO_NEGATIVE,

    MAX_ANIMATIONS,

    LEGS_BACKCR,
    LEGS_BACKWALK,
    FLAG_RUN,
    FLAG_STAND,
    FLAG_STAND2RUN,

    MAX_TOTALANIMATIONS
} animNumber_t;


typedef struct animation_s {
    int		firstFrame;
    int		numFrames;
    int		loopFrames;			// 0 to numFrames
    int		frameLerp;			// msec between frames
    int		initialLerp;		// msec to get to first frame
    int		reversed;			// true if animation is reversed
    int		flipflop;			// true if animation should flipflop back to base
}
animation_t;


// flip the togglebit every time an animation
// changes so a restart of the same anim can be detected
#define	ANIM_TOGGLEBIT		128


typedef enum {
    TEAM_FREE,
    TEAM_RED,
    TEAM_BLUE,
    TEAM_SPECTATOR,
    //BB
    TEAM_SPECTATOR_RED,
    TEAM_SPECTATOR_BLUE,

    TEAM_NUM_TEAMS
} team_t;

// Time between location updates
#define TEAM_LOCATION_UPDATE_TIME		1000

// How many players on the overlay
#define TEAM_MAXOVERLAY		32

//team task
typedef enum {
    TEAMTASK_NONE,
    TEAMTASK_OFFENSE,
    TEAMTASK_DEFENSE,
    TEAMTASK_PATROL,
    TEAMTASK_FOLLOW,
    TEAMTASK_RETRIEVE,
    TEAMTASK_ESCORT,
    TEAMTASK_CAMP
} teamtask_t;

// means of death
typedef enum {
    MOD_UNKNOWN,
    MOD_SHOTGUN,
    MOD_GAUNTLET,
    MOD_MACHINEGUN,
    MOD_GRENADE,
    MOD_GRENADE_SPLASH,
    MOD_ROCKET,
    MOD_ROCKET_SPLASH,
    MOD_PLASMA,
    MOD_PLASMA_SPLASH,
    MOD_RAILGUN,
    MOD_LIGHTNING,
    MOD_BFG,
    MOD_BFG_SPLASH,
    MOD_WATER,
    MOD_SLIME,
    MOD_LAVA,
    MOD_CRUSH,
    MOD_TELEFRAG,
    MOD_FALLING,
    MOD_SUICIDE,
    MOD_TARGET_LASER,
    MOD_TRIGGER_HURT,
#ifdef MISSIONPACK
    MOD_NAIL,
    MOD_CHAINGUN,
    MOD_PROXIMITY_MINE,
    MOD_KAMIKAZE,
    MOD_JUICED,
#endif
    MOD_GRAPPLE,
    //Alliance - MOD for Hand Grenades - Banshee
    MOD_HANDGRENADE,
    MOD_HANDGRENADE_SPLASH,
    MOD_RAILGUN_SPLASH,
    MOD_TEAMCHANGE,
    MOD_WEAPONKNOCKBACK

} meansOfDeath_t;


//---------------------------------------------------------

// gitem_t->type
typedef enum {
    IT_BAD,
    IT_WEAPON,				// EFX: rotate + upscale + minlight
    IT_AMMO,				// EFX: rotate
    IT_ARMOR,				// EFX: rotate + minlight
    IT_HEALTH,				// EFX: static external sphere + rotating internal
    IT_POWERUP,				// instant on, timer based
    // EFX: rotate + external ring that rotates
    IT_HOLDABLE,			// single use, holdable item
    // EFX: rotate + bob
    IT_PERSISTANT_POWERUP,
    IT_TEAM,
    IT_GRAPPLE
    //IT_BBPOWERUP,
} itemType_t;

#define MAX_ITEM_MODELS 4

typedef struct gitem_s {
    char		*classname;	// spawning name
    char		*pickup_sound;
    char		*world_model[MAX_ITEM_MODELS];

    char		*icon;
    char		*pickup_name;	// for printing on pickup

    int			quantity;		// for ammo how much, or duration of powerup
    itemType_t  giType;			// IT_* flags

    int			giTag;

    char		*precaches;		// string of all models and images this item will use
    char		*sounds;		// string of all sounds this item will use
}
gitem_t;

// included in both the game dll and the client
extern	gitem_t	bg_itemlist[];
extern	int		bg_numItems;

gitem_t	*BG_FindItem( const char *pickupName );
gitem_t	*BG_FindItemForWeapon( weapon_t weapon );
gitem_t	*BG_FindItemForPowerup( powerup_t pw );
gitem_t	*BG_FindItemForHoldable( holdable_t pw );
gitem_t	*BG_FindItemForRune( powerup_t pw );
gitem_t	*BG_FindItemAmmoForWeapon( weapon_t weapon );
gitem_t *BG_FindItemByClass( const char *classname );
gitem_t *BG_Find_Offhand_Grapple(void);
gitem_t *BG_Find_Grapple(void);

#define	ITEM_INDEX(x) ((x)-bg_itemlist)

qboolean	BG_CanItemBeGrabbed( int gametype, const entityState_t *ent, const playerState_t *ps );

// BB
//char *coloredTeamName(team_t team);
// Map location related flags
#define LOC_SMALLEST_FLAG  20
#define FL_DEEP_RED        (1 << LOC_SMALLEST_FLAG)
#define FL_HALF_RED        (1 << (LOC_SMALLEST_FLAG + 1))
#define FL_MIDDLE          (1 << (LOC_SMALLEST_FLAG + 2))
#define FL_HALF_BLUE       (1 << (LOC_SMALLEST_FLAG + 3))
#define FL_DEEP_BLUE       (1 << (LOC_SMALLEST_FLAG + 4))
// Location mask for location flags
#define LOC_MASK           (FL_DEEP_RED | FL_HALF_RED | FL_MIDDLE | FL_HALF_BLUE | FL_DEEP_BLUE)

// Means no location info available
#define LOC_INVALID        -1

typedef enum {
    LOC_DEEP_RED,
    LOC_HALF_RED,
    LOC_MIDDLE,
    LOC_HALF_BLUE,
    LOC_DEEP_BLUE
} location_t;

// locations in the context of a particular team
typedef enum {
    POS_HOME_BASE,
    POS_HOME_TERRITORY,
    POS_NEUTRAL,
    POS_ENEMY_TERRITORY,
    POS_ENEMY_BASE
} relativeLocation_t;

// convert location spawnflags to location_t
location_t spawnflagsToLocation(int spawnFlags);
// return team-relative locations (eg LOC_ENEMY_BASE)
relativeLocation_t relativeLocation(int team, int locationFlag);


// g_dmflags->integer flags
#define	DF_NO_FALLING			8		//NO FALL DAMAGE
#define DF_FIXED_FOV			16		//FOV 90
#define	DF_NO_FOOTSTEPS			32		//NO FOOTSTEPS
#define DF_NO_PLATS				64		//NO MOVER PLATS SPAWN IN MAPS
#define DF_NO_DOORS				128		//NO DOORS SPAWN IN MAPS
// THE OVERRIDES IS DUE TO THE FACT THAT I AM NOT GOING THRU THE HASSLE OF REWRITING THE ITEMS PAGE IN UIE
#define DF_NO_IDPOWERUPS		256		//NO ID POWERUPS -- OVERRIDES UI SETTINGS
#define DF_NO_HOLDABLES			512		//NO HOLDABLE ITEMS SPAWN IN MAPS -- OVERRIDES UI SETTINGS
#define DF_NO_CLIPBRUSH			1024	//flag to allow players to go thru playerclip space


// content masks
#define	MASK_ALL				(-1)
#define	MASK_SOLID				(CONTENTS_SOLID)

#ifdef GAME
	extern vmCvar_t g_dmflags;
	#define	MASK_PLAYERSOLID		(g_dmflags.integer & DF_NO_CLIPBRUSH)?(CONTENTS_SOLID|CONTENTS_BODY):(CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_BODY)
#endif

#ifdef CGAME
	//serverConfig_t cg_serverConfig;
	#define	MASK_PLAYERSOLID		(cg_serverConfig.dm_flags & DF_NO_CLIPBRUSH)?(CONTENTS_SOLID|CONTENTS_BODY):(CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_BODY)
#endif


#define	MASK_DEADSOLID			(CONTENTS_SOLID|CONTENTS_PLAYERCLIP)
#define	MASK_WATER				(CONTENTS_WATER|CONTENTS_LAVA|CONTENTS_SLIME)
#define	MASK_OPAQUE				(CONTENTS_SOLID|CONTENTS_SLIME|CONTENTS_LAVA)
#define	MASK_SHOT				(CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_CORPSE)


//
// entityState_t->eType
//
typedef enum {
    ET_GENERAL,
    ET_PLAYER,
    ET_ITEM,
    ET_MISSILE,
    ET_MOVER,
    ET_BEAM,
    ET_PORTAL,
    ET_SPEAKER,
    ET_PUSH_TRIGGER,
    ET_TELEPORT_TRIGGER,
    ET_INVISIBLE,
    ET_OFFHAND_GRAPPLE,				// offhand grapple hooked on wall
    ET_GRAPPLE,						// grapple hooked on wall
    ET_TEAM,

    ET_EVENTS				// any of the EV_* events can be added freestanding
    // by setting eType to ET_EVENTS + eventNum
    // this avoids having to set eFlags and eventNum
} entityType_t;


// Alliance: Myrkul: arc-sine and arc-cosine with domain clamping
//double safe_asin( double x );
double safe_acos( double x );



void	BG_EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result );
void	BG_EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result );

void	BG_AddPredictableEventToPlayerstate( int newEvent, int eventParm, playerState_t *ps );

void	BG_TouchJumpPad( playerState_t *ps, entityState_t *jumppad );

void	BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean snap );
void	BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s, int time, qboolean snap );

qboolean	BG_PlayerTouchesItem( playerState_t *ps, entityState_t *item, int atTime );

qboolean PM_PressingJump( void );

int		BG_GetWeaponReloadTime( int weapon );


#define ARENAS_PER_TIER		4
#define MAX_ARENAS			1024
#define	MAX_ARENAS_TEXT		8192

#define MAX_BOTS			1024
#define MAX_BOTS_TEXT		8192


// Kamikaze
#ifdef MISSIONPACK
// 1st shockwave times
#define KAMI_SHOCKWAVE_STARTTIME		0
#define KAMI_SHOCKWAVEFADE_STARTTIME	1500
#define KAMI_SHOCKWAVE_ENDTIME			2000
// explosion/implosion times
#define KAMI_EXPLODE_STARTTIME			250
#define KAMI_IMPLODE_STARTTIME			2000
#define KAMI_IMPLODE_ENDTIME			2250
// 2nd shockwave times
#define KAMI_SHOCKWAVE2_STARTTIME		2000
#define KAMI_SHOCKWAVE2FADE_STARTTIME	2500
#define KAMI_SHOCKWAVE2_ENDTIME			3000
// radius of the models without scaling
#define KAMI_SHOCKWAVEMODEL_RADIUS		88
#define KAMI_BOOMSPHEREMODEL_RADIUS		72
// maximum radius of the models during the effect
#define KAMI_SHOCKWAVE_MAXRADIUS		1320
#define KAMI_BOOMSPHERE_MAXRADIUS		720
#define KAMI_SHOCKWAVE2_MAXRADIUS		704
#endif

#endif //_BG_PUBLIC_H_
