//========= Copyright Valve Corporation, All rights reserved. ============//
//
// NOTE: Inserting to most or all of the enums in this file will BREAK DEMOS -
// please add to the end instead.
//
//=============================================================================
#ifndef TF_SHAREDDEFS_H
#define TF_SHAREDDEFS_H
#ifdef _WIN32
#pragma once
#endif

#include "shareddefs.h"
#include "mp_shareddefs.h"
#include "tf_matchmaking_shared.h"

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

		   
#define	MAX_MVM_WAVE_STRING 256


//-----------------------------------------------------------------------------
// Teams.
//-----------------------------------------------------------------------------
enum
{
	TF_TEAM_RED = LAST_SHARED_TEAM+1,
	TF_TEAM_BLUE,
	TF_TEAM_COUNT
};

#define TF_TEAM_AUTOASSIGN (TF_TEAM_COUNT + 1 )

#define TF_TEAM_HALLOWEEN	TF_TEAM_AUTOASSIGN

#define TF_TEAM_PVE_INVADERS	TF_TEAM_BLUE		// invading bot team in mann vs machine
#define TF_TEAM_PVE_DEFENDERS	TF_TEAM_RED			// defending player team in mann vs machine

#define TF_TEAM_PVE_INVADERS_GIANTS 4				// hack for replacing visuals via itemdef

extern const char *g_aTeamNames[TF_TEAM_COUNT];
extern color32 g_aTeamColors[TF_TEAM_COUNT];

#define COLOR_TF_SPECTATOR	Color( 245, 229, 196, 255 )
#define COLOR_TF_RED		Color( 175, 73, 73, 255 )
#define COLOR_TF_BLUE		Color( 79, 117, 143, 255 )

#define CONTENTS_REDTEAM	CONTENTS_TEAM1
#define CONTENTS_BLUETEAM	CONTENTS_TEAM2

enum 
{
	TF_ARENA_NOTIFICATION_CAREFUL = 0,
	TF_ARENA_NOTIFICATION_SITOUT,
	TF_ARENA_NOTIFICATION_NOPLAYERS,
};

// Team roles
enum 
{
	TEAM_ROLE_NONE = 0,
	TEAM_ROLE_DEFENDERS,
	TEAM_ROLE_ATTACKERS,

	NUM_TEAM_ROLES,
};

enum HalloweenBossType
{
	HALLOWEEN_BOSS_INVALID = 0,
	HALLOWEEN_BOSS_HHH = 1,
	HALLOWEEN_BOSS_MONOCULUS = 2,
	HALLOWEEN_BOSS_MERASMUS = 3,
};

// common utility
inline int GetEnemyTeam( int team )
{
	if ( team == TF_TEAM_RED )
		return TF_TEAM_BLUE;

	if ( team == TF_TEAM_BLUE )
		return TF_TEAM_RED;

	// no enemy team
	return team;
}

// Is this a active in-game team, vs spectator/unassigned/special-values/etc.
inline bool BIsGameTeam( int team )
{
	return team >= FIRST_GAME_TEAM;
}

inline bool BAreTeamsEnemies( int team, int otherTeam )
{
	// Right now all game teams are enemies in TF -- We may want to change this in the future for special mechanics/etc.
	return BIsGameTeam( team ) && BIsGameTeam( otherTeam ) && team != otherTeam;
}

enum PowerupBottleType_t
{
	POWERUP_BOTTLE_NONE,

	POWERUP_BOTTLE_CRITBOOST,
	POWERUP_BOTTLE_UBERCHARGE,
	POWERUP_BOTTLE_RECALL,
	POWERUP_BOTTLE_REFILL_AMMO,
	POWERUP_BOTTLE_BUILDINGS_INSTANT_UPGRADE,
	POWERUP_BOTTLE_RADIUS_STEALTH,
#ifdef STAGING_ONLY
	POWERUP_BOTTLE_SEE_CASH_THROUGH_WALL,
#endif

	POWERUP_BOTTLE_TOTAL
};

enum 
{
	MVM_EVENT_POPFILE_NONE = 0,
	MVM_EVENT_POPFILE_HALLOWEEN,

	MVM_EVENT_POPFILE_MAX_TYPES,
};

enum
{
	DRAW_ARROW_UP,
	DRAW_ARROW_LEFT,
	DRAW_ARROW_RIGHT
};

//-----------------------------------------------------------------------------
// CVar replacements
//-----------------------------------------------------------------------------
#define TF_DAMAGE_CRIT_CHANCE				0.02f
#define TF_DAMAGE_CRIT_CHANCE_RAPID			0.02f
#define TF_DAMAGE_CRIT_DURATION_RAPID		2.0f
#define TF_DAMAGE_CRIT_CHANCE_MELEE			0.15f

#define TF_DAMAGE_CRITMOD_MAXTIME			20
#define TF_DAMAGE_CRITMOD_MINTIME			2
#define TF_DAMAGE_CRITMOD_DAMAGE			800
#define TF_DAMAGE_CRITMOD_MAXMULT			6

#define TF_DAMAGE_CRIT_MULTIPLIER			3.0f
#define TF_DAMAGE_MINICRIT_MULTIPLIER		1.35f

//-----------------------------------------------------------------------------
// TF-specific viewport panels
//-----------------------------------------------------------------------------
#define PANEL_CLASS_BLUE		"class_blue"
#define PANEL_CLASS_RED			"class_red"
#define PANEL_MAPINFO			"mapinfo"
#define PANEL_ROUNDINFO			"roundinfo"

#define PANEL_CHARACTER_INFO	"character_info"

#define PANEL_ARENA_WIN		"arenawinpanel"
#define PANEL_ARENA_TEAM	"arenateampanel"

#define PANEL_PVE_WIN		"pvewinpanel"

#define PANEL_GIVEAWAY_ITEM		"giveaway_item"

#define PANEL_MAINMENUOVERRIDE	"MainMenuOverride"

#define PANEL_QUEST_LOG				"QuestLog"

// file we'll save our list of viewed intro movies in
#define MOVIES_FILE				"viewed.res"

#define TF_WEAPON_TAUNT_FRONTIER_JUSTICE_GUITAR_MODEL	"models/player/items/engineer/guitar.mdl"

//-----------------------------------------------------------------------------
// Used in calculating the health percentage of a player
//-----------------------------------------------------------------------------
#define TF_HEALTH_UNDEFINED		1

//-----------------------------------------------------------------------------
// Used to mark a spy's disguise attribute (team or class) as "unused"
//-----------------------------------------------------------------------------
#define TF_SPY_UNDEFINED		TEAM_UNASSIGNED

//-----------------------------------------------------------------------------
// Player Classes.
//-----------------------------------------------------------------------------
#define TF_CLASS_COUNT			( TF_CLASS_COUNT_ALL )

#define TF_FIRST_NORMAL_CLASS	( TF_CLASS_UNDEFINED + 1 )
#define TF_LAST_NORMAL_CLASS	( TF_CLASS_CIVILIAN )

#define	TF_CLASS_MENU_BUTTONS	( TF_CLASS_RANDOM + 1 )

enum
{
	TF_CLASS_UNDEFINED = 0,

	TF_CLASS_SCOUT,			// TF_FIRST_NORMAL_CLASS
    TF_CLASS_SNIPER,
    TF_CLASS_SOLDIER,
	TF_CLASS_DEMOMAN,
	TF_CLASS_MEDIC,
	TF_CLASS_HEAVYWEAPONS,
	TF_CLASS_PYRO,
	TF_CLASS_SPY,
	TF_CLASS_ENGINEER,		

	// Add any new classes after Engineer
	TF_CLASS_CIVILIAN,		// TF_LAST_NORMAL_CLASS
	TF_CLASS_COUNT_ALL,

	TF_CLASS_RANDOM
};

inline bool IsValidTFPlayerClass( int iClass ) { return iClass >= TF_FIRST_NORMAL_CLASS && iClass < TF_LAST_NORMAL_CLASS; }
inline bool IsValidTFTeam( int iTeam ) { return iTeam == TF_TEAM_RED || iTeam == TF_TEAM_BLUE; }

#define FOR_EACH_NORMAL_PLAYER_CLASS( _i ) for ( int _i = TF_FIRST_NORMAL_CLASS; _i < TF_LAST_NORMAL_CLASS; _i++ )

extern const char *g_aPlayerClassNames[TF_CLASS_MENU_BUTTONS];				// localization keys
extern const char *g_aPlayerClassNames_NonLocalized[TF_CLASS_MENU_BUTTONS];	// non-localized class names
extern const char *g_aRawPlayerClassNamesShort[TF_CLASS_MENU_BUTTONS];		// raw class names, useful for formatting resource/material filenames - "heavy" instead of "heavyweapons" and "demo" instead of "demoman"
extern const char *g_aRawPlayerClassNames[TF_CLASS_MENU_BUTTONS];			// raw class names, useful for formatting resource/material filenames

extern const char g_szPlayerRobotModels[TF_LAST_NORMAL_CLASS][ MAX_PATH ];

extern const char g_szBotModels[TF_LAST_NORMAL_CLASS][ MAX_PATH ];
extern const char g_szBotBossModels[TF_LAST_NORMAL_CLASS][ MAX_PATH ];
extern const char g_szBotBossSentryBusterModel[ MAX_PATH ];

extern const char g_szRomePromoItems_Hat[TF_LAST_NORMAL_CLASS][ MAX_PATH ];
extern const char g_szRomePromoItems_Misc[TF_LAST_NORMAL_CLASS][ MAX_PATH ];

int GetClassIndexFromString( const char *pClassName, int nLastClassIndex = TF_LAST_NORMAL_CLASS );

// menu buttons are not in the same order as the defines
extern int iRemapIndexToClass[TF_CLASS_MENU_BUTTONS];
int GetRemappedMenuIndexForClass( int iClass );

extern const char *g_pszBreadModels[];

//-----------------------------------------------------------------------------
// For entity_capture_flags to use when placed in the world
// NOTE: Inserting to most or all of the enums in this file will BREAK DEMOS -
// please add to the end instead.
//-----------------------------------------------------------------------------
enum ETFFlagType
{
	TF_FLAGTYPE_CTF = 0,
	TF_FLAGTYPE_ATTACK_DEFEND,
	TF_FLAGTYPE_TERRITORY_CONTROL,
	TF_FLAGTYPE_INVADE,
	TF_FLAGTYPE_RESOURCE_CONTROL,
	TF_FLAGTYPE_ROBOT_DESTRUCTION,
	TF_FLAGTYPE_PLAYER_DESTRUCTION

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

//-----------------------------------------------------------------------------
// For the game rules to determine which type of game we're playing
//
// NOTE: Inserting to most or all of the enums in this file will BREAK DEMOS -
// please add to the end instead.
//-----------------------------------------------------------------------------
enum ETFGameType
{
	TF_GAMETYPE_UNDEFINED = 0,
	TF_GAMETYPE_CTF,
	TF_GAMETYPE_CP,
	TF_GAMETYPE_ESCORT,
	TF_GAMETYPE_ARENA,
	TF_GAMETYPE_MVM,
	TF_GAMETYPE_RD,
	TF_GAMETYPE_PASSTIME,
	TF_GAMETYPE_PD,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
	TF_GAMETYPE_COUNT
};
const char *GetGameTypeName( ETFGameType gameType );
const char *GetEnumGameTypeName( ETFGameType gameType );
ETFGameType GetGameTypeFromName( const char *pszGameType );

//=============================================================================
// HPE_BEGIN:
// [msmith]	Added a HUD type so that we can have the hud independent from the
//			game type.  This is useful in training where we want a training hud
//			Instead of the other types of HUD.
//=============================================================================
enum
{
	TF_HUDTYPE_UNDEFINED = 0,
	TF_HUDTYPE_CTF,
	TF_HUDTYPE_CP,
	TF_HUDTYPE_ESCORT,
	TF_HUDTYPE_ARENA,
	TF_HUDTYPE_TRAINING,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};
//=============================================================================
// HPE_END
//=============================================================================

//-----------------------------------------------------------------------------
// Buildings.
//-----------------------------------------------------------------------------
enum
{
	TF_BUILDING_SENTRY				= (1<<0),
	TF_BUILDING_DISPENSER			= (1<<1),
	TF_BUILDING_TELEPORT			= (1<<2),

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

//-----------------------------------------------------------------------------
// Items.
//-----------------------------------------------------------------------------
enum
{
	TF_ITEM_UNDEFINED		= 0,
	TF_ITEM_CAPTURE_FLAG	= (1<<0),
	TF_ITEM_HEALTH_KIT		= (1<<1),
	TF_ITEM_ARMOR			= (1<<2),
	TF_ITEM_AMMO_PACK		= (1<<3),
	TF_ITEM_GRENADE_PACK	= (1<<4),

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

//-----------------------------------------------------------------------------
// Ammo.
//-----------------------------------------------------------------------------
enum ETFAmmoType
{
	TF_AMMO_DUMMY = 0,	// Dummy index to make the CAmmoDef indices correct for the other ammo types.
	TF_AMMO_PRIMARY,
	TF_AMMO_SECONDARY,
	TF_AMMO_METAL,
	TF_AMMO_GRENADES1,
	TF_AMMO_GRENADES2,
	TF_AMMO_GRENADES3,	// Utility Slot Grenades
	TF_AMMO_COUNT,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};
const char *GetAmmoName( int iAmmoType );

//-----------------------------------------------------------------------------
// Weapons.
//-----------------------------------------------------------------------------
#define TF_PLAYER_WEAPON_COUNT		6
#define TF_PLAYER_GRENADE_COUNT		2
#define TF_PLAYER_BUILDABLE_COUNT	3
#define TF_PLAYER_BLUEPRINT_COUNT	6

#define TF_WEAPON_PRIMARY_MODE		0
#define TF_WEAPON_SECONDARY_MODE	1

#define TF_WEAPON_GRENADE_FRICTION						0.6f
#define TF_WEAPON_GRENADE_GRAVITY						0.81f
#define TF_WEAPON_GRENADE_INITPRIME						0.8f
#define TF_WEAPON_GRENADE_CONCUSSION_TIME				15.0f
#define TF_WEAPON_GRENADE_MIRV_BOMB_COUNT				4
#define TF_WEAPON_GRENADE_CALTROP_TIME					8.0f

#define TF_WEAPON_PIPEBOMB_WORLD_COUNT					15
#define TF_WEAPON_PIPEBOMB_COUNT						8
#define TF_WEAPON_PIPEBOMB_INTERVAL						0.6f

#define TF_WEAPON_ROCKET_INTERVAL						0.8f

#define TF_WEAPON_FLAMETHROWER_INTERVAL					0.15f
#define TF_WEAPON_FLAMETHROWER_ROCKET_INTERVAL			0.8f

#define TF_WEAPON_ZOOM_FOV								20

//
// NOTE: Inserting to most or all of the enums in this file will BREAK DEMOS -
// please add to the end instead.
//
enum ETFWeaponType
{
	TF_WEAPON_NONE = 0,
	TF_WEAPON_BAT,
	TF_WEAPON_BAT_WOOD,
	TF_WEAPON_BOTTLE, 
	TF_WEAPON_FIREAXE,
	TF_WEAPON_CLUB,
	TF_WEAPON_CROWBAR,
	TF_WEAPON_KNIFE,
	TF_WEAPON_FISTS,
	TF_WEAPON_SHOVEL,
	TF_WEAPON_WRENCH,
	TF_WEAPON_BONESAW,
	TF_WEAPON_SHOTGUN_PRIMARY,
	TF_WEAPON_SHOTGUN_SOLDIER,
	TF_WEAPON_SHOTGUN_HWG,
	TF_WEAPON_SHOTGUN_PYRO,
	TF_WEAPON_SCATTERGUN,
	TF_WEAPON_SNIPERRIFLE,
	TF_WEAPON_MINIGUN,
	TF_WEAPON_SMG,
	TF_WEAPON_SYRINGEGUN_MEDIC,
	TF_WEAPON_TRANQ,
	TF_WEAPON_ROCKETLAUNCHER,
	TF_WEAPON_GRENADELAUNCHER,
	TF_WEAPON_PIPEBOMBLAUNCHER,
	TF_WEAPON_FLAMETHROWER,
	TF_WEAPON_GRENADE_NORMAL,
	TF_WEAPON_GRENADE_CONCUSSION,
	TF_WEAPON_GRENADE_NAIL,
	TF_WEAPON_GRENADE_MIRV,
	TF_WEAPON_GRENADE_MIRV_DEMOMAN,
	TF_WEAPON_GRENADE_NAPALM,
	TF_WEAPON_GRENADE_GAS,
	TF_WEAPON_GRENADE_EMP,
	TF_WEAPON_GRENADE_CALTROP,
	TF_WEAPON_GRENADE_PIPEBOMB,
	TF_WEAPON_GRENADE_SMOKE_BOMB,
	TF_WEAPON_GRENADE_HEAL,
	TF_WEAPON_GRENADE_STUNBALL,
	TF_WEAPON_GRENADE_JAR,
	TF_WEAPON_GRENADE_JAR_MILK,
	TF_WEAPON_PISTOL,
	TF_WEAPON_PISTOL_SCOUT,
	TF_WEAPON_REVOLVER,
	TF_WEAPON_NAILGUN,
	TF_WEAPON_PDA,
	TF_WEAPON_PDA_ENGINEER_BUILD,
	TF_WEAPON_PDA_ENGINEER_DESTROY,
	TF_WEAPON_PDA_SPY,
	TF_WEAPON_BUILDER,
	TF_WEAPON_MEDIGUN,
	TF_WEAPON_GRENADE_MIRVBOMB,
	TF_WEAPON_FLAMETHROWER_ROCKET,
	TF_WEAPON_GRENADE_DEMOMAN,
	TF_WEAPON_SENTRY_BULLET,
	TF_WEAPON_SENTRY_ROCKET,
	TF_WEAPON_DISPENSER,
	TF_WEAPON_INVIS,
	TF_WEAPON_FLAREGUN,
	TF_WEAPON_LUNCHBOX,
	TF_WEAPON_JAR,
	TF_WEAPON_COMPOUND_BOW,
	TF_WEAPON_BUFF_ITEM,
	TF_WEAPON_PUMPKIN_BOMB,
	TF_WEAPON_SWORD, 
	TF_WEAPON_ROCKETLAUNCHER_DIRECTHIT,
	TF_WEAPON_LIFELINE,
	TF_WEAPON_LASER_POINTER,
	TF_WEAPON_DISPENSER_GUN,
	TF_WEAPON_SENTRY_REVENGE,
	TF_WEAPON_JAR_MILK,
	TF_WEAPON_HANDGUN_SCOUT_PRIMARY,
	TF_WEAPON_BAT_FISH,
	TF_WEAPON_CROSSBOW,
	TF_WEAPON_STICKBOMB,
	TF_WEAPON_HANDGUN_SCOUT_SECONDARY,
	TF_WEAPON_SODA_POPPER,
	TF_WEAPON_SNIPERRIFLE_DECAP,
	TF_WEAPON_RAYGUN,
	TF_WEAPON_PARTICLE_CANNON,
	TF_WEAPON_MECHANICAL_ARM,
	TF_WEAPON_DRG_POMSON,
	TF_WEAPON_BAT_GIFTWRAP,
	TF_WEAPON_GRENADE_ORNAMENT_BALL,
	TF_WEAPON_FLAREGUN_REVENGE,
	TF_WEAPON_PEP_BRAWLER_BLASTER,
	TF_WEAPON_CLEAVER,
	TF_WEAPON_GRENADE_CLEAVER,
	TF_WEAPON_STICKY_BALL_LAUNCHER,
	TF_WEAPON_GRENADE_STICKY_BALL,
	TF_WEAPON_SHOTGUN_BUILDING_RESCUE,
	TF_WEAPON_CANNON,
	TF_WEAPON_THROWABLE,
	TF_WEAPON_GRENADE_THROWABLE,
	TF_WEAPON_PDA_SPY_BUILD,
	TF_WEAPON_GRENADE_WATERBALLOON,
	TF_WEAPON_HARVESTER_SAW,
	TF_WEAPON_SPELLBOOK,
	TF_WEAPON_SPELLBOOK_PROJECTILE,
	TF_WEAPON_SNIPERRIFLE_CLASSIC,
	TF_WEAPON_PARACHUTE,
	TF_WEAPON_GRAPPLINGHOOK,
	TF_WEAPON_PASSTIME_GUN,
#ifdef STAGING_ONLY
	TF_WEAPON_SNIPERRIFLE_REVOLVER,
#endif

