option optimize_for = SPEED;
option cc_generic_services = false;

enum DOTA_GameMode {
	DOTA_GAMEMODE_NONE = 0;
	DOTA_GAMEMODE_AP = 1;
	DOTA_GAMEMODE_CM = 2;
	DOTA_GAMEMODE_RD = 3;
	DOTA_GAMEMODE_SD = 4;
	DOTA_GAMEMODE_AR = 5;
	DOTA_GAMEMODE_INTRO = 6;
	DOTA_GAMEMODE_HW = 7;
	DOTA_GAMEMODE_REVERSE_CM = 8;
	DOTA_GAMEMODE_XMAS = 9;
	DOTA_GAMEMODE_TUTORIAL = 10;
	DOTA_GAMEMODE_MO = 11;
	DOTA_GAMEMODE_LP = 12;
	DOTA_GAMEMODE_POOL1 = 13;
	DOTA_GAMEMODE_FH = 14;
	DOTA_GAMEMODE_CUSTOM = 15;
	DOTA_GAMEMODE_CD = 16;
	DOTA_GAMEMODE_BD = 17;
	DOTA_GAMEMODE_ABILITY_DRAFT = 18;
	DOTA_GAMEMODE_EVENT = 19;
	DOTA_GAMEMODE_ARDM = 20;
	DOTA_GAMEMODE_1V1MID = 21;
	DOTA_GAMEMODE_ALL_DRAFT = 22;
}

enum DOTA_GameState {
	DOTA_GAMERULES_STATE_INIT = 0;
	DOTA_GAMERULES_STATE_WAIT_FOR_PLAYERS_TO_LOAD = 1;
	DOTA_GAMERULES_STATE_HERO_SELECTION = 2;
	DOTA_GAMERULES_STATE_STRATEGY_TIME = 3;
	DOTA_GAMERULES_STATE_PRE_GAME = 4;
	DOTA_GAMERULES_STATE_GAME_IN_PROGRESS = 5;
	DOTA_GAMERULES_STATE_POST_GAME = 6;
	DOTA_GAMERULES_STATE_DISCONNECT = 7;
	DOTA_GAMERULES_STATE_TEAM_SHOWCASE = 8;
	DOTA_GAMERULES_STATE_CUSTOM_GAME_SETUP = 9;
	DOTA_GAMERULES_STATE_WAIT_FOR_MAP_TO_LOAD = 10;
	DOTA_GAMERULES_STATE_LAST = 11;
}

enum DOTA_GC_TEAM {
	DOTA_GC_TEAM_GOOD_GUYS = 0;
	DOTA_GC_TEAM_BAD_GUYS = 1;
	DOTA_GC_TEAM_BROADCASTER = 2;
	DOTA_GC_TEAM_SPECTATOR = 3;
	DOTA_GC_TEAM_PLAYER_POOL = 4;
	DOTA_GC_TEAM_NOTEAM = 5;
}

enum EEvent {
	EVENT_ID_NONE = 0;
	EVENT_ID_DIRETIDE = 1;
	EVENT_ID_SPRING_FESTIVAL = 2;
	EVENT_ID_FROSTIVUS_2013 = 3;
	EVENT_ID_COMPENDIUM_2014 = 4;
	EVENT_ID_NEXON_PC_BANG = 5;
	EVENT_ID_PWRD_DAC_2015 = 6;
	EVENT_ID_NEW_BLOOM_2015 = 7;
	EVENT_ID_INTERNATIONAL_2015 = 8;
	EVENT_ID_FALL_MAJOR_2015 = 9;
	EVENT_ID_ORACLE_PA = 10;
	EVENT_ID_NEW_BLOOM_2015_PREBEAST = 11;
	EVENT_ID_FROSTIVUS = 12;
	EVENT_ID_WINTER_MAJOR_2016 = 13;
	EVENT_ID_INTERNATIONAL_2016 = 14;
	EVENT_ID_FALL_MAJOR_2016 = 15;
	EVENT_ID_WINTER_MAJOR_2017 = 16;
	EVENT_ID_NEW_BLOOM_2017 = 17;
	EVENT_ID_INTERNATIONAL_2017 = 18;
	EVENT_ID_COUNT = 19;
}

