import "steammessages.proto";
import "dac_gcmessages_common.proto";
import "usermessages.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

enum EDACGameMessages {
	k_EMsgNetBufferContents = 2;
	k_EMsgClientConnectionStarted = 3;
	k_EMsgClientConnectionComplete = 4;
	k_EMsgClientSetDebugNetBuffer = 5;
	k_EMsgPlayerOrder = 6;
	k_EMsgGameReplayActionMarker = 7;
	k_EMsgPlayerCombinedHero = 8;
	k_EMsgPlayerCombatResult = 9;
	k_EMsgPlayerWinStreak = 10;
	k_EMsgNetBufferRemoved = 11;
	k_EMsgClientToServerChatMsg = 12;
	k_EMsgServerToClientChatMsg = 13;
	k_EMsgPlayerEliminated = 14;
	k_EMsgRecordLocalBotStats = 15;
	k_EMsgPlayerOrderProcessed = 16;
	k_EMsgPlayerAcquiredItem = 18;
	k_EMsgPlayerLevelUp = 19;
	k_EMsgClientToServerUpvoteNotification = 20;
	k_EMsgServerToClientNotificationChanged = 21;
	k_EMsgItemChangedOwner = 22;
	k_EMsgLocalPlayerInventory = 23;
	k_eMsgIndividualPostMatchStats = 24;
	k_EMsgPlayerPreferences = 25;
	k_EMsgPlayerStateUpdatesComplete = 26;
	k_EMsgClientToServerTeammateDuosMessage = 27;
	k_EMsgServerToClientTeammateDuosMessage = 28;
	k_EMsgPlayerSelectedTalent = 29;
	k_EMsgPlayerRecievedUnitFromDuosPartner = 30;
	k_EMsgClientToServerLoadShareCode = 31;
	k_EMsgPlayerBoardBuddyCommand = 33;
	k_EMsgPlayerMapPropCommand = 34;
	k_EMsgPlayerLoadPuzzleLeaderboardCommand = 35;
	k_EMsgClientToServerClickMsg = 36;
	k_EMsgServerToClientClickMsg = 37;
	k_EMsgPlayerChallengeCompletePrediction = 38;
}

enum EDACDisconnectReason {
	k_EDACDisconnectReason_UserLeaveMatch = 1001;
	k_EDACDisconnectReason_UserQuitApp = 1002;
	k_EDACDisconnectReason_UserCancel = 1003;
	k_EDACDisconnectReason_Goodbye = 1004;
	k_EDACDisconnectReason_BadMessage = 2001;
	k_EDACDisconnectReason_GameDestroyedUnexpectedly = 2002;
	k_EDACDisconnectReason_ChangingServer = 2003;
	k_EDACDisconnectReason_OldConnection = 2004;
	k_EDACDisconnectReason_GoodbyeUnrecognizedGame = 2005;
}

enum EGameState {
	EGameState_Intro = 0;
	EGameState_Playing = 1;
	EGameState_GameOver = 2;
}

enum ERoundState {
	ERoundState_Preparing = 0;
	ERoundState_Ready = 1;
	ERoundState_Combat = 2;
	ERoundState_RoundOver = 3;
}

enum EUnitKeyword {
	EUnitKeyword_Invalid = 0;
	EUnitKeyword_Beast = 1;
	EUnitKeyword_Demon = 2;
	EUnitKeyword_Dragon = 3;
	EUnitKeyword_Dwarf = 4;
	EUnitKeyword_Element = 5;
	EUnitKeyword_Elf = 6;
	EUnitKeyword_Goblin = 7;
	EUnitKeyword_Human = 8;
	EUnitKeyword_Naga = 9;
	EUnitKeyword_Ogre = 10;
	EUnitKeyword_Orc = 11;
	EUnitKeyword_Troll = 12;
	EUnitKeyword_Undead = 13;
	EUnitKeyword_Satyr = 14;
	EUnitKeyword_Assassin = 15;
	EUnitKeyword_DemonHunter = 16;
	EUnitKeyword_Druid = 17;
	EUnitKeyword_Hunter = 18;
	EUnitKeyword_Knight = 19;
	EUnitKeyword_Mage = 20;
	EUnitKeyword_Mech = 21;
	EUnitKeyword_Shaman = 22;
	EUnitKeyword_Warlock = 23;
	EUnitKeyword_Warrior = 24;
	EUnitKEyword_MegaWarrior = 25;
	EUnitKeyword_MegaAssassin = 26;
	EUnitKeyword_MegaBloodbound = 27;
	EUnitKeyword_MegaElusive = 28;
	EUnitKeyword_MegaWarlock = 29;
	EUnitKeyword_MegaScaled = 30;
	EUnitKeyword_MegaTroll = 31;
	EUnitKeyword_MegaDemon = 32;
	EUnitKeyword_Primordial = 33;
	EUnitKeyword_Brawny = 34;
	EUnitKeyword_Savage = 35;
	EUnitKeyword_Inventor = 36;
	EUnitKeyword_Insect = 37;
	EUnitKeyword_Spectral = 38;
	EUnitKeyword_Summoner = 39;
	EUnitKeyword_SpiritBrother = 40;
	EUnitKeyword_Meepo = 41;
	EUnitKeyword_Monk = 42;
	EUnitKeyword_Brawler = 43;
	EUnitKeyword_Invoker = 44;
	EUnitKeyword_Sorceror = 45;
	EUnitKeyword_Guardian = 46;
	EUnitKeyword_Commander = 47;
	EUnitKeyword_Faerie = 48;
	EUnitKeyword_Necromancer = 49;
	EUnitKeyword_Champion = 50;
	EUnitKeyword_Wisp = 51;
	EUnitKeyword_Brutal = 52;
	EUnitKeyword_Healer = 53;
	EUnitKeyword_Vigilant = 54;
	EUnitKeyword_Void = 55;
}

enum ESynergyType {
	ESynergyType_Class = 1;
	ESynergyType_Race = 2;
}

enum EDACItemType {
	EDACItemType_Invalid = -1;
	EDACItemType_Global = 0;
	EDACItemType_Equipment_Offensive = 1;
	EDACItemType_Equipment_Defensive = 2;
	EDACItemType_Equipment_Support = 3;
	EDACItemType_Placeable = 5;
	EDACItemType_Equipment_Hat = 9;
}

enum EPlayerConnectionState {
	EPlayerConnectionState_Connecting = 0;
	EPlayerConnectionState_Connected = 1;
	EPlayerConnectionState_Disconnected = 2;
}

enum ESendDestination {
	ESendDestination_Duos_Partner = 0;
}

