private Dictionary <long, FinalBoonUptime>[] GetBoonsForPlayers(List <Player> playerList, Player player) { Dictionary <long, FinalBoonUptime>[] uptimesByPhase = new Dictionary <long, FinalBoonUptime> [_statistics.Phases.Count]; for (int phaseIndex = 0; phaseIndex < _statistics.Phases.Count; phaseIndex++) { PhaseData phase = _statistics.Phases[phaseIndex]; long fightDuration = phase.End - phase.Start; Dictionary <Player, BoonDistribution> boonDistributions = new Dictionary <Player, BoonDistribution>(); foreach (Player p in playerList) { boonDistributions[p] = p.GetBoonDistribution(_log, phaseIndex); } Dictionary <long, FinalBoonUptime> final = new Dictionary <long, FinalBoonUptime>(); foreach (Boon boon in player.BoonToTrack) { long totalGeneration = 0; long totalOverstack = 0; foreach (BoonDistribution boons in boonDistributions.Values) { if (boons.ContainsKey(boon.ID)) { totalGeneration += boons.GetGeneration(boon.ID, player.InstID); totalOverstack += boons.GetOverstack(boon.ID, player.InstID); } } FinalBoonUptime uptime = new FinalBoonUptime(); if (boon.Type == Boon.BoonType.Duration) { uptime.Generation = Math.Round(100.0f * totalGeneration / fightDuration / playerList.Count, 1); uptime.Overstack = Math.Round(100.0f * (totalOverstack + totalGeneration) / fightDuration / playerList.Count, 1); } else if (boon.Type == Boon.BoonType.Intensity) { uptime.Generation = Math.Round((double)totalGeneration / fightDuration / playerList.Count, 1); uptime.Overstack = Math.Round((double)(totalOverstack + totalGeneration) / fightDuration / playerList.Count, 1); } final[boon.ID] = uptime; } uptimesByPhase[phaseIndex] = final; } return(uptimesByPhase); }
private void CalculateBoons() { foreach (Player player in _log.PlayerList) { // Boons applied to self Dictionary <long, FinalBoonUptime>[] selfUptimesByPhase = new Dictionary <long, FinalBoonUptime> [_statistics.Phases.Count]; for (int phaseIndex = 0; phaseIndex < _statistics.Phases.Count; phaseIndex++) { Dictionary <long, FinalBoonUptime> final = new Dictionary <long, FinalBoonUptime>(); PhaseData phase = _statistics.Phases[phaseIndex]; BoonDistribution selfBoons = player.GetBoonDistribution(_log, phaseIndex); Dictionary <long, long> boonPresence = player.GetBoonPresence(_log, phaseIndex); Dictionary <long, long> condiPresence = player.GetCondiPresence(_log, phaseIndex); long fightDuration = phase.End - phase.Start; foreach (Boon boon in player.BoonToTrack) { FinalBoonUptime uptime = new FinalBoonUptime { Uptime = 0, Generation = 0, Overstack = 0 }; if (selfBoons.ContainsKey(boon.ID)) { long generation = selfBoons.GetGeneration(boon.ID, player.InstID); if (boon.Type == Boon.BoonType.Duration) { uptime.Uptime = Math.Round(100.0 * selfBoons.GetUptime(boon.ID) / fightDuration, 1); uptime.Generation = Math.Round(100.0f * generation / fightDuration, 1); uptime.Overstack = Math.Round(100.0f * (selfBoons.GetOverstack(boon.ID, player.InstID) + generation) / fightDuration, 1); } else if (boon.Type == Boon.BoonType.Intensity) { uptime.Uptime = Math.Round((double)selfBoons.GetUptime(boon.ID) / fightDuration, 1); uptime.Generation = Math.Round((double)generation / fightDuration, 1); uptime.Overstack = Math.Round((double)(selfBoons.GetOverstack(boon.ID, player.InstID) + generation) / fightDuration, 1); if (boonPresence.TryGetValue(boon.ID, out long presenceValueBoon)) { uptime.Presence = Math.Round(100.0 * presenceValueBoon / fightDuration, 1); } else if (condiPresence.TryGetValue(boon.ID, out long presenceValueCondi)) { uptime.Presence = Math.Round(100.0 * presenceValueCondi / fightDuration, 1); } } } final[boon.ID] = uptime; } selfUptimesByPhase[phaseIndex] = final; } _statistics.SelfBoons[player] = selfUptimesByPhase; // Boons applied to player's group var otherPlayersInGroup = _log.PlayerList .Where(p => p.Group == player.Group && player.InstID != p.InstID) .ToList(); _statistics.GroupBoons[player] = GetBoonsForPlayers(otherPlayersInGroup, player); // Boons applied to other groups var offGroupPlayers = _log.PlayerList.Where(p => p.Group != player.Group).ToList(); _statistics.OffGroupBoons[player] = GetBoonsForPlayers(offGroupPlayers, player); // Boons applied to squad var otherPlayers = _log.PlayerList.Where(p => p.InstID != player.InstID).ToList(); _statistics.SquadBoons[player] = GetBoonsForPlayers(otherPlayers, player); } // a little hack to remove the contribution on boon average // to remove once we switch to new html builder Player CASword = _log.PlayerList.Find(x => x.Account == ":Conjured Sword"); if (CASword != null) { var caBoons = _statistics.SelfBoons[CASword]; List <Player> swordlessPList = _log.PlayerList.Where(x => x.Account != ":Conjured Sword").ToList(); for (int phaseIndex = 0; phaseIndex < _statistics.Phases.Count; phaseIndex++) { var caPhaseBoons = caBoons[phaseIndex]; foreach (Player p in swordlessPList) { var phaseBoons = _statistics.SelfBoons[p][phaseIndex]; foreach (long boonId in phaseBoons.Keys) { var uptime = phaseBoons[boonId]; if (caPhaseBoons.TryGetValue(boonId, out var caUptime)) { caUptime.Uptime += uptime.Uptime; } else { caPhaseBoons[boonId] = new FinalBoonUptime() { Uptime = uptime.Uptime }; } } } foreach (var uptime in caPhaseBoons.Values) { uptime.Uptime = Math.Round(uptime.Uptime / swordlessPList.Count, 1); } } } }