import "dota_shared_enums.proto";

message CScenario_Position {
	optional float x = 1;
	optional float y = 2;
}

message CScenarioGame_RoshanSpawner {
	optional int32 kill_count = 1;
	optional int32 state = 2;
	optional float cooldown = 3;
	optional int32 killer_team = 4;
}

message CScenarioEnt_Courier {
	optional int32 team_number = 1;
	optional int32 owner_player_id = 2 [default = -1];
	optional float cooldown = 3 [default = -1];
}

message CScenarioEnt_NPC {
	optional .CScenario_Position position = 1;
	optional string unit_name = 2;
	optional int32 team_number = 3;
	optional float health_frac = 4 [default = 1];
	optional string owning_camp = 10;
	optional .CScenario_Position owning_camp_position = 11;
	optional string invade_goal = 20;
}

message CScenarioEnt_SpiritBear {
	optional int32 owner_id = 1 [default = -1];
	optional int32 team_id = 2;
}

message CScenarioEnt_DroppedItem {
	optional .CScenario_Position position = 1;
}

message CMsgDotaScenario {
	message EntityRef {
		optional int32 player_id = 1 [default = -1];
		optional int32 neutral_stash_id = 2 [default = -1];
		optional int32 entity_idx = 3 [default = -1];
		optional bool roshan = 4 [default = false];
		optional string ability_name = 10;
	}

	message Game {
		optional uint64 match_id = 1;
		optional int32 game_mode = 2;
		optional float clock_time = 3;
		optional float internal_time = 4;
		optional .CScenarioGame_RoshanSpawner roshan = 5;
	}

	message TeamNeutralItem {
		optional string name = 1;
		optional bool consumed = 2;
		optional int32 tier = 3;
	}

	message Team {
		optional int32 team_number = 1;
		repeated .CMsgDotaScenario.TeamNeutralItem neutral_items = 2;
		optional int32 hero_kills = 3;
		optional int32 tower_kills = 4;
		optional int32 barracks_kills = 5;
		optional float glyph_cooldown = 6;
		optional float radar_cooldown = 7;
	}

	message HeroHeroInt {
		optional int32 player_id = 1 [default = -1];
		optional int32 value = 2;
	}

	message HeroHeroFloat {
		optional int32 player_id = 1 [default = -1];
		optional float value = 2;
	}

	message DamageStatsByType {
		optional int32 damage_type = 1;
		optional float received_pre_reduction = 2;
		optional float received_post_reduction = 3;
		optional float outgoing_pre_reduction = 4;
		optional float outgoing_post_reduction = 5;
	}

	message HeroAbility {
		optional string name = 1;
		optional int32 level = 2;
	}

	message HeroNeutralChoice {
		optional int32 choice_index = 1;
		optional string artifact_name = 2;
		optional string enchantment_name = 3;
	}

	message HeroNeutralTier {
		optional uint32 tier = 1;
		repeated .CMsgDotaScenario.HeroNeutralChoice choices = 2;
		optional int32 selected_artifact = 3;
		optional int32 selected_enchantment = 4;
	}

	message Hero {
		optional fixed64 steam_id = 1;
		optional int32 player_id = 2 [default = -1];
		optional int32 team_id = 3;
		optional string hero = 4;
		optional int32 total_xp = 5;
		optional int32 bkb_charges_used = 6;
		optional int32 aeon_charges_used = 7;
		optional int32 reliable_gold = 8;
		optional int32 unreliable_gold = 9;
		optional int32 total_earned_gold = 10;
		optional int32 shared_gold = 11;
		optional int32 hero_kill_gold = 12;
		optional int32 creep_kill_gold = 13;
		optional int32 neutral_kill_gold = 14;
		optional int32 courier_gold = 15;
		optional int32 bounty_gold = 16;
		optional int32 roshan_gold = 17;
		optional int32 building_gold = 18;
		optional int32 other_gold = 19;
		optional int32 income_gold = 26;
		optional int32 ward_kill_gold = 27;
		optional int32 ability_gold = 28;
		optional int32 denies = 29;
		optional int32 last_hits = 30;
		optional int32 last_hit_streak = 31;
		optional int32 last_hit_multikill = 32;
		optional int32 nearby_creep_death_count = 33;
		optional int32 claimed_deny_count = 34;
		optional int32 claimed_miss_count = 35;
		optional int32 miss_count = 36;
		optional float buyback_cooldown_time = 40;
		optional float buyback_gold_limit_time = 41;
		optional float stun_duration = 44;
		optional float healing = 45;
		optional int32 tower_kills = 46;
		optional int32 roshan_kills = 47;
		optional int32 observer_wards_placed = 48;
		optional int32 sentry_wards_placed = 49;
		optional int32 creeps_stacked = 50;
		optional int32 camps_stacked = 51;
		optional int32 rune_pickups = 52;
		optional int32 gold_spent_on_support = 53;
		optional float hero_damage = 54;
		optional int32 wards_purchased = 55;
		optional int32 wards_destroyed = 56;
		optional int32 gold_spent_on_consumables = 58;
		optional int32 gold_spent_on_items = 59;
		optional int32 gold_spent_on_buybacks = 60;
		optional int32 gold_lost_to_death = 61;
		optional int32 kills = 62;
		optional int32 assists = 63;
		optional int32 deaths = 64;
		optional int32 kill_streak = 65;
		optional int32 respawn_seconds = 68 [default = -1];
		optional int32 last_buyback_time = 69;
		optional bool first_blood_claimed = 71;
		optional bool first_blood_given = 72;
		optional int32 bounty_runes = 73;
		optional int32 outposts_captured = 74;
		optional .CScenario_Position position = 75;
		repeated .CMsgDotaScenario.HeroHeroInt enemy_kills = 150;
		repeated .CMsgDotaScenario.DamageStatsByType damage_stats = 151;
		repeated .CMsgDotaScenario.HeroAbility abilities = 152;
		optional uint32 hero_facet = 153;
		optional uint32 total_madstone = 154;
		optional uint32 current_madstone = 155;
		repeated .CMsgDotaScenario.HeroNeutralTier neutral_tiers = 156;
		optional int32 refresher_charges_used = 157;
	}

	message Stock {
		optional string name = 1;
		optional int32 team_number = 2 [default = -1];
		optional int32 player_id = 3 [default = -1];
		optional int32 current_stock = 4;
		optional float cooldown = 5;
		optional int32 bonus_stock = 6;
	}

	message Building {
		optional string entity_name = 1;
		optional string entity_class = 2;
		optional int32 team_id = 3;
		optional bool is_destroyed = 4;
		optional float health_frac = 5 [default = 1];
	}

	message Entity {
		optional .CScenarioEnt_Courier courier = 1;
		optional .CScenarioEnt_NPC npc = 2;
		optional .CScenarioEnt_SpiritBear spirit_bear = 3;
		optional .CScenarioEnt_DroppedItem dropped_item = 4;
	}

	message Item {
		optional string name = 1;
		optional .CMsgDotaScenario.EntityRef location = 2;
		optional int32 owner_id = 3 [default = -1];
		optional int32 item_slot = 4;
		optional int32 neutral_drop_team = 5;
		optional int32 charges = 6;
		optional int32 secondary_charges = 7;
		optional float lifetime = 8 [default = -1];
		optional int32 stored_rune_type = 9 [default = -1];
		optional int32 level = 10 [default = 1];
	}

	message Modifier {
		optional string name = 1;
		optional .CMsgDotaScenario.EntityRef parent = 2;
		optional .CMsgDotaScenario.EntityRef caster = 3;
		optional .CMsgDotaScenario.EntityRef ability = 4;
		optional float duration = 5 [default = -1];
		optional float lifetime_remaining = 6 [default = 0];
		optional int32 stack_count = 7;
		optional bool create_even_if_existing = 8;
		optional bool create_without_caster = 9;
		optional bool create_without_ability = 10;
		optional int32 moonshard_consumed_bonus = 100;
		optional int32 moonshard_consumed_bonus_night_vision = 101;
		optional int32 wardtruesight_range = 110;
		optional int32 ultimate_scepter_consumed_alchemist_bonus_all_stats = 120;
		optional int32 ultimate_scepter_consumed_alchemist_bonus_health = 121;
		optional int32 ultimate_scepter_consumed_alchemist_bonus_mana = 122;
	}

	optional uint64 lobby_id = 1;
	optional .CMsgDotaScenario.Game game = 2;
	repeated .CMsgDotaScenario.Team teams = 3;
	repeated .CMsgDotaScenario.Hero heroes = 4;
	repeated .CMsgDotaScenario.Stock stock = 5;
	repeated .CMsgDotaScenario.Building buildings = 6;
	repeated .CMsgDotaScenario.Entity entities = 7;
	repeated .CMsgDotaScenario.Item items = 8;
	repeated .CMsgDotaScenario.Modifier modifiers = 9;
}
