private static DmgDistributionDto BuildDMGDistDataMinionsInternal(ParsedEvtcLog log, FinalDPS dps, Minions minions, AbstractSingleActor target, PhaseData phase, Dictionary <long, SkillItem> usedSkills, Dictionary <long, Buff> usedBuffs)
        {
            var dto = new DmgDistributionDto();
            IReadOnlyList <AbstractCastEvent>           casting       = minions.GetIntersectingCastEvents(log, phase.Start, phase.End);
            IReadOnlyList <AbstractHealthDamageEvent>   damageLogs    = minions.GetDamageEvents(target, log, phase.Start, phase.End);
            IReadOnlyList <AbstractBreakbarDamageEvent> brkDamageLogs = minions.GetBreakbarDamageEvents(target, log, phase.Start, phase.End);

            dto.ContributedDamage         = damageLogs.Sum(x => x.HealthDamage);
            dto.ContributedShieldDamage   = damageLogs.Sum(x => x.ShieldDamage);
            dto.ContributedBreakbarDamage = Math.Round(brkDamageLogs.Sum(x => x.BreakbarDamage), 1);
            dto.TotalDamage         = dps.Damage;
            dto.TotalBreakbarDamage = dps.BreakbarDamage;
            dto.TotalCasting        = casting.Sum(cl => Math.Min(cl.EndTime, phase.End) - Math.Max(cl.Time, phase.Start));
            dto.Distribution        = BuildDMGDistBodyData(log, casting, damageLogs, brkDamageLogs, usedSkills, usedBuffs, phase);
            return(dto);
        }
        public static DmgDistributionDto BuildDMGTakenDistData(ParsedEvtcLog log, AbstractSingleActor p, PhaseData phase, Dictionary <long, SkillItem> usedSkills, Dictionary <long, Buff> usedBuffs)
        {
            var dto = new DmgDistributionDto
            {
                Distribution = new List <object[]>()
            };
            FinalDefensesAll incomingDamageStats = p.GetDefenseStats(log, phase.Start, phase.End);
            IReadOnlyList <AbstractHealthDamageEvent>   damageLogs   = p.GetDamageTakenEvents(null, log, phase.Start, phase.End);
            IReadOnlyList <AbstractBreakbarDamageEvent> breakbarLogs = p.GetBreakbarDamageTakenEvents(null, log, phase.Start, phase.End);
            var damageLogsBySkill   = damageLogs.GroupBy(x => x.Skill).ToDictionary(x => x.Key, x => x.ToList());
            var breakbarLogsBySkill = breakbarLogs.GroupBy(x => x.Skill).ToDictionary(x => x.Key, x => x.ToList());

            dto.ContributedDamage         = incomingDamageStats.DamageTaken;
            dto.ContributedShieldDamage   = incomingDamageStats.DamageBarrier;
            dto.ContributedBreakbarDamage = incomingDamageStats.BreakbarDamageTaken;
            foreach (KeyValuePair <SkillItem, List <AbstractHealthDamageEvent> > pair in damageLogsBySkill)
            {
                dto.Distribution.Add(GetDMGDtoItem(pair.Key, pair.Value, null, breakbarLogsBySkill, usedSkills, usedBuffs, log.Buffs, phase));
            }
            return(dto);
        }