public HeatmapService(MapService mapService, Demo demo, ComboboxSelector eventSelector, ComboboxSelector sideSelector, PlayerExtended selectedPlayer, Round selectedRound)
		{
			MapService = mapService;
			_demo = demo;
			_eventSelector = eventSelector;
			_sideSelector = sideSelector;
			_selectedPlayer = selectedPlayer;
			_selectedRound = selectedRound;
		}
		public async Task<List<PlayerRoundStats>> GetRoundStats(Demo demo, Round round)
		{
			List<PlayerRoundStats> data = new List<PlayerRoundStats>();
			Dictionary<PlayerExtended, PlayerRoundStats> playerRoundStats = new Dictionary<PlayerExtended, PlayerRoundStats>();

			await Task.Factory.StartNew(() =>
			{
				foreach (PlayerExtended player in demo.Players)
				{
					if (!playerRoundStats.ContainsKey(player))
					{
						playerRoundStats.Add(player, new PlayerRoundStats());
						playerRoundStats[player].Name = player.Name;
						if (!player.StartMoneyRounds.ContainsKey(round.Number)) player.StartMoneyRounds[round.Number] = 0;
						if (!player.EquipementValueRounds.ContainsKey(round.Number)) player.EquipementValueRounds[round.Number] = 0;
						playerRoundStats[player].StartMoneyValue = player.StartMoneyRounds[round.Number];
						playerRoundStats[player].EquipementValue = player.EquipementValueRounds[round.Number];
					}

					foreach (WeaponFire e in demo.WeaponFired)
					{
						if (e.RoundNumber == round.Number && e.ShooterSteamId == player.SteamId)
						{
							playerRoundStats[player].ShotCount++;
						}
					}

					foreach (PlayerHurtedEvent e in demo.PlayersHurted)
					{
						if (e.RoundNumber == round.Number && e.AttackerSteamId != 0 && e.AttackerSteamId == player.SteamId)
						{
							playerRoundStats[player].DamageArmorCount += e.ArmorDamage;
							playerRoundStats[player].DamageHealthCount += e.HealthDamage;
							playerRoundStats[player].HitCount++;
						}
					}

					foreach (KillEvent e in round.Kills)
					{
						if (e.KillerSteamId == player.SteamId)
						{
							playerRoundStats[player].KillCount++;
							if (e.KillerVelocityZ > 0) playerRoundStats[player].JumpKillCount++;
						}
					}
				}

				data.AddRange(playerRoundStats.Select(keyValuePair => keyValuePair.Value));
			});
			return data;
		}
		public Task<List<RoundEvent>> GetTimeLineEventList(Demo demo, Round round)
		{
			List<RoundEvent> roundEventList = new List<RoundEvent>();
			Random ran = new Random();
			for (int i = 0; i < 7; i++)
			{
				int timeEvent = ran.Next(1, 100);
				roundEventList.Add(new RoundEvent
				{
					StartTime = DateTime.Today.AddSeconds(timeEvent),
					EndTime = DateTime.Today.AddSeconds(timeEvent + 1),
					Category = "Kill",
					Message = "Player killed Player",
					Type = "kill"
				});
			}

			return Task.FromResult(roundEventList);
		}
		public Task<List<PlayerRoundStats>> GetRoundStats(Demo demo, Round round)
		{
			List<PlayerRoundStats> stats = new List<PlayerRoundStats>();
			Random ran = new Random();
			for (int i = 0; i < 10; i++)
			{
				stats.Add(new PlayerRoundStats
				{
					Name = "Player " + (i + 1),
					DamageArmorCount = ran.Next(300),
					DamageHealthCount = ran.Next(300),
					EquipementValue = ran.Next(8000),
					HitCount = ran.Next(8),
					JumpKillCount = 0,
					KillCount = ran.Next(9),
					ShotCount = ran.Next(200),
					StartMoneyValue = ran.Next(16000)
				});
			}

			return Task.FromResult(stats);
		}
		public async Task<List<RoundEvent>> GetTimeLineEventList(Demo demo, Round round)
		{
			List<RoundEvent> roundEventList = new List<RoundEvent>();
			await Task.Factory.StartNew(() =>
			{
				foreach (KillEvent e in demo.Kills)
				{
					if (e.RoundNumber == round.Number)
					{
						roundEventList.Add(new RoundEvent
						{
							StartTime = DateTime.Today.AddSeconds(e.Seconds - round.StartTimeSeconds),
							EndTime = DateTime.Today.AddSeconds(e.Seconds - round.StartTimeSeconds + 1),
							Category = "Kills",
							Message = e.KillerName + " killed " + e.KilledName,
							Type = "kill"
						});
					}
				}
				foreach (WeaponFire e in demo.WeaponFired)
				{
					if (e.RoundNumber == round.Number)
					{
						string type = string.Empty;
						string message = string.Empty;
						string category = string.Empty;
						switch (e.Weapon.Element)
						{
							case EquipmentElement.Flash:
								type = "flash";
								category = "Flashbang";
								message = e.ShooterName + " thrown a flashbang";
								break;
							case EquipmentElement.Smoke:
								type = "smoke";
								category = "Smoke";
								message = e.ShooterName + " thrown a smoke";
								break;
							case EquipmentElement.Decoy:
								type = "decoy";
								category = "Decoy";
								message = e.ShooterName + " thrown a decoy";
								break;
							case EquipmentElement.HE:
								type = "he";
								category = "HE";
								message = e.ShooterName + " thrown a HE grenade";
								break;
							case EquipmentElement.Molotov:
								type = "molotov";
								category = "Molotov";
								message = e.ShooterName + " thrown a molotov";
								break;
							case EquipmentElement.Incendiary:
								type = "incendiary";
								category = "Molotov";
								message = e.ShooterName + " thrown an incendiary";
								break;
						}

						if (type != string.Empty)
						{
							roundEventList.Add(new RoundEvent
							{
								StartTime = DateTime.Today.AddSeconds(e.Seconds - round.StartTimeSeconds),
								EndTime = DateTime.Today.AddSeconds(e.Seconds - round.StartTimeSeconds + 1),
								Category = category,
								Message = message,
								Type = type
							});
						}
					}
				}

				if (round.BombPlanted != null)
				{
					roundEventList.Add(new RoundEvent
					{
						StartTime = DateTime.Today.AddSeconds(round.BombPlanted.Seconds - round.StartTimeSeconds),
						EndTime = DateTime.Today.AddSeconds(round.BombPlanted.Seconds - round.StartTimeSeconds + 1),
						Category = "Bomb",
						Message = round.BombPlanted.PlanterName + " planted the bomb on bomb site " + round.BombPlanted.Site,
						Type = "bomb_planted"
					});
				}

				if (round.BombDefused != null)
				{
					roundEventList.Add(new RoundEvent
					{
						StartTime = DateTime.Today.AddSeconds(round.BombDefused.Seconds - round.StartTimeSeconds),
						EndTime = DateTime.Today.AddSeconds(round.BombDefused.Seconds - round.StartTimeSeconds + 1),
						Category = "Bomb",
						Message = round.BombDefused.DefuserName + " defused the bomb on bomb site " + round.BombDefused.Site,
						Type = "bomb_defused"
					});
				}
				if (round.BombExploded != null)
				{
					roundEventList.Add(new RoundEvent
					{
						StartTime = DateTime.Today.AddSeconds(round.BombExploded.Seconds - round.StartTimeSeconds),
						EndTime = DateTime.Today.AddSeconds(round.BombExploded.Seconds - round.StartTimeSeconds + 1),
						Category = "Bomb",
						Message = "The bomb exploded on bomb site " + round.BombExploded.Site,
						Type = "bomb_exploded"
					});
				}
			});
			return roundEventList;
		}