enum EPlayerOrder {
	EPlayerOrder_SellUnit = 2;
	EPlayerOrder_MoveUnit = 3;
	EPlayerOrder_BuyXP = 4;
	EPlayerOrder_ReRoll = 5;
	EPlayerOrder_LockShop = 6;
	EPlayerOrder_AssignEquipmentItem = 7;
	EPlayerOrder_SelectItemRewardChoice = 8;
	EPlayerOrder_DevGold = 9;
	EPlayerOrder_DevItem = 10;
	EPlayerOrder_DevHero = 12;
	EPlayerOrder_BuyAndCombine = 15;
	EPlayerOrder_PauseGame = 16;
	EPlayerOrder_ResumeGame = 17;
	EPlayerOrder_SpectatePlayer = 18;
	EPlayerOrder_RequestPlayerStats = 19;
	EPlayerOrder_StepForward = 20;
	EPlayerOrder_MutePlayer = 21;
	EPlayerOrder_SelectTalent = 22;
	EPlayerOrder_Send = 23;
	EPlayerOrder_CombineItem = 24;
	EPlayerOrder_BuyCombineMove = 25;
	EPlayerOrder_BuyAndSend = 26;
	EPlayerOrder_SendGold = 27;
	EPlayerOrder_DevTalent = 28;
	EPlayerOrder_SellItem = 29;
	EPlayerOrder_DevSetPlayerLevel = 30;
	EPlayerOrder_DevGiveUnderlord = 32;
	EPlayerOrder_DevSetAutosavingEnabled = 33;
	EPlayerOrder_DevRemoveAllUnits = 34;
	EPlayerOrder_DevSetUnitRank = 35;
	EPlayerOrder_DevRemoveAllItems = 36;
	EPlayerOrder_ClearBoard = 37;
	EPlayerOrder_GoToTutorialState = 38;
	EPlayerOrder_SelectTurboBucket = 39;
	EPlayerOrder_TurboBucketReroll = 40;
	EPlayerOrder_SelectUnderlord = 41;
	EPlayerOrder_DevMakeTestBot = 42;
	EPlayerOrder_ItemRewardChoiceReroll = 43;
	EPlayerOrder_BuyPuzzleUnit = 44;
	EPlayerOrder_Dungeon_AdvancePhase = 45;
}

enum ERoundCombatResult {
	ERoundCombatResult_Draw = 0;
	ERoundCombatResult_HomeWin = 1;
	ERoundCombatResult_AwayWin = 2;
}

enum EDamageSourceType {
	k_EDamageSourceType_Round = 0;
	k_EDamageSourceType_Unit = 1;
	k_EDamageSourceType_Item = 2;
	k_EDamageSourceType_DuosNetDamage = 3;
}

enum ERoundVictoryLevel {
	ERoundVictoryLevel_HomeDecisive = 0;
	ERoundVictoryLevel_HomeNarrow = 1;
	ERoundVictoryLevel_HomeFlawless = 2;
	ERoundVictoryLevel_HomeNormal = 3;
	ERoundVictoryLevel_AwayDecisive = 4;
	ERoundVictoryLevel_AwayNarrow = 5;
	ERoundVictoryLevel_AwayFlawless = 6;
	ERoundVictoryLevel_AwayNormal = 7;
	ERoundVictoryLevel_Draw = 8;
}

enum EDACPuzzleRule {
	k_EDACPuzzleRule_None = 0;
	k_EDACPuzzleRule_UnitCountLimit = 1;
	k_EDACPuzzleRule_UnitStarLimit = 2;
	k_EDACPuzzleRule_BoardCostLimit = 3;
	k_EDACPuzzleRule_ItemCountLimit = 4;
	k_EDACPuzzleRule_ValidBoardPositions = 5;
	k_EDACPuzzleRule_MaxCombatDuration = 6;
	k_EDACPuzzleRule_Custom1 = 100;
	k_EDACPuzzleRule_Custom2 = 101;
	k_EDACPuzzleRule_Custom3 = 102;
	k_EDACPuzzleRule_Custom4 = 103;
	k_EDACPuzzleRule_AllianceAllowed1 = 110;
	k_EDACPuzzleRule_AllianceAllowed2 = 111;
	k_EDACPuzzleRule_AllianceAllowed3 = 112;
	k_EDACPuzzleRule_AllianceAllowed4 = 113;
	k_EDACPuzzleRule_AllianceDisllowed1 = 120;
	k_EDACPuzzleRule_AllianceDisllowed2 = 121;
	k_EDACPuzzleRule_AllianceDisllowed3 = 122;
	k_EDACPuzzleRule_AllianceDisllowed4 = 123;
	k_EDACPuzzleRule_UnitAllowed1 = 130;
	k_EDACPuzzleRule_UnitAllowed2 = 131;
	k_EDACPuzzleRule_UnitAllowed3 = 132;
	k_EDACPuzzleRule_UnitAllowed4 = 133;
	k_EDACPuzzleRule_UnitDisallowed1 = 140;
	k_EDACPuzzleRule_UnitDisallowed2 = 141;
	k_EDACPuzzleRule_UnitDisallowed3 = 142;
	k_EDACPuzzleRule_UnitDisallowed4 = 143;
}

enum EDACDungeonRoomType {
	k_EDACDungeonRoomType_None = 0;
	k_EDACDungeonRoomType_Shop = 1;
	k_EDACDungeonRoomType_Mystery = 2;
	k_EDACDungeonRoomType_MiniGame = 3;
	k_EDACDungeonRoomType_StandardCombat = 4;
	k_EDACDungeonRoomType_MiniBoss = 5;
	k_EDACDungeonRoomType_Boss = 6;
}

enum EDACDungeonPhase {
	k_EDACDungeonPhase_None = 0;
	k_EDACDungeonPhase_Intro_ChoosingUnderlord = 1;
	k_EDACDungeonPhase_Intro_ChoosingFirstUnit = 2;
	k_EDACDungeonPhase_Room_Setup = 3;
	k_EDACDungeonPhase_Room_Main = 4;
	k_EDACDungeonPhase_Room_Post_Rewards = 5;
	k_EDACDungeonPhase_Room_Post_ChooseNextRoom = 6;
	k_EDACDungeonPhase_Victory = 7;
	k_EDACDungeonPhase_Defeat = 8;
}