enum DOTALeaverStatus_t {
	DOTA_LEAVER_NONE = 0;
	DOTA_LEAVER_DISCONNECTED = 1;
	DOTA_LEAVER_DISCONNECTED_TOO_LONG = 2;
	DOTA_LEAVER_ABANDONED = 3;
	DOTA_LEAVER_AFK = 4;
	DOTA_LEAVER_NEVER_CONNECTED = 5;
	DOTA_LEAVER_NEVER_CONNECTED_TOO_LONG = 6;
	DOTA_LEAVER_FAILED_TO_READY_UP = 7;
	DOTA_LEAVER_DECLINED = 8;
}

enum DOTAConnectionState_t {
	DOTA_CONNECTION_STATE_UNKNOWN = 0;
	DOTA_CONNECTION_STATE_NOT_YET_CONNECTED = 1;
	DOTA_CONNECTION_STATE_CONNECTED = 2;
	DOTA_CONNECTION_STATE_DISCONNECTED = 3;
	DOTA_CONNECTION_STATE_ABANDONED = 4;
	DOTA_CONNECTION_STATE_LOADING = 5;
	DOTA_CONNECTION_STATE_FAILED = 6;
}

enum Fantasy_Roles {
	FANTASY_ROLE_UNDEFINED = 0;
	FANTASY_ROLE_CORE = 1;
	FANTASY_ROLE_SUPPORT = 2;
	FANTASY_ROLE_OFFLANE = 3;
}

enum Fantasy_Team_Slots {
	FANTASY_SLOT_NONE = 0;
	FANTASY_SLOT_CORE = 1;
	FANTASY_SLOT_SUPPORT = 2;
	FANTASY_SLOT_ANY = 3;
	FANTASY_SLOT_BENCH = 4;
}

enum Fantasy_Selection_Mode {
	FANTASY_SELECTION_INVALID = 0;
	FANTASY_SELECTION_LOCKED = 1;
	FANTASY_SELECTION_SHUFFLE = 2;
	FANTASY_SELECTION_FREE_PICK = 3;
	FANTASY_SELECTION_ENDED = 4;
	FANTASY_SELECTION_PRE_SEASON = 5;
	FANTASY_SELECTION_PRE_DRAFT = 6;
	FANTASY_SELECTION_DRAFTING = 7;
	FANTASY_SELECTION_REGULAR_SEASON = 8;
	FANTASY_SELECTION_CARD_BASED = 9;
}

enum DOTAChatChannelType_t {
	DOTAChannelType_Regional = 0;
	DOTAChannelType_Custom = 1;
	DOTAChannelType_Party = 2;
	DOTAChannelType_Lobby = 3;
	DOTAChannelType_Team = 4;
	DOTAChannelType_Guild = 5;
	DOTAChannelType_Fantasy = 6;
	DOTAChannelType_Whisper = 7;
	DOTAChannelType_Console = 8;
	DOTAChannelType_Tab = 9;
	DOTAChannelType_Invalid = 10;
	DOTAChannelType_GameAll = 11;
	DOTAChannelType_GameAllies = 12;
	DOTAChannelType_GameSpectator = 13;
	DOTAChannelType_Cafe = 15;
	DOTAChannelType_CustomGame = 16;
	DOTAChannelType_Private = 17;
	DOTAChannelType_PostGame = 18;
	DOTAChannelType_BattleCup = 19;
	DOTAChannelType_HLTVSpectator = 20;
	DOTAChannelType_GameEvents = 21;
	DOTAChannelType_Trivia = 22;
}

enum EProfileCardSlotType {
	k_EProfileCardSlotType_Empty = 0;
	k_EProfileCardSlotType_Stat = 1;
	k_EProfileCardSlotType_Trophy = 2;
	k_EProfileCardSlotType_Item = 3;
	k_EProfileCardSlotType_Hero = 4;
	k_EProfileCardSlotType_Emoticon = 5;
	k_EProfileCardSlotType_Team = 6;
}

enum EMatchGroupServerStatus {
	k_EMatchGroupServerStatus_OK = 0;
	k_EMatchGroupServerStatus_LimitedAvailability = 1;
	k_EMatchGroupServerStatus_Offline = 2;
}

enum DOTA_CM_PICK {
	DOTA_CM_RANDOM = 0;
	DOTA_CM_GOOD_GUYS = 1;
	DOTA_CM_BAD_GUYS = 2;
}

enum DOTALowPriorityBanType {
	DOTA_LOW_PRIORITY_BAN_ABANDON = 0;
	DOTA_LOW_PRIORITY_BAN_REPORTS = 1;
	DOTA_LOW_PRIORITY_BAN_SECONDARY_ABANDON = 2;
}

