//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================//

#ifndef TFC_SHAREDDEFS_H
#define TFC_SHAREDDEFS_H
#ifdef _WIN32
#pragma once
#endif


#include "shareddefs.h"


// Using MAP_DEBUG mode?
#ifdef MAP_DEBUG
	#define MDEBUG(x) x
#else
	#define MDEBUG(x)
#endif


#define TFC_PLAYER_VIEW_OFFSET	Vector( 0, 0, 53.5 )


// Team IDs.
//	#define TEAM_SPECTATOR	0 // This is set in shareddefs.h
#define	TEAM_BLUE		1
#define TEAM_RED		2
#define TEAM_YELLOW		3
#define TEAM_GREEN		4
#define TEAM_MAXCOUNT	5	// update this if we ever add teams (unlikely)


// Defines for the playerclass
#define PC_UNDEFINED	0 

#define PC_SCOUT		1 
#define PC_SNIPER		2 
#define PC_SOLDIER		3 
#define PC_DEMOMAN		4 
#define PC_MEDIC		5 
#define PC_HWGUY		6 
#define PC_PYRO			7
#define PC_SPY			8
#define PC_ENGINEER		9
#define PC_LAST_NORMAL_CLASS	9

#define PC_CIVILIAN		10		// Civilians are a special class. They cannot
								// be chosen by players, only enforced by maps
#define PC_LASTCLASS	11 		// Use this as the high-boundary for any loops
								// through the playerclass.


/*======================*/
//      Menu stuff      //
/*======================*/

#define MENU_DEFAULT				1
#define MENU_TEAM 					2
#define MENU_CLASS 					3
#define MENU_MAPBRIEFING			4
#define MENU_INTRO 					5
#define MENU_CLASSHELP				6
#define MENU_CLASSHELP2 			7
#define MENU_REPEATHELP 			8

#define MENU_SPECHELP				9


#define MENU_SPY					12
#define MENU_SPY_SKIN				13
#define MENU_SPY_COLOR				14
#define MENU_ENGINEER				15
#define MENU_ENGINEER_FIX_DISPENSER	16
#define MENU_ENGINEER_FIX_SENTRYGUN	17
#define MENU_ENGINEER_FIX_MORTAR	18
#define MENU_DISPENSER				19
#define MENU_CLASS_CHANGE			20
#define MENU_TEAM_CHANGE			21

#define MENU_REFRESH_RATE 			25

#define MENU_VOICETWEAK				50



// Additional classes
// NOTE: adding them onto the Class_T's in baseentity.h is cheesy, but so is
// having an #ifdef for each mod in baseentity.h.
#define CLASS_TFGOAL				((Class_T)NUM_AI_CLASSES)
#define CLASS_TFGOAL_TIMER			((Class_T)(NUM_AI_CLASSES+1))
#define CLASS_TFGOAL_ITEM			((Class_T)(NUM_AI_CLASSES+2))
#define CLASS_TFSPAWN				((Class_T)(NUM_AI_CLASSES+3))
#define CLASS_MACHINE				((Class_T)(NUM_AI_CLASSES+4))


// Building types
#define BUILD_DISPENSER				1
#define BUILD_SENTRYGUN				2
#define BUILD_MORTAR				3
#define BUILD_TELEPORTER_ENTRY		4
#define BUILD_TELEPORTER_EXIT		5


// Grenade types.
enum GrenadeType_t
{
	GR_TYPE_NONE=0,
	GR_TYPE_NORMAL,
	GR_TYPE_CONCUSSION,
	GR_TYPE_NAIL,
	GR_TYPE_MIRV,
	GR_TYPE_NAPALM,
	GR_TYPE_GAS,
	GR_TYPE_EMP,
	GR_TYPE_CALTROP,
	NUM_GRENADE_TYPES
};

// Max amount of each grenade each player can carry.
// This is in addition to the player's
extern int g_nMaxGrenades[NUM_GRENADE_TYPES];


// These are the names of the ammo types that go in the CAmmoDefs and that the 
// weapon script files reference.
// These directly correspond to ammo_X in the goldsrc tfc code.
#define TFC_AMMO_DUMMY			0	// This is a dummy index, to make the CAmmoDef indices correct for the other ammo types.