enum EUnitAIState {
	EUnitAIState_Idle = 0;
	EUnitAIState_MoveToAttack = 1;
	EUnitAIState_MoveToLocation = 2;
	EUnitAIState_Attack = 3;
	EUnitAIState_CastAbility = 4;
	EUnitAIState_Dead = 5;
	EUnitAIState_Portrait = 6;
	EUnitAIState_WalkBack = 7;
	EUnitAIState_Celebrate = 8;
	EUnitAIState_RoundEndTeleport = 9;
	EUnitAIState_Resurrecting = 10;
	EUnitAIState_WalkThroughGate = 11;
	EUnitAIState_MoveInFear = 12;
}

enum EDACIncidentType {
	EDACIncidentType_None = 0;
	EDACIncidentType_DamagePhysical = 1;
	EDACIncidentType_DamageMagical = 2;
	EDACIncidentType_DamagePure = 3;
	EDACIncidentType_Died = 4;
	EDACIncidentType_Heal = 5;
}

enum EDACNetBuffer {
	k_eDACNetBuffer_MatchState = 0;
	k_eDACNetBuffer_RoundCombat = 1;
	k_eDACNetBuffer_PublicPlayerState = 2;
	k_eDACNetBuffer_PrivatePlayerState = 3;
	k_eDACNetBuffer_Debug = 4;
	k_eDACNetBuffer_ModifierName = 5;
	k_eDACNetBuffer_IndividualPostMatchStats = 6;
	k_eDACNetBuffer_PublicPostMatchStats = 7;
	k_eDACNetBuffer_GameModeState = 8;
	k_eDACNetBuffer_RoundCombatGlobal = 9;
}

enum EInGameChatType {
	k_eInGameChatType_Global = 0;
	k_eInGameChatType_Combat = 1;
}

enum EClickType {
	k_eClickType_Left = 0;
	k_eClickType_Right = 1;
}

enum EMapPropCommand {
	k_eMapPropCommand_None = 0;
	k_eMapPropCommand_Click = 1;
}

enum EDuosMessageType {
	k_eDuosMessageType_None = 0;
	k_eDuosMessageType_IWant = 1001;
	k_eDuosMessageType_DoYouWant = 1002;
	k_eDuosMessageType_YesWant = 1003;
	k_eDuosMessageType_NoWant = 1004;
	k_eDuosMessageType_FreeYourBenchFor = 1005;
	k_eDuosMessageType_Thanks = 1006;
	k_eDuosMessageType_Sent1Gold = 1007;
	k_eDuosMessageType_Sent5Gold = 1008;
	k_eDuosMessageType_INoLongerWant = 1009;
	k_eDuosMessageType_WantGold = 1010;
	k_eDuosMessageType_LevelUpQuestion = 1011;
	k_eDuosMessageType_SpendRerollQuestion = 1012;
}

enum EDuosMessageTargetType {
	k_eDuosMessageTargetType_None = 0;
	k_eDuosMessageTargetType_Unit = 1;
	k_eDuosMessageTargetType_Synergy = 2;
	k_eDuosMessageTargetType_Gold = 3;
}

enum EBoardBuddyCommand {
	k_eBoardBuddyCommand_None = 0;
	k_eBoardBuddyCommand_Move = 1;
}

message CClientReconnectInfo {
	optional fixed64 server_steam_id = 1;
	optional uint64 lobby_id = 2;
	optional uint32 time_updated = 3;
	optional uint32 udp_connect_ip = 4;
	optional uint32 udp_connect_port = 5;
	optional uint32 compatibility_version = 7;
}

message CMsgPlayerStateUpdatesComplete {
}

message CMsgClientUnderlordLoadout {
	repeated uint32 item_defs = 1;
	optional string loadout_name = 2;
	optional bool selected = 3;
	optional uint32 underlord_id = 4;
}

message CMsgClientUnderlordLoadoutList {
	optional uint32 version = 1;
	repeated .CMsgClientUnderlordLoadout loadouts = 2;
}

message CMsgPlayerOrder {
	required .EPlayerOrder order = 1 [default = EPlayerOrder_SellUnit];
	optional int32 param1 = 2;
	optional int32 param2 = 3;
	optional int32 param3 = 4;
	optional uint32 spoof_player_slot = 5;
	optional uint32 command_id = 6;
	optional int32 param4 = 7;
	optional int32 param5 = 8;
	optional int32 param6 = 9;
	optional string string_param1 = 10;
}

message CMsgPlayerOrderProcessed {
	optional uint32 command_id = 1;
}

message CMsgPlayerCombinedHero {
	optional uint32 player_slot = 1;
	optional int32 unit_id = 2;
	optional uint32 new_rank = 3;
	optional uint32 entindex = 4;
	optional uint32 notification_id = 5;
	optional bool duos_combine = 6;
}

message CMsgPlayerAcquiredItem {
	optional uint32 player_slot = 1;
	optional int32 item_id = 2;
	optional uint32 notification_id = 3;
}

message CMsgPlayerRecievedUnitFromDuosPartner {
	optional int32 unit_id = 1;
}

message CMsgPlayerSelectedTalent {
	optional uint32 player_slot = 1;
	optional int32 talent_itemdef_index = 2;
	optional uint32 notification_id = 3;
}

message CMsgPlayerCombatResult {
	message DamageSource {
		required .EDamageSourceType type = 1 [default = k_EDamageSourceType_Round];
		optional int32 entity_id = 2;
		optional int32 rank = 3;
		optional int32 damage_dealt = 4;
	}

	optional uint32 player_slot = 1;
	optional .ERoundCombatResult result = 4 [default = ERoundCombatResult_Draw];
	optional uint32 damage_taken = 5;
	repeated .CMsgPlayerCombatResult.DamageSource damage_sources = 6;
	optional bool aegis_used = 7;
	optional .ERoundVictoryLevel victory_level = 8 [default = ERoundVictoryLevel_HomeDecisive];
	optional uint32 notification_id = 9;
	optional uint32 total_gold = 11;
	optional uint32 gold_from_interest = 12;
	optional uint32 gold_from_streak = 13;
	optional uint32 gold_from_items = 14;
	optional uint32 gold_from_round_bonus = 15;
	optional uint32 gold_from_victory = 16;

	oneof opponent {
		uint32 opponent_player_slot = 2;
		uint32 opponent_neutral_wave = 3;
	}
}

message CMsgPlayerWinStreak {
	optional uint32 player_slot = 1;
	optional uint32 streak_length = 2;
	optional uint32 notification_id = 3;
}

message CMsgPlayerLevelUp {
	optional uint32 player_slot = 1;
	optional uint32 level = 2;
	optional uint32 notification_id = 3;
}

message CMsgItemChangedOwner {
	optional uint32 old_player_slot = 1;
	optional uint32 new_player_slot = 2;
	optional uint32 item_id = 3;
	optional uint32 notification_id = 4;
}

