private void CalculateConditions() { foreach (Target target in _log.FightData.Logic.Targets) { Dictionary <long, FinalTargetBoon>[] stats = new Dictionary <long, FinalTargetBoon> [_statistics.Phases.Count]; for (int phaseIndex = 0; phaseIndex < _statistics.Phases.Count; phaseIndex++) { BoonDistribution boonDistribution = target.GetBoonDistribution(_log, phaseIndex); Dictionary <long, FinalTargetBoon> rates = new Dictionary <long, FinalTargetBoon>(); Dictionary <long, long> boonPresence = target.GetBoonPresence(_log, phaseIndex); Dictionary <long, long> condiPresence = target.GetCondiPresence(_log, phaseIndex); PhaseData phase = _statistics.Phases[phaseIndex]; long fightDuration = phase.GetDuration(); foreach (Boon boon in target.BoonToTrack) { FinalTargetBoon condition = new FinalTargetBoon(_log.PlayerList); rates[boon.ID] = condition; if (boonDistribution.ContainsKey(boon.ID)) { if (boon.Type == Boon.BoonType.Duration) { condition.Uptime = Math.Round(100.0 * boonDistribution.GetUptime(boon.ID) / fightDuration, 1); foreach (Player p in _log.PlayerList) { long gen = boonDistribution.GetGeneration(boon.ID, p.InstID); condition.Generated[p] = Math.Round(100.0 * gen / fightDuration, 1); condition.Overstacked[p] = Math.Round(100.0 * (boonDistribution.GetOverstack(boon.ID, p.InstID) + gen) / fightDuration, 1); } } else if (boon.Type == Boon.BoonType.Intensity) { condition.Uptime = Math.Round((double)boonDistribution.GetUptime(boon.ID) / fightDuration, 1); foreach (Player p in _log.PlayerList) { long gen = boonDistribution.GetGeneration(boon.ID, p.InstID); condition.Generated[p] = Math.Round((double)gen / fightDuration, 1); condition.Overstacked[p] = Math.Round((double)(boonDistribution.GetOverstack(boon.ID, p.InstID) + gen) / fightDuration, 1); } if (boonPresence.TryGetValue(boon.ID, out long presenceValueBoon)) { condition.Presence = Math.Round(100.0 * presenceValueBoon / fightDuration, 1); } else if (condiPresence.TryGetValue(boon.ID, out long presenceValueCondi)) { condition.Presence = Math.Round(100.0 * presenceValueCondi / fightDuration, 1); } } rates[boon.ID] = condition; } } stats[phaseIndex] = rates; } _statistics.TargetConditions[target] = stats; } }
public void calculateConditions() { statistics.bossConditions = new Dictionary <int, Statistics.FinalBossBoon> [phases.Count]; List <Boon> boon_to_track = Boon.getCondiBoonList(); boon_to_track.AddRange(Boon.getBoonList()); for (int phaseIndex = 0; phaseIndex < phases.Count; phaseIndex++) { List <PhaseData> phases = log.getBoss().getPhases(log, settings.ParsePhases); BoonDistribution boonDistribution = log.getBoss().getBoonDistribution(log, phases, boon_to_track, phaseIndex); Dictionary <int, Statistics.FinalBossBoon> rates = new Dictionary <int, Statistics.FinalBossBoon>(); PhaseData phase = phases[phaseIndex]; long fightDuration = phase.getDuration(); foreach (Boon boon in Boon.getCondiBoonList()) { Statistics.FinalBossBoon condition = new Statistics.FinalBossBoon(); rates[boon.getID()] = condition; if (boonDistribution.ContainsKey(boon.getID())) { if (boon.getType() == Boon.BoonType.Duration) { condition.boonType = Boon.BoonType.Duration; condition.uptime = Math.Round(100.0 * boonDistribution.getUptime(boon.getID()) / fightDuration, 1); } else if (boon.getType() == Boon.BoonType.Intensity) { condition.boonType = Boon.BoonType.Intensity; condition.uptime = Math.Round((double)boonDistribution.getUptime(boon.getID()) / fightDuration, 1); } rates[boon.getID()] = condition; } } statistics.bossConditions[phaseIndex] = rates; } }
private void CalculateBoons() { foreach (Player player in _log.PlayerList) { // Boons applied to self Dictionary <long, FinalBuffs>[] selfUptimesByPhase = new Dictionary <long, FinalBuffs> [_statistics.Phases.Count]; for (int phaseIndex = 0; phaseIndex < _statistics.Phases.Count; phaseIndex++) { Dictionary <long, FinalBuffs> final = new Dictionary <long, FinalBuffs>(); 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.TrackedBoons) { if (selfBoons.ContainsKey(boon.ID)) { FinalBuffs uptime = new FinalBuffs { Uptime = 0, Generation = 0, Overstack = 0, Wasted = 0, UnknownExtended = 0, ByExtension = 0, Extended = 0 }; final[boon.ID] = uptime; long generation = selfBoons.GetGeneration(boon.ID, player.AgentItem); if (boon.Type == Boon.BoonType.Duration) { uptime.Uptime = Math.Round(100.0 * selfBoons.GetUptime(boon.ID) / fightDuration, 2); uptime.Generation = Math.Round(100.0 * generation / fightDuration, 2); uptime.Overstack = Math.Round(100.0 * (selfBoons.GetOverstack(boon.ID, player.AgentItem) + generation) / fightDuration, 2); uptime.Wasted = Math.Round(100.0 * selfBoons.GetWaste(boon.ID, player.AgentItem) / fightDuration, 2); uptime.UnknownExtended = Math.Round(100.0 * selfBoons.GetUnknownExtension(boon.ID, player.AgentItem) / fightDuration, 2); uptime.ByExtension = Math.Round(100.0 * selfBoons.GetExtension(boon.ID, player.AgentItem) / fightDuration, 2); uptime.Extended = Math.Round(100.0 * selfBoons.GetExtended(boon.ID, player.AgentItem) / fightDuration, 2); } else if (boon.Type == Boon.BoonType.Intensity) { uptime.Uptime = Math.Round((double)selfBoons.GetUptime(boon.ID) / fightDuration, 2); uptime.Generation = Math.Round((double)generation / fightDuration, 2); uptime.Overstack = Math.Round((double)(selfBoons.GetOverstack(boon.ID, player.AgentItem) + generation) / fightDuration, 2); uptime.Wasted = Math.Round((double)selfBoons.GetWaste(boon.ID, player.AgentItem) / fightDuration, 2); uptime.UnknownExtended = Math.Round((double)selfBoons.GetUnknownExtension(boon.ID, player.AgentItem) / fightDuration, 2); uptime.ByExtension = Math.Round((double)selfBoons.GetExtension(boon.ID, player.AgentItem) / fightDuration, 2); uptime.Extended = Math.Round((double)selfBoons.GetExtended(boon.ID, player.AgentItem) / fightDuration, 2); if (boonPresence.TryGetValue(boon.ID, out long presenceValueBoon)) { uptime.Presence = Math.Round(100.0 * presenceValueBoon / fightDuration, 2); } else if (condiPresence.TryGetValue(boon.ID, out long presenceValueCondi)) { uptime.Presence = Math.Round(100.0 * presenceValueCondi / fightDuration, 2); } } } } selfUptimesByPhase[phaseIndex] = final; } _statistics.SelfBuffs[player] = selfUptimesByPhase; // Boons applied to player's group var otherPlayersInGroup = _log.PlayerList .Where(p => p.Group == player.Group && player.InstID != p.InstID) .ToList(); _statistics.GroupBuffs[player] = GetBoonsForPlayers(otherPlayersInGroup, player); // Boons applied to other groups var offGroupPlayers = _log.PlayerList.Where(p => p.Group != player.Group).ToList(); _statistics.OffGroupBuffs[player] = GetBoonsForPlayers(offGroupPlayers, player); // Boons applied to squad var otherPlayers = _log.PlayerList.Where(p => p.InstID != player.InstID).ToList(); _statistics.SquadBuffs[player] = GetBoonsForPlayers(otherPlayers, player); } }
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); } } } }
private void calculateBoons() { // Player Boons foreach (Player player in log.getPlayerList()) { List <Boon> boon_to_track = new List <Boon>(); boon_to_track.AddRange(statistics.present_boons); boon_to_track.AddRange(statistics.present_offbuffs); boon_to_track.AddRange(statistics.present_defbuffs); boon_to_track.AddRange(statistics.present_personnal[player.getInstid()]); Dictionary <int, Statistics.FinalBoonUptime>[] phaseBoons = new Dictionary <int, Statistics.FinalBoonUptime> [phases.Count]; for (int phaseIndex = 0; phaseIndex < phases.Count; phaseIndex++) { Dictionary <int, Statistics.FinalBoonUptime> final = new Dictionary <int, Statistics.FinalBoonUptime>(); PhaseData phase = phases[phaseIndex]; BoonDistribution selfBoons = player.getBoonDistribution(log, phases, boon_to_track, phaseIndex); long fightDuration = phase.getEnd() - phase.getStart(); foreach (Boon boon in Boon.getAllBuffList()) { Statistics.FinalBoonUptime uptime = new Statistics.FinalBoonUptime(); uptime.uptime = 0; uptime.generation = 0; uptime.overstack = 0; if (selfBoons.ContainsKey(boon.getID())) { if (boon.getType() == Boon.BoonType.Duration) { uptime.uptime = Math.Round(100.0 * selfBoons.getUptime(boon.getID()) / fightDuration, 1); uptime.generation = Math.Round(100.0f * selfBoons.getGeneration(boon.getID(), player.getInstid()) / fightDuration, 1); uptime.overstack = Math.Round(100.0f * selfBoons.getOverstack(boon.getID(), player.getInstid()) / fightDuration, 1); } else if (boon.getType() == Boon.BoonType.Intensity) { uptime.uptime = Math.Round((double)selfBoons.getUptime(boon.getID()) / fightDuration, 1); uptime.generation = Math.Round((double)selfBoons.getGeneration(boon.getID(), player.getInstid()) / fightDuration, 1); uptime.overstack = Math.Round((double)selfBoons.getOverstack(boon.getID(), player.getInstid()) / fightDuration, 1); } uptime.boonType = boon.getType(); } final[boon.getID()] = uptime; } phaseBoons[phaseIndex] = final; } statistics.selfBoons[player] = phaseBoons; } // Group Boons foreach (Player player in log.getPlayerList()) { List <Boon> boon_to_track = new List <Boon>(); boon_to_track.AddRange(statistics.present_boons); boon_to_track.AddRange(statistics.present_offbuffs); boon_to_track.AddRange(statistics.present_defbuffs); boon_to_track.AddRange(statistics.present_personnal[player.getInstid()]); List <Player> groupPlayers = new List <Player>(); foreach (Player p in log.getPlayerList()) { if (p.getGroup() == player.getGroup()) { groupPlayers.Add(p); } } Dictionary <int, Statistics.FinalBoonUptime>[] phaseBoons = new Dictionary <int, Statistics.FinalBoonUptime> [phases.Count]; for (int phaseIndex = 0; phaseIndex < phases.Count; phaseIndex++) { phaseBoons[phaseIndex] = getBoonsForList(groupPlayers, player, boon_to_track, phaseIndex); } statistics.groupBoons[player] = phaseBoons; } // Off Group Boons foreach (Player player in log.getPlayerList()) { List <Boon> boon_to_track = new List <Boon>(); boon_to_track.AddRange(statistics.present_boons); boon_to_track.AddRange(statistics.present_offbuffs); boon_to_track.AddRange(statistics.present_defbuffs); boon_to_track.AddRange(statistics.present_personnal[player.getInstid()]); List <Player> groupPlayers = new List <Player>(); foreach (Player p in log.getPlayerList()) { if (p.getGroup() != player.getGroup()) { groupPlayers.Add(p); } } Dictionary <int, Statistics.FinalBoonUptime>[] phaseBoons = new Dictionary <int, Statistics.FinalBoonUptime> [phases.Count]; for (int phaseIndex = 0; phaseIndex < phases.Count; phaseIndex++) { phaseBoons[phaseIndex] = getBoonsForList(groupPlayers, player, boon_to_track, phaseIndex); } statistics.offGroupBoons[player] = phaseBoons; } // Squad Boons foreach (Player player in log.getPlayerList()) { List <Boon> boon_to_track = new List <Boon>(); boon_to_track.AddRange(statistics.present_boons); boon_to_track.AddRange(statistics.present_offbuffs); boon_to_track.AddRange(statistics.present_defbuffs); boon_to_track.AddRange(statistics.present_personnal[player.getInstid()]); List <Player> groupPlayers = new List <Player>(); foreach (Player p in log.getPlayerList()) { groupPlayers.Add(p); } Dictionary <int, Statistics.FinalBoonUptime>[] phaseBoons = new Dictionary <int, Statistics.FinalBoonUptime> [phases.Count]; for (int phaseIndex = 0; phaseIndex < phases.Count; phaseIndex++) { phaseBoons[phaseIndex] = getBoonsForList(groupPlayers, player, boon_to_track, phaseIndex); } statistics.squadBoons[player] = phaseBoons; } }