	TF_WEAPON_CHARGED_SMG,

	//
	// ADD NEW WEAPONS HERE TO AVOID BREAKING DEMOS
	//

	TF_WEAPON_COUNT
};

extern const char *g_aWeaponNames[TF_WEAPON_COUNT];
extern int g_aWeaponDamageTypes[TF_WEAPON_COUNT];

int GetWeaponId( const char *pszWeaponName );
#ifdef GAME_DLL
int GetWeaponFromDamage( const CTakeDamageInfo &info );
#endif
int GetBuildableId( const char *pszBuildableName );
const char *WeaponIdToAlias( int iWeapon );

// Only TF specific classes that derives from CBaseProjectile should OVERRIDE GetBaseProjectileType()
enum BaseProjectileType_t
{
	TF_BASE_PROJECTILE_GRENADE, // CTFWeaponBaseGrenadeProj

	// add new entries here!
};

// Item definitions look into this array by hard-coded indices, so do not add entries
// anywhere except the end!
enum ProjectileType_t
{
	TF_PROJECTILE_NONE,
	TF_PROJECTILE_BULLET,
	TF_PROJECTILE_ROCKET,
	TF_PROJECTILE_PIPEBOMB,
	TF_PROJECTILE_PIPEBOMB_REMOTE,
	TF_PROJECTILE_SYRINGE,
	TF_PROJECTILE_FLARE,
	TF_PROJECTILE_JAR,
	TF_PROJECTILE_ARROW,
	TF_PROJECTILE_FLAME_ROCKET,
	TF_PROJECTILE_JAR_MILK,
	TF_PROJECTILE_HEALING_BOLT,
	TF_PROJECTILE_ENERGY_BALL,
	TF_PROJECTILE_ENERGY_RING,
	TF_PROJECTILE_PIPEBOMB_PRACTICE,
	TF_PROJECTILE_CLEAVER,
	TF_PROJECTILE_STICKY_BALL,
	TF_PROJECTILE_CANNONBALL,
	TF_PROJECTILE_BUILDING_REPAIR_BOLT,
	TF_PROJECTILE_FESTIVE_ARROW,
	TF_PROJECTILE_THROWABLE,
	TF_PROJECTILE_SPELL,
	TF_PROJECTILE_FESTIVE_JAR,
	TF_PROJECTILE_FESTIVE_HEALING_BOLT,
	TF_PROJECTILE_BREADMONSTER_JARATE,
	TF_PROJECTILE_BREADMONSTER_MADMILK,

	TF_PROJECTILE_GRAPPLINGHOOK,
	TF_PROJECTILE_SENTRY_ROCKET,
	TF_PROJECTILE_BREAD_MONSTER,

#ifdef STAGING_ONLY
	// STAGING ONLY
	TF_PROJECTILE_TRANQ,
	TF_PROJECTILE_SNIPERBULLET,
	TF_PROJECTILE_THROWING_KNIFE,
	TF_PROJECTILE_GRENADE_CONCUSSION,
	TF_PROJECTILE_GRENADE_TELEPORT,
	TF_PROJECTILE_MILK_BOLT,
#endif
	// Add new entries here!

	TF_NUM_PROJECTILES
};

extern const char *g_szProjectileNames[];

enum medigun_charge_types
{
	MEDIGUN_CHARGE_INVALID = -1,
	MEDIGUN_CHARGE_INVULN = 0,
	MEDIGUN_CHARGE_CRITICALBOOST,
	MEDIGUN_CHARGE_MEGAHEAL,
	MEDIGUN_CHARGE_BULLET_RESIST,
	MEDIGUN_CHARGE_BLAST_RESIST,
	MEDIGUN_CHARGE_FIRE_RESIST,

	MEDIGUN_NUM_CHARGE_TYPES,
};

enum arrow_models
{
	MODEL_ARROW_REGULAR,
	MODEL_ARROW_BUILDING_REPAIR,
	MODEL_SNOWBALL,
	MODEL_FESTIVE_ARROW_REGULAR,
	MODEL_SYRINGE,
	MODEL_FESTIVE_HEALING_BOLT,
	MODEL_BREAD_MONSTER,
	MODEL_GRAPPLINGHOOK,

	// Staging
	MODEL_THROWING_KNIFE,

	TF_ARROW_MODEL_COUNT
};

extern const char *g_pszArrowModels[];

//-----------------------------------------------------------------------------
// Dead Calling Cards
//-----------------------------------------------------------------------------
enum death_calling_card_models
{
	CALLING_CARD_NONE = 0,			// Empty at zero
	CALLING_CARD_MILKMAN = 1,	// Scout PolyCount Set
	CALLING_CARD_CROC,			// Sniper PolyCount Set
	CALLING_CARD_TANKBUSTER,	// Solider PolyCount Set
	CALLING_CARD_GASJOCKEY,		// Pyro PolyCount Set 

	TF_CALLING_CARD_MODEL_COUNT
};
extern const char *g_pszDeathCallingCardModels[TF_CALLING_CARD_MODEL_COUNT];

#ifdef TF_CLIENT_DLL
extern const char *g_pszInvasionMaps[];
bool IsPlayingInvasionMap( void );

#define SCOREBOARD_DOMINATION_ICONS		17
#define SCOREBOARD_CLASS_ICONS			19
#define SCOREBOARD_PING_ICONS			6

extern const char *g_pszClassIcons[];

extern const char *g_pszClassIconsAlt[];

extern const char *g_pszCompetitiveMedalImages[];

extern const char *g_pszItemClassImagesRed[];

extern const char *g_pszItemClassImagesBlue[];

#endif // TF_CLIENT_DLL

//-----------------------------------------------------------------------------
// Attributes.
//-----------------------------------------------------------------------------
#define TF_PLAYER_VIEW_OFFSET	Vector( 0, 0, 64.0 ) //--> see GetViewVectors()

//-----------------------------------------------------------------------------
// TF Player Condition.
//-----------------------------------------------------------------------------

// Burning
#define TF_BURNING_FREQUENCY		0.5f
#define TF_BURNING_FLAME_LIFE		10.0
#define TF_BURNING_FLAME_LIFE_PYRO	0.25		// pyro only displays burning effect momentarily
#define TF_BURNING_FLAME_LIFE_FLARE 10.0
#define TF_BURNING_FLAME_LIFE_PLASMA 6.0
#define TF_BURNING_DMG				3

// Bleeding
#define TF_BLEEDING_FREQUENCY		0.5f
#define TF_BLEEDING_DMG				4

// disguising
#define TF_TIME_TO_DISGUISE			2.0f
#define TF_TIME_TO_QUICK_DISGUISE	0.5f
#define TF_TIME_TO_SHOW_DISGUISED_FINISHED_EFFECT 5.0

// phasing

#define TF_SCOUT_NUMBEROFPHASEATTACHMENTS	5

#define SHOW_DISGUISE_EFFECT 1
#define TF_DISGUISE_TARGET_INDEX_NONE	( MAX_PLAYERS + 1 )
#define TF_PLAYER_INDEX_NONE			( MAX_PLAYERS + 1 )

//
// ADD NEW WEAPONS HERE TO AVOID BREAKING DEMOS
//
enum ETFCond
{
	TF_COND_INVALID = -1,
	TF_COND_AIMING = 0,		// Sniper aiming, Heavy minigun.
	TF_COND_ZOOMED,
	TF_COND_DISGUISING,
	TF_COND_DISGUISED,
	TF_COND_STEALTHED,		// Spy specific
	TF_COND_INVULNERABLE,
	TF_COND_TELEPORTED,
	TF_COND_TAUNTING,
	TF_COND_INVULNERABLE_WEARINGOFF,
	TF_COND_STEALTHED_BLINK,
	TF_COND_SELECTED_TO_TELEPORT,
	TF_COND_CRITBOOSTED,	// DO NOT RE-USE THIS -- THIS IS FOR KRITZKRIEG AND REVENGE CRITS ONLY
	TF_COND_TMPDAMAGEBONUS,
	TF_COND_FEIGN_DEATH,
	TF_COND_PHASE,
	TF_COND_STUNNED,		// Any type of stun. Check iStunFlags for more info.
	TF_COND_OFFENSEBUFF,
	TF_COND_SHIELD_CHARGE,
	TF_COND_DEMO_BUFF,
	TF_COND_ENERGY_BUFF,
	TF_COND_RADIUSHEAL,
	TF_COND_HEALTH_BUFF,
	TF_COND_BURNING,
	TF_COND_HEALTH_OVERHEALED,
	TF_COND_URINE,
	TF_COND_BLEEDING,
	TF_COND_DEFENSEBUFF,	// 35% defense! No crit damage.
	TF_COND_MAD_MILK,
	TF_COND_MEGAHEAL,
	TF_COND_REGENONDAMAGEBUFF,
	TF_COND_MARKEDFORDEATH,
	TF_COND_NOHEALINGDAMAGEBUFF,
	TF_COND_SPEED_BOOST,				// = 32
	TF_COND_CRITBOOSTED_PUMPKIN,		// Brandon hates bits
	TF_COND_CRITBOOSTED_USER_BUFF,
	TF_COND_CRITBOOSTED_DEMO_CHARGE,
	TF_COND_SODAPOPPER_HYPE,
	TF_COND_CRITBOOSTED_FIRST_BLOOD,	// arena mode first blood
	TF_COND_CRITBOOSTED_BONUS_TIME,
	TF_COND_CRITBOOSTED_CTF_CAPTURE,
	TF_COND_CRITBOOSTED_ON_KILL,		// =40. KGB, etc.
	TF_COND_CANNOT_SWITCH_FROM_MELEE,
	TF_COND_DEFENSEBUFF_NO_CRIT_BLOCK,	// 35% defense! Still damaged by crits.
	TF_COND_REPROGRAMMED,				// Bots only
	TF_COND_CRITBOOSTED_RAGE_BUFF,
	TF_COND_DEFENSEBUFF_HIGH,			// 75% defense! Still damaged by crits.
	TF_COND_SNIPERCHARGE_RAGE_BUFF,		// Sniper Rage - Charge time speed up
	TF_COND_DISGUISE_WEARINGOFF,		// Applied for half-second post-disguise
	TF_COND_MARKEDFORDEATH_SILENT,		// Sans sound
	TF_COND_DISGUISED_AS_DISPENSER,
	TF_COND_SAPPED,						// =50. Bots only
	TF_COND_INVULNERABLE_HIDE_UNLESS_DAMAGED,
	TF_COND_INVULNERABLE_USER_BUFF,
	TF_COND_HALLOWEEN_BOMB_HEAD,
	TF_COND_HALLOWEEN_THRILLER,
	TF_COND_RADIUSHEAL_ON_DAMAGE,
	TF_COND_CRITBOOSTED_CARD_EFFECT,
	TF_COND_INVULNERABLE_CARD_EFFECT,
	TF_COND_MEDIGUN_UBER_BULLET_RESIST,
	TF_COND_MEDIGUN_UBER_BLAST_RESIST,
	TF_COND_MEDIGUN_UBER_FIRE_RESIST,		// =60
	TF_COND_MEDIGUN_SMALL_BULLET_RESIST,
	TF_COND_MEDIGUN_SMALL_BLAST_RESIST,
	TF_COND_MEDIGUN_SMALL_FIRE_RESIST,
	TF_COND_STEALTHED_USER_BUFF,			// Any class can have this
	TF_COND_MEDIGUN_DEBUFF,
	TF_COND_STEALTHED_USER_BUFF_FADING,
	TF_COND_BULLET_IMMUNE,
	TF_COND_BLAST_IMMUNE,
	TF_COND_FIRE_IMMUNE,
	TF_COND_PREVENT_DEATH,					// =70
	TF_COND_MVM_BOT_STUN_RADIOWAVE, 		// Bots only
	TF_COND_HALLOWEEN_SPEED_BOOST,
	TF_COND_HALLOWEEN_QUICK_HEAL,
	TF_COND_HALLOWEEN_GIANT,
	TF_COND_HALLOWEEN_TINY,
	TF_COND_HALLOWEEN_IN_HELL,
	TF_COND_HALLOWEEN_GHOST_MODE,			// =77
	TF_COND_MINICRITBOOSTED_ON_KILL,
	TF_COND_OBSCURED_SMOKE,
	TF_COND_PARACHUTE_DEPLOYED,				// =80
	TF_COND_BLASTJUMPING,
	TF_COND_HALLOWEEN_KART,
	TF_COND_HALLOWEEN_KART_DASH,
	TF_COND_BALLOON_HEAD,					// =84 larger head, lower-gravity-feeling jumps
	TF_COND_MELEE_ONLY,						// =85 melee only
	TF_COND_SWIMMING_CURSE,					// player movement become swimming movement
	TF_COND_FREEZE_INPUT,					// freezes player input
	TF_COND_HALLOWEEN_KART_CAGE,			// attach cage model to player while in kart
	TF_COND_DONOTUSE_0,
	TF_COND_RUNE_STRENGTH,
	TF_COND_RUNE_HASTE,
	TF_COND_RUNE_REGEN,
	TF_COND_RUNE_RESIST,
	TF_COND_RUNE_VAMPIRE,
	TF_COND_RUNE_REFLECT,
	TF_COND_RUNE_PRECISION,
	TF_COND_RUNE_AGILITY,
	TF_COND_GRAPPLINGHOOK,
	TF_COND_GRAPPLINGHOOK_SAFEFALL,
	TF_COND_GRAPPLINGHOOK_LATCHED,
	TF_COND_GRAPPLINGHOOK_BLEEDING,
	TF_COND_AFTERBURN_IMMUNE,
	TF_COND_RUNE_KNOCKOUT,
	TF_COND_RUNE_IMBALANCE,
	TF_COND_CRITBOOSTED_RUNE_TEMP,
	TF_COND_PASSTIME_INTERCEPTION,
	TF_COND_SWIMMING_NO_EFFECTS,			// =107_DNOC_FT
	TF_COND_PURGATORY,
	TF_COND_RUNE_KING,
	TF_COND_RUNE_PLAGUE,
	TF_COND_RUNE_SUPERNOVA,
	TF_COND_PLAGUE,
	TF_COND_KING_BUFFED,
	TF_COND_TEAM_GLOWS,						// used to show team glows to living players
	TF_COND_KNOCKED_INTO_AIR,
	TF_COND_COMPETITIVE_WINNER,
	TF_COND_COMPETITIVE_LOSER,
	TF_COND_HEALING_DEBUFF,
	TF_COND_PASSTIME_PENALTY_DEBUFF,		// when carrying the ball without any teammates nearby	
	TF_COND_GRAPPLED_TO_PLAYER,
	TF_COND_GRAPPLED_BY_PLAYER,
	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	// ******** Keep this block last! ********
	// Keep experimental conditions below and graduate out of it before shipping
#ifdef STAGING_ONLY
	TF_COND_NO_COMBAT_SPEED_BOOST,		// STAGING_ENGY
	TF_COND_TRANQ_SPY_BOOST,			// STAGING_SPY
	TF_COND_TRANQ_MARKED,
//	TF_COND_SPACE_GRAVITY,
//	TF_COND_SELF_CONC,
	TF_COND_ROCKETPACK,
	TF_COND_STEALTHED_PHASE,  	
	TF_COND_CLIP_OVERLOAD,
	TF_COND_SPY_CLASS_STEAL,
#endif // STAGING_ONLY