Example #6
0
		/// <summary>
		/// Return PositionPoint for each players determined by selection
		/// </summary>
		/// <param name="demo"></param>
		/// <param name="teamSelector"></param>
		/// <param name="selectedPlayer"></param>
		/// <param name="round"></param>
		/// <returns></returns>
		public async Task<List<List<PositionPoint>>> GetPoints(Demo demo, ComboboxSelector teamSelector, PlayerExtended selectedPlayer, Round round)
		{
			List<List<PositionPoint>> points = new List<List<PositionPoint>>();

			if (teamSelector != null)
			{
				switch (teamSelector.Id)
				{
					case "CT":
						demo.PositionsPoint.Reverse();

						foreach (PlayerExtended playerExtended in demo.Players)
						{
							List<PositionPoint> playerPoints = new List<PositionPoint>();

							for (int i = demo.PositionsPoint.Count - 1; i >= 0; i--)
							{
								if (!demo.PositionsPoint[i].Round.Equals(round)) continue;

								// Keep kills from terrorists
								if (demo.PositionsPoint[i].Event != null
									&& demo.PositionsPoint[i].Team == Team.Terrorist
									&& demo.PositionsPoint[i].Event.GetType() == typeof(KillEvent))
								{
									KillEvent e = (KillEvent)demo.PositionsPoint[i].Event;
									if (e.DeathPerson.Equals(playerExtended))
									{
										playerPoints.Add(demo.PositionsPoint[i]);
										demo.PositionsPoint.RemoveAt(i);
										continue;
									}
								}

								if (demo.PositionsPoint[i].Team != Team.CounterTerrorist) continue;

								// Molotov started
								if (demo.PositionsPoint[i].Event != null
									&& demo.PositionsPoint[i].Event.GetType() == typeof(MolotovFireStartedEvent))
								{
									MolotovFireStartedEvent e = (MolotovFireStartedEvent)demo.PositionsPoint[i].Event;
									if (e.Thrower.Equals(playerExtended))
									{
										playerPoints.Add(demo.PositionsPoint[i]);
										demo.PositionsPoint.RemoveAt(i);
										continue;
									}
								}

								// Molotov ended
								if (demo.PositionsPoint[i].Event != null
									&& demo.PositionsPoint[i].Event.GetType() == typeof(MolotovFireEndedEvent))
								{
									MolotovFireEndedEvent e = (MolotovFireEndedEvent)demo.PositionsPoint[i].Event;
									if (e.Thrower.Equals(playerExtended))
									{
										playerPoints.Add(demo.PositionsPoint[i]);
										demo.PositionsPoint.RemoveAt(i);
										continue;
									}
								}

								if (demo.PositionsPoint[i].Player != null
								&& demo.PositionsPoint[i].Player.Equals(playerExtended))
								{
									playerPoints.Add(demo.PositionsPoint[i]);
									demo.PositionsPoint.RemoveAt(i);
								}
							}
							if (playerPoints.Any()) points.Add(playerPoints);
						}
						break;
					case "T":
						demo.PositionsPoint.Reverse();

						foreach (PlayerExtended playerExtended in demo.Players)
						{
							List<PositionPoint> playerPoints = new List<PositionPoint>();

							for (int i = demo.PositionsPoint.Count - 1; i >= 0; i--)
							{
								if (!demo.PositionsPoint[i].Round.Equals(round)) continue;

								// Keep kills from CT
								if (demo.PositionsPoint[i].Event != null
									&& demo.PositionsPoint[i].Team == Team.CounterTerrorist
									&& demo.PositionsPoint[i].Event.GetType() == typeof(KillEvent))
								{
									KillEvent e = (KillEvent)demo.PositionsPoint[i].Event;
									if (e.DeathPerson.Equals(playerExtended))
									{
										playerPoints.Add(demo.PositionsPoint[i]);
										demo.PositionsPoint.RemoveAt(i);
										continue;
									}
								}

								if (demo.PositionsPoint[i].Team != Team.Terrorist) continue;

								// Molotov started
								if (demo.PositionsPoint[i].Event != null
									&& demo.PositionsPoint[i].Event.GetType() == typeof(MolotovFireStartedEvent))
								{
									MolotovFireStartedEvent e = (MolotovFireStartedEvent)demo.PositionsPoint[i].Event;
									if (e.Thrower.Equals(playerExtended))
									{
										playerPoints.Add(demo.PositionsPoint[i]);
										demo.PositionsPoint.RemoveAt(i);
										continue;
									}
								}

								// Molotov ended
								if (demo.PositionsPoint[i].Event != null
									&& demo.PositionsPoint[i].Event.GetType() == typeof(MolotovFireEndedEvent))
								{
									MolotovFireEndedEvent e = (MolotovFireEndedEvent)demo.PositionsPoint[i].Event;
									if (e.Thrower.Equals(playerExtended))
									{
										playerPoints.Add(demo.PositionsPoint[i]);
										demo.PositionsPoint.RemoveAt(i);
										continue;
									}
								}

								if (demo.PositionsPoint[i].Player != null
								&& demo.PositionsPoint[i].Player.Equals(playerExtended))
								{
									playerPoints.Add(demo.PositionsPoint[i]);
									demo.PositionsPoint.RemoveAt(i);
								}
							}
							if (playerPoints.Any()) points.Add(playerPoints);
						}
						break;
					case "BOTH":
						points.AddRange(
							demo.Players.Select(
								playerExtended => demo.PositionsPoint.Where(
									point => point.Round.Number == round.Number
									&& point.Player.SteamId == playerExtended.SteamId).ToList())
									.Where(pts => pts.Any()));
						break;
				}
			}

			if (selectedPlayer != null)
			{
				await Task.Run(delegate
				{
					List<PositionPoint> pt = demo.PositionsPoint.ToList().Where(
						positionPoint => positionPoint.Player.SteamId == selectedPlayer.SteamId
						&& positionPoint.Round.Number == round.Number
						|| (positionPoint.Event != null
						&& positionPoint.Event.GetType() == typeof(KillEvent))
						&& positionPoint.Round.Number == round.Number).ToList();
					if (pt.Any()) points.Add(pt);
				});
			}

			// Set players color
			await Task.Run(delegate
			{
				int index = 0;
				foreach (List<PositionPoint> positionPoints in points.ToList())
				{
					foreach (PositionPoint positionPoint in positionPoints)
					{
						positionPoint.X = MapService.CalculatePointToResolutionX(positionPoint.X);
						positionPoint.Y = MapService.CalculatePointToResolutionY(positionPoint.Y);
						positionPoint.Color = ColorToInt(_colors[index]);
					}
					index++;
				}
			});

			return points;
		}
		public Task<List<Demo>> GetDemosHeader(List<string> folders)
		{
			List<Demo> demos = new List<Demo>();

			for (int i = 0; i < 20; i++)
			{
				ObservableCollection<PlayerExtended> players = new ObservableCollection<PlayerExtended>();
				Random random = new Random();

				ObservableCollection<EntryKillEvent> entryKills = new ObservableCollection<EntryKillEvent>();
				for (int indexEntryKill = 0; indexEntryKill < random.Next(5); indexEntryKill++)
				{
					EntryKillEvent entryKill = new EntryKillEvent(random.Next(7000, 100000))
					{
						KilledName = "killed" + indexEntryKill,
						KilledSteamId = random.Next(8000000),
						KilledTeam = Team.Terrorist,
						KillerName = "killer" + indexEntryKill,
						KillerSteamId = random.Next(800000),
						KillerTeam = Team.CounterTerrorist
					};
					entryKills.Add(entryKill);
				}

				for (int j = 0; j < 10; j++)
				{
					PlayerExtended player = new PlayerExtended
					{
						Name = "player" + (j + 1),
						HeadshotCount = random.Next(14),
						OnekillCount = random.Next(10, 30),
						TwokillCount = random.Next(10, 20),
						ThreekillCount = random.Next(0, 10),
						FourKillCount = random.Next(0, 5),
						FiveKillCount = random.Next(0, 2),
						Clutch1V1Count = random.Next(1),
						Clutch1V2Count = random.Next(1),
						Clutch1V3Count = random.Next(1),
						Clutch1V4Count = random.Next(1),
						Clutch1V5Count = random.Next(1),
						BombDefusedCount = random.Next(0, 2),
						BombPlantedCount = random.Next(0, 2),
						EntryKills = entryKills,
						DeathCount = random.Next(0, 32),
						KillsCount = random.Next(30),
						AssistCount = random.Next(15),
						Score = random.Next(10, 80),
						RoundMvpCount = random.Next(6)
					};

					players.Add(player);
				}

				ObservableCollection<Round> rounds = new ObservableCollection<Round>();
				for (int k = 0; k < 32; k++)
				{
					Round round = new Round
					{
						Number = k + 1,
						OneKillCount = random.Next(5),
						TwoKillCount = random.Next(2),
						ThreeKillCount = random.Next(1),
						FourKillCount = random.Next(1),
						FiveKillCount = random.Next(1),
						EquipementValueTeam1 = random.Next(4200, 30000),
						EquipementValueTeam2 = random.Next(4200, 30000),
						StartMoneyTeam1 = random.Next(4200, 50000),
						StartMoneyTeam2 = random.Next(4200, 50000),
						Tick = random.Next(7000, 100000)
					};

					rounds.Add(round);
				}

				Demo demo = new Demo
				{
					Id = "de_dust25445648778447878",
					Name = "mydemo" + (i + 1) + ".dem",
					Tickrate = 128,
					MapName = "de_dust2",
					ClientName = "localhost",
					Hostname = "local",
					OneKillCount = random.Next(50, 90),
					TwoKillCount = random.Next(20, 50),
					ThreeKillCount = random.Next(10),
					FourKillCount = random.Next(3),
					FiveKillCount = random.Next(1),
					Path = "C:\\mydemo.dem",
					ScoreTeam1 = 16,
					ScoreTeam2 = 6,
					Type = "GOTV",
					Comment = "comment",
					ScoreFirstHalfTeam1 = 10,
					ScoreFirstHalfTeam2 = 5,
					ScoreSecondHalfTeam1 = 6,
					ScoreSecondHalfTeam2 = 1,
					Players = players,
					PlayersTeam1 = new ObservableCollection<PlayerExtended>(players.Take(5)),
					PlayersTeam2 = new ObservableCollection<PlayerExtended>(players.Skip(5).Take(5)),
					MostBombPlantedPlayer = players.ElementAt(random.Next(10)),
					MostHeadshotPlayer = players.ElementAt(random.Next(10)),
					Rounds = rounds
				};

				demos.Add(demo);
			}

			return Task.FromResult(demos);
		}