enum DOTALobbyReadyState {
	DOTALobbyReadyState_UNDECLARED = 0;
	DOTALobbyReadyState_ACCEPTED = 1;
	DOTALobbyReadyState_DECLINED = 2;
}

enum DOTAGameVersion {
	GAME_VERSION_CURRENT = 0;
	GAME_VERSION_STABLE = 1;
}

enum DOTAJoinLobbyResult {
	DOTA_JOIN_RESULT_SUCCESS = 0;
	DOTA_JOIN_RESULT_ALREADY_IN_GAME = 1;
	DOTA_JOIN_RESULT_INVALID_LOBBY = 2;
	DOTA_JOIN_RESULT_INCORRECT_PASSWORD = 3;
	DOTA_JOIN_RESULT_ACCESS_DENIED = 4;
	DOTA_JOIN_RESULT_GENERIC_ERROR = 5;
	DOTA_JOIN_RESULT_INCORRECT_VERSION = 6;
	DOTA_JOIN_RESULT_IN_TEAM_PARTY = 7;
	DOTA_JOIN_RESULT_NO_LOBBY_FOUND = 8;
	DOTA_JOIN_RESULT_LOBBY_FULL = 9;
	DOTA_JOIN_RESULT_CUSTOM_GAME_INCORRECT_VERSION = 10;
	DOTA_JOIN_RESULT_TIMEOUT = 11;
}

enum SelectionPriorityType {
	UNDEFINED = 0;
	RADIANT = 1;
	DIRE = 2;
	FIRST_PICK = 3;
	SECOND_PICK = 4;
}

enum DOTAMatchVote {
	DOTAMatchVote_INVALID = 0;
	DOTAMatchVote_POSITIVE = 1;
	DOTAMatchVote_NEGATIVE = 2;
}

enum DOTA_LobbyMemberXPBonus {
	DOTA_LobbyMemberXPBonus_DEFAULT = 0;
	DOTA_LobbyMemberXPBonus_BATTLE_BOOSTER = 1;
	DOTA_LobbyMemberXPBonus_SHARE_BONUS = 2;
	DOTA_LobbyMemberXPBonus_PARTY = 3;
	DOTA_LobbyMemberXPBonus_RECRUITMENT = 4;
	DOTA_LobbyMemberXPBonus_PCBANG = 5;
}

enum DOTALobbyVisibility {
	DOTALobbyVisibility_Public = 0;
	DOTALobbyVisibility_Friends = 1;
	DOTALobbyVisibility_Unlisted = 2;
}

enum EDOTAPlayerMMRType {
	k_EDOTAPlayerMMRType_Invalid = 0;
	k_EDOTAPlayerMMRType_GeneralHidden = 1;
	k_EDOTAPlayerMMRType_SoloHidden = 2;
	k_EDOTAPlayerMMRType_GeneralCompetitive = 3;
	k_EDOTAPlayerMMRType_SoloCompetitive = 4;
	k_EDOTAPlayerMMRType_1v1Competitive_UNUSED = 5;
	k_EDOTAPlayerMMRType_GeneralSeasonalRanked = 6;
	k_EDOTAPlayerMMRType_SoloSeasonalRanked = 7;
}

enum MatchType {
	MATCH_TYPE_CASUAL = 0;
	MATCH_TYPE_COOP_BOTS = 1;
	MATCH_TYPE_TEAM_RANKED = 2;
	MATCH_TYPE_LEGACY_SOLO_QUEUE = 3;
	MATCH_TYPE_COMPETITIVE = 4;
	MATCH_TYPE_WEEKEND_TOURNEY = 5;
	MATCH_TYPE_CASUAL_1V1 = 6;
	MATCH_TYPE_EVENT = 7;
	MATCH_TYPE_SEASONAL_RANKED = 8;
}

enum DOTABotDifficulty {
	BOT_DIFFICULTY_PASSIVE = 0;
	BOT_DIFFICULTY_EASY = 1;
	BOT_DIFFICULTY_MEDIUM = 2;
	BOT_DIFFICULTY_HARD = 3;
	BOT_DIFFICULTY_UNFAIR = 4;
	BOT_DIFFICULTY_INVALID = 5;
	BOT_DIFFICULTY_EXTRA1 = 6;
	BOT_DIFFICULTY_EXTRA2 = 7;
	BOT_DIFFICULTY_EXTRA3 = 8;
}