message CMsgPlayerEliminated {
	optional uint32 player_slot = 1;
	optional uint32 final_position = 2;
	optional uint32 notification_id = 3;
	optional uint32 opponent_player_slot = 4;
	optional bool was_head_to_head = 5;
}

message CMsgPosition {
	required int32 x = 1;
	required int32 y = 2;
}

message CMsgUnit {
	required int32 entindex = 1;
	optional int32 unit_id = 2;
	optional .CMsgPosition position = 3;
	optional int32 rank = 4;
	optional int32 gold_value = 6;
	optional uint32 kill_count = 8;
	optional uint32 kill_streak = 9;
	repeated .EUnitKeyword keywords = 10;
	optional bool is_summoned = 11;
	optional uint32 duel_bonus_damage = 12;
	optional int32 unit_cap_cost = 13;
	optional bool is_placeable_item = 14;
	optional bool bot_ignore = 15;
	optional bool can_move_to_bench = 16;
	optional bool can_be_sold = 17;
	optional bool recommended_for_placement = 18;
	optional float float_kill_count = 38;
}

message CMsgShopItem {
	optional int32 unit_id = 1;
	optional bool will_combine_two_stars = 2;
	optional int32 gold_cost = 3;
	optional bool wanted_legendary = 4;
	optional bool will_combine_three_stars = 5;
	repeated .EUnitKeyword keywords = 6;
}

message CMsgTurboBucket {
	repeated .EUnitKeyword keywords = 1;
	repeated int32 unit_ids = 2;
}

message CMsgUnderlordPickerOffering {
	optional uint32 underlord_id = 1;
	optional uint32 build_id = 2;
}

message CMsgSynergy {
	optional .EUnitKeyword keyword = 1 [default = EUnitKeyword_Invalid];
	optional int32 unique_unit_count = 2;
	optional int32 bench_additional_unique_unit_count = 3;
}

message CMsgItemSlot {
	optional uint32 slot_index = 1;
	required uint32 item_id = 2;
	optional int32 assigned_unit_entindex = 3;
}

message CMsgBoardBuddy {
	optional float desired_pos_x = 1;
	optional float desired_pos_y = 2;
}

message CMsgMapProp {
	optional uint32 prop_idx = 1;
	optional uint32 prop_state = 2;
	optional uint32 num_clicks = 3;
}

message CMsgPublicPlayerState {
	message LoadoutItem {
		optional uint32 slot = 1;
		optional uint32 sub_slot = 2;
		optional uint32 def_index = 3;
	}

	required uint32 player_slot = 1;
	optional uint32 account_id = 2;
	optional .EPlayerConnectionState connection_status = 3 [default = EPlayerConnectionState_Connecting];
	optional bool is_human_player = 4;
	optional int32 health = 5;
	optional int32 gold = 6;
	optional int32 level = 7;
	optional int32 xp = 8;
	repeated .CMsgItemSlot item_slots = 9;
	repeated .CMsgUnit units = 10;
	optional uint32 final_place = 14;
	optional int32 next_level_xp = 15;
	repeated .CMsgSynergy synergies = 16;
	optional string bot_persona_name = 17;
	optional uint64 sequence_number = 18;
	optional int32 shop_cost_modifier = 20;
	optional float combat_duration = 21;
	optional int32 reroll_cost_modifier = 22;
	optional int32 win_streak = 26;
	optional int32 lose_streak = 27;
	optional uint32 rank_tier = 28;
	optional float disconnected_time = 29;
	optional uint32 vs_opponent_wins = 30;
	optional uint32 vs_opponent_losses = 31;
	optional uint32 vs_opponent_draws = 32;
	optional .EDACPlatform platform = 33 [default = k_eDACPlatform_None];
	optional uint32 event_tier = 34;
	optional string persona_name = 36;
	optional uint32 wins = 37;
	optional uint32 losses = 38;
	optional uint32 global_leaderboard_rank = 39;
	repeated .CMsgPublicPlayerState.LoadoutItem player_loadout = 40;
	optional uint32 net_worth = 41;
	optional uint32 combat_result = 43;
	optional .EDACLobbyTeam lobby_team = 44 [default = k_EDACLobbyTeam_Team0];
	repeated uint32 underlord_selected_talents = 45;
	optional bool is_mirrored_match = 46;
	optional uint32 underlord = 47;
	optional uint32 party_index = 48;
	optional uint32 next_combat_opponent_neutral_wave = 49;
	optional int32 board_unit_limit = 52;
	repeated uint32 underlord_available_talents = 53;
	optional uint32 combat_type = 54;
	optional .CMsgBoardBuddy board_buddy = 55;
	repeated .CMsgMapProp prop_state = 56;
	optional float brawny_kills_float = 57;
	optional bool owns_event = 58;
	optional uint32 city_prestige_level = 59;
	optional uint32 stat_best_victory_duration = 1000;
	optional uint32 stat_best_victory_net_worth = 1001;
	optional uint32 stat_best_victory_remaining_health_percent = 1002;
	optional uint32 stat_best_victory_units = 1006;
	optional uint32 stat_prev_victory_duration = 1003;
	optional uint32 stat_prev_victory_net_worth = 1004;
	optional uint32 stat_prev_victory_remaining_health_percent = 1005;
	optional uint32 stat_prev_victory_units = 1007;

	oneof opponent {
		uint32 opponent_player_slot = 24;
		uint32 opponent_neutral_wave = 25;
	}
}

message CMsgPublicPostMatchStats {
	message PlayerPerRoundInfo {
		optional uint32 gold = 1;
		optional uint32 health = 2;
		optional uint32 level = 3;
		optional uint32 wins = 4;
		optional uint32 losses = 5;
		optional uint32 net_worth = 6;
		repeated .CMsgUnit units = 7;
		repeated uint32 synergies = 8;
		repeated .CMsgItemSlot item_slots = 9;
		repeated uint32 underlord_selected_talents = 10;
	}

	message PlayerInfo {
		repeated .CMsgPublicPostMatchStats.PlayerPerRoundInfo rounds = 1;
		optional uint32 player_slot = 2;
		optional uint32 account_id = 3;
		optional bool is_human_player = 4;
		optional string persona_name = 5;
		optional uint32 mmr_level = 6;
		optional uint32 global_leaderboard_rank = 7;
		optional uint32 final_position = 8;
		optional .EDACLobbyTeam lobby_team = 9 [default = k_EDACLobbyTeam_Team0];
	}

	repeated .CMsgPublicPostMatchStats.PlayerInfo players = 1;
	optional uint32 game_mode = 2;
	optional uint64 match_id = 3;
}