	TF_COND_LAST
};

const char *GetTFConditionName( ETFCond eCond );
ETFCond GetTFConditionFromName( const char *pszCondName );

// If you want your condition to expire faster under healing,
// add it to this function in tf_shareddefs.cpp
bool ConditionExpiresFast( ETFCond eCond );

// Some attributes specify conditions to be or'd. The problem there is that if we add conditions
// to the above list, they get hosed. So we maintain this separate list as a translation table.
// When you add conditions to the above list, add them TO THE BOTTOM of this list.
extern ETFCond condition_to_attribute_translation[];

extern ETFCond g_aDebuffConditions[];
//-----------------------------------------------------------------------------
// TF Player State.
//-----------------------------------------------------------------------------
enum 
{
	TF_STATE_ACTIVE = 0,		// Happily running around in the game.
	TF_STATE_WELCOME,			// First entering the server (shows level intro screen).
	TF_STATE_OBSERVER,			// Game observer mode.
	TF_STATE_DYING,				// Player is dying.
	TF_STATE_COUNT

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

//-----------------------------------------------------------------------------
// TF FlagInfo State.
//-----------------------------------------------------------------------------
#define TF_FLAGINFO_HOME		0
#define TF_FLAGINFO_STOLEN		(1<<0)
#define TF_FLAGINFO_DROPPED		(1<<1)

enum ETFFlagEventTypes
{
	TF_FLAGEVENT_PICKUP = 1,
	TF_FLAGEVENT_CAPTURE,
	TF_FLAGEVENT_DEFEND,
	TF_FLAGEVENT_DROPPED,
	TF_FLAGEVENT_RETURNED,

	
	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
	TF_NUM_FLAG_EVENTS
};

const char *GetCTFEventName( ETFFlagEventTypes iEventType );
ETFFlagEventTypes GetCTFEventTypeFromName( const char *pszName );

//-----------------------------------------------------------------------------
// TF Robot Destruction Score Methods
//-----------------------------------------------------------------------------
enum RDScoreMethod_t
{
	SCORE_UNDEFINED = -1,
	SCORE_REACTOR_CAPTURED,
	SCORE_CORES_COLLECTED,
	SCORE_REACTOR_RETURNED,
	SCORE_REACTOR_STEAL,
		
	NUM_SCORE_TYPES
};

const char *GetRDScoreMethodName( RDScoreMethod_t iScoreMethod );
RDScoreMethod_t GetRDScoreMethodFromName( const char *pszName );

//-----------------------------------------------------------------------------
// Class data
//-----------------------------------------------------------------------------
#define TF_REGEN_TIME			1.0			// Number of seconds between each regen.
#define TF_REGEN_AMOUNT			3 			// Amount of health regenerated each regen.
#define TF_REGEN_TIME_RUNE		0.25		// Number of seconds between each regen generated by a powerup.

//-----------------------------------------------------------------------------
// Assist-damage constants
//-----------------------------------------------------------------------------
#define TF_TIME_ASSIST_KILL				3.0f	// Time window for a recent damager to get credit for an assist for a kill
#define TF_TIME_SUICIDE_KILL_CREDIT		10.0f	// Time window for a recent damager to get credit for a kill if target suicides

//-----------------------------------------------------------------------------
// Domination/nemesis constants
//-----------------------------------------------------------------------------
#define TF_KILLS_DOMINATION				4		// # of unanswered kills to dominate another player

//-----------------------------------------------------------------------------
// Taunt attacks
//-----------------------------------------------------------------------------
enum taunt_attack_t
{
	TAUNTATK_NONE = 0,
	TAUNTATK_PYRO_HADOUKEN,
	TAUNTATK_HEAVY_EAT,
	TAUNTATK_HEAVY_RADIAL_BUFF,
	TAUNTATK_HEAVY_HIGH_NOON,
	TAUNTATK_SCOUT_DRINK,
	TAUNTATK_SCOUT_GRAND_SLAM,
	TAUNTATK_MEDIC_INHALE,
	TAUNTATK_SPY_FENCING_SLASH_A,
	TAUNTATK_SPY_FENCING_SLASH_B,
	TAUNTATK_SPY_FENCING_STAB,
	TAUNTATK_RPS_KILL,
	TAUNTATK_SNIPER_ARROW_STAB_IMPALE,
	TAUNTATK_SNIPER_ARROW_STAB_KILL,
	TAUNTATK_SOLDIER_GRENADE_KILL,
	TAUNTATK_DEMOMAN_BARBARIAN_SWING,
	TAUNTATK_MEDIC_UBERSLICE_IMPALE,
	TAUNTATK_MEDIC_UBERSLICE_KILL,
	TAUNTATK_FLIP_LAND_PARTICLE,
	TAUNTATK_RPS_PARTICLE,
	TAUNTATK_HIGHFIVE_PARTICLE,
	TAUNTATK_ENGINEER_GUITAR_SMASH,
	TAUNTATK_ENGINEER_ARM_IMPALE,
	TAUNTATK_ENGINEER_ARM_KILL,
	TAUNTATK_ENGINEER_ARM_BLEND,
	TAUNTATK_SOLDIER_GRENADE_KILL_WORMSIGN,
	TAUNTATK_SHOW_ITEM,
	TAUNTATK_MEDIC_RELEASE_DOVES,
	TAUNTATK_PYRO_ARMAGEDDON,
	TAUNTATK_PYRO_SCORCHSHOT,
	TAUNTATK_ALLCLASS_GUITAR_RIFF,
	TAUNTATK_MEDIC_HEROIC_TAUNT,

	//
	// INSERT NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	TAUNTATK_COUNT
};

taunt_attack_t GetTauntAttackByName( const char* pszTauntAttackName );

//-----------------------------------------------------------------------------
// TF Hints
//-----------------------------------------------------------------------------
enum
{
	HINT_FRIEND_SEEN = 0,				// #Hint_spotted_a_friend
	HINT_ENEMY_SEEN,					// #Hint_spotted_an_enemy
	HINT_ENEMY_KILLED,					// #Hint_killing_enemies_is_good
	HINT_AMMO_EXHAUSTED,				// #Hint_out_of_ammo
	HINT_TURN_OFF_HINTS,				// #Hint_turn_off_hints
	HINT_PICKUP_AMMO,					// #Hint_pickup_ammo
	HINT_CANNOT_TELE_WITH_FLAG,			// #Hint_Cannot_Teleport_With_Flag
	HINT_CANNOT_CLOAK_WITH_FLAG,		// #Hint_Cannot_Cloak_With_Flag
	HINT_CANNOT_DISGUISE_WITH_FLAG,		// #Hint_Cannot_Disguise_With_Flag
	HINT_CANNOT_ATTACK_WHILE_CLOAKED,	// #Hint_Cannot_Attack_While_Cloaked
	HINT_CLASSMENU,						// #Hint_ClassMenu

	// Grenades
	HINT_GREN_CALTROPS,					// #Hint_gren_caltrops
	HINT_GREN_CONCUSSION,				// #Hint_gren_concussion
	HINT_GREN_EMP,						// #Hint_gren_emp
	HINT_GREN_GAS,						// #Hint_gren_gas
	HINT_GREN_MIRV,						// #Hint_gren_mirv
	HINT_GREN_NAIL,						// #Hint_gren_nail
	HINT_GREN_NAPALM,					// #Hint_gren_napalm
	HINT_GREN_NORMAL,					// #Hint_gren_normal

	// Weapon alt-fires
	HINT_ALTFIRE_SNIPERRIFLE,			// #Hint_altfire_sniperrifle
	HINT_ALTFIRE_FLAMETHROWER,			// #Hint_altfire_flamethrower
	HINT_ALTFIRE_GRENADELAUNCHER,		// #Hint_altfire_grenadelauncher
	HINT_ALTFIRE_PIPEBOMBLAUNCHER,		// #Hint_altfire_pipebomblauncher
	HINT_ALTFIRE_ROTATE_BUILDING,		// #Hint_altfire_rotate_building

	// Class specific
	// Soldier
	HINT_SOLDIER_RPG_RELOAD,			// #Hint_Soldier_rpg_reload

	// Engineer
	HINT_ENGINEER_USE_WRENCH_ONOWN,		// "#Hint_Engineer_use_wrench_onown",
	HINT_ENGINEER_USE_WRENCH_ONOTHER,	// "#Hint_Engineer_use_wrench_onother",
	HINT_ENGINEER_USE_WRENCH_FRIEND,	// "#Hint_Engineer_use_wrench_onfriend",
	HINT_ENGINEER_BUILD_SENTRYGUN,		// "#Hint_Engineer_build_sentrygun"
	HINT_ENGINEER_BUILD_DISPENSER,		// "#Hint_Engineer_build_dispenser"
	HINT_ENGINEER_BUILD_TELEPORTERS,	// "#Hint_Engineer_build_teleporters"
	HINT_ENGINEER_PICKUP_METAL,			// "#Hint_Engineer_pickup_metal"
	HINT_ENGINEER_REPAIR_OBJECT,		// "#Hint_Engineer_repair_object"
	HINT_ENGINEER_METAL_TO_UPGRADE,		// "#Hint_Engineer_metal_to_upgrade"
	HINT_ENGINEER_UPGRADE_SENTRYGUN,	// "#Hint_Engineer_upgrade_sentrygun"

	HINT_OBJECT_HAS_SAPPER,				// "#Hint_object_has_sapper"

	HINT_OBJECT_YOUR_OBJECT_SAPPED,		// "#Hint_object_your_object_sapped"
	HINT_OBJECT_ENEMY_USING_DISPENSER,	// "#Hint_enemy_using_dispenser"
	HINT_OBJECT_ENEMY_USING_TP_ENTRANCE,	// "#Hint_enemy_using_tp_entrance"
	HINT_OBJECT_ENEMY_USING_TP_EXIT,	// "#Hint_enemy_using_tp_exit"

	HINT_CANNOT_PHASE_WITH_FLAG,		// #Hint_Cannot_Phase_With_Flag

	HINT_CANNOT_ATTACK_WHILE_FEIGN_ARMED,	// #Hint_Cannot_Attack_While_Feign_Armed

	HINT_CANNOT_ARM_FEIGN_NOW,			// #Hint_Cannot_Arm_Feign_Now

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	NUM_HINTS
};
extern const char *g_pszHintMessages[];



/*======================*/
//      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))

// 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  // player isn't allowed to move
#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_BULLETS				(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

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

//--------------
// TF Specific damage flags
//--------------
//#define DMG_UNUSED					(DMG_LASTGENERICFLAG<<2)
// We can't add anymore dmg flags, because we'd be over the 32 bit limit.
// So lets re-use some of the old dmg flags in TF
#define DMG_USE_HITLOCATIONS					(DMG_AIRBOAT)
#define DMG_HALF_FALLOFF						(DMG_RADIATION)
#define DMG_CRITICAL							(DMG_ACID)
#define DMG_RADIUS_MAX							(DMG_ENERGYBEAM)
#define DMG_IGNITE								(DMG_PLASMA)
#define DMG_USEDISTANCEMOD						(DMG_SLOWBURN)		// NEED TO REMOVE CALTROPS
#define DMG_NOCLOSEDISTANCEMOD					(DMG_POISON)
#define DMG_FROM_OTHER_SAPPER					(DMG_IGNITE)		// USED TO DAMAGE SAPPERS ON MATCHED TELEPORTERS
#define DMG_MELEE								(DMG_BLAST_SURFACE)
#define DMG_DONT_COUNT_DAMAGE_TOWARDS_CRIT_RATE	(DMG_DISSOLVE)		// DON'T USE THIS FOR EXPLOSION DAMAGE YOU WILL MAKE BRANDON SAD AND KYLE SADDER

// This can only ever be used on a TakeHealth call, since it re-uses a dmg flag that means something else
#define DMG_IGNORE_MAXHEALTH	(DMG_BULLET)
#define DMG_IGNORE_DEBUFFS		(DMG_SLASH)

// Special Damage types
// Also update g_szSpecialDamageNames
enum ETFDmgCustom
{
	TF_DMG_CUSTOM_NONE = 0,
	TF_DMG_CUSTOM_HEADSHOT,
	TF_DMG_CUSTOM_BACKSTAB,
	TF_DMG_CUSTOM_BURNING,
	TF_DMG_WRENCH_FIX,
	TF_DMG_CUSTOM_MINIGUN,
	TF_DMG_CUSTOM_SUICIDE,
	TF_DMG_CUSTOM_TAUNTATK_HADOUKEN,
	TF_DMG_CUSTOM_BURNING_FLARE,
	TF_DMG_CUSTOM_TAUNTATK_HIGH_NOON,
	TF_DMG_CUSTOM_TAUNTATK_GRAND_SLAM,
	TF_DMG_CUSTOM_PENETRATE_MY_TEAM,
	TF_DMG_CUSTOM_PENETRATE_ALL_PLAYERS,
	TF_DMG_CUSTOM_TAUNTATK_FENCING,
	TF_DMG_CUSTOM_PENETRATE_NONBURNING_TEAMMATE,
	TF_DMG_CUSTOM_TAUNTATK_ARROW_STAB,
	TF_DMG_CUSTOM_TELEFRAG,
	TF_DMG_CUSTOM_BURNING_ARROW,
	TF_DMG_CUSTOM_FLYINGBURN,
	TF_DMG_CUSTOM_PUMPKIN_BOMB,
	TF_DMG_CUSTOM_DECAPITATION,
	TF_DMG_CUSTOM_TAUNTATK_GRENADE,
	TF_DMG_CUSTOM_BASEBALL,
	TF_DMG_CUSTOM_CHARGE_IMPACT,
	TF_DMG_CUSTOM_TAUNTATK_BARBARIAN_SWING,
	TF_DMG_CUSTOM_AIR_STICKY_BURST,
	TF_DMG_CUSTOM_DEFENSIVE_STICKY,
	TF_DMG_CUSTOM_PICKAXE,
	TF_DMG_CUSTOM_ROCKET_DIRECTHIT,
	TF_DMG_CUSTOM_TAUNTATK_UBERSLICE,
	TF_DMG_CUSTOM_PLAYER_SENTRY,
	TF_DMG_CUSTOM_STANDARD_STICKY,
	TF_DMG_CUSTOM_SHOTGUN_REVENGE_CRIT,
	TF_DMG_CUSTOM_TAUNTATK_ENGINEER_GUITAR_SMASH,
	TF_DMG_CUSTOM_BLEEDING,
	TF_DMG_CUSTOM_GOLD_WRENCH,
	TF_DMG_CUSTOM_CARRIED_BUILDING,
	TF_DMG_CUSTOM_COMBO_PUNCH,
	TF_DMG_CUSTOM_TAUNTATK_ENGINEER_ARM_KILL,
	TF_DMG_CUSTOM_FISH_KILL,
	TF_DMG_CUSTOM_TRIGGER_HURT,
	TF_DMG_CUSTOM_DECAPITATION_BOSS,
	TF_DMG_CUSTOM_STICKBOMB_EXPLOSION,
	TF_DMG_CUSTOM_AEGIS_ROUND,
	TF_DMG_CUSTOM_FLARE_EXPLOSION,
	TF_DMG_CUSTOM_BOOTS_STOMP,
	TF_DMG_CUSTOM_PLASMA,
	TF_DMG_CUSTOM_PLASMA_CHARGED,
	TF_DMG_CUSTOM_PLASMA_GIB,
	TF_DMG_CUSTOM_PRACTICE_STICKY,
	TF_DMG_CUSTOM_EYEBALL_ROCKET,
	TF_DMG_CUSTOM_HEADSHOT_DECAPITATION,
	TF_DMG_CUSTOM_TAUNTATK_ARMAGEDDON,
	TF_DMG_CUSTOM_FLARE_PELLET,
	TF_DMG_CUSTOM_CLEAVER,
	TF_DMG_CUSTOM_CLEAVER_CRIT,
	TF_DMG_CUSTOM_SAPPER_RECORDER_DEATH,
	TF_DMG_CUSTOM_MERASMUS_PLAYER_BOMB,
	TF_DMG_CUSTOM_MERASMUS_GRENADE,
	TF_DMG_CUSTOM_MERASMUS_ZAP,
	TF_DMG_CUSTOM_MERASMUS_DECAPITATION,
	TF_DMG_CUSTOM_CANNONBALL_PUSH,
	TF_DMG_CUSTOM_TAUNTATK_ALLCLASS_GUITAR_RIFF,
	TF_DMG_CUSTOM_THROWABLE,
	TF_DMG_CUSTOM_THROWABLE_KILL,
	TF_DMG_CUSTOM_SPELL_TELEPORT,
	TF_DMG_CUSTOM_SPELL_SKELETON,
	TF_DMG_CUSTOM_SPELL_MIRV,
	TF_DMG_CUSTOM_SPELL_METEOR,
	TF_DMG_CUSTOM_SPELL_LIGHTNING,
	TF_DMG_CUSTOM_SPELL_FIREBALL,
	TF_DMG_CUSTOM_SPELL_MONOCULUS,
	TF_DMG_CUSTOM_SPELL_BLASTJUMP,
	TF_DMG_CUSTOM_SPELL_BATS,
	TF_DMG_CUSTOM_SPELL_TINY,
	TF_DMG_CUSTOM_KART,
	TF_DMG_CUSTOM_GIANT_HAMMER,
	TF_DMG_CUSTOM_RUNE_REFLECT,
	//
	// INSERT NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	TF_DMG_CUSTOM_END // END
};

const char *GetCustomDamageName( ETFDmgCustom eDmgCustom );
ETFDmgCustom GetCustomDamageFromName( const char *pszCustomDmgName );

inline bool IsTauntDmg( int iType )
{
	return (iType == TF_DMG_CUSTOM_TAUNTATK_HADOUKEN ||
			iType == TF_DMG_CUSTOM_TAUNTATK_HIGH_NOON ||
			iType == TF_DMG_CUSTOM_TAUNTATK_GRAND_SLAM || 
			iType == TF_DMG_CUSTOM_TAUNTATK_FENCING ||
			iType == TF_DMG_CUSTOM_TAUNTATK_ARROW_STAB ||
			iType == TF_DMG_CUSTOM_TAUNTATK_GRENADE ||
			iType == TF_DMG_CUSTOM_TAUNTATK_BARBARIAN_SWING ||
			iType == TF_DMG_CUSTOM_TAUNTATK_UBERSLICE ||
			iType == TF_DMG_CUSTOM_TAUNTATK_ENGINEER_GUITAR_SMASH || 
			iType == TF_DMG_CUSTOM_TAUNTATK_ARMAGEDDON ||
			iType == TF_DMG_CUSTOM_TAUNTATK_ALLCLASS_GUITAR_RIFF || 
			iType == TF_DMG_CUSTOM_TAUNTATK_ENGINEER_ARM_KILL );
}
inline bool IsDOTDmg( int iType )
{
	if ( iType == TF_DMG_CUSTOM_BURNING ||
		 iType == TF_DMG_CUSTOM_BURNING_FLARE ||
		 iType == TF_DMG_CUSTOM_BURNING_ARROW ||
		 iType == TF_DMG_CUSTOM_BLEEDING )
	{
		return true;
	}
	else
	{
		return false;
	}
}

inline bool IsHeadshot( int iType ) 
{
	return (iType == TF_DMG_CUSTOM_HEADSHOT || iType == TF_DMG_CUSTOM_HEADSHOT_DECAPITATION);
}

enum
{
	TF_COLLISIONGROUP_GRENADES = LAST_SHARED_COLLISION_GROUP,
	TFCOLLISION_GROUP_OBJECT,
	TFCOLLISION_GROUP_OBJECT_SOLIDTOPLAYERMOVEMENT,
	TFCOLLISION_GROUP_COMBATOBJECT,
	TFCOLLISION_GROUP_ROCKETS,		// Solid to players, but not player movement. ensures touch calls are originating from rocket
	TFCOLLISION_GROUP_RESPAWNROOMS,
	TFCOLLISION_GROUP_TANK,
	TFCOLLISION_GROUP_ROCKET_BUT_NOT_WITH_OTHER_ROCKETS,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

// Stun flags
#define TF_STUN_NONE						0
#define TF_STUN_MOVEMENT					(1<<0)
#define	TF_STUN_CONTROLS					(1<<1)
#define TF_STUN_MOVEMENT_FORWARD_ONLY		(1<<2)
#define TF_STUN_SPECIAL_SOUND				(1<<3)
#define TF_STUN_DODGE_COOLDOWN				(1<<4)
#define TF_STUN_NO_EFFECTS					(1<<5)
#define TF_STUN_LOSER_STATE					(1<<6)
#define TF_STUN_BY_TRIGGER					(1<<7)
#define TF_STUN_BOTH						TF_STUN_MOVEMENT | TF_STUN_CONTROLS

//-----------------
// TF Objects Info
//-----------------

#define SENTRYGUN_UPGRADE_COST			130
#define SENTRYGUN_UPGRADE_METAL			200
#define SENTRYGUN_EYE_OFFSET_LEVEL_1	Vector( 0, 0, 32 )
#define SENTRYGUN_EYE_OFFSET_LEVEL_2	Vector( 0, 0, 40 )
#define SENTRYGUN_EYE_OFFSET_LEVEL_3	Vector( 0, 0, 46 )
#define SENTRYGUN_MAX_SHELLS_1			150
#define SENTRYGUN_MAX_SHELLS_2			200
#define SENTRYGUN_MAX_SHELLS_3			200
#define SENTRYGUN_MAX_ROCKETS			20

// Dispenser's maximum carrying capability
#define DISPENSER_MAX_METAL_AMMO		400
#define	MAX_DISPENSER_HEALING_TARGETS	32
#define MINI_DISPENSER_MAX_METAL	200

//--------------------------------------------------------------------------
// OBJECTS
//--------------------------------------------------------------------------
enum ObjectType_t
{
	OBJ_DISPENSER=0,
	OBJ_TELEPORTER,
	OBJ_SENTRYGUN,

