diff options
Diffstat (limited to 'game/shared/tf/tf_shareddefs.h')
| -rw-r--r-- | game/shared/tf/tf_shareddefs.h | 2815 |
1 files changed, 2815 insertions, 0 deletions
diff --git a/game/shared/tf/tf_shareddefs.h b/game/shared/tf/tf_shareddefs.h new file mode 100644 index 0000000..3da03b7 --- /dev/null +++ b/game/shared/tf/tf_shareddefs.h @@ -0,0 +1,2815 @@ +//========= 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 + |