message CMsgIndividualPostMatchStats {
	message Round {
		repeated .CMsgUnit units = 1;
		repeated uint32 synergies = 2;
		repeated .CMsgItemSlot items = 3;
		optional uint32 gold_spent_on_rerolls = 4;
		optional uint32 gold_earned = 5;
		optional uint32 interest_gold_earned = 6;
		optional uint32 streak_gold_earned = 7;
		optional uint32 victory = 8;
		optional uint32 xp_earned = 9;
		optional uint32 health = 10;
		optional uint32 gold = 11;
		optional uint32 round_ranking = 12;
		optional uint32 level = 13;
		optional uint32 enemy_player_slot = 14;
		optional uint32 gold_spent_on_levels = 15;
		optional uint32 gold_spent_on_units = 16;
		optional uint32 damage_dealt_to_units = 17;
		optional uint32 victory_level = 18;
		optional uint32 damage_dealt_to_player = 19;
		optional uint32 enemy_underlord = 20;
		repeated uint32 underlord_selected_talents = 21;
	}

	message Challenge {
		optional uint32 slot_id = 1;
		optional uint32 sequence_id = 2;
		optional uint32 progress = 3;
		optional uint32 initial_progress = 4;
		optional uint32 claimed = 5;
	}

	message Currency {
		optional uint32 currency_id = 1;
		optional uint32 initial_amount = 2;
		optional uint32 amount_gained = 3;
	}

	message Event {
		optional uint32 event_id = 1;
		optional bool event_owned = 2;
		optional uint32 event_tier = 3;
		repeated .CMsgIndividualPostMatchStats.Challenge challenges = 4;
		repeated .CMsgIndividualPostMatchStats.Currency currencies = 5;
	}

	message RankUpdate {
		optional uint32 initial_level_score = 1;
		optional uint32 initial_level = 2;
		optional float initial_level_partial_progress = 3;
		optional uint32 final_level_score = 4;
		optional uint32 final_level = 5;
		optional float final_level_partial_progress = 6;
		optional uint32 initial_leaderboard_place = 7;
	}

	repeated .CMsgIndividualPostMatchStats.Round rounds = 1;
	optional uint32 player_slot = 2;
	optional uint32 position = 3;
	repeated .CMsgIndividualPostMatchStats.Event events = 4;
	optional .CMsgIndividualPostMatchStats.RankUpdate individual_rank_update = 5;
	optional .CMsgIndividualPostMatchStats.RankUpdate duos_rank_update = 6;
	optional .EDACGameMode game_mode = 7 [default = k_EDACGameMode_Invalid];
	optional .EDACMatchMode match_mode = 8 [default = k_EDACMatchMode_Invalid];
	optional .EDACBotDifficulty bot_difficulty = 9 [default = k_EDACBotDifficulty_None];
	optional uint32 underlord_id = 10;
	optional uint32 underlord_build_id = 11;
	optional .CMsgGameModeSettings game_mode_settings = 12;
}

message CMsgPlayerPreferences {
	optional bool auto_deploy_units = 1;
}

message CMsgPrivatePlayerState {
	message ItemChoiceReward {
		message Choice {
			required uint32 item_id = 1;
			optional bool available = 2;
		}

		required int32 reward_id = 1;
		repeated .CMsgPrivatePlayerState.ItemChoiceReward.Choice choices = 2;
	}

	message Challenge {
		optional uint32 slot_id = 1;
		optional uint32 sequence_id = 2;
		optional uint32 progress = 3;
		optional uint32 initial_progress = 4;
		optional uint32 claimed = 5;
	}

	enum EGrantRewards {
		EGrantRewards_No = 0;
		EGrantRewards_Yes = 1;
		EGrantRewards_NoLongerEligible = 2;
	}

	required uint32 player_slot = 1;
	optional int32 unclaimed_reward_count = 2;
	optional .CMsgPrivatePlayerState.ItemChoiceReward oldest_unclaimed_reward = 3;
	optional bool shop_locked = 4;
	repeated .CMsgShopItem shop_units = 5;
	optional uint32 gold_earned_this_round = 6;
	optional uint32 shop_generation_id = 7;
	repeated .CMsgPrivatePlayerState.Challenge challenges = 8;
	optional .CMsgPrivatePlayerState.EGrantRewards grants_rewards = 9 [default = EGrantRewards_No];
	optional uint32 sequence_number = 10;
	optional int32 reroll_cost = 11;
	optional bool used_turbo_bucket_reroll = 20;
	repeated .CMsgTurboBucket turbo_buckets = 21;
	optional bool can_select_underlord = 22;
	repeated .CMsgUnderlordPickerOffering underlord_picker_offering = 23;
	optional bool used_item_reward_reroll_this_round = 24;
}

message CMsgMatchState {
	message TeamInfo {
		optional .EDACLobbyTeam lobby_team = 1 [default = k_EDACLobbyTeam_Team0];
		optional string team_name = 2;
		optional uint32 team_mmr_level = 3;
		optional uint32 team_leaderboard_place = 4;
	}

	optional .EGameState game_state = 1 [default = EGameState_Intro];
	optional .ERoundState round_state = 2 [default = ERoundState_Preparing];
	optional int32 round_number = 3;
	optional float state_change_time = 4;
	optional float state_duration = 5;
	optional float paused_state_time_remaining = 6;
	optional uint64 match_id = 8;
	optional .CMsgGameModifiers game_modifiers = 9;
	repeated .CMsgMatchState.TeamInfo team_info = 10;
	optional string feature_controls = 11;
}

message CMsgGameModeState_Normal {
}

message CMsgGameModeState_Turbo {
	optional .CMsgGameModeState_Normal base_normal = 1;
}

message CMsgDuos_TeamCombatResult {
	optional uint32 player_slot = 1;
	optional uint32 opponent_slot = 2;
	optional int32 damage_result = 3;
	optional uint32 teammate_slot = 4;
	optional uint32 teammate_opponent_slot = 5;
	optional int32 teammate_damage_result = 6;
}

message CMsgGameModeState_Duos {
	optional .CMsgGameModeState_Normal base_normal = 1;
	repeated .CMsgDuos_TeamCombatResult combat_results = 2;
}

message CMsgGameModeState_TechPrototypeA {
	optional int32 rounds_remaining = 1;
}

message CMsgGameModeState_Sandbox {
	optional int32 opponent_player_slot = 1;
}