#define TFC_AMMO_SHELLS			1
#define TFC_AMMO_SHELLS_NAME	"TFC_AMMO_SHELLS"

#define TFC_AMMO_NAILS			2
#define TFC_AMMO_NAILS_NAME		"TFC_AMMO_NAILS"

#define TFC_AMMO_ROCKETS		3
#define TFC_AMMO_ROCKETS_NAME	"TFC_AMMO_ROCKETS"

#define TFC_AMMO_CELLS			4
#define TFC_AMMO_CELLS_NAME		"TFC_AMMO_CELLS"

#define TFC_AMMO_MEDIKIT		5
#define TFC_AMMO_MEDIKIT_NAME	"TFC_AMMO_MEDIKIT"

#define TFC_AMMO_DETPACK		6
#define TFC_AMMO_DETPACK_NAME	"TFC_AMMO_DETPACK"

#define TFC_AMMO_GRENADES1		7
#define TFC_AMMO_GRENADES1_NAME "TFC_AMMO_GRENADES1"

#define TFC_AMMO_GRENADES2		8
#define TFC_AMMO_GRENADES2_NAME	"TFC_AMMO_GRENADES2"

#define TFC_NUM_AMMO_TYPES		9	// NOTE: KEEP THESE UP TO DATE WITH g_AmmoTypeNames[]
extern const char* g_AmmoTypeNames[TFC_NUM_AMMO_TYPES];



// TeamFortress State Flags
#define TFSTATE_GRENPRIMED		0x000001 // Whether the player has a primed grenade
#define TFSTATE_RELOADING		0x000002 // Whether the player is reloading
#define TFSTATE_ALTKILL			0x000004 // #TRUE if killed with a weapon not in self.weapon: NOT USED ANYMORE
#define TFSTATE_RANDOMPC		0x000008 // Whether Playerclass is random, new one each respawn
#define TFSTATE_INFECTED		0x000010 // set when player is infected by the bioweapon
#define TFSTATE_INVINCIBLE		0x000020 // Player has permanent Invincibility (Usually by GoalItem)
#define TFSTATE_INVISIBLE		0x000040 // Player has permanent Invisibility (Usually by GoalItem)
#define TFSTATE_QUAD			0x000080 // Player has permanent Quad Damage (Usually by GoalItem)
#define TFSTATE_RADSUIT			0x000100 // Player has permanent Radsuit (Usually by GoalItem)
#define TFSTATE_BURNING			0x000200 // Is on fire
#define TFSTATE_GRENTHROWING	0x000400  // is throwing a grenade
#define TFSTATE_AIMING			0x000800  // is using the laser sight
#define TFSTATE_ZOOMOFF			0x001000  // doesn't want the FOV changed when zooming
#define TFSTATE_RESPAWN_READY	0x002000  // is waiting for respawn, and has pressed fire
#define TFSTATE_HALLUCINATING	0x004000  // set when player is hallucinating
#define TFSTATE_TRANQUILISED	0x008000  // set when player is tranquilised
#define TFSTATE_CANT_MOVE		0x010000  // set when player is setting a detpack
#define TFSTATE_RESET_FLAMETIME 0x020000 // set when the player has to have his flames increased in health
#define TFSTATE_HIGHEST_VALUE	TFSTATE_RESET_FLAMETIME


// items
#define IT_SHOTGUN				(1<<0)
#define IT_SUPER_SHOTGUN		(1<<1) 
#define IT_NAILGUN				(1<<2) 
#define IT_SUPER_NAILGUN		(1<<3) 
#define IT_GRENADE_LAUNCHER		(1<<4) 
#define IT_ROCKET_LAUNCHER		(1<<5) 
#define IT_LIGHTNING			(1<<6) 
#define IT_EXTRA_WEAPON			(1<<7) 

#define IT_SHELLS				(1<<8) 
#define IT_NAILS				(1<<9) 
#define IT_ROCKETS				(1<<10) 
#define IT_CELLS				(1<<11) 
#define IT_AXE					(1<<12) 

