// helpers

        public static EXTHealingStatsPlayerDetailsDto BuildPlayerHealingData(ParsedEvtcLog log, AbstractSingleActor actor, Dictionary<long, SkillItem> usedSkills, Dictionary<long, Buff> usedBuffs)
        {
            var dto = new EXTHealingStatsPlayerDetailsDto
            {
                HealingDistributions = new List<EXTHealingStatsHealingDistributionDto>(),
                HealingDistributionsTargets = new List<List<EXTHealingStatsHealingDistributionDto>>(),
                IncomingHealingDistributions = new List<EXTHealingStatsHealingDistributionDto>(),
                Minions = new List<EXTHealingStatsPlayerDetailsDto>(),
            };
            foreach (PhaseData phase in log.FightData.GetPhases(log))
            {
                dto.HealingDistributions.Add(EXTHealingStatsHealingDistributionDto.BuildFriendlyHealingDistData(log, actor, null, phase, usedSkills, usedBuffs));
                var dmgTargetsDto = new List<EXTHealingStatsHealingDistributionDto>();
                foreach (AbstractSingleActor target in log.Friendlies)
                {
                    dmgTargetsDto.Add(EXTHealingStatsHealingDistributionDto.BuildFriendlyHealingDistData(log, actor, target, phase, usedSkills, usedBuffs));
                }
                dto.HealingDistributionsTargets.Add(dmgTargetsDto);
                dto.IncomingHealingDistributions.Add(EXTHealingStatsHealingDistributionDto.BuildIncomingHealingDistData(log, actor, phase, usedSkills, usedBuffs));
            }
            foreach (KeyValuePair<long, Minions> pair in actor.GetMinions(log))
            {
                dto.Minions.Add(BuildFriendlyMinionsHealingData(log, actor, pair.Value, usedSkills, usedBuffs));
            }

            return dto;
        }
 public HealingStatsExtension(ParsedEvtcLog log, Dictionary <long, SkillItem> usedSkills, Dictionary <long, Buff> usedBuffs)
 {
     HealingPhases        = new List <EXTHealingStatsPhaseDto>();
     PlayerHealingCharts  = new List <List <EXTHealingStatsPlayerChartDto> >();
     PlayerHealingDetails = new List <EXTHealingStatsPlayerDetailsDto>();
     foreach (PhaseData phase in log.FightData.GetPhases(log))
     {
         HealingPhases.Add(new EXTHealingStatsPhaseDto(phase, log));
         PlayerHealingCharts.Add(EXTHealingStatsPlayerChartDto.BuildPlayersHealingGraphData(log, phase));
     }
     foreach (AbstractSingleActor actor in log.Friendlies)
     {
         PlayerHealingDetails.Add(EXTHealingStatsPlayerDetailsDto.BuildPlayerHealingData(log, actor, usedSkills, usedBuffs));
     }
 }
 private static EXTHealingStatsPlayerDetailsDto BuildFriendlyMinionsHealingData(ParsedEvtcLog log, AbstractSingleActor actor, Minions minion, Dictionary<long, SkillItem> usedSkills, Dictionary<long, Buff> usedBuffs)
 {
     var dto = new EXTHealingStatsPlayerDetailsDto
     {
         HealingDistributions = new List<EXTHealingStatsHealingDistributionDto>(),
         HealingDistributionsTargets = new List<List<EXTHealingStatsHealingDistributionDto>>()
     };
     foreach (PhaseData phase in log.FightData.GetPhases(log))
     {
         var dmgTargetsDto = new List<EXTHealingStatsHealingDistributionDto>();
         foreach (AbstractSingleActor target in log.Friendlies)
         {
             dmgTargetsDto.Add(EXTHealingStatsHealingDistributionDto.BuildFriendlyMinionHealingDistData(log, actor, minion, target, phase, usedSkills, usedBuffs));
         }
         dto.HealingDistributionsTargets.Add(dmgTargetsDto);
         dto.HealingDistributions.Add(EXTHealingStatsHealingDistributionDto.BuildFriendlyMinionHealingDistData(log, actor, minion, null, phase, usedSkills, usedBuffs));
     }
     return dto;
 }