message CMsgGameModeState_Puzzle {
	message ActiveRule {
		optional .EDACPuzzleRule rule = 1 [default = k_EDACPuzzleRule_None];
		optional bool satisfied = 2;
		repeated int32 constraints = 3 [packed = true];
		optional int32 current_value = 4;
	}

	optional int32 opponent_player_slot = 1;
	repeated .CMsgGameModeState_Puzzle.ActiveRule active_rules = 2;
	optional bool active_rules_satisfied = 3;
	optional int32 puzzle_id = 4;
	repeated uint32 allowed_unit_def_indices = 5;
}

message CMsgGameModeState_Tutorial {
	optional string tutorial_state_name = 1;
	optional int32 opponent_player_slot = 2;
}

message CMsgGameModeState_Streetfight {
	optional uint32 streetfight_id = 1;
	optional int32 opponent_player_slot = 2;
}

message DungeonActionCard {
	optional int32 card_id = 1;
}

message CMsgGameModeState_Dungeon {
	optional .EDACDungeonPhase dungeon_phase = 1 [default = k_EDACDungeonPhase_None];
	optional .EDACDungeonRoomType current_room_type = 2 [default = k_EDACDungeonRoomType_None];
	repeated .EDACDungeonRoomType next_room_types = 3;
	repeated .DungeonActionCard available_cards = 4;
}

message CMsgGameModeState {
	oneof details {
		.CMsgGameModeState_Normal details_normal = 1;
		.CMsgGameModeState_Turbo details_turbo = 2;
		.CMsgGameModeState_Duos details_duos = 3;
		.CMsgGameModeState_TechPrototypeA details_tech_prototype_a = 4;
		.CMsgGameModeState_Sandbox details_sandbox = 5;
		.CMsgGameModeState_Puzzle details_puzzle = 6;
		.CMsgGameModeState_Tutorial details_tutorial = 7;
		.CMsgGameModeState_Streetfight details_streetfight = 8;
		.CMsgGameModeState_Dungeon details_dungeon = 9;
	}
}

message CMsgUnitPosition {
	required float x = 1;
	required float y = 2;
	required float z = 3;
}

message CMsgUnitPositionAndFacing {
	required float x = 1;
	required float y = 2;
	required float z = 3;
	required float yaw = 4;
}

message CMsgUnitAbilityCooldown {
	required uint32 ability_id = 1;
	required float cooldown_ratio = 2;
}

message CMsgUnitSnapshot {
	optional int32 entindex = 1;
	optional int32 unit_id = 2;
	optional int32 team_number = 3;
	optional .CMsgUnitPositionAndFacing position = 4;
	optional int32 health = 5;
	optional int32 mana = 6;
	repeated string particle_attachment_names = 7;
	optional int32 rank = 8;
	optional .EUnitAIState ai_state = 9 [default = EUnitAIState_Idle];
	optional float cooldown_ratio = 10;
	optional uint32 kill_count = 12;
	optional uint32 kill_streak = 13;
	optional int32 max_health = 14;
	repeated .EUnitKeyword keywords = 15;
	optional .CMsgUnitPositionAndFacing starting_position = 16;
	optional bool is_summoned = 17;
	optional int32 summon_owner_entindex = 18;
	optional uint32 duel_bonus_damage = 19;
	optional int32 armor = 20;
	optional uint32 underlord_power = 21;
	optional uint32 status_label = 22;
	optional uint32 status_effect_index = 23;
	optional float attacks_per_second = 24;
	optional int32 damage_min = 25;
	optional int32 damage_max = 26;
	optional int32 damage_bonus = 27;
	optional bool full_update = 28;
	repeated .CMsgUnitAbilityCooldown ability_cooldowns = 29;
	repeated uint32 abilities_enabled = 30;
	repeated uint32 buff_status = 31;
	optional bool force_big_healthbar = 32;
	optional uint32 override_item_slot = 33;
	optional int32 range_bonus = 34;
	optional bool can_move_to_bench = 35;
	optional bool can_be_sold = 36;
	optional bool recommended_for_placement = 37;
	optional float float_kill_count = 38;
	optional bool client_synthesized_for_setup = 1001;
	optional bool client_is_on_bench = 1002;
}

message CMsgUnitMeterDamageDealt {
	optional int32 total_damage_dealt = 1;
	optional int32 spell_damage_dealt = 2;
	optional int32 attack_damage_dealt = 3;
	optional int32 item_damage_dealt = 4;
}

message CMsgUnitMeterDetail {
	optional int32 value = 2;
	optional uint32 id = 3;
}

message CMsgUnitMeterDamageTaken {
	optional int32 total_damage_taken = 1;
	optional int32 physical_damage_taken = 2;
	optional int32 magical_damage_taken = 3;
	optional int32 pure_damage_taken = 4;
}

message CMsgUnitMeterSnapshot {
	optional int32 entindex = 1;
	optional int32 unit_id = 2;
	optional int32 team_number = 3;
	optional .CMsgUnitMeterDamageDealt damage_dealt = 4;
	optional .CMsgUnitMeterDamageTaken damage_taken = 5;
	optional uint32 healing_done = 6;
	optional uint32 kills = 7;
	optional float time_of_death = 8;
	optional uint32 rank = 9;
	optional int32 globalindex = 10;
	repeated .CMsgUnitMeterDetail damage_dealt_details = 11;
	repeated .CMsgUnitMeterDetail healing_done_details = 12;
	optional float disable_done = 13;
	repeated .CMsgUnitMeterDetail damage_taken_details = 14;
	repeated .CMsgUnitMeterDetail kills_details = 15;
	repeated .CMsgUnitMeterDetail disable_done_details = 16;
}

message CMsgCombatMetersSnapshot {
	required float snapshot_time = 1;
	repeated .CMsgUnitMeterSnapshot units = 2;
}

message CMsgCombatDebugSnapshot {
	message PathfindingCell {
		required bool reserved = 1;
		optional int32 owner_entindex = 2;
	}

	message ActivePath {
		optional int32 owner_entindex = 1;
		repeated .CMsgPosition path_waypoints = 2;
		optional int32 path_waypoint_index = 3;
	}

	repeated .CMsgCombatDebugSnapshot.PathfindingCell pathfinding_cells = 1;
	repeated .CMsgCombatDebugSnapshot.ActivePath active_paths = 2;
}

message CMsgCombatSnapshot {
	required float snapshot_time = 1;
	repeated .CMsgUnitSnapshot units = 2;
	optional .CMsgCombatDebugSnapshot debug_snapshot = 3;
}

message CMsgCombatEvent_Attack {
	optional int32 attack_projectile_speed = 1;
}