	// Attachment Objects
	OBJ_ATTACHMENT_SAPPER,

	// If you add a new object, you need to add it to the g_ObjectInfos array 
	// in tf_shareddefs.cpp, and add it's data to the scripts/object.txt

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
#ifdef STAGING_ONLY
	OBJ_CATAPULT,
	OBJ_SPY_TRAP,
#endif

	OBJ_LAST,
};

#define BUILDING_MODE_ANY -1

enum
{
	MODE_TELEPORTER_ENTRANCE=0,
	MODE_TELEPORTER_EXIT,
#ifdef STAGING_ONLY
	MODE_TELEPORTER_SPEED,
	MODE_TELEPORTER_SPEED2,
#endif
};

enum
{
	MODE_SENTRYGUN_NORMAL = 0,
	MODE_SENTRYGUN_DISPOSABLE,
};

enum
{
	MODE_SAPPER_NORMAL = 0,
	MODE_SAPPER_ANTI_ROBOT,
	MODE_SAPPER_ANTI_ROBOT_RADIUS,
};

enum ESpyTrapType_t
{
	MODE_SPY_TRAP_RADIUS_STEALTH = 0,
	MODE_SPY_TRAP_REPROGRAM,
	MODE_SPY_TRAP_MAGNET,
	// MODE_SPY_TRAP_REPULSOR,
};

// Warning levels for buildings in the building hud, in priority order
typedef enum
{
	BUILDING_HUD_ALERT_NONE = 0,
	BUILDING_HUD_ALERT_LOW_AMMO,
	BUILDING_HUD_ALERT_LOW_HEALTH,
	BUILDING_HUD_ALERT_VERY_LOW_AMMO,
	BUILDING_HUD_ALERT_VERY_LOW_HEALTH,
	BUILDING_HUD_ALERT_SAPPER,	

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	MAX_BUILDING_HUD_ALERT_LEVEL
} BuildingHudAlert_t;

typedef enum
{
	BUILDING_DAMAGE_LEVEL_NONE = 0,		// 100%
	BUILDING_DAMAGE_LEVEL_LIGHT,		// 75% - 99%
	BUILDING_DAMAGE_LEVEL_MEDIUM,		// 50% - 76%
	BUILDING_DAMAGE_LEVEL_HEAVY,		// 25% - 49%	
	BUILDING_DAMAGE_LEVEL_CRITICAL,		// 0% - 24%

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	MAX_BUILDING_DAMAGE_LEVEL
} BuildingDamageLevel_t;

//--------------
// Scoring
//--------------

#define TF_SCORE_KILL							1
#define TF_SCORE_DEATH							0
#define TF_SCORE_CAPTURE						2
#define TF_SCORE_DEFEND							1
#define TF_SCORE_DESTROY_BUILDING				1
#define TF_SCORE_HEADSHOT_DIVISOR				2
#define TF_SCORE_BACKSTAB						1
#define TF_SCORE_INVULN							1
#define TF_SCORE_REVENGE						1
#define TF_SCORE_KILL_ASSISTS_PER_POINT			2
#define TF_SCORE_TELEPORTS_PER_POINT			2
#define TF_SCORE_HEAL_HEALTHUNITS_PER_POINT		600
#define TF_SCORE_BONUS_POINT_DIVISOR			10
#define TF_SCORE_DAMAGE							250
#define TF_SCORE_CURRENCY_COLLECTED				20
#define TF_SCORE_CAPTURE_POWERUPMODE			10 // With these CTF rules capturing flags is tougher, hence the higher scoring for flag events
#define TF_SCORE_FLAG_RETURN					4
#define TF_SCORE_KILL_RUNECARRIER				1


//-------------------------
// Shared Teleporter State
//-------------------------
enum
{
	DISPENSER_STATE_IDLE,
	DISPENSER_STATE_UPGRADING,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

//-------------------------
// Shared Teleporter State
//-------------------------
enum
{
	TELEPORTER_STATE_BUILDING = 0,				// Building, not active yet
	TELEPORTER_STATE_IDLE,						// Does not have a matching teleporter yet
	TELEPORTER_STATE_READY,						// Found match, charged and ready
	TELEPORTER_STATE_SENDING,					// Teleporting a player away
	TELEPORTER_STATE_RECEIVING,					
	TELEPORTER_STATE_RECEIVING_RELEASE,
	TELEPORTER_STATE_RECHARGING,				// Waiting for recharge
	TELEPORTER_STATE_UPGRADING,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

#define TELEPORTER_TYPE_ENTRANCE	0
#define TELEPORTER_TYPE_EXIT		1

//-------------------------
// Shared Sentry State
//-------------------------
enum
{
	SENTRY_STATE_INACTIVE = 0,
	SENTRY_STATE_SEARCHING,
	SENTRY_STATE_ATTACKING,
	SENTRY_STATE_UPGRADING,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	SENTRY_NUM_STATES,
};

//--------------------------------------------------------------------------
// OBJECT FLAGS
//--------------------------------------------------------------------------
enum
{
	OF_ALLOW_REPEAT_PLACEMENT				= 0x01,
	OF_MUST_BE_BUILT_ON_ATTACHMENT			= 0x02,
	OF_DOESNT_HAVE_A_MODEL					= 0x04,
	OF_PLAYER_DESTRUCTION					= 0x08,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	OF_BIT_COUNT	= 4
};

//--------------------------------------------------------------------------
// Builder "weapon" states
//--------------------------------------------------------------------------
enum 
{
	BS_IDLE = 0,
	BS_SELECTING,
	BS_PLACING,
	BS_PLACING_INVALID

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};


//--------------------------------------------------------------------------
// Builder object id...
//--------------------------------------------------------------------------
enum
{
	BUILDER_OBJECT_BITS = 8,
	BUILDER_INVALID_OBJECT = ((1 << BUILDER_OBJECT_BITS) - 1)
};

// Analyzer state
enum
{
	AS_INACTIVE = 0,
	AS_SUBVERTING,
	AS_ANALYZING
};

// Max number of objects a team can have
#define MAX_OBJECTS_PER_PLAYER	6
//#define MAX_OBJECTS_PER_TEAM	128

// sanity check that commands send via user command are somewhat valid
#define MAX_OBJECT_SCREEN_INPUT_DISTANCE	100

//--------------------------------------------------------------------------
// BUILDING
//--------------------------------------------------------------------------
// Build checks will return one of these for a player
enum
{
	CB_CAN_BUILD,			// Player is allowed to build this object
	CB_CANNOT_BUILD,		// Player is not allowed to build this object
	CB_LIMIT_REACHED,		// Player has reached the limit of the number of these objects allowed
	CB_NEED_RESOURCES,		// Player doesn't have enough resources to build this object
	CB_NEED_ADRENALIN,		// Commando doesn't have enough adrenalin to build a rally flag
	CB_UNKNOWN_OBJECT,		// Error message, tried to build unknown object

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

// Build animation events
#define TF_OBJ_ENABLEBODYGROUP			6000
#define TF_OBJ_DISABLEBODYGROUP			6001
#define TF_OBJ_ENABLEALLBODYGROUPS		6002
#define TF_OBJ_DISABLEALLBODYGROUPS		6003
#define TF_OBJ_PLAYBUILDSOUND			6004

#define TF_AE_CIGARETTE_THROW			7000
#define TF_AE_GUN_SALUTE				7001
#define TF_AE_PICKAXE_THROW				7002

#define OBJECT_COST_MULTIPLIER_PER_OBJECT			3
#define OBJECT_UPGRADE_COST_MULTIPLIER_PER_LEVEL	3

//--------------------------------------------------------------------------
// Powerups
//--------------------------------------------------------------------------
enum
{
	POWERUP_BOOST,		// Medic, buff station
	POWERUP_EMP,		// Technician
	POWERUP_RUSH,		// Rally flag
	POWERUP_POWER,		// Object power

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	MAX_POWERUPS
};

#define	MAX_CABLE_CONNECTIONS 4

bool IsObjectAnUpgrade( int iObjectType );
bool IsObjectAVehicle( int iObjectType );
bool IsObjectADefensiveBuilding( int iObjectType );

class CHudTexture;

#define OBJECT_MAX_GIB_MODELS	9
#ifdef STAGING_ONLY
#define OBJECT_MAX_MODES		4
#else
#define OBJECT_MAX_MODES		3
#endif

// This should be moved into its own header.
class CObjectInfo
{
public:
	CObjectInfo( const char *pObjectName );	
	~CObjectInfo();

	// This is initialized by the code and matched with a section in objects.txt
	const char	*m_pObjectName;

	// This stuff all comes from objects.txt
	char	*m_pClassName;					// Code classname (in LINK_ENTITY_TO_CLASS).
	char	*m_pStatusName;					// Shows up when crosshairs are on the object.
	float	m_flBuildTime;
	int		m_nMaxObjects;					// Maximum number of objects per player
	int		m_Cost;							// Base object resource cost
	float	m_CostMultiplierPerInstance;	// Cost multiplier
	int		m_UpgradeCost;					// Base object resource cost for upgrading
	int		m_MaxUpgradeLevel;				// Max object upgrade level
	char	*m_pBuilderWeaponName;			// Names shown for each object onscreen when using the builder weapon
	char	*m_pBuilderPlacementString;		// String shown to player during placement of this object
	int		m_SelectionSlot;				// Weapon selection slots for objects
	int		m_SelectionPosition;			// Weapon selection positions for objects
	bool	m_bSolidToPlayerMovement;
	bool	m_bUseItemInfo;					// Use default item appearance info.
	char    *m_pViewModel;					// View model to show in builder weapon for this object
	char    *m_pPlayerModel;				// World model to show attached to the player
	int		m_iDisplayPriority;				// Priority for ordering in the hud display ( higher is closer to top )
	bool	m_bVisibleInWeaponSelection;	// should show up and be selectable via the weapon selection?
	char	*m_pExplodeSound;				// gamesound to play when object explodes
	char	*m_pExplosionParticleEffect;	// particle effect to play when object explodes
	bool	m_bAutoSwitchTo;				// should we let players switch back to the builder weapon representing this?
	char	*m_pUpgradeSound;				// gamesound to play when object is upgraded
	float	m_flUpgradeDuration;			// time it takes to upgrade to the next level
	int		m_iBuildCount;					// number of these that can be carried at one time
	int		m_iNumAltModes;					// whether the item has more than one mode (ex: teleporter exit/entrance)

	struct
	{
		char* pszStatusName;
		char* pszModeName;
		char* pszIconMenu;
	}		m_AltModes[OBJECT_MAX_MODES];

	// HUD weapon selection menu icon ( from hud_textures.txt )
	char	*m_pIconActive;
	char	*m_pIconInactive;
	char	*m_pIconMenu;

	// HUD building status icon
	char	*m_pHudStatusIcon;

	// gibs
	int		m_iMetalToDropInGibs;

	// unique builder
	bool	m_bRequiresOwnBuilder;			// if object needs to instantiate its' own builder
};

// Loads the objects.txt script.
class IBaseFileSystem;
void LoadObjectInfos( IBaseFileSystem *pFileSystem );

// Get a CObjectInfo from a TFOBJ_ define.
const CObjectInfo* GetObjectInfo( int iObject );

// Object utility funcs
bool	ClassCanBuild( int iClass, int iObjectType );
int		InternalCalculateObjectCost( int iObjectType /*, int iNumberOfObjects, int iTeam, bool bLast = false*/ );
int		CalculateObjectUpgrade( int iObjectType, int iObjectLevel );

// Shell ejections
enum
{
	EJECTBRASS_PISTOL,
	EJECTBRASS_MINIGUN,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

// Win panel styles
enum
{
	WINPANEL_BASIC = 0,
};

#define TF_DEATH_ANIMATION_TIME			2.0


enum HudNotification_t
{
	HUD_NOTIFY_YOUR_FLAG_TAKEN,
	HUD_NOTIFY_YOUR_FLAG_DROPPED,
	HUD_NOTIFY_YOUR_FLAG_RETURNED,
	HUD_NOTIFY_YOUR_FLAG_CAPTURED,

	HUD_NOTIFY_ENEMY_FLAG_TAKEN,
	HUD_NOTIFY_ENEMY_FLAG_DROPPED,
	HUD_NOTIFY_ENEMY_FLAG_RETURNED,
	HUD_NOTIFY_ENEMY_FLAG_CAPTURED,