#define IT_ARMOR1				(1<<13) 
#define IT_ARMOR2				(1<<14) 
#define IT_ARMOR3				(1<<15) 
#define IT_SUPERHEALTH			(1<<16) 

#define IT_KEY1					(1<<17) 
#define IT_KEY2					(1<<18) 

#define IT_INVISIBILITY			(1<<19) 
#define IT_INVULNERABILITY		(1<<20) 
#define IT_SUIT					(1<<21)
#define IT_QUAD					(1<<22) 
#define IT_HOOK					(1<<23)

#define IT_KEY3					(1<<24)	// Stomp invisibility
#define IT_KEY4					(1<<25)	// Stomp invulnerability
#define IT_LAST_ITEM			IT_KEY4


enum TFCTimer_t
{
	TF_TIMER_ANY=0,
	TF_TIMER_CONCUSSION,
	TF_TIMER_INFECTION,
	TF_TIMER_HALLUCINATION,
	TF_TIMER_TRANQUILISATION,
	TF_TIMER_ROTHEALTH,
	TF_TIMER_REGENERATION,
	TF_TIMER_GRENPRIME,
	TF_TIMER_CELLREGENERATION,
	TF_TIMER_DETPACKSET,
	TF_TIMER_DETPACKDISARM,
	TF_TIMER_BUILD,
	TF_TIMER_CHECKBUILDDISTANCE,
	TF_TIMER_DISGUISE,
	TF_TIMER_DISPENSERREFILL,

	// Non player timers.
	TF_TIMER_RETURNITEM,
	TF_TIMER_DELAYEDGOAL,
	TF_TIMER_ENDROUND
};



/*==================================================*/
/* New Weapon Related Defines		                */
/*==================================================*/

// Medikit
#define WEAP_MEDIKIT_OVERHEAL 50 // Amount of superhealth over max_health the medikit will dispense
#define WEAP_MEDIKIT_HEAL	200  // Amount medikit heals per hit



//--------------
// TFC Specific damage flags
//--------------
#define DMG_IGNORE_MAXHEALTH	(DMG_LASTGENERICFLAG<<1)
#define DMG_IGNOREARMOR			(DMG_LASTGENERICFLAG<<2)


// ------------------------------------------------------------------------------ //
// Info for each player class.
// ------------------------------------------------------------------------------ //

class CTFCPlayerClassInfo
{
public:
	const char *m_pClassName;
	const char *m_pModelName;	// What model this class uses.
	
	float m_flMaxSpeed;
	int m_iMaxHealth;
	
	int m_iInitArmor;
	int m_iMaxArmor;
	float m_flInitArmorType;
	float m_flMaxArmorType;
	int m_iInitArmorClass;
	int m_nArmorClasses;

	// What types of grenades does this guy carry?
	// GR_TYPE_ defines.
	GrenadeType_t m_iGrenadeType1;
	GrenadeType_t m_iGrenadeType2;
	
	int m_InitAmmo[TFC_NUM_AMMO_TYPES]; // These are in the same order as g_AmmoTypeNames.
	int m_MaxAmmo[TFC_NUM_AMMO_TYPES]; // These are in the same order as g_AmmoTypeNames.
};

const CTFCPlayerClassInfo* GetTFCClassInfo( int iClass );


// The various states the player can be in during the join game process.
enum TFCPlayerState
{
	// Happily running around in the game.
	// You can't move though if CSGameRules()->IsFreezePeriod() returns true.
	// This state can jump to a bunch of other states like STATE_PICKINGCLASS or STATE_DEATH_ANIM.
	STATE_ACTIVE=0,
	
	// This is the state you're in when you first enter the server.
	// It's switching between intro cameras every few seconds, and there's a level info 
	// screen up.
	STATE_WELCOME,			// Show the level intro screen.
	
	// During these states, you can either be a new player waiting to join, or
	// you can be a live player in the game who wants to change teams.
	// Either way, you can't move while choosing team or class (or while any menu is up).
	STATE_PICKINGTEAM,			// Choosing team.
	STATE_PICKINGCLASS,			// Choosing class.

	STATE_OBSERVER_MODE,

	STATE_DYING,

	TFC_NUM_PLAYER_STATES
};


#endif // TFC_SHAREDDEFS_H