enum DOTA_BOT_MODE {
	DOTA_BOT_MODE_NONE = 0;
	DOTA_BOT_MODE_LANING = 1;
	DOTA_BOT_MODE_ATTACK = 2;
	DOTA_BOT_MODE_ROAM = 3;
	DOTA_BOT_MODE_RETREAT = 4;
	DOTA_BOT_MODE_SECRET_SHOP = 5;
	DOTA_BOT_MODE_SIDE_SHOP = 6;
	DOTA_BOT_MODE_RUNE = 7;
	DOTA_BOT_MODE_PUSH_TOWER_TOP = 8;
	DOTA_BOT_MODE_PUSH_TOWER_MID = 9;
	DOTA_BOT_MODE_PUSH_TOWER_BOT = 10;
	DOTA_BOT_MODE_DEFEND_TOWER_TOP = 11;
	DOTA_BOT_MODE_DEFEND_TOWER_MID = 12;
	DOTA_BOT_MODE_DEFEND_TOWER_BOT = 13;
	DOTA_BOT_MODE_ASSEMBLE = 14;
	DOTA_BOT_MODE_ASSEMBLE_WITH_HUMANS = 15;
	DOTA_BOT_MODE_TEAM_ROAM = 16;
	DOTA_BOT_MODE_FARM = 17;
	DOTA_BOT_MODE_DEFEND_ALLY = 18;
	DOTA_BOT_MODE_EVASIVE_MANEUVERS = 19;
	DOTA_BOT_MODE_ROSHAN = 20;
	DOTA_BOT_MODE_ITEM = 21;
	DOTA_BOT_MODE_WARD = 22;
	DOTA_BOT_MODE_COMPANION = 23;
	DOTA_BOT_MODE_TUTORIAL_BOSS = 24;
	DOTA_BOT_MODE_MINION = 25;
}

enum MatchLanguages {
	MATCH_LANGUAGE_INVALID = 0;
	MATCH_LANGUAGE_ENGLISH = 1;
	MATCH_LANGUAGE_RUSSIAN = 2;
	MATCH_LANGUAGE_CHINESE = 3;
	MATCH_LANGUAGE_KOREAN = 4;
	MATCH_LANGUAGE_SPANISH = 5;
	MATCH_LANGUAGE_PORTUGUESE = 6;
	MATCH_LANGUAGE_ENGLISH2 = 7;
}

enum ETourneyQueueDeadlineState {
	k_ETourneyQueueDeadlineState_Normal = 0;
	k_ETourneyQueueDeadlineState_Missed = 1;
	k_ETourneyQueueDeadlineState_ExpiredOK = 2;
	k_ETourneyQueueDeadlineState_SeekingBye = 3;
	k_ETourneyQueueDeadlineState_EligibleForRefund = 4;
	k_ETourneyQueueDeadlineState_NA = -1;
	k_ETourneyQueueDeadlineState_ExpiringSoon = 101;
}

enum EMatchOutcome {
	k_EMatchOutcome_Unknown = 0;
	k_EMatchOutcome_RadVictory = 2;
	k_EMatchOutcome_DireVictory = 3;
	k_EMatchOutcome_NotScored_PoorNetworkConditions = 64;
	k_EMatchOutcome_NotScored_Leaver = 65;
	k_EMatchOutcome_NotScored_ServerCrash = 66;
	k_EMatchOutcome_NotScored_NeverStarted = 67;
	k_EMatchOutcome_NotScored_Canceled = 68;
}

message CDOTAClientHardwareSpecs {
	optional uint32 logical_processors = 1;
	optional fixed64 cpu_cycles_per_second = 2;
	optional fixed64 total_physical_memory = 3;
	optional bool is_64_bit_os = 4;
	optional uint64 upload_measurement = 5;
	optional bool prefer_not_host = 6;
}

message CDOTASaveGame {
	message Player {
		optional .DOTA_GC_TEAM team = 1 [default = DOTA_GC_TEAM_GOOD_GUYS];
		optional string name = 2;
		optional string hero = 3;
	}

	message SaveInstance {
		message PlayerPositions {
			optional float x = 1;
			optional float y = 2;
		}

		optional uint32 game_time = 2;
		optional uint32 team1_score = 3;
		optional uint32 team2_score = 4;
		repeated .CDOTASaveGame.SaveInstance.PlayerPositions player_positions = 5;
		optional uint32 save_id = 6;
		optional uint32 save_time = 7;
	}

	optional uint64 match_id = 5;
	optional uint32 save_time = 2;
	repeated .CDOTASaveGame.Player players = 3;
	repeated .CDOTASaveGame.SaveInstance save_instances = 4;
}