	HUD_NOTIFY_TOUCHING_ENEMY_CTF_CAP,

	HUD_NOTIFY_NO_INVULN_WITH_FLAG,
	HUD_NOTIFY_NO_TELE_WITH_FLAG,

	HUD_NOTIFY_SPECIAL,

	HUD_NOTIFY_GOLDEN_WRENCH,

	HUD_NOTIFY_RD_ROBOT_UNDER_ATTACK,

	HUD_NOTIFY_HOW_TO_CONTROL_GHOST,
	HUD_NOTIFY_HOW_TO_CONTROL_KART,

	HUD_NOTIFY_PASSTIME_HOWTO,
	HUD_NOTIFY_PASSTIME_NO_TELE,
	HUD_NOTIFY_PASSTIME_NO_CARRY,
	HUD_NOTIFY_PASSTIME_NO_INVULN,
	HUD_NOTIFY_PASSTIME_NO_DISGUISE, 
	HUD_NOTIFY_PASSTIME_NO_CLOAK, 
	HUD_NOTIFY_PASSTIME_NO_OOB, // out of bounds
	HUD_NOTIFY_PASSTIME_NO_HOLSTER,
	HUD_NOTIFY_PASSTIME_NO_TAUNT,

	HUD_NOTIFY_COMPETITIVE_GC_DOWN,

	HUD_NOTIFY_TRUCE_START,
	HUD_NOTIFY_TRUCE_END,

	HUD_NOTIFY_HOW_TO_CONTROL_GHOST_NO_RESPAWN,
	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	NUM_STOCK_NOTIFICATIONS
};

// HudAlerts don't set HIDEHUD_MISCSTATUS, so they appear with the win panel, etc
typedef enum
{
	HUD_ALERT_SCRAMBLE_TEAMS,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	NUM_STOCK_ALERTS
} HudAlert_t;

//-----------------------------------------------------------------------------
// Item testing
//-----------------------------------------------------------------------------
enum testitem_botanims_t
{
	TI_BOTANIM_IDLE,
	TI_BOTANIM_CROUCH,
	TI_BOTANIM_RUN,
	TI_BOTANIM_CROUCH_WALK,
	TI_BOTANIM_JUMP,

	TI_BOTANIM_COUNT,
};

#define TF_DEATH_DOMINATION				0x0001	// killer is dominating victim
#define TF_DEATH_ASSISTER_DOMINATION	0x0002	// assister is dominating victim
#define TF_DEATH_REVENGE				0x0004	// killer got revenge on victim
#define TF_DEATH_ASSISTER_REVENGE		0x0008	// assister got revenge on victim
#define TF_DEATH_FIRST_BLOOD			0x0010  // death triggered a first blood
#define TF_DEATH_FEIGN_DEATH			0x0020  // feign death
#define TF_DEATH_INTERRUPTED			0x0040	// interrupted a player doing an important game event (like capping or carrying flag)
#define TF_DEATH_GIBBED					0x0080	// player was gibbed
#define TF_DEATH_PURGATORY				0x0100	// player died while in purgatory
#define TF_DEATH_MINIBOSS				0x0200	// player killed was a miniboss
#define TF_DEATH_AUSTRALIUM				0x0400	// player killed by a Australium Weapon

#define MAX_DECAPITATIONS		4

extern const char *TranslateWeaponEntForClass( const char *pszName, int iClass );

// Item Giveaways
#define PLAYER_ROLL_MIN			1
#define PLAYER_ROLL_MAX			500

// Generalized Jump State
#define TF_PLAYER_ROCKET_JUMPED		( 1 << 0 )
#define TF_PLAYER_STICKY_JUMPED		( 1 << 1 )
#define TF_PLAYER_ENEMY_BLASTED_ME	( 1 << 2 )

enum taunts_t
{
	TAUNT_BASE_WEAPON,		// The standard taunt we shipped with. Taunts based on your currently held weapon
	TAUNT_MISC_ITEM,		// Taunts based on the item you have equipped in your Misc slot.
	TAUNT_SHOW_ITEM,		// Show off an item to everyone nearby
	TAUNT_LONG,				// Press-and-hold taunt
	TAUNT_SPECIAL,			// Special-case taunts called explicitly from code
	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

enum eEurekaTeleportTargets
{
	EUREKA_FIRST_TARGET = 0,

	EUREKA_TELEPORT_HOME = 0,
	EUREKA_TELEPORT_TELEPORTER_EXIT,

	EUREKA_LAST_TARGET = EUREKA_TELEPORT_TELEPORTER_EXIT,
		
	EUREKA_NUM_TARGETS
};

#define TF_HIGHFIVE_HINT_MASK			( 0x10100 ) // annotations have id ( TF_HIGHFIVE_HINT_MASK | entindex )

enum BombDeployingState_t
{
	TF_BOMB_DEPLOYING_NONE,
	TF_BOMB_DEPLOYING_DELAY,
	TF_BOMB_DEPLOYING_ANIMATING,
	TF_BOMB_DEPLOYING_COMPLETE,

	TF_BOMB_DEPLOYING_NOT_COUNT,
};

enum EHorriblePyroVisionHack
{
	kHorriblePyroVisionHack_KillAssisterType_Default						= 0,

	kHorriblePyroVisionHack_KillAssisterType_CustomName						= 'a',
	kHorriblePyroVisionHack_KillAssisterType_LocalizationString				= 'b',
	kHorriblePyroVisionHack_KillAssisterType_CustomName_First				= 'c',
	kHorriblePyroVisionHack_KillAssisterType_LocalizationString_First		= 'd',
};

enum EAttackBonusEffects_t
{
	kBonusEffect_None = 4, // Must be 4.  Yep.
	kBonusEffect_Crit = 0,
	kBonusEffect_MiniCrit,
	kBonusEffect_DoubleDonk,
	kBonusEffect_WaterBalloonSploosh,

	kBonusEffect_Count, // Must be 2nd to last
	
};


//-----------------------------------------------------------------------------
// PVE MODE
//-----------------------------------------------------------------------------
// In-game currency
enum CurrencyRewards_t
{
	TF_CURRENCY_KILLED_PLAYER,
	TF_CURRENCY_KILLED_OBJECT,
	TF_CURRENCY_ASSISTED_PLAYER,
	TF_CURRENCY_BONUS_POINTS,
	TF_CURRENCY_CAPTURED_OBJECTIVE,
	TF_CURRENCY_ESCORT_REWARD,
	TF_CURRENCY_PACK_SMALL,
	TF_CURRENCY_PACK_MEDIUM,
	TF_CURRENCY_PACK_LARGE,
	TF_CURRENCY_PACK_CUSTOM,
	TF_CURRENCY_TIME_REWARD,
	TF_CURRENCY_WAVE_COLLECTION_BONUS,
};

enum mvm_announcement_t
{
	TF_MVM_ANNOUNCEMENT_WAVE_COMPLETE,
	TF_MVM_ANNOUNCEMENT_WAVE_FAILED,

