public static NormalizedMatch NormalizeMatch(string matchId, string matchJsonStr) { NormalizedMatch normedMatch = new NormalizedMatch { Id = matchId }; MatchModel model = JsonConvert.DeserializeObject <MatchModel>(matchJsonStr); List <string> rosterIds = model.Data.Relationships.Rosters.Data.Select(x => x.Id).ToList(); foreach (string rosterId in rosterIds) { MatchModelIncluded modelIncludedRoster = model.Included.First(x => x.Id == rosterId); List <string> participantIds = modelIncludedRoster.Relationships.Participants.Data.Select(x => x.Id).ToList(); NormalizedRoster roster = new NormalizedRoster { Roster = modelIncludedRoster }; normedMatch.Rosters.Add(roster); foreach (string participantId in participantIds) { MatchModelIncluded participant = model.Included.First(x => x.Id == participantId); roster.Players.Add(participant); } } normedMatch.Model = model; normedMatch.JsonStr = matchJsonStr; return(normedMatch); }
public void DrawData(PreparedData pd, MainForm mainForm) { ClearChart(); Chart chart1 = this.Chart; DateTime?localTime = pd.File?.MatchDate?.ToLocalTime(); string matchDate = ""; if (localTime.HasValue) { matchDate = localTime.Value.ToString(ViewModel.ChartTitleDateFormat); matchDate += " " + localTime.Value.GetTimeZoneAbbreviation(); } chart1.ChartAreas[0].AxisY.Title = "HP: 0 to 100"; chart1.ChartAreas[0].AxisY.TitleFont = mainForm.DeriveFont(chart1.ChartAreas[0].AxisY.TitleFont, 0); chart1.ChartAreas[0].AxisX.Title = "Elapsed time since start of match (in minutes)."; chart1.ChartAreas[0].AxisX.TitleFont = mainForm.DeriveFont(chart1.ChartAreas[0].AxisX.TitleFont, 0); ISet <string> squad = pd.File?.Squad ?? new HashSet <string>(); NormalizedRoster roster = pd.File?.NormalizedMatch?.Rosters?.FirstOrDefault(r => r.Players?.Any(p => squad.Contains(p?.Attributes?.Stats?.Name)) ?? false); chart1.Titles[0].Text = $"HP over time for one match -- {matchDate} -- Squad Rank: {roster?.Roster.Attributes.Stats.Rank}"; chart1.Titles[0].Font = new Font(chart1.Titles[0].Font.FontFamily, 12, FontStyle.Bold); // Declare series first foreach (string playerName in pd.PlayerToEvents.Keys) { var series = chart1.Series.Add(playerName); series.Color = mainForm.ViewModel.ColorForPlayer(playerName); series.BorderWidth = 3; series.ChartType = SeriesChartType.Line; chart1.ChartAreas[0].AxisX.IsMarginVisible = false; series.SmartLabelStyle.Enabled = true; series.SmartLabelStyle.MovingDirection = LabelAlignmentStyles.Center; series.LabelFormat = "#"; series.SmartLabelStyle.IsOverlappedHidden = true; series.XValueType = ChartValueType.DateTime; } // Track player's last known HP so we can fill in a reasonable value at missing time intervals var lastHps = new Dictionary <string, float>(); // Then add data DebugThreadWriteLine("About to render " + pd.File?.FileInfo.Name); DateTime t0 = pd.TimeToPlayerToEvents.Keys.FirstOrDefault().ToLocalTime(); foreach (var kv in pd.TimeToPlayerToEvents) { TimeSpan eventTimeOffset = kv.Key.ToLocalTime().Subtract(t0); DateTime dt = new DateTime(eventTimeOffset.Ticks); var timePlayerToEvents = kv.Value; foreach (string squadMember in pd.Squad) { timePlayerToEvents.TryGetValue(squadMember, out var squadEvents); if (squadEvents != null) { chart1.Series[squadMember].Points.AddXY(dt, squadEvents.First().character.health); float minHp = squadEvents.Select(x => x.character.health).Min(); lastHps[squadMember] = minHp; } else { float lastHp = lastHps.GetValueOrDefault(squadMember, () => 100); chart1.Series[squadMember].Points.AddXY(dt, lastHp); } } } this.RecalcPointLabels(); }