message CMsgCombatEvent_Damage {
	optional uint32 damage_amount = 1;
	optional bool is_critical = 2;
}

message CMsgCombatEvent_AttackMissed {
}

message CMsgCombatEvent_AttackEvaded {
}

message CMsgCombatEvent_AttackBlocked {
	optional uint32 block_amount = 1;
}

message CMsgCombatEvent_Death {
}

message CMsgCombatEvent_StartAttack {
	optional float attack_speed = 1;
}

message CMsgCombatEvent_SoundEvent {
	optional uint32 soundevent_hash = 1;
	optional .CMsgUnitPosition position = 2;
	optional bool restrict_to_home_team = 4;
}

message CMsgCombatEvent_SpeechEvent {
	optional string vcd_name = 1;
	optional bool restrict_to_home_team = 2;
	optional int32 priority = 3;
}

message CMsgCombatEvent_ModifierCreate {
	required uint32 modifier_entindex = 1;
	required uint32 modifier_id = 2;
	optional float duration = 3;
	optional int32 synergy_level = 4;
}

message CMsgCombatEvent_ModifierDestroy {
	required uint32 modifier_entindex = 1;
}

message CMsgCombatEvent_StartGesture {
	required uint32 activity = 1;
	optional float fade_in = 2;
	optional float fade_out = 3;
	optional int32 slot = 4;
	optional float duration = 5;
}

message CMsgCombatEvent_StopGesture {
	required uint32 activity = 1;
}

message CMsgCombatEvent_CancelAttack {
}

message CMsgCombatEvent_CombatEnded {
	optional bool ran_out_of_time = 1;
}

message CMsgCombatEvent_Resurrect {
}

message CMsgCombatEvent_CastAbility {
	optional uint32 ability_id = 1;
}

message CMsgCombatEvent {
	required float event_time = 1;
	optional uint32 source_entindex = 2;
	optional uint32 target_entindex = 3;

	oneof details {
		.CMsgCombatEvent_Attack details_attack = 4;
		.CMsgCombatEvent_Damage details_damage = 5;
		.CMsgCombatEvent_Death details_death = 6;
		.CMsgCombatEvent_StartAttack details_start_attack = 7;
		.CMsgCombatEvent_SoundEvent details_sound_event = 8;
		.CUserMsg_ParticleManager details_particle_event = 9;
		.CMsgCombatEvent_ModifierCreate details_modifier_create = 10;
		.CMsgCombatEvent_ModifierDestroy details_modifier_destroy = 11;
		.CMsgCombatEvent_StartGesture details_start_gesture = 12;
		.CMsgCombatEvent_CancelAttack details_cancel_attack = 13;
		.CMsgCombatEvent_CombatEnded details_combat_ended = 14;
		.CMsgCombatEvent_AttackMissed details_attack_missed = 15;
		.CMsgCombatEvent_AttackEvaded details_attack_evaded = 16;
		.CMsgCombatEvent_AttackBlocked details_attack_blocked = 17;
		.CMsgCombatEvent_Resurrect details_resurrect = 18;
		.CMsgCombatEvent_SpeechEvent details_speech_event = 19;
		.CMsgCombatEvent_CastAbility details_cast_ability = 20;
		.CMsgCombatEvent_StopGesture details_stop_gesture = 21;
	}
}

message CMsgCombatHighlight {
	required .EDACIncidentType highlight_type = 1 [default = EDACIncidentType_None];
	optional float start_time = 2;
	optional float finish_time = 3;
	optional int32 source_unit_idx = 4;
	optional int32 target_unit_idx = 5;
	optional float magnitude = 6;
}

message CMsgRoundCombat {
	optional int32 round_number = 1;
	optional float combat_duration = 2;
	optional float combat_intro_duration = 3;
	optional float added_time_before_results = 4;
	repeated .CMsgCombatSnapshot snapshots = 5;
	repeated .CMsgCombatEvent events = 6;
	optional .ERoundCombatResult result = 7 [default = ERoundCombatResult_Draw];
	optional uint32 player_player_slot = 8;
	repeated .CMsgCombatMetersSnapshot meter_snapshots = 11;
	repeated .CMsgCombatHighlight combat_highlights = 12;
	optional bool mirrored = 14;

	oneof opponent {
		uint32 opponent_player_slot = 9;
		uint32 opponent_neutral_wave = 10;
	}
}

message CMsgBattle {
	optional int32 round_number = 1;
	repeated .CMsgRoundCombat combats = 2;
	optional .CMsgRoundCombatGlobal global = 3;
}

message CMsgRoundCombatGlobal {
	message EventList {
		repeated .CMsgCombatEvent events = 1;
	}

	message CombatPlayerSlotToEventsEntry {
		optional uint32 key = 1;
		optional .CMsgRoundCombatGlobal.EventList value = 2;
	}

	optional int32 round_number = 1;
	repeated .CMsgRoundCombatGlobal.CombatPlayerSlotToEventsEntry combat_player_slot_to_events = 2;
}

message CMsgClientServerHeader {
	required .EDACGameMessages msg_id = 1 [default = k_EMsgNetBufferContents];
	optional bytes payload = 2;
}

message CMsgNetBufferContents {
	optional bool is_diff = 1;
	optional bool is_last = 2;
	optional bytes payload = 3;
	optional uint32 unpacked_state_size = 4;
	optional .EDACNetBuffer net_buffer_type = 5 [default = k_eDACNetBuffer_MatchState];
	optional uint32 net_buffer_id = 6;
	optional uint32 server_time_ms = 7;
	optional bool is_result_compressed = 8;
	optional bool is_update_compressed = 9;
}

message CMsgNetBufferRemoved {
	optional .EDACNetBuffer net_buffer_type = 5 [default = k_eDACNetBuffer_MatchState];
	optional uint32 net_buffer_id = 6;
}

message CMsgClientConnectionStarted {
	message GameConstants {
		message UnitChances {
			repeated float chance = 1;
		}

		optional .CMsgGameModeSettings game_mode_settings = 1;
		repeated int32 player_experience_table = 2;
		optional int32 experience_purchase_gold_cost = 3;
		optional int32 experience_purchase_amount = 4;
		repeated .CMsgClientConnectionStarted.GameConstants.UnitChances unit_tier_chances = 5;
		optional int32 max_interest_gold = 6;
		optional int32 interest_gold_divisor = 7;
		optional bool win_matters_for_item_rewards = 8;
		repeated int32 loot_round_numbers = 9;
		optional bool has_neutral_rounds = 10;
		optional int32 underlord_selection_round = 11;
		optional float kill_multiplier = 12;
		optional uint32 prestige_level = 13;
	}

	message GameManager {
		optional uint32 definition_set = 1;
	}

	optional bool in_developer_mode = 1;
	optional bool in_offline_mode = 2;
	optional bool is_listen_server_game = 3;
	optional bool is_single_human_game = 4;
	optional .EDACMatchMode match_mode = 5 [default = k_EDACMatchMode_Invalid];
	optional .EDACGameMode game_mode = 6 [default = k_EDACGameMode_Invalid];
	optional .CMsgClientConnectionStarted.GameConstants game_constants = 7;
	optional .CMsgClientConnectionStarted.GameManager game_manager = 8;
}