	TF_MVM_ANNOUNCEMENT_TOTAL
};

#define RD_MAX_ROBOT_GROUPS_PER_TEAM 6

#define MAX_RAIDMODE_UPGRADES		60

enum mvm_upgrade_uigroups_t
{
	UIGROUP_UPGRADE_ATTACHED_TO_ITEM = 0,
	UIGROUP_UPGRADE_ATTACHED_TO_PLAYER,
	UIGROUP_POWERUPBOTTLE,
};

enum
{
	MVM_UPGRADE_QUALITY_LOW = 1,
	MVM_UPGRADE_QUALITY_NORMAL,		// Default
	MVM_UPGRADE_QAULITY_HIGH,
};

#define MVM_BUYBACK_COST_PER_SEC		5

#define MVM_CLASS_TYPES_PER_WAVE_MAX			12
// this is ugly, but we need to increase the max types per wave and changing the old define will break demos
#define MVM_CLASS_TYPES_PER_WAVE_MAX_NEW		( MVM_CLASS_TYPES_PER_WAVE_MAX * 2 )

#define MVM_CLASS_FLAG_NONE				0
#define MVM_CLASS_FLAG_NORMAL			(1<<0)
#define MVM_CLASS_FLAG_SUPPORT			(1<<1)
#define MVM_CLASS_FLAG_MISSION			(1<<2)
#define MVM_CLASS_FLAG_MINIBOSS			(1<<3)
#define MVM_CLASS_FLAG_ALWAYSCRIT		(1<<4)
#define MVM_CLASS_FLAG_SUPPORT_LIMITED	(1<<5)



enum MedicCallerType
{
	CALLER_TYPE_NORMAL,
	CALLER_TYPE_AUTO,
	CALLER_TYPE_REVIVE_EASY,		// The more someone is revived, the harder
	CALLER_TYPE_REVIVE_MEDIUM,		// subsequent revives become.
	CALLER_TYPE_REVIVE_HARD,
};

//-----------------------------------------------------------------------------
// Additional TF achievement packs
//-----------------------------------------------------------------------------
#define ACHIEVEMENT_TF_COMPLETE_TRAINING			(ACHIEVEMENT_TF_LAST_ORANGEBOX + 1)
#define ACHIEVEMENT_TF_FIRE_WATERJUMP				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 2)
#define ACHIEVEMENT_TF_KILL_BALLOONICORN_OWNERS		(ACHIEVEMENT_TF_LAST_ORANGEBOX + 3)
#define ACHIEVEMENT_TF_MULTIPLE_BFF					(ACHIEVEMENT_TF_LAST_ORANGEBOX + 4)
#define ACHIEVEMENT_TF_TEAM_PYROVISION				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 5)
#define ACHIEVEMENT_TF_DOMINATE_FOR_GOGGLES			(ACHIEVEMENT_TF_LAST_ORANGEBOX + 6)
#define ACHIEVEMENT_TF_PARACHUTE_KILL_GRIND				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 7)
#define ACHIEVEMENT_TF_MELEE_KILL_CLASSIC_RIFLE_SNIPER	(ACHIEVEMENT_TF_LAST_ORANGEBOX + 8)
#define ACHIEVEMENT_TF_KILL_CHARGING_DEMO				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 9)
#define ACHIEVEMENT_TF_TAUNT_CONGA_KILL				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 10)
#define ACHIEVEMENT_TF_TAUNT_CONGA_LINE				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 11)
#define ACHIEVEMENT_TF_TAUNT_RPS_ROCK				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 12)
#define ACHIEVEMENT_TF_TAUNT_RPS_SCISSORS			(ACHIEVEMENT_TF_LAST_ORANGEBOX + 13)
#define ACHIEVEMENT_TF_TAUNT_DOSIDO_MELLE_KILL		(ACHIEVEMENT_TF_LAST_ORANGEBOX + 14)
#define ACHIEVEMENT_TF_TAUNT_WHILE_CAPPING			(ACHIEVEMENT_TF_LAST_ORANGEBOX + 15)
#define ACHIEVEMENT_TF_PASS_TIME_HAT				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 16)
#define ACHIEVEMENT_TF_PASS_TIME_GRIND				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 17)


#define ACHIEVEMENT_START_CLASS_SPECIFIC			1000

// Scout
#define ACHIEVEMENT_TF_SCOUT_START_RANGE			1001
#define ACHIEVEMENT_TF_SCOUT_FIRST_BLOOD			1001
#define ACHIEVEMENT_TF_SCOUT_FIRST_BLOOD_KILL		1002
#define ACHIEVEMENT_TF_SCOUT_WELL_EARLY_KILL		1003
#define ACHIEVEMENT_TF_SCOUT_LIFETIME_KILLS			1004
#define ACHIEVEMENT_TF_SCOUT_IRON_MAN_KILLS			1005
#define ACHIEVEMENT_TF_SCOUT_DESTROY_TELEPORTERS	1006
#define ACHIEVEMENT_TF_SCOUT_DESTROY_BUILDINGS_BEING_BUILT	1007
#define ACHIEVEMENT_TF_SCOUT_DESTROY_SENTRY_WITH_PISTOL		1008
#define ACHIEVEMENT_TF_SCOUT_DOUBLE_JUMPS			1009
#define ACHIEVEMENT_TF_SCOUT_ASSIST_MEDIC			1010
#define ACHIEVEMENT_TF_SCOUT_STEAL_SANDWICH			1011
#define ACHIEVEMENT_TF_SCOUT_KILL_CHARGED_MEDICS	1012
#define ACHIEVEMENT_TF_SCOUT_SURVIVE_DAMAGE			1013
#define ACHIEVEMENT_TF_SCOUT_THREE_FLAGCAPS			1014
#define ACHIEVEMENT_TF_SCOUT_DOUBLEJUMP_KILL		1015
#define ACHIEVEMENT_TF_SCOUT_FLAG_CAP_GRIND			1016
#define ACHIEVEMENT_TF_SCOUT_DODGE_DAMAGE			1017
#define ACHIEVEMENT_TF_SCOUT_KNOCK_INTO_TRAIN		1018
#define ACHIEVEMENT_TF_SCOUT_KILL_STUNNED			1019
#define ACHIEVEMENT_TF_SCOUT_STUN_INTO_TRAIN		1020
#define ACHIEVEMENT_TF_SCOUT_STUN_UBER_ENEMIES		1021
#define ACHIEVEMENT_TF_SCOUT_STUN_CAPPING_ENEMIES	1022
#define ACHIEVEMENT_TF_SCOUT_MAX_STUNS				1023
#define ACHIEVEMENT_TF_SCOUT_STUN_SCOUT_WITH_THEIR_BALL		1024
#define ACHIEVEMENT_TF_SCOUT_KILL_IN_DODGE_COOLDOWN	1025
#define ACHIEVEMENT_TF_SCOUT_KILL_FROM_BEHIND		1026
#define ACHIEVEMENT_TF_SCOUT_CAPTURE_LAST_POINT		1027
#define ACHIEVEMENT_TF_SCOUT_CAPTURE_THREE_POINTS	1028
#define ACHIEVEMENT_TF_SCOUT_FAST_CAP				1029
#define ACHIEVEMENT_TF_SCOUT_START_AND_FINISH_CAP	1030
#define ACHIEVEMENT_TF_SCOUT_BLOCK_CAPS				1031
#define	ACHIEVEMENT_TF_SCOUT_CARRIER_KILL_CARRIER	1032
#define ACHIEVEMENT_TF_SCOUT_CAP_FLAG_WITHOUT_ATTACKING 1033
#define ACHIEVEMENT_TF_SCOUT_LONG_DISTANCE_RUNNER	1034
#define ACHIEVEMENT_TF_SCOUT_TAUNT_KILL				1035
#define ACHIEVEMENT_TF_SCOUT_ACHIEVE_PROGRESS1		1036
#define ACHIEVEMENT_TF_SCOUT_ACHIEVE_PROGRESS2		1037
#define ACHIEVEMENT_TF_SCOUT_ACHIEVE_PROGRESS3		1038
#define ACHIEVEMENT_TF_SCOUT_BACKSCATTER_KILL_SPY_GRIND			1039
#define ACHIEVEMENT_TF_SCOUT_BACKSCATTER_KILL_HEAVY_MEDIC_PAIR	1040
#define ACHIEVEMENT_TF_SCOUT_BACKSCATTER_KILL_FRIENDS_GRIND		1041
#define ACHIEVEMENT_TF_SCOUT_END_RANGE				1041

// Sniper
#define ACHIEVEMENT_TF_SNIPER_START_RANGE			1101
#define ACHIEVEMENT_TF_SNIPER_JARATE_DOMINATED		1101
#define ACHIEVEMENT_TF_SNIPER_FREEZECAM_HAT			1102
#define ACHIEVEMENT_TF_SNIPER_RIFLE_NO_MISSING		1103
#define ACHIEVEMENT_TF_SNIPER_CAPTURE_FLAG			1104
#define ACHIEVEMENT_TF_SNIPER_KILL_GRIND			1105
#define ACHIEVEMENT_TF_SNIPER_KILL_WEAPONS			1106
#define ACHIEVEMENT_TF_SNIPER_HEADSHOT_SNIPERS		1107
#define ACHIEVEMENT_TF_SNIPER_DESTROY_SENTRYGUNS	1108
#define ACHIEVEMENT_TF_SNIPER_KILL_INVIS_SPY		1109
#define ACHIEVEMENT_TF_SNIPER_KILL_MIDAIR_SCOUT		1110
#define ACHIEVEMENT_TF_SNIPER_FREEZECAM_WAVE		1111
#define ACHIEVEMENT_TF_SNIPER_DOMINATE_SNIPER		1112
#define ACHIEVEMENT_TF_SNIPER_KILL_SPIES_MELEE		1113
#define ACHIEVEMENT_TF_SNIPER_HEADSHOT_DEMOMAN		1114
#define ACHIEVEMENT_TF_SNIPER_KILL_RJER				1115
#define ACHIEVEMENT_TF_SNIPER_KILL_OBJECTIVES		1116
#define ACHIEVEMENT_TF_SNIPER_KILL_UNSCOPED			1117
#define ACHIEVEMENT_TF_SNIPER_KILL_CHARGED_MEDIC	1118
#define ACHIEVEMENT_TF_SNIPER_GET_BACKSTABBED		1119
#define ACHIEVEMENT_TF_SNIPER_KILL_AT_ROUNDSTART	1120
#define ACHIEVEMENT_TF_SNIPER_HEADSHOT_POST_INVULN	1121
#define ACHIEVEMENT_TF_SNIPER_TOP_SCOREBOARD_GRIND	1122
#define ACHIEVEMENT_TF_SNIPER_KILL_FAILED_SPY		1123
#define ACHIEVEMENT_TF_SNIPER_JARATE_GROUP			1124
#define ACHIEVEMENT_TF_SNIPER_JARATE_MEDIC_PAIR		1125
#define ACHIEVEMENT_TF_SNIPER_JARATE_REVEAL_SPY		1126
#define ACHIEVEMENT_TF_SNIPER_JARATE_EXTINGUISH		1127
#define ACHIEVEMENT_TF_SNIPER_BOW_PIN_HEAVY			1128
#define ACHIEVEMENT_TF_SNIPER_BOW_KILL_MEDIC_PAIR	1129
#define ACHIEVEMENT_TF_SNIPER_BOW_KILL_FLAGCARRIER	1130
#define ACHIEVEMENT_TF_SNIPER_BOW_PINCUSHION		1131
#define ACHIEVEMENT_TF_SNIPER_JARATE_ASSISTS		1132
#define ACHIEVEMENT_TF_SNIPER_JARATE_KILL_MELEE		1133
#define ACHIEVEMENT_TF_SNIPER_TAUNT_KILL			1134
#define ACHIEVEMENT_TF_SNIPER_BOW_KILL_WHILEDEAD	1135
#define ACHIEVEMENT_TF_SNIPER_ACHIEVE_PROGRESS1		1136
#define ACHIEVEMENT_TF_SNIPER_ACHIEVE_PROGRESS2		1137
#define ACHIEVEMENT_TF_SNIPER_ACHIEVE_PROGRESS3		1138
#define ACHIEVEMENT_TF_SNIPER_CLASSIC_RIFLE_NOSCOPE_HEADSHOT		1139
#define ACHIEVEMENT_TF_SNIPER_CLASSIC_RIFLE_HEADSHOT_JUMPER			1140
#define ACHIEVEMENT_TF_SNIPER_CLASSIC_RIFLE_GIB_GRIND				1141
#define ACHIEVEMENT_TF_SNIPER_PARACHUTE_GRIND						1142
#define ACHIEVEMENT_TF_SNIPER_END_RANGE				1142

// Soldier
#define ACHIEVEMENT_TF_SOLDIER_START_RANGE			1201
#define ACHIEVEMENT_TF_SOLDIER_RJ_EQUALIZER_KILL	1201
#define ACHIEVEMENT_TF_SOLDIER_BUFF_TEAMMATES		1202
#define ACHIEVEMENT_TF_SOLDIER_KILL_DEMOMAN_GRIND	1203
#define ACHIEVEMENT_TF_SOLDIER_KILL_ENGY			1204
#define ACHIEVEMENT_TF_SOLDIER_KILL_PYRO			1205
#define ACHIEVEMENT_TF_SOLDIER_NEMESIS_SHOVEL_KILL	1206
#define ACHIEVEMENT_TF_SOLDIER_DESTROY_STICKIES		1207
#define ACHIEVEMENT_TF_SOLDIER_CROUCH_ROCKET_JUMP	1208
#define ACHIEVEMENT_TF_SOLDIER_EQUALIZER_STREAK		1209
#define ACHIEVEMENT_TF_SOLDIER_BUFF_FRIENDS			1210
#define ACHIEVEMENT_TF_SOLDIER_KILL_GROUP_WITH_CROCKET				1211
#define ACHIEVEMENT_TF_SOLDIER_KILL_TWO_DURING_ROCKET_JUMP			1212
#define ACHIEVEMENT_TF_SOLDIER_KILL_TAUNT			1213
#define ACHIEVEMENT_TF_SOLDIER_DEFEND_MEDIC			1214
#define ACHIEVEMENT_TF_SOLDIER_KILL_WITH_EQUALIZER_WHILE_HURT		1215
#define ACHIEVEMENT_TF_SOLDIER_KILL_AIRBORNE_TARGET_WHILE_AIRBORNE	1216
#define ACHIEVEMENT_TF_SOLDIER_BOUNCE_THEN_SHOTGUN	1217
#define ACHIEVEMENT_TF_SOLDIER_KILL_AIRBORNE_WITH_DIRECT_HIT		1218
#define ACHIEVEMENT_TF_SOLDIER_KILL_SNIPER_WHILE_DEAD				1219
#define ACHIEVEMENT_TF_SOLDIER_DESTROY_SENTRY_OUT_OF_RANGE			1220
#define ACHIEVEMENT_TF_SOLDIER_DUO_SOLDIER_KILLS	1221
#define ACHIEVEMENT_TF_SOLDIER_MVP					1222
#define ACHIEVEMENT_TF_SOLDIER_ASSIST_MEDIC_UBER	1223
#define ACHIEVEMENT_TF_SOLDIER_SHOOT_MULT_CRITS		1224
#define ACHIEVEMENT_TF_SOLDIER_KILL_DEFENSELESS		1225
#define ACHIEVEMENT_TF_SOLDIER_KILL_ON_FIRE			1226
#define ACHIEVEMENT_TF_SOLDIER_FREEZECAM_TAUNT		1227
#define ACHIEVEMENT_TF_SOLDIER_FREEZECAM_GIBS		1228
#define ACHIEVEMENT_TF_SOLDIER_KILL_SPY_KILLER		1229
#define ACHIEVEMENT_TF_SOLDIER_GIB_GRIND			1230
#define ACHIEVEMENT_TF_SOLDIER_THREE_DOMINATIONS	1231
#define ACHIEVEMENT_TF_SOLDIER_RIDE_THE_CART		1232
#define ACHIEVEMENT_TF_SOLDIER_KILL_TWENTY_FROM_ABOVE			1233
#define ACHIEVEMENT_TF_SOLDIER_KILL_FIVE_STUNNED				1234
#define ACHIEVEMENT_TF_SOLDIER_DEFEND_CAP_THIRTY_TIMES			1235
#define ACHIEVEMENT_TF_SOLDIER_ACHIEVE_PROGRESS1				1236
#define ACHIEVEMENT_TF_SOLDIER_ACHIEVE_PROGRESS2				1237
#define ACHIEVEMENT_TF_SOLDIER_ACHIEVE_PROGRESS3				1238
#define ACHIEVEMENT_TF_SOLDIER_PARACHUTE_KILL_GROUP				1239
#define ACHIEVEMENT_TF_SOLDIER_PARACHUTE_DISTANCE				1240
#define ACHIEVEMENT_TF_SOLDIER_PARACHUTE_KILL_PARACHUTE			1241
#define ACHIEVEMENT_TF_SOLDIER_AIRSTRIKE_MAX_CLIP				1242
#define ACHIEVEMENT_TF_SOLDIER_AIRSTRIKE_GROUP_KILL				1243
#define ACHIEVEMENT_TF_SOLDIER_END_RANGE						1243

// Demoman
#define ACHIEVEMENT_TF_DEMOMAN_START_RANGE						1301
#define ACHIEVEMENT_TF_DEMOMAN_KILL_SOLDIER_GRIND				1301
#define ACHIEVEMENT_TF_DEMOMAN_DESTROY_BUILDINGS_WITH_MEDIC		1302
#define ACHIEVEMENT_TF_DEMOMAN_DECAPITATE_CLOAKED_SPY			1303
#define ACHIEVEMENT_TF_DEMOMAN_KILL_X_WITH_DIRECTPIPE			1304
#define ACHIEVEMENT_TF_DEMOMAN_BOUNCE_AND_KILL					1305
#define ACHIEVEMENT_TF_DEMOMAN_KILL_TWO_DURING_STICKYJUMP		1306
#define ACHIEVEMENT_TF_DEMOMAN_KILL_PLAYER_AFTER_TP				1307
#define ACHIEVEMENT_TF_DEMOMAN_DOMINATE_THREE_ENGINEERS			1308
#define ACHIEVEMENT_TF_DEMOMAN_KILL_BUILDING_DIRECT_HIT			1309
#define ACHIEVEMENT_TF_DEMOMAN_DECAPITATE_PLAYERS				1310
#define ACHIEVEMENT_TF_DEMOMAN_DECAPITATE_PLAYERS_FAST			1311
#define ACHIEVEMENT_TF_DEMOMAN_DUO_DEMOMAN_KILLS				1312
#define ACHIEVEMENT_TF_DEMOMAN_MELEE_KILL_WHILE_STICKYJUMPING	1313
#define ACHIEVEMENT_TF_DEMOMAN_KILL_ENGI_SENTRY_DISPENSER		1314
#define ACHIEVEMENT_TF_DEMOMAN_DECAPITATE_EQUALIZER				1315
#define ACHIEVEMENT_TF_DEMOMAN_DECAPITATE_NEMESIS				1316
#define ACHIEVEMENT_TF_DEMOMAN_DAMAGE_GRIND						1317
#define ACHIEVEMENT_TF_DEMOMAN_KILL_X_CAPPING_ONEDET			1318
#define ACHIEVEMENT_TF_DEMOMAN_KILL_X_DEFENDING					1319
#define ACHIEVEMENT_TF_DEMOMAN_DESTROY_BUILDINGS_GRIND			1320
#define ACHIEVEMENT_TF_DEMOMAN_KILL_X_HEAVIES_FULLHP_ONEDET		1321
#define ACHIEVEMENT_TF_DEMOMAN_KILL_X_SCOUTS_PYROS				1322
#define ACHIEVEMENT_TF_DEMOMAN_TAUNT_KILL						1323
#define ACHIEVEMENT_TF_DEMOMAN_CHARGE_KILL						1324
#define ACHIEVEMENT_TF_DEMOMAN_CRIT_SWORD_KILL					1325
#define ACHIEVEMENT_TF_DEMOMAN_AIR_BURST_KILLS					1326
#define ACHIEVEMENT_TF_DEMOMAN_STICKYJUMP_CAP					1327
#define ACHIEVEMENT_TF_DEMOMAN_FREEZECAM_SMILE					1328
#define ACHIEVEMENT_TF_DEMOMAN_FREEZECAM_RUMP					1329
#define ACHIEVEMENT_TF_DEMOMAN_ENVIRONMENTAL_KILL				1330
#define ACHIEVEMENT_TF_DEMOMAN_DESTROY_X_STICKYBOMBS			1331
#define ACHIEVEMENT_TF_DEMOMAN_STICKJUMP_DISTANCE				1332
#define ACHIEVEMENT_TF_DEMOMAN_KILL3_WITH_DETONATION			1333
#define ACHIEVEMENT_TF_DEMOMAN_KILLXSAPPINGSPIES				1334
#define ACHIEVEMENT_TF_DEMOMAN_KILL3_WITH_PIPE_SETUPS			1335
#define ACHIEVEMENT_TF_DEMOMAN_ACHIEVE_PROGRESS1				1336
#define ACHIEVEMENT_TF_DEMOMAN_ACHIEVE_PROGRESS2				1337
#define ACHIEVEMENT_TF_DEMOMAN_ACHIEVE_PROGRESS3				1338
#define ACHIEVEMENT_TF_DEMOMAN_PARACHUTE_KILL_GROUP				1339
#define ACHIEVEMENT_TF_DEMOMAN_PARACHUTE_DISTANCE				1340
#define ACHIEVEMENT_TF_DEMOMAN_PARACHUTE_KILL_PARACHUTE			1341
#define ACHIEVEMENT_TF_DEMOMAN_KILL_PLAYER_YOU_DIDNT_SEE		1342
#define ACHIEVEMENT_TF_DEMOMAN_QUICK_KILLS						1343
#define ACHIEVEMENT_TF_DEMOMAN_CHARGE_KILL_CHARGING_DEMO		1344
#define ACHIEVEMENT_TF_DEMOMAN_END_RANGE						1344

// Medic
#define ACHIEVEMENT_TF_MEDIC_START_RANGE			1401
#define ACHIEVEMENT_TF_MEDIC_TOP_SCOREBOARD			1401
#define ACHIEVEMENT_TF_MEDIC_HEAL_UNDER_FIRE		1402
#define ACHIEVEMENT_TF_MEDIC_SIMUL_CHARGE			1403
#define ACHIEVEMENT_TF_MEDIC_SETUP_CHARGE			1404
#define ACHIEVEMENT_TF_MEDIC_RAPID_CHARGE			1405
#define ACHIEVEMENT_TF_MEDIC_COUNTER_CHARGE			1406
#define ACHIEVEMENT_TF_MEDIC_SWITCH_TO_MEDIC		1407
#define ACHIEVEMENT_TF_MEDIC_SAVE_TEAMMATE			1408
#define ACHIEVEMENT_TF_MEDIC_CHARGE_BLOCKER			1409
#define ACHIEVEMENT_TF_MEDIC_ASSIST_MEDIC			1410
#define ACHIEVEMENT_TF_MEDIC_SYRINGE_SCOUTS			1411
#define ACHIEVEMENT_TF_MEDIC_BONESAW_MEDICS			1412
#define ACHIEVEMENT_TF_MEDIC_ASSIST_HEAVY_LONG		1413
#define ACHIEVEMENT_TF_MEDIC_ASSIST_SCOUT			1414
#define ACHIEVEMENT_TF_MEDIC_ASSIST_PYRO			1415
#define ACHIEVEMENT_TF_MEDIC_ASSIST_HEAVY			1416
#define ACHIEVEMENT_TF_MEDIC_ASSIST_DEMOMAN			1417
#define ACHIEVEMENT_TF_MEDIC_ASSIST_SOLDIER			1418
#define ACHIEVEMENT_TF_MEDIC_HEAL_ENGINEER			1419
#define ACHIEVEMENT_TF_MEDIC_ASSIST_CAPTURER		1420
#define ACHIEVEMENT_TF_MEDIC_HEAL_CALLERS			1421
#define ACHIEVEMENT_TF_MEDIC_EXTINGUISH_TEAMMATES	1422
#define ACHIEVEMENT_TF_MEDIC_ASSIST_VS_NEMESES		1423
#define ACHIEVEMENT_TF_MEDIC_KILL_WHILE_CHARGED		1424
#define ACHIEVEMENT_TF_MEDIC_BONESAW_NOMISSES		1425
#define ACHIEVEMENT_TF_MEDIC_HEAL_LARGE				1426
#define ACHIEVEMENT_TF_MEDIC_HEAL_HUGE				1427
#define ACHIEVEMENT_TF_MEDIC_HEAL_GRIND				1428
#define ACHIEVEMENT_TF_MEDIC_KILL_HEALED_SPY		1429
#define ACHIEVEMENT_TF_MEDIC_SAVE_FALLING_TEAMMATE	1430
#define ACHIEVEMENT_TF_MEDIC_CHARGE_JUGGLE			1431
#define ACHIEVEMENT_TF_MEDIC_FREEZECAM_RAGDOLL		1432
#define ACHIEVEMENT_TF_MEDIC_BONESAW_SPY_CALLERS	1433
#define ACHIEVEMENT_TF_MEDIC_CHARGE_FRIENDS			1434
#define ACHIEVEMENT_TF_MEDIC_INVITE_JOIN_CHARGE		1435
#define ACHIEVEMENT_TF_MEDIC_HEAL_ACHIEVER			1436
#define ACHIEVEMENT_TF_MEDIC_ACHIEVE_PROGRESS1		1437
#define ACHIEVEMENT_TF_MEDIC_ACHIEVE_PROGRESS2		1438
#define ACHIEVEMENT_TF_MEDIC_ACHIEVE_PROGRESS3		1439
#define ACHIEVEMENT_TF_MEDIC_END_RANGE				1439

// Heavy
#define ACHIEVEMENT_TF_HEAVY_START_RANGE			1501
#define ACHIEVEMENT_TF_HEAVY_DAMAGE_TAKEN			1501
#define ACHIEVEMENT_TF_HEAVY_DEFEND_MEDIC			1502
#define ACHIEVEMENT_TF_HEAVY_ASSIST_MEDIC_LARGE		1503
#define ACHIEVEMENT_TF_HEAVY_EARN_MEDIC_DOMINATION	1504
#define ACHIEVEMENT_TF_HEAVY_KILL_TAUNT				1505
#define ACHIEVEMENT_TF_HEAVY_KILL_FLAG_CARRIERS		1506
#define ACHIEVEMENT_TF_HEAVY_KILL_MEDIC_PAIR		1507
#define ACHIEVEMENT_TF_HEAVY_BLOCK_INVULN_HEAVY		1508
#define ACHIEVEMENT_TF_HEAVY_BLOCK_CART				1509
#define ACHIEVEMENT_TF_HEAVY_RECEIVE_UBER_GRIND		1510
#define ACHIEVEMENT_TF_HEAVY_STAND_NEAR_DISPENSER	1511
#define ACHIEVEMENT_TF_HEAVY_ASSIST_HEAVY_GRIND		1512
#define ACHIEVEMENT_TF_HEAVY_CLEAR_STICKYBOMBS		1513
#define ACHIEVEMENT_TF_HEAVY_KILL_UNDERWATER		1514
#define ACHIEVEMENT_TF_HEAVY_TAKE_MULTI_DAMAGE		1515
#define ACHIEVEMENT_TF_HEAVY_KILL_DOMINATED			1516
#define ACHIEVEMENT_TF_HEAVY_SURVIVE_CROCKET		1517
#define ACHIEVEMENT_TF_HEAVY_ASSIST_GRIND			1518
#define ACHIEVEMENT_TF_HEAVY_UNCOVER_SPIES			1519
#define ACHIEVEMENT_TF_HEAVY_KILL_WHILE_SPUNUP		1520
#define ACHIEVEMENT_TF_HEAVY_FIRE_LOTS				1521
#define ACHIEVEMENT_TF_HEAVY_KILL_CRIT_PUNCH		1522
#define ACHIEVEMENT_TF_HEAVY_HEAL_MEDIKITS			1523
#define ACHIEVEMENT_TF_HEAVY_KILL_SHOTGUN			1524
#define ACHIEVEMENT_TF_HEAVY_FIRST_TO_CAP			1525
#define ACHIEVEMENT_TF_HEAVY_PAYLOAD_CAP_GRIND		1526
#define ACHIEVEMENT_TF_HEAVY_KILL_MIDAIR_MINIGUN	1527
#define ACHIEVEMENT_TF_HEAVY_DEFEND_CONTROL_POINT	1528
#define ACHIEVEMENT_TF_HEAVY_KILL_CAPPING_ENEMIES	1529
#define ACHIEVEMENT_TF_HEAVY_REVENGE_ASSIST			1530
#define ACHIEVEMENT_TF_HEAVY_TELEPORT_FAST_KILL		1531
#define ACHIEVEMENT_TF_HEAVY_FREEZECAM_TAUNT		1532
#define ACHIEVEMENT_TF_HEAVY_EAT_SANDWICHES			1533
#define ACHIEVEMENT_TF_HEAVY_KILL_SCOUTS			1534
#define ACHIEVEMENT_TF_HEAVY_KILL_HEAVIES_GLOVES	1535
#define ACHIEVEMENT_TF_HEAVY_ACHIEVE_PROGRESS1		1537
#define ACHIEVEMENT_TF_HEAVY_ACHIEVE_PROGRESS2		1538
#define ACHIEVEMENT_TF_HEAVY_ACHIEVE_PROGRESS3		1539
#define ACHIEVEMENT_TF_HEAVY_END_RANGE				1539

// Pyro
#define ACHIEVEMENT_TF_PYRO_START_RANGE				1601
#define ACHIEVEMENT_TF_PYRO_KILL_MULTIWEAPONS		1601
#define ACHIEVEMENT_TF_PYRO_SIMULBURN_SCOUTS		1602
#define ACHIEVEMENT_TF_PYRO_FORCE_WATERJUMP			1603
#define ACHIEVEMENT_TF_PYRO_KILL_POSTDEATH			1604
#define ACHIEVEMENT_TF_PYRO_KILL_SPIES				1605
#define ACHIEVEMENT_TF_PYRO_KILL_CARRIERS			1606
#define ACHIEVEMENT_TF_PYRO_REVEAL_SPIES			1607
#define ACHIEVEMENT_TF_PYRO_CAMP_TELEPORTERS		1608
#define ACHIEVEMENT_TF_PYRO_CAMP_POSITION			1609
#define ACHIEVEMENT_TF_PYRO_KILL_AXE_SMALL			1610
#define ACHIEVEMENT_TF_PYRO_KILL_AXE_LARGE			1611
#define ACHIEVEMENT_TF_PYRO_KILL_FROM_BEHIND		1612
#define ACHIEVEMENT_TF_PYRO_BURN_SPIES_AS_YOU		1613
#define ACHIEVEMENT_TF_PYRO_BURN_SNIPERS_ZOOMED		1614
#define ACHIEVEMENT_TF_PYRO_BURN_MEDICS_CHARGED		1615
#define ACHIEVEMENT_TF_PYRO_REFLECT_PROJECTILES		1616
#define ACHIEVEMENT_TF_PYRO_KILL_HEAVIES			1617
#define ACHIEVEMENT_TF_PYRO_KILL_UNDERWATER			1618
#define ACHIEVEMENT_TF_PYRO_KILL_UBERCHARGE			1619
#define ACHIEVEMENT_TF_PYRO_DESTROY_BUILDINGS		1620
#define ACHIEVEMENT_TF_PYRO_DEFEND_POINTS			1621
#define ACHIEVEMENT_TF_PYRO_KILL_GRIND				1622
#define ACHIEVEMENT_TF_PYRO_DAMAGE_GRIND			1623
#define ACHIEVEMENT_TF_PYRO_BURN_MEDICPAIR			1624
#define ACHIEVEMENT_TF_PYRO_KILL_TAUNT				1625
#define ACHIEVEMENT_TF_PYRO_KILL_TEAMWORK			1626
#define ACHIEVEMENT_TF_PYRO_BURN_SPY_TAUNT			1627
#define ACHIEVEMENT_TF_PYRO_DOMINATE_LEAVESVR		1628
#define ACHIEVEMENT_TF_PYRO_REFLECT_CROCKET_KILL	1629
#define ACHIEVEMENT_TF_PYRO_KILL_TAUNTERS			1630
#define ACHIEVEMENT_TF_PYRO_DOUBLE_KO				1631
#define ACHIEVEMENT_TF_PYRO_BURN_RJ_SOLDIER			1632
#define ACHIEVEMENT_TF_PYRO_FREEZECAM_TAUNTS		1633
#define ACHIEVEMENT_TF_PYRO_KILL_GRIND_LARGE		1634
#define ACHIEVEMENT_TF_PYRO_IGNITE_FLAREGUN			1635
#define ACHIEVEMENT_TF_PYRO_ACHIEVE_PROGRESS1		1637
#define ACHIEVEMENT_TF_PYRO_ACHIEVE_PROGRESS2		1638
#define ACHIEVEMENT_TF_PYRO_ACHIEVE_PROGRESS3		1639
#define ACHIEVEMENT_TF_PYRO_IGNITE_WITH_RAINBOW		1640
#define ACHIEVEMENT_TF_PYRO_IGNITE_PLAYER_BEING_FLIPPED 1641
#define ACHIEVEMENT_TF_PYRO_END_RANGE				1641

// Spy
#define ACHIEVEMENT_TF_SPY_START_RANGE				1701
#define ACHIEVEMENT_TF_SPY_BACKSTAB_SNIPERS			1701
#define ACHIEVEMENT_TF_SPY_FREEZECAM_FLICK			1702
#define ACHIEVEMENT_TF_SPY_BACKSTAB_DISGUISED_SPY	1703
#define ACHIEVEMENT_TF_SPY_BACKSTAB_DISGUISE_TARGET	1704
#define ACHIEVEMENT_TF_SPY_TAUNT_KILL				1705
#define ACHIEVEMENT_TF_SPY_BACKSTAB_MEDIC_HEALING_YOU	1706
#define ACHIEVEMENT_TF_SPY_BACKSTAB_ENGY_SAP_BUILDING	1707
#define ACHIEVEMENT_TF_SPY_SAP_BUILDING_BACKSTAB_ENGY	1708
#define ACHIEVEMENT_TF_SPY_BACKSTAB_MEDIC_PAIR		1709
#define ACHIEVEMENT_TF_SPY_BACKSTAB_FRIENDS			1710
#define ACHIEVEMENT_TF_SPY_DOMINATE_SNIPER			1711
#define ACHIEVEMENT_TF_SPY_BUMP_CLOAKED_SPY			1712
#define ACHIEVEMENT_TF_SPY_KILL_SPY_WITH_KNIFE		1713
#define ACHIEVEMENT_TF_SPY_SURVIVE_BURNING			1714
#define ACHIEVEMENT_TF_SPY_BREAK_SHIELD_KILL_SNIPER	1715
#define ACHIEVEMENT_TF_SPY_KILL_WORKING_ENGY		1716
#define ACHIEVEMENT_TF_SPY_FAST_CAP					1717
#define ACHIEVEMENT_TF_SPY_MEDIC_HEALING_KILL_ENEMY	1718
#define ACHIEVEMENT_TF_SPY_KILL_CP_DEFENDERS		1719
#define ACHIEVEMENT_TF_SPY_BACKSTAB_DOMINATING_ENEMY	1720
#define ACHIEVEMENT_TF_SPY_REVENGE_WITH_BACKSTAB	1721
#define ACHIEVEMENT_TF_SPY_KNIFE_KILL_WHILE_JARATED	1722
#define ACHIEVEMENT_TF_SPY_BACKSTAB_QUICK_KILLS		1723
#define ACHIEVEMENT_TF_SPY_BACKSTAB_GRIND			1724
#define ACHIEVEMENT_TF_SPY_SAPPER_GRIND				1725
#define ACHIEVEMENT_TF_SPY_SAPPER_TEAMWORK			1726
#define ACHIEVEMENT_TF_SPY_BACKSTAB_MEDIC_CHARGED	1727
#define ACHIEVEMENT_TF_SPY_BACKSTAB_CAPPING_ENEMIES	1728
#define ACHIEVEMENT_TF_SPY_BACKSTAB_ENEMY_SWITCH_PYRO	1729
#define ACHIEVEMENT_TF_SPY_AMBASSADOR_GRIND			1730
#define ACHIEVEMENT_TF_SPY_AMBASSADOR_SNIPER_GRIND	1731
#define ACHIEVEMENT_TF_SPY_FEIGN_DEATH_KILL			1732
#define ACHIEVEMENT_TF_SPY_AMBASSADOR_SCOUT_GRIND	1733
#define ACHIEVEMENT_TF_SPY_CAMP_POSITION			1734
#define ACHIEVEMENT_TF_SPY_ACHIEVE_PROGRESS1		1735
#define ACHIEVEMENT_TF_SPY_ACHIEVE_PROGRESS2		1736
#define ACHIEVEMENT_TF_SPY_ACHIEVE_PROGRESS3		1737
#define ACHIEVEMENT_TF_SPY_KILL_BACKSCATTER_SCOUT	1738
#define ACHIEVEMENT_TF_SPY_END_RANGE				1738

// Engineer
#define ACHIEVEMENT_TF_ENGINEER_START_RANGE					1801
#define ACHIEVEMENT_TF_ENGINEER_ACHIEVE_PROGRESS1			1801
#define ACHIEVEMENT_TF_ENGINEER_ACHIEVE_PROGRESS2			1802
#define ACHIEVEMENT_TF_ENGINEER_ACHIEVE_PROGRESS3			1803
#define ACHIEVEMENT_TF_ENGINEER_REVENGE_CRIT_SENTRY_KILLER	1804
#define ACHIEVEMENT_TF_ENGINEER_TELEPORT_GRIND				1805
#define ACHIEVEMENT_TF_ENGINEER_DISPENSER_EXTINGUISH		1806
#define ACHIEVEMENT_TF_ENGINEER_MANUAL_CLOAKED_SPY_KILL		1807
#define ACHIEVEMENT_TF_ENGINEER_REVENGE_CRIT_LIFE			1808
#define ACHIEVEMENT_TF_ENGINEER_MANUAL_SENTRY_ABSORB_DMG				1809
#define ACHIEVEMENT_TF_ENGINEER_MANUAL_SENTRY_KILLS_BEYOND_RANGE		1810
#define ACHIEVEMENT_TF_ENGINEER_UPGRADE_BUILDINGS			1811
#define ACHIEVEMENT_TF_ENGINEER_DISPENSER_HEAL_GROUP		1812
#define ACHIEVEMENT_TF_ENGINEER_SENTRY_KILL_LIFETIME_GRIND	1813
#define ACHIEVEMENT_TF_ENGINEER_WASTE_METAL_GRIND			1814
#define ACHIEVEMENT_TF_ENGINEER_KILL_FLAG_CARRIERS			1815
#define ACHIEVEMENT_TF_ENGINEER_KILL_DISGUISED_SPY			1816
#define ACHIEVEMENT_TF_ENGINEER_HELP_BUILD_STRUCTURE		1817
#define ACHIEVEMENT_TF_ENGINEER_FREEZECAM_TAUNT				1818
#define ACHIEVEMENT_TF_ENGINEER_FREEZECAM_SENTRY			1819
#define ACHIEVEMENT_TF_ENGINEER_SHOTGUN_KILL_PREV_SENTRY_TARGET	1820
#define ACHIEVEMENT_TF_ENGINEER_SENTRY_AVENGES_YOU			1821
#define ACHIEVEMENT_TF_ENGINEER_REPAIR_SENTRY_W_MEDIC		1822
#define ACHIEVEMENT_TF_ENGINEER_SENTRY_KILL_CAPS			1823
#define ACHIEVEMENT_TF_ENGINEER_DESTROY_SAPPERS				1824
#define ACHIEVEMENT_TF_ENGINEER_KILL_SPY_TWO_SAPPERS		1825
#define ACHIEVEMENT_TF_ENGINEER_REMOVE_SAPPER_LONG_DIST		1826
#define ACHIEVEMENT_TF_ENGINEER_TAUNT_KILL					1827
#define ACHIEVEMENT_TF_ENGINEER_DESTROY_STICKIES			1828
#define ACHIEVEMENT_TF_ENGINEER_HELP_MANUAL_SENTRY			1829
#define ACHIEVEMENT_TF_ENGINEER_KILL_SNIPERS_SENTRY			1830
#define ACHIEVEMENT_TF_ENGINEER_KILL_SENTRY_WITH_SENTRY		1831
#define ACHIEVEMENT_TF_ENGINEER_MOVE_SENTRY_GET_KILL		1832
#define ACHIEVEMENT_TF_ENGINEER_BUILDING_CARRY				1833
#define ACHIEVEMENT_TF_ENGINEER_KILL_ASSIST					1834
#define ACHIEVEMENT_TF_ENGINEER_DISPENSER_HEAL_GRIND		1835
#define ACHIEVEMENT_TF_ENGINEER_REPAIR_TEAM_GRIND			1836
#define ACHIEVEMENT_TF_ENGINEER_TANK_DAMAGE					1837
#define ACHIEVEMENT_TF_ENGINEER_HEAVY_ASSIST				1838
#define ACHIEVEMENT_TF_ENGINEER_END_RANGE					1838

#define ACHIEVEMENT_END_CLASS_SPECIFIC			1899
 
// Halloween Events
#define ACHIEVEMENT_TF_HALLOWEEN_START_RANGE					1901
#define ACHIEVEMENT_TF_HALLOWEEN_COLLECT_PUMPKINS				1901
#define ACHIEVEMENT_TF_HALLOWEEN_DOMINATE_FOR_HAT				1902
#define ACHIEVEMENT_TF_HALLOWEEN_KILL_SCARED_PLAYER				1903
#define ACHIEVEMENT_TF_HALLOWEEN_PUMPKIN_KILL					1904
#define ACHIEVEMENT_TF_HALLOWEEN_DISGUISED_SPY_KILL				1905
#define ACHIEVEMENT_TF_HALLOWEEN_BOSS_KILL						1906
#define ACHIEVEMENT_TF_HALLOWEEN_COLLECT_GOODY_BAG				1907
#define ACHIEVEMENT_TF_HALLOWEEN_CRAFT_SAXTON_MASK				1908
#define ACHIEVEMENT_TF_HALLOWEEN_BOSS_KILL_MELEE				1909
#define ACHIEVEMENT_TF_HALLOWEEN_EYEBOSS_KILL					1910
#define ACHIEVEMENT_TF_HALLOWEEN_LOOT_ISLAND					1911
#define ACHIEVEMENT_TF_HALLOWEEN_MERASMUS_COLLECT_LOOT			1912
#define ACHIEVEMENT_TF_HALLOWEEN_MERASMUS_KILL					1913
// These six achievements are part of the milestone for Helltower. Order matters here.
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_RARE_SPELL			1914
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_WIN_ROUNDS			1915
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_ENVIRONMENTAL_KILLS	1916
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_SKELETON_GRIND		1917
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_KILL_GRIND			1918
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_KILL_BROTHERS		1919
// This is the milestone for Helltower. Order matters here. 4/6 of the above achievements are required.
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_MILESTONE			1920
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_SKULL_ISLAND_REWARD	1921
// These six achievements are part of the milestone for Doomsday. Order matters here.
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_KILL_KARTS			1922
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_COLLECT_DUCKS			1923
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_SCORE_GOALS			1924
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_RESPAWN_TEAMMATES		1925
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_TINY_SMASHER			1926
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_WIN_MINIGAMES			1927
// This is the milestone for Doomsday. Order matters here. 4/6 of the above achievements are required.
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_MILESTONE				1928
#define ACHIEVEMENT_TF_HALLOWEEN_END_RANGE						1928

// Replay Achievements
#define ACHIEVEMENT_TF_REPLAY_START_RANGE			2001
#define ACHIEVEMENT_TF_REPLAY_SAVE_REPLAY			2001
#define ACHIEVEMENT_TF_REPLAY_PERFORMANCE_MODE		2002
#define ACHIEVEMENT_TF_REPLAY_BROWSE_REPLAYS		2003
#define ACHIEVEMENT_TF_REPLAY_EDIT_TIME				2004
#define ACHIEVEMENT_TF_REPLAY_YOUTUBE_VIEWS_TIER1	2005
#define ACHIEVEMENT_TF_REPLAY_YOUTUBE_VIEWS_TIER2	2006
#define ACHIEVEMENT_TF_REPLAY_YOUTUBE_VIEWS_TIER3	2007
#define ACHIEVEMENT_TF_REPLAY_YOUTUBE_VIEWS_HIGHEST	2008
#define ACHIEVEMENT_TF_REPLAY_END_RANGE				2008

// Christmas Event
#define ACHIEVEMENT_TF_CHRISTMAS_START_RANGE		2101
#define ACHIEVEMENT_TF_CHRISTMAS_COLLECT_GIFTS		2101
#define ACHIEVEMENT_TF_CHRISTMAS_END_RANGE			2101

// Foundry Achievements
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_START_RANGE				2201
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_KILL_CAPPING_ENEMY		2201
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_PLAY_GAME_FRIENDS		2202
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_WIN_MINTIME				2203
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_WIN_ROUNDS				2204
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_FAST_FINAL_CAP			2205
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_TELEPORT_AND_CAP		2206
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_PUSH_INTO_CAULDRON		2207
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_PUSH_BACK_AND_WIN		2208
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_PLAY_EACH_CLASS			2209
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_KILL_ENEMY_ON_ROOF		2210
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_BACK_AND_FORTH_BATTLE	2211
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_ACHIEVE_PROGRESS1		2212
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_END_RANGE				2212

// MvM Achievements
#define ACHIEVEMENT_TF_MVM_START_RANGE						2301
#define ACHIEVEMENT_TF_MVM_COMPLETE_POP_FILE				2301
#define ACHIEVEMENT_TF_MVM_EARN_MONEY_BONUS					2302
#define ACHIEVEMENT_TF_MVM_ADVANCED_EARN_ALL_BONUSES		2303
#define ACHIEVEMENT_TF_MVM_PICKUP_MONEY_ABOUT_TO_EXPIRE		2304
#define ACHIEVEMENT_TF_MVM_COLLECT_MONEY_GRIND				2305
#define ACHIEVEMENT_TF_MVM_PLAY_GAME_FRIENDS				2306
#define ACHIEVEMENT_TF_MVM_PLAY_EACH_CLASS					2307
#define ACHIEVEMENT_TF_MVM_DESTROY_TWO_TANKS				2308
#define ACHIEVEMENT_TF_MVM_DESTROY_TANK_WHILE_DEPLOYING		2309
#define ACHIEVEMENT_TF_MVM_DESTROY_TANK_QUICKLY				2310
#define ACHIEVEMENT_TF_MVM_DEFEND_CAP						2311
#define ACHIEVEMENT_TF_MVM_KILL_BOMB_CARRIERS				2312
#define ACHIEVEMENT_TF_MVM_COMPLETE_WAVE_WITHOUT_DYING		2313
#define ACHIEVEMENT_TF_MVM_COMPLETE_TOUR					2314
#define ACHIEVEMENT_TF_MVM_USE_TELEPORT_BOTTLE				2315
#define ACHIEVEMENT_TF_MVM_USE_CRIT_BOTTLE					2316
#define ACHIEVEMENT_TF_MVM_USE_UBER_BOTTLE					2317
#define ACHIEVEMENT_TF_MVM_USE_BUILD_BOTTLE					2318
#define ACHIEVEMENT_TF_MVM_USE_AMMO_BOTTLE					2319
#define ACHIEVEMENT_TF_MVM_MAX_PRIMARY_UPGRADES				2320
#define ACHIEVEMENT_TF_MVM_MAX_PLAYER_RESISTANCES			2321
#define ACHIEVEMENT_TF_MVM_NO_ALARMS_IN_FINAL_WAVE			2322
#define ACHIEVEMENT_TF_MVM_KILL_MEDICS_CHARGED				2323
#define ACHIEVEMENT_TF_MVM_KILL_ROBOT_GRIND					2324
#define ACHIEVEMENT_TF_MVM_KILL_ROBOT_MEGA_GRIND			2325
#define ACHIEVEMENT_TF_MVM_KILL_SENTRY_BUSTER				2326
#define ACHIEVEMENT_TF_MVM_SPY_SAP_ROBOTS					2327
#define ACHIEVEMENT_TF_MVM_SOLDIER_BUFF_TEAM				2328
#define ACHIEVEMENT_TF_MVM_HEAVY_RAGE_PUSH_DEPLOYING_ROBOT	2329
#define ACHIEVEMENT_TF_MVM_MEDIC_SHARE_BOTTLES				2330
#define ACHIEVEMENT_TF_MVM_DEMO_GROUP_KILL					2331
#define ACHIEVEMENT_TF_MVM_SCOUT_MARK_FOR_DEATH				2332
#define ACHIEVEMENT_TF_MVM_SNIPER_KILL_GROUP				2333
#define ACHIEVEMENT_TF_MVM_PYRO_BOMB_RESET					2334
#define ACHIEVEMENT_TF_MVM_ENGINEER_ESCAPE_SENTRY_BUSTER	2335
#define ACHIEVEMENT_TF_MVM_ACHIEVE_PROGRESS1				2336
#define ACHIEVEMENT_TF_MVM_ACHIEVE_PROGRESS2				2337
#define ACHIEVEMENT_TF_MVM_ACHIEVE_PROGRESS3				2338
#define ACHIEVEMENT_TF_MVM_MAPS_ROTTENBURG_TANK				2339
#define ACHIEVEMENT_TF_MVM_MAPS_ROTTENBURG_BOMB				2340
#define ACHIEVEMENT_TF_MVM_MAPS_ROTTENBURG_PIT_GRIND		2341
#define ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_PIT				2342
#define ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_MYSTERY			2343
#define ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_NO_GATES			2344
#define ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_STUN_RADIOWAVE	2345
#define ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_BOMB_BOT_GRIND	2346
#define ACHIEVEMENT_TF_MVM_SENTRY_BUSTER_FRIENDLY_FIRE		2347
#define ACHIEVEMENT_TF_MVM_SNIPER_COLLECT_HEADSHOT_MONEY	2348
#define ACHIEVEMENT_TF_MVM_MEDIC_SHIELD_BLOCK_DAMAGE		2349
#define ACHIEVEMENT_TF_MVM_MEDIC_REVIVE_TEAMMATES			2350
#define ACHIEVEMENT_TF_MVM_ROCKET_SPECIALIST_KILL_GRIND		2351
#define ACHIEVEMENT_TF_MVM_ROCKET_SPECIALIST_STUN_GRIND		2352
#define ACHIEVEMENT_TF_MVM_END_RANGE						2352

// Doomsday Achievements
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_START_RANGE				2401
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_SOLO_CAPTURE				2401
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_PLAY_GAME_FRIENDS			2402
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_WIN_ROUNDS					2403
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_PLAY_EACH_CLASS			2404
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_KILL_ENEMIES_ON_ELEVATOR	2405
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_PUSH_BACK_AND_WIN			2406
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_KILL_CARRIERS				2407
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_RIDE_THE_ELEVATOR			2408
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_DENY_NEUTRAL_PICKUP		2409
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_PUSH_INTO_EXHAUST			2410
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_DEFEND_CARRIER				2411
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_ACHIEVE_PROGRESS1			2412
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_END_RANGE					2412

// Process Achievement
#define ACHIEVEMENT_TF_MAPS_PROCESS_START_RANGE				2501
#define ACHIEVEMENT_TF_MAPS_PROCESS_WIN_ROUNDS				2501
#define ACHIEVEMENT_TF_MAPS_PROCESS_END_RANGE				2501

// Standin Achievement
#define ACHIEVEMENT_TF_MAPS_STANDIN_START_RANGE				2601
#define ACHIEVEMENT_TF_MAPS_STANDIN_WIN_ROUNDS				2601
#define ACHIEVEMENT_TF_MAPS_STANDIN_END_RANGE				2601

// Snakewater Achievements
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_START_RANGE				2701
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_WIN_ROUNDS				2701
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_PUSH_BACK_AND_WIN		2702
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_TEAM_KILL				2703
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_DOUBLE_AIR_DEATHS		2704
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_KILL_ENEMIES_IN_MIDDLE	2705
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_END_RANGE				2705

// Powerhouse Achievements
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_START_RANGE				2801
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_WIN_ROUNDS				2801
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_PUSH_BACK_AND_WIN		2802
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_FAST_FINAL_CAP			2803
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_KILL_CAPPING_PLAYER		2804
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_KILL_ENEMY_IN_WATER		2805
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_END_RANGE				2805

const unsigned char *GetTFEncryptionKey( void );

//-----------------------------------------------------------------------------
// Sapping Events
//-----------------------------------------------------------------------------
enum
{
	TF_SAPEVENT_NONE = 0,	
	TF_SAPEVENT_PLACED,
	TF_SAPEVENT_DONE,
};

//-----------------------------------------------------------------------------
// Helper code shared between client/server.
//-----------------------------------------------------------------------------
inline bool BIsAttributeValueWithDeltaOverCap( float flCurAttributeValue, float flAttrDeltaValue, float flCap )
{
	return AlmostEqual( flCurAttributeValue, flCap )
		|| ( flAttrDeltaValue > 0 && flCurAttributeValue >= flCap )
		|| ( flAttrDeltaValue < 0 && flCurAttributeValue <= flCap );
}

//-----------------------------------------------------------------------------
// Helltower Announcer lines for Redmond and Blutarch
//-----------------------------------------------------------------------------
enum
{
	HELLTOWER_VO_RED_MISC = 0,
	HELLTOWER_VO_BLUE_MISC,
	HELLTOWER_VO_RED_MISC_RARE,
	HELLTOWER_VO_BLUE_MISC_RARE,
	HELLTOWER_VO_RED_WINNING,
	HELLTOWER_VO_BLUE_WINNING,
	HELLTOWER_VO_RED_WINNING_RARE,
	HELLTOWER_VO_BLUE_WINNING_RARE,
	HELLTOWER_VO_RED_LOSING,
	HELLTOWER_VO_BLUE_LOSING,
	HELLTOWER_VO_RED_LOSING_RARE,
	HELLTOWER_VO_BLUE_LOSING_RARE,
	HELLTOWER_VO_RED_WIN,
	HELLTOWER_VO_BLUE_WIN,
	HELLTOWER_VO_RED_WIN_RARE,
	HELLTOWER_VO_BLUE_WIN_RARE,
	HELLTOWER_VO_RED_LOSE,
	HELLTOWER_VO_BLUE_LOSE,
	HELLTOWER_VO_RED_LOSE_RARE,
	HELLTOWER_VO_BLUE_LOSE_RARE,
	HELLTOWER_VO_RED_ROUNDSTART,
	HELLTOWER_VO_BLUE_ROUNDSTART,
	HELLTOWER_VO_RED_ROUNDSTART_RARE,
	HELLTOWER_VO_BLUE_ROUNDSTART_RARE,
	HELLTOWER_VO_RED_SKELETON_KING,
	HELLTOWER_VO_BLUE_SKELETON_KING,
	HELLTOWER_VO_RED_NEAR_WIN,
	HELLTOWER_VO_BLUE_NEAR_WIN,
	HELLTOWER_VO_RED_NEAR_LOSE,
	HELLTOWER_VO_BLUE_NEAR_LOSE,
	
