protected JsonRotation(long skillID, List <AbstractCastEvent> skillCasts, Dictionary <string, JsonLog.SkillDesc> skillDesc)
 {
     if (!skillDesc.ContainsKey("s" + skillID))
     {
         SkillItem skill = skillCasts.First().Skill;
         skillDesc["s" + skillID] = new JsonLog.SkillDesc(skill);
     }
     Id     = skillID;
     Skills = skillCasts.Select(x => new JsonSkill(x)).ToList();
 }
 protected JsonDamageDist(long id, List <AbstractDamageEvent> list, ParsedLog log, Dictionary <string, JsonLog.SkillDesc> skillDesc, Dictionary <string, JsonLog.BuffDesc> buffDesc)
 {
     IndirectDamage = list.Exists(x => x is NonDirectDamageEvent);
     if (IndirectDamage)
     {
         if (!buffDesc.ContainsKey("b" + id))
         {
             if (log.Buffs.BuffsByIds.TryGetValue(id, out Buff buff))
             {
                 buffDesc["b" + id] = new JsonLog.BuffDesc(buff);
             }
             else
             {
                 SkillItem skill   = list.First().Skill;
                 var       auxBoon = new Buff(skill.Name, id, skill.Icon);
                 buffDesc["b" + id] = new JsonLog.BuffDesc(auxBoon);
             }
         }
     }
     else
     {
         if (!skillDesc.ContainsKey("s" + id))
         {
             SkillItem skill = list.First().Skill;
             skillDesc["s" + id] = new JsonLog.SkillDesc(skill);
         }
     }
     Hits = list.Count;
     Id   = id;
     Min  = int.MaxValue;
     Max  = int.MinValue;
     foreach (AbstractDamageEvent dmgEvt in list)
     {
         TotalDamage += dmgEvt.Damage;
         Min          = Math.Min(Min, dmgEvt.Damage);
         Max          = Math.Max(Max, dmgEvt.Damage);
         if (IndirectDamage)
         {
             Flank  += dmgEvt.IsFlanking ? 1 : 0;
             Crit   += dmgEvt.HasCrit ? 1 : 0;
             Glance += dmgEvt.HasGlanced ? 1 : 0;
         }
         ShieldDamage += dmgEvt.ShieldDamage;
     }
 }