message CMsgClientConnectionComplete {
}

message CMsgClientSetDebugNetBuffer {
	optional uint32 net_buffer_id = 1;
	optional string contents = 2;
	optional uint32 repeat = 3;
	optional bool force_full_send = 4;
}

message CDACNetBuffer_Debug {
	optional string contents = 1;
}

message CMsgGameReplayActionMarker {
	enum EActionType {
		k_eActionType_Placholder = 1;
	}

	optional .CMsgGameReplayActionMarker.EActionType action = 1 [default = k_eActionType_Placholder];
}

message CMsgModifierName {
	message Modifier {
		required uint32 modifier_id = 1;
		required string modifier_name = 2;
	}

	repeated .CMsgModifierName.Modifier modifier_list = 1;
}

message CMsgClientToServerChatMsg {
	optional uint32 message_id = 1;
	optional string custom_text = 2;
	optional .EInGameChatType chat_type = 3 [default = k_eInGameChatType_Global];
	optional uint32 board_spray_id = 4;
	optional float board_spray_x = 5;
	optional float board_spray_y = 6;
	optional uint32 sprayed_board_player_slot = 7;
}

message CMsgServerToClientChatMsg {
	optional uint32 player_slot = 1;
	optional uint32 message_id = 2;
	optional string custom_text = 3;
	optional uint32 notification_id = 4;
	optional .EInGameChatType chat_type = 5 [default = k_eInGameChatType_Global];
	optional uint32 board_spray_id = 6;
	optional float board_spray_x = 7;
	optional float board_spray_y = 8;
	optional uint32 sprayed_board_player_slot = 9;
}

message CMsgClientToServerClickMsg {
	optional .EClickType click_type = 1 [default = k_eClickType_Left];
	optional uint32 target_player_slot = 2;
	optional float click_x = 3;
	optional float click_y = 4;
	optional float click_z = 5;
}

message CMsgServerToClientClickMsg {
	optional .EClickType click_type = 1 [default = k_eClickType_Left];
	optional uint32 source_player_slot = 2;
	optional uint32 target_player_slot = 3;
	optional float click_x = 4;
	optional float click_y = 5;
	optional float click_z = 6;
}

message CMsgPlayerMapPropCommand {
	optional uint32 command = 1;
	optional uint32 player_slot = 2;
	optional uint32 prop_idx = 3;
}

message CMsgClientToServerTeammateDuosMessage {
	optional uint32 teammate_slot = 1;
	optional .EDuosMessageType message_type = 2 [default = k_eDuosMessageType_None];
	optional .EDuosMessageTargetType target_type = 3 [default = k_eDuosMessageTargetType_None];
	optional uint32 target_id = 4;
}

message CMsgServerToClientTeammateDuosMessage {
	optional uint32 teammate_slot = 1;
	optional .EDuosMessageType message_type = 2 [default = k_eDuosMessageType_None];
	optional .EDuosMessageTargetType target_type = 3 [default = k_eDuosMessageTargetType_None];
	optional uint32 target_id = 4;
}

message CMsgClientToServerLoadShareCode {
	optional string share_code = 1;
}

message CMsgClientToServerBoardBuddyCommand {
	optional uint32 command = 1;
	optional float pos_x = 2;
	optional float pos_y = 3;
}

message CMsgClientToServerPuzzleLeaderboardCommand {
	optional uint32 leaderboard = 1;
}

message CMsgRecordLocalBotStats {
	optional bytes serialized_msg = 1;
}

message CMsgClientToServerUpvoteNotification {
	optional uint32 notification_id = 1;
}

message CMsgServerToClientNotificationChanged {
	message UpvoteSubtype {
		optional uint32 item_id = 1;
		optional uint32 upvotes = 2;
	}

	optional uint32 notification_id = 1;
	optional uint32 upvotes = 2;
	repeated .CMsgServerToClientNotificationChanged.UpvoteSubtype subtypes = 3;
}

message CMsgClientToServerLocalPlayerInventory {
	message LoadoutItem {
		optional uint32 slot = 1;
		optional uint32 sub_slot = 2;
		optional uint32 def_index = 3;
	}

	repeated .CMsgClientToServerLocalPlayerInventory.LoadoutItem player_loadout = 1;
}

message CMsgGameStateIntegrationData {
	optional uint32 id = 1;
	optional .CMsgPublicPlayerState public_player_state = 2;
	optional .CMsgPrivatePlayerState private_player_state = 3;
}

message CMsgGameStateIntegrationBlock {
	repeated .CMsgGameStateIntegrationData data = 1;
	optional uint32 id = 2;
}

message CMsgGameStateIntegrationUpdate {
	repeated .CMsgGameStateIntegrationBlock block = 1;
	optional string auth = 2;
}

message CMsgClientToServerInitData {
	optional .CMsgGameModifiers game_modifiers = 1;
	optional uint32 event_id = 2;
	optional bool developer_mode = 3;
	optional string load_save_file = 4;
	optional int32 local_mmr_level = 5 [default = -1];
	optional uint32 underlord = 6;
	optional uint32 local_global_leaderboard_rank = 7;
	optional bool offline_mode = 8;
	optional int32 bot_difficulty = 9 [default = 0];
	optional bool tutorial = 10;
	optional .EDACGameMode game_mode = 11 [default = k_EDACGameMode_Normal];
	optional .CMsgGameModeSettings game_mode_settings = 12;
	optional string feature_controls = 13;
	optional uint32 active_challenge_slot_id = 14;
}

message CMsgClientAccountSyncStorageFile {
	optional uint32 version = 1;
	repeated uint32 ids = 2;
	repeated uint32 values = 3;
}

message CMsgPlayerChallengeCompletePrediction {
	optional uint32 event_id = 1;
	optional uint32 slot_id = 2;
	optional uint32 challenge_id = 3;
	optional uint32 config_id = 4;
	optional uint32 initial_progress = 5;
	optional uint32 predicted_total = 6;
}