	HELLTOWER_VO_COUNT,
};

struct helltower_vo_t
{
	const char *m_pszFormatString;
	int			m_nCount;
};

extern helltower_vo_t g_pszHelltowerAnnouncerLines[];

// flags to ignore certain check in CanAttack function
#define TF_CAN_ATTACK_FLAG_NONE				0
#define TF_CAN_ATTACK_FLAG_GRAPPLINGHOOK	0x01

struct PlayerHistoryInfo_t
{
	CSteamID steamID;
	float flTime;		// Time last seen
	int nTeam;			// Last team they were on
};

// When adding new RuneTypes_t, make sure to add new condition codes to 
// ETFCond and also update GetConditionFromRuneType and GetRuneTypeFromCondition.
enum RuneTypes_t
{
	RUNE_NONE = -1,
	RUNE_STRENGTH,
	RUNE_HASTE,
	RUNE_REGEN,
	RUNE_RESIST,
	RUNE_VAMPIRE,
	RUNE_REFLECT,
	RUNE_PRECISION,
	RUNE_AGILITY,
	RUNE_KNOCKOUT,
	RUNE_KING,
	RUNE_PLAGUE,
	RUNE_SUPERNOVA,

	// ADD NEW RUNE TYPE HERE, DO NOT RE-ORDER