Example #8
0
		protected void CreateNewRound()
		{
			CurrentRound = new Round
			{
				Tick = Parser.IngameTick,
				Number = ++RoundCount
			};

			// Sometimes parser return wrong money values on 1st round of side
			if (CurrentRound.Number == 1 || CurrentRound.Number == 16)
			{
				CurrentRound.StartMoneyTeam1 = 4000;
				CurrentRound.StartMoneyTeam2 = 4000;
			}
			else
			{
				CurrentRound.StartMoneyTeam1 = Parser.Participants.Where(a => a.Team == Team.CounterTerrorist).Sum(a => a.Money);
				CurrentRound.StartMoneyTeam2 = Parser.Participants.Where(a => a.Team == Team.Terrorist).Sum(a => a.Money);
			}

			IsEntryKillDone = false;
			IsOpeningKillDone = false;
			IsFirstShotOccured = false;
			_playerInClutch1 = null;
			_playerInClutch2 = null;

			KillsThisRound.Clear();

			// Nobody is controlling a BOT at the beginning of a round
			foreach (PlayerExtended pl in Demo.Players)
			{
				pl.OpponentClutchCount = 0;
				pl.HasEntryKill = false;
				pl.HasOpeningKill = false;
				pl.IsControllingBot = false;
				Player player = Parser.PlayingParticipants.FirstOrDefault(p => p.SteamID == pl.SteamId);
				if (player != null)
				{
					pl.RoundPlayedCount++;
					pl.IsAlive = true;
					pl.Team = player.Team;
				}
			}
		}
		protected void CreateNewRound()
		{
			CurrentRound = new Round
			{
				Tick = Parser.IngameTick,
				Number = ++RoundCount
			};

			// Sometimes parser return wrong money values on 1st round of side
			if (CurrentRound.Number == 1 || CurrentRound.Number == 16)
			{
				CurrentRound.StartMoneyTeam1 = 4000;
				CurrentRound.StartMoneyTeam2 = 4000;
			}
			else
			{
				CurrentRound.StartMoneyTeam1 = Parser.Participants.Where(a => a.Team == Team.CounterTerrorist).Sum(a => a.Money);
				CurrentRound.StartMoneyTeam2 = Parser.Participants.Where(a => a.Team == Team.Terrorist).Sum(a => a.Money);
			}

			IsEntryKillDone = false;
			IsOpeningKillDone = false;

			KillsThisRound.Clear();

			// Nobody is controlling a BOT at the beginning of a round
			foreach (PlayerExtended pl in Demo.Players)
			{
				pl.IsAlive = true;
				pl.OpponentClutchCount = 0;
				pl.HasEntryKill = false;
				pl.HasOpeningKill = false;
				pl.IsControllingBot = false;
			}
		}
		public Task<Demo> AnalyzeDemo(Demo demo)
		{
			Random random = new Random();

			ObservableCollection<PlayerExtended> players = new ObservableCollection<PlayerExtended>();
			for (int i = 0; i < 10; i++)
			{
				PlayerExtended player = new PlayerExtended
				{
					Name = "player" + (i + 1),
					HeadshotCount = random.Next(14),
					OnekillCount = random.Next(10, 30),
					TwokillCount = random.Next(10, 20),
					ThreekillCount = random.Next(0, 10),
					FourKillCount = random.Next(0, 5),
					FiveKillCount = random.Next(0, 2),
					Clutch1V1Count = random.Next(1),
					Clutch1V2Count = random.Next(1),
					Clutch1V3Count = random.Next(1),
					Clutch1V4Count = random.Next(1),
					Clutch1V5Count = random.Next(1),
					BombDefusedCount = random.Next(0, 2),
					BombPlantedCount = random.Next(0, 2),
					DeathCount = random.Next(0, 32),
					KillsCount = random.Next(30),
					AssistCount = random.Next(15),
					Score = random.Next(10, 80),
					RoundMvpCount = random.Next(6),
					RankNumberNew = 5,
					RankNumberOld = 4,
					RatingHltv = (float)random.NextDouble(),
					SteamId = random.Next(1000, 800000),
					IsOverwatchBanned = random.Next(100) < 40,
					IsVacBanned = random.Next(100) < 40,
					TeamKillCount = random.Next(0, 1),
					WinCount = random.Next(10, 687)
				};

				players.Add(player);

				ObservableCollection<EntryKillEvent> entryKills = new ObservableCollection<EntryKillEvent>();
				for (int indexEntryKill = 0; indexEntryKill < random.Next(5); indexEntryKill++)
				{
					EntryKillEvent entryKill = new EntryKillEvent(random.Next(7000, 100000))
					{
						Killed = players.ElementAt(random.Next(0, 9)),
						KilledTeam = Team.Terrorist,
						Killer = players.ElementAt(random.Next(0, 9)),
						KillerTeam = Team.CounterTerrorist
					};
					entryKills.Add(entryKill);
				}

				ObservableCollection<OpenKillEvent> openKills = new ObservableCollection<OpenKillEvent>();
				for (int indexOpenKill = 0; indexOpenKill < random.Next(5); indexOpenKill++)
				{
					OpenKillEvent openKill = new OpenKillEvent(random.Next(7000, 100000))
					{
						Killed = players.ElementAt(random.Next(0, 9)),
						KilledTeam = Team.Terrorist,
						Killer = players.ElementAt(random.Next(0, 9)),
						KillerTeam = Team.CounterTerrorist
					};
					openKills.Add(openKill);
				}

				players.Last().EntryKills = entryKills;
				players.Last().OpeningKills = openKills;
			}

			ObservableCollection<TeamExtended> teams = new ObservableCollection<TeamExtended>
			{
				new TeamExtended
				{
					Name = "Team 1",
					Players = new ObservableCollection<PlayerExtended>(players.Take(5))
				},
				new TeamExtended
				{
					Name = "Team 2",
					Players = new ObservableCollection<PlayerExtended>(players.Skip(5).Take(5))
				}
			};

			ObservableCollection<Round> rounds = new ObservableCollection<Round>();
			for (int i = 0; i < 32; i++)
			{
				Round round = new Round
				{
					Number = i + 1,
					OneKillCount = random.Next(5),
					TwoKillCount = random.Next(2),
					ThreeKillCount = random.Next(1),
					FourKillCount = random.Next(1),
					FiveKillCount = random.Next(1),
					EquipementValueTeam1 = random.Next(4200, 30000),
					EquipementValueTeam2 = random.Next(4200, 30000),
					StartMoneyTeam1 = random.Next(4200, 50000),
					StartMoneyTeam2 = random.Next(4200, 50000),
					Tick = random.Next(7000, 100000),
					WinnerClanName = teams[random.Next(0, 2)].Name
				};

				rounds.Add(round);
			}

			demo.Id = "de_dust25445648778447878";
			demo.Source = new Valve();
			demo.Name = "esea_nip_vs_titan.dem";
			demo.Tickrate = 15;
			demo.ServerTickrate = 128;
			demo.MapName = "de_dust2";
			demo.ClientName = "localhost";
			demo.Hostname = "local";
			demo.OneKillCount = 90;
			demo.TwoKillCount = 30;
			demo.ThreeKillCount = 25;
			demo.FourKillCount = 3;
			demo.FiveKillCount = 1;
			demo.Path = "C:\\mydemo.dem";
			demo.ScoreTeam1 = 16;
			demo.ScoreTeam2 = 6;
			demo.Type = "GOTV";
			demo.Comment = "comment";
			demo.ScoreFirstHalfTeam1 = 10;
			demo.ScoreFirstHalfTeam2 = 5;
			demo.ScoreSecondHalfTeam1 = 6;
			demo.ScoreSecondHalfTeam2 = 1;
			demo.Players = players;
			demo.PlayersTeam1 = teams[0].Players;
			demo.PlayersTeam2 = teams[1].Players;
			demo.MostBombPlantedPlayer = players.ElementAt(random.Next(10));
			demo.MostHeadshotPlayer = players.ElementAt(random.Next(10));
			demo.MostEntryKillPlayer = players.ElementAt(random.Next(10));
			demo.MostKillingWeapon = new Weapon
			{
				Name = "AK-47"
			};
			demo.Teams = teams;
			demo.Rounds = rounds;

			return Task.FromResult(demo);
		}
		public Task<Demo> AnalyzeDemo(Demo demo, CancellationToken token)
		{
			Random random = new Random();

			ObservableCollection<PlayerExtended> players = new ObservableCollection<PlayerExtended>();
			for (int i = 0; i < 10; i++)
			{
				PlayerExtended player = new PlayerExtended
				{
					Name = "player" + (i + 1),
					HeadshotCount = random.Next(14),
					OnekillCount = random.Next(10, 30),
					TwokillCount = random.Next(10, 20),
					ThreekillCount = random.Next(0, 10),
					FourKillCount = random.Next(0, 5),
					FiveKillCount = random.Next(0, 2),
					Clutch1V1Count = random.Next(1),
					Clutch1V2Count = random.Next(1),
					Clutch1V3Count = random.Next(1),
					Clutch1V4Count = random.Next(1),
					Clutch1V5Count = random.Next(1),
					BombDefusedCount = random.Next(0, 2),
					BombPlantedCount = random.Next(0, 2),
					DeathCount = random.Next(0, 32),
					KillsCount = random.Next(30),
					AssistCount = random.Next(15),
					Score = random.Next(10, 80),
					RoundMvpCount = random.Next(6),
					RankNumberNew = 5,
					RankNumberOld = 4,
					RatingHltv = (float)random.NextDouble(),
					SteamId = random.Next(1000, 800000),
					IsOverwatchBanned = random.Next(100) < 40,
					IsVacBanned = random.Next(100) < 40,
					TeamKillCount = random.Next(0, 1),
					WinCount = random.Next(10, 687),
					MolotovThrownCount = random.Next(0, 10),
					DecoyThrownCount = random.Next(0, 10),
					IncendiaryThrownCount = random.Next(20),
					SmokeThrownCount = random.Next(20),
					FlashbangThrownCount = random.Next(20),
					HeGrenadeThrownCount = random.Next(20),
					BombExplodedCount = random.Next(5),
					AvatarUrl = string.Empty,
					ClutchCount = random.Next(5),
					ClutchLostCount = random.Next(5),
					KillDeathRatio = (decimal)random.NextDouble(),
					MatchCount = random.Next(100),
					OpponentClutchCount = random.Next(5),
					RoundPlayedCount = random.Next(100)
				};

				players.Add(player);
			}
			TeamExtended teamT = new TeamExtended
			{
				Name = "Team 1",
				Players = new ObservableCollection<PlayerExtended>(players.Take(5))
			};
			TeamExtended teamCt = new TeamExtended
			{
				Name = "Team 2",
				Players = new ObservableCollection<PlayerExtended>(players.Skip(5).Take(5))
			};

			ObservableCollection<Round> rounds = new ObservableCollection<Round>();
			for (int i = 0; i < 32; i++)
			{
				ObservableCollection<KillEvent> kills = new ObservableCollection<KillEvent>();
				for (int j = 0; j < random.Next(1, 9); j++)
				{
					PlayerExtended killer = players.ElementAt(random.Next(9));
					PlayerExtended killed = players.ElementAt(random.Next(9));
					kills.Add(new KillEvent(random.Next(1, 10000), random.Next(1, 100))
					{
						KillerName = killer.Name,
						KillerSteamId = killer.SteamId,
						KillerSide = killer.Side,
						KilledName = killed.Name,
						KilledSteamId = killed.SteamId,
						KilledSide = killed.Side,
						RoundNumber = i,
						Weapon = Weapon.WeaponList.ElementAt(random.Next(44))
					});
				}

				// generate open / entry kills for this round
				Round round = new Round
				{
					Number = i + 1,
					OneKillCount = random.Next(5),
					TwoKillCount = random.Next(2),
					ThreeKillCount = random.Next(1),
					FourKillCount = random.Next(1),
					FiveKillCount = random.Next(1),
					EquipementValueTeam1 = random.Next(4200, 30000),
					EquipementValueTeam2 = random.Next(4200, 30000),
					StartMoneyTeam1 = random.Next(4200, 50000),
					StartMoneyTeam2 = random.Next(4200, 50000),
					Tick = random.Next(7000, 100000),
					WinnerName = teamCt.Name,
					WinnerSide = Team.CounterTerrorist,
					MolotovThrownCount = random.Next(5),
					DecoyThrownCount = random.Next(5),
					IncendiaryThrownCount = random.Next(5),
					SmokeThrownCount = random.Next(5),
					FlashbangThrownCount = random.Next(5),
					StartTimeSeconds = random.Next(1),
					HeGrenadeThrownCount = random.Next(5),
					BombDefused = null,
					EndTimeSeconds = random.Next(100),
					BombPlanted = null,
					BombExploded = null,
					Type = RoundType.NORMAL,
					EndReason = RoundEndReason.CTWin,
					EntryKillEvent = new EntryKillEvent(random.Next(1, 10000), random.Next(1, 100))
					{
						HasWin = random.Next(100) < 50,
						KillerSteamId = players.ElementAt(random.Next(9)).SteamId,
						KillerName = players.ElementAt(random.Next(9)).Name,
						KilledSteamId = players.ElementAt(random.Next(9)).SteamId,
						KilledName = players.ElementAt(random.Next(9)).Name,
						Weapon = Weapon.WeaponList.ElementAt(random.Next(44)),
						KilledSide = Team.CounterTerrorist,
						KillerSide = Team.Terrorist
					},
					OpenKillEvent = new OpenKillEvent(random.Next(1, 10000), random.Next(1, 100))
					{
						HasWin = random.Next(100) < 50,
						KillerSteamId = players.ElementAt(random.Next(9)).SteamId,
						KillerName = players.ElementAt(random.Next(9)).Name,
						KilledSteamId = players.ElementAt(random.Next(9)).SteamId,
						KilledName = players.ElementAt(random.Next(9)).Name,
						Weapon = Weapon.WeaponList.ElementAt(random.Next(44)),
						KilledSide = Team.CounterTerrorist,
						KillerSide = Team.Terrorist
					},
					SideTrouble = Team.Spectate,
					Kills = kills
				};
				rounds.Add(round);
			}

			demo.Id = "de_dust25445648778447878";
			demo.Source = new Valve();
			demo.Name = "esea_nip_vs_titan.dem";
			demo.Tickrate = 15;
			demo.ServerTickrate = 128;
			demo.MapName = "de_dust2";
			demo.ClientName = "localhost";
			demo.Hostname = "local";
			demo.OneKillCount = 90;
			demo.TwoKillCount = 30;
			demo.ThreeKillCount = 25;
			demo.FourKillCount = 3;
			demo.FiveKillCount = 1;
			demo.Path = "C:\\mydemo.dem";
			demo.ScoreTeam1 = 16;
			demo.ScoreTeam2 = 6;
			demo.Type = "GOTV";
			demo.Comment = "comment";
			demo.ScoreFirstHalfTeam1 = 10;
			demo.ScoreFirstHalfTeam2 = 5;
			demo.ScoreSecondHalfTeam1 = 6;
			demo.ScoreSecondHalfTeam2 = 1;
			demo.TeamCT = teamCt;
			demo.TeamT = teamT;
			demo.Players = players;
			demo.Rounds = rounds;
			demo.MostKillingWeapon = Weapon.WeaponList[random.Next(44)];
			foreach (KillEvent e in rounds.SelectMany(round => round.Kills)) demo.Kills.Add(e);

			return Task.FromResult(demo);
		}