	RUNE_TYPES_MAX
};

inline ETFCond GetConditionFromRuneType( RuneTypes_t rt )
{
	switch ( rt )
	{ 
	case RUNE_NONE:			return TF_COND_INVALID;
	case RUNE_STRENGTH:		return TF_COND_RUNE_STRENGTH;
	case RUNE_HASTE:		return TF_COND_RUNE_HASTE;
	case RUNE_REGEN:		return TF_COND_RUNE_REGEN;
	case RUNE_RESIST:		return TF_COND_RUNE_RESIST;
	case RUNE_VAMPIRE:		return TF_COND_RUNE_VAMPIRE;
	case RUNE_REFLECT:		return TF_COND_RUNE_REFLECT;
	case RUNE_PRECISION:	return TF_COND_RUNE_PRECISION;
	case RUNE_AGILITY:		return TF_COND_RUNE_AGILITY;
	case RUNE_KNOCKOUT:		return TF_COND_RUNE_KNOCKOUT;
	case RUNE_KING:			return TF_COND_RUNE_KING;
	case RUNE_PLAGUE:		return TF_COND_RUNE_PLAGUE;
	case RUNE_SUPERNOVA:	return TF_COND_RUNE_SUPERNOVA;
	default:
		AssertMsg( 0, "Unexpected rune_type rt (%d) in GetConditionFromRuneType", rt );	
	}

	return TF_COND_INVALID;
}

enum TemporaryRuneTypes_t
{
	RUNETYPE_TEMP_NONE = 0,

	RUNETYPE_TEMP_CRIT,
	RUNETYPE_TEMP_UBER,

	RUNETYPE_TEMP_MAX,
};

const char *GetPowerupIconName( RuneTypes_t type, int iTeam );

#define TOURNAMENT_NOCANCEL_TIME 10

#define TF_WEAPON_PICKUP_RANGE 150

enum CampaignMedalDisplayType_t
{
	CAMPAIGN_MEDAL_DISPLAY_TYPE_NONE = 0,

	// Gun Mettle Campaign
	CAMPAIGN_MEDAL_DISPLAY_TYPE_SUMMER2015_GRAVEL,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_SUMMER2015_BRONZE,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_SUMMER2015_SILVER,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_SUMMER2015_GOLD,

	// Invasion Community Update
	CAMPAIGN_MEDAL_DISPLAY_TYPE_INVASION,

	// Halloween
	CAMPAIGN_MEDAL_DISPLAY_TYPE_HALLOWEEN_GRAVEL,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_HALLOWEEN_BRONZE,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_HALLOWEEN_SILVER,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_HALLOWEEN_GOLD,

	// Tough Break Campaign
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_GRAVEL1,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_BRONZE1,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_SILVER1,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_GOLD1,

	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_GRAVEL2,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_BRONZE2,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_SILVER2,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_GOLD2,

	CAMPAIGN_MEDAL_DISPLAY_TYPE_COUNT,
};

enum CampaignMedalBaseType_t
{
	CAMPAIGN_MEDAL_SUMMER2015		= 0x001,
	CAMPAIGN_MEDAL_INVASION			= 0x002,
	CAMPAIGN_MEDAL_HALLOWEEN		= 0x004,
	CAMPAIGN_MEDAL_WINTER2016		= 0x008,
};

extern const char *g_pszCampaignMedalIcons[];

// Rage buffs - how is rage generated with respect to a buff ID?
enum
{
	kRageBuffFlag_None = 0x00,
	kRageBuffFlag_OnDamageDealt = 0x01,
	kRageBuffFlag_OnDamageReceived = 0x02,
	kRageBuffFlag_OnMedicHealingReceived = 0x04,
	kRageBuffFlag_OnBurnDamageDealt = 0x08,
	kRageBuffFlag_OnHeal = 0x10
};

struct RageBuffType
{
	unsigned int m_iBuffFlags;
	float m_fRageScale;
	int m_nMaxPulses;
};

static const RageBuffType g_RageBuffTypes[] =
{
	{ kRageBuffFlag_None,					0.f,	10 },	// default/unknown buff type
	{ kRageBuffFlag_OnDamageDealt,			1.f,	10 },	// buff type 1
	{ kRageBuffFlag_OnDamageDealt,			1.f,	10 },	// buff type 2
	{ kRageBuffFlag_OnDamageDealt,			1.25f,	10 },	// buff type 3
	{ kRageBuffFlag_OnMedicHealingReceived,	1.f,	10 },	// buff type 4
	{ kRageBuffFlag_OnBurnDamageDealt,		1.f,	10 },	// pyro rage
	{ kRageBuffFlag_OnHeal,					1.f,	10 },	// medic healing
};

enum
{
	DRAWING_PANEL_TYPE_NONE,
	DRAWING_PANEL_TYPE_CRAFTING,
	DRAWING_PANEL_TYPE_MATCH_SUMMARY,

	DRAWING_PANEL_TYPE_MAX,
};

enum RankStatType_t
{
	RankStat_Invalid = -1,
	RankStat_Score = 0,
	RankStat_Kills,
	RankStat_Damage,
	RankStat_Healing,
	RankStat_Support,
	RankStat_Deaths,
};

enum StatMedal_t
{
	StatMedal_None = 0,
	StatMedal_Bronze = 1,
	StatMedal_Silver = 2,
	StatMedal_Gold = 3,

	StatMedal_Max
};

#define SF_TEAMSPAWN_SCOUT		1
#define SF_TEAMSPAWN_SNIPER		2
#define	SF_TEAMSPAWN_SOLDIER	4
#define SF_TEAMSPAWN_DEMOMAN	8
#define SF_TEAMSPAWN_MEDIC		16
#define SF_TEAMSPAWN_HEAVY		32
#define SF_TEAMSPAWN_PYRO		64
#define	SF_TEAMSPAWN_SPY		128
#define	SF_TEAMSPAWN_ENGINEER	256

enum MM_PlayerConnectionState_t
{
	MM_DISCONNECTED = 0,
	MM_CONNECTED,
	MM_CONNECTING, // the server knows that this player is coming
	MM_LOADING, // loading into the server
	MM_WAITING_FOR_PLAYER
};

#endif // TF_SHAREDDEFS_H