コード例 #1
0
        private List <JsonMinions> BuildMinions(AbstractMasterActor master)
        {
            List <JsonMinions> mins = new List <JsonMinions>();

            foreach (Minions minions in master.GetMinions(_log).Values)
            {
                List <int>   totalDamage             = new List <int>();
                List <int>   totalShieldDamage       = new List <int>();
                List <int>[] totalTargetDamage       = new List <int> [_log.FightData.Logic.Targets.Count];
                List <int>[] totalTargetShieldDamage = new List <int> [_log.FightData.Logic.Targets.Count];
                foreach (PhaseData phase in _phases)
                {
                    int tot    = 0;
                    int shdTot = 0;
                    foreach (AbstractDamageEvent de in minions.GetDamageLogs(null, _log, phase.Start, phase.End))
                    {
                        tot   += de.Damage;
                        shdTot = de.ShieldDamage;
                    }
                    totalDamage.Add(tot);
                    totalShieldDamage.Add(shdTot);
                }
                for (int i = 0; i < _log.FightData.Logic.Targets.Count; i++)
                {
                    Target     tar                  = _log.FightData.Logic.Targets[i];
                    List <int> totalTarDamage       = new List <int>();
                    List <int> totalTarShieldDamage = new List <int>();
                    foreach (PhaseData phase in _phases)
                    {
                        int tot    = 0;
                        int shdTot = 0;
                        foreach (AbstractDamageEvent de in minions.GetDamageLogs(tar, _log, phase.Start, phase.End))
                        {
                            tot   += de.Damage;
                            shdTot = de.ShieldDamage;
                        }
                        totalTarDamage.Add(tot);
                        totalTarShieldDamage.Add(shdTot);
                    }
                    totalTargetDamage[i]       = totalTarDamage;
                    totalTargetShieldDamage[i] = totalTarShieldDamage;
                }
                JsonMinions min = new JsonMinions()
                {
                    Name                    = minions.Character,
                    Rotation                = BuildRotation(minions.GetCastLogs(_log, 0, _log.FightData.FightDuration)),
                    TotalDamageDist         = BuildDamageDist(minions, null),
                    TargetDamageDist        = BuildDamageDist(minions),
                    TotalDamage             = totalDamage,
                    TotalShieldDamage       = totalShieldDamage,
                    TotalTargetShieldDamage = totalTargetShieldDamage,
                    TotalTargetDamage       = totalTargetDamage,
                };
                mins.Add(min);
            }
            return(mins);
        }
コード例 #2
0
 private List <int>[] BuildTotal1SDamage(AbstractMasterActor p)
 {
     List <int>[] list = new List <int> [_statistics.Phases.Count];
     for (int i = 0; i < _statistics.Phases.Count; i++)
     {
         list[i] = p.Get1SDamageList(_log, i, _statistics.Phases[i], null);
     }
     return(list);
 }
コード例 #3
0
 private Dictionary <string, JsonDamageDist>[] BuildDamageTaken(AbstractMasterActor p)
 {
     Dictionary <string, JsonDamageDist>[] res = new Dictionary <string, JsonDamageDist> [_statistics.Phases.Count];
     for (int i = 0; i < _statistics.Phases.Count; i++)
     {
         PhaseData phase = _statistics.Phases[i];
         res[i] = BuildDamageDist(p.GetDamageTakenLogs(null, _log, phase.Start, phase.End));
     }
     return(res);
 }
コード例 #4
0
 private Dictionary <string, JsonDamageDist>[] BuildDamageDist(AbstractMasterActor p, Target target)
 {
     Dictionary <string, JsonDamageDist>[] res = new Dictionary <string, JsonDamageDist> [_statistics.Phases.Count];
     for (int i = 0; i < _statistics.Phases.Count; i++)
     {
         PhaseData phase = _statistics.Phases[i];
         res[i] = BuildDamageDist(p.GetJustPlayerDamageLogs(target, _log, phase.Start, phase.End));
     }
     return(res);
 }
コード例 #5
0
 private Dictionary <string, JsonDamageDist>[][] BuildDamageDist(AbstractMasterActor p)
 {
     Dictionary <string, JsonDamageDist>[][] res = new Dictionary <string, JsonDamageDist> [_log.FightData.Logic.Targets.Count][];
     for (int i = 0; i < _log.FightData.Logic.Targets.Count; i++)
     {
         Target target = _log.FightData.Logic.Targets[i];
         res[i] = BuildDamageDist(p, target);
     }
     return(res);
 }
コード例 #6
0
 private List <JsonDamageDist>[] BuildDamageTaken(AbstractMasterActor p)
 {
     List <JsonDamageDist>[] res = new List <JsonDamageDist> [_phases.Count];
     for (int i = 0; i < _phases.Count; i++)
     {
         PhaseData phase = _phases[i];
         res[i] = BuildDamageDist(p.GetDamageTakenLogs(null, _log, phase.Start, phase.End));
     }
     return(res);
 }
コード例 #7
0
 private List <JsonDamageDist>[] BuildDamageDist(AbstractMasterActor p, Target target)
 {
     List <JsonDamageDist>[] res = new List <JsonDamageDist> [_phases.Count];
     for (int i = 0; i < _phases.Count; i++)
     {
         PhaseData phase = _phases[i];
         res[i] = BuildDamageDist(p.GetJustPlayerDamageLogs(target, _log, phase));
     }
     return(res);
 }
コード例 #8
0
        public override void ComputeMobCombatReplayActors(Mob mob, ParsedLog log, CombatReplay replay)
        {
            int start = (int)replay.TimeOffsets.start;
            int end   = (int)replay.TimeOffsets.end;

            switch (mob.ID)
            {
            case (ushort)EntropicDistortion:
                //sapping surge, red tether
                List <AbstractBuffEvent> sappingSurge = GetFilteredList(log.CombatData, 56118, mob, true);
                int surgeStart             = 0;
                AbstractMasterActor source = null;
                foreach (AbstractBuffEvent c in sappingSurge)
                {
                    if (c is BuffApplyEvent)
                    {
                        Target qadim = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.PeerlessQadim);
                        surgeStart = (int)c.Time;
                        source     = (AbstractMasterActor)log.PlayerList.FirstOrDefault(x => x.AgentItem == c.By) ?? qadim;
                    }
                    else
                    {
                        int surgeEnd = (int)c.Time;
                        if (source != null)
                        {
                            replay.Actors.Add(new LineActor(0, (surgeStart, surgeEnd), "rgba(255, 0, 0, 0.3)", new AgentConnector(mob), new AgentConnector(source)));
                        }
                    }
                }
                break;

            case (ushort)BigKillerTornado:
                replay.Actors.Add(new CircleActor(true, 0, 450, (start, end), "rgba(255, 150, 0, 0.4)", new AgentConnector(mob)));
                break;

            case (ushort)Pylon1:
                break;

            case (ushort)Pylon2:
                break;

            case (ushort)EnergyOrb:
                break;

            default:
                throw new InvalidOperationException("Unknown ID in ComputeAdditionalData");
            }
        }
コード例 #9
0
        private List <JsonMinions> BuildMinions(AbstractMasterActor master)
        {
            List <JsonMinions> mins = new List <JsonMinions>();

            foreach (Minions minions in master.GetMinions(_log).Values)
            {
                JsonMinions min = new JsonMinions()
                {
                    name             = minions.Character,
                    rotation         = BuildRotation(minions.GetCastLogs(_log, 0, _log.FightData.FightDuration)),
                    totalDamageDist  = BuildDamageDist(minions, null),
                    targetDamageDist = BuildDamageDist(minions),
                };
                mins.Add(min);
            }
            return(mins);
        }
コード例 #10
0
        //
        protected static List <CombatItem> GetFilteredList(CombatData combatData, long skillID, AbstractMasterActor target, bool beginWithStart)
        {
            bool needStart             = beginWithStart;
            List <CombatItem> main     = combatData.GetBoonData(skillID).Where(x => ((x.DstInstid == target.InstID && x.IsBuffRemove == ParseEnum.BuffRemove.None) || (x.SrcInstid == target.InstID && x.IsBuffRemove == ParseEnum.BuffRemove.Manual)) && x.Time >= target.FirstAware && x.Time <= target.LastAware).ToList();
            List <CombatItem> filtered = new List <CombatItem>();

            for (int i = 0; i < main.Count; i++)
            {
                CombatItem c = main[i];
                if (needStart && c.IsBuffRemove == ParseEnum.BuffRemove.None)
                {
                    needStart = false;
                    filtered.Add(c);
                }
                else if (!needStart && c.IsBuffRemove == ParseEnum.BuffRemove.Manual)
                {
                    // consider only last remove event before another application
                    if ((i == main.Count - 1) || (i < main.Count - 1 && main[i + 1].IsBuffRemove == ParseEnum.BuffRemove.None))
                    {
                        needStart = true;
                        filtered.Add(c);
                    }
                }
            }
            return(filtered);
        }
コード例 #11
0
        public override void ComputePlayerCombatReplayActors(Player p, ParsedLog log, CombatReplay replay)
        {
            // fixated
            List <AbstractBuffEvent> fixated = GetFilteredList(log.CombatData, 56510, p, true);
            int fixatedStart = 0;

            foreach (AbstractBuffEvent c in fixated)
            {
                if (c is BuffApplyEvent)
                {
                    fixatedStart = Math.Max((int)c.Time, 0);
                }
                else
                {
                    int fixatedEnd = (int)c.Time;
                    replay.Actors.Add(new CircleActor(true, 0, 120, (fixatedStart, fixatedEnd), "rgba(255, 80, 255, 0.3)", new AgentConnector(p)));
                }
            }
            // Magma drop
            List <AbstractBuffEvent> magmaDrop = GetFilteredList(log.CombatData, 56475, p, true);
            int magmaDropStart = 0;
            int magmaRadius    = 420;
            int magmaOffset    = 4000;

            foreach (AbstractBuffEvent c in magmaDrop)
            {
                if (c is BuffApplyEvent)
                {
                    magmaDropStart = (int)c.Time;
                }
                else
                {
                    int magmaDropEnd = (int)c.Time;
                    replay.Actors.Add(new CircleActor(true, 0, magmaRadius, (magmaDropStart, magmaDropEnd), "rgba(255, 150, 0, 0.15)", new AgentConnector(p)));
                    replay.Actors.Add(new CircleActor(true, magmaDropEnd, magmaRadius, (magmaDropStart, magmaDropEnd), "rgba(255, 150, 0, 0.25)", new AgentConnector(p)));
                    Point3D magmaNextPos = replay.PolledPositions.FirstOrDefault(x => x.Time >= magmaDropEnd);
                    Point3D magmaPrevPos = replay.PolledPositions.LastOrDefault(x => x.Time <= magmaDropEnd);
                    if (magmaNextPos != null || magmaPrevPos != null)
                    {
                        replay.Actors.Add(new CircleActor(true, 0, magmaRadius, (magmaDropEnd, magmaDropEnd + magmaOffset), "rgba(255, 220, 50, 0.15)", new InterpolatedPositionConnector(magmaPrevPos, magmaNextPos, magmaDropEnd)));
                        replay.Actors.Add(new CircleActor(true, magmaDropEnd + magmaOffset, magmaRadius, (magmaDropEnd, magmaDropEnd + magmaOffset), "rgba(255, 220, 50, 0.25)", new InterpolatedPositionConnector(magmaPrevPos, magmaNextPos, magmaDropEnd)));
                        replay.Actors.Add(new CircleActor(true, 0, magmaRadius, (magmaDropEnd + magmaOffset, (int)log.FightData.FightDuration), "rgba(255, 220, 50, 0.5)", new InterpolatedPositionConnector(magmaPrevPos, magmaNextPos, magmaDropEnd)));
                    }
                }
            }
            //sapping surge, bad red tether
            List <AbstractBuffEvent> sappingSurge = GetFilteredList(log.CombatData, 56118, p, true);
            int surgeStart             = 0;
            AbstractMasterActor source = null;

            foreach (AbstractBuffEvent c in sappingSurge)
            {
                if (c is BuffApplyEvent)
                {
                    Target qadim = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.PeerlessQadim);
                    surgeStart = (int)c.Time;
                    source     = (AbstractMasterActor)log.PlayerList.FirstOrDefault(x => x.AgentItem == c.By) ?? qadim;
                }
                else
                {
                    int surgeEnd = (int)c.Time;
                    if (source != null)
                    {
                        replay.Actors.Add(new LineActor(0, (surgeStart, surgeEnd), "rgba(255, 0, 0, 0.4)", new AgentConnector(p), new AgentConnector(source)));
                    }
                }
            }
            // kinetic abundance, good (blue) tether
            List <AbstractBuffEvent> kineticAbundance = GetFilteredList(log.CombatData, 56609, p, true);
            int kinStart = 0;
            AbstractMasterActor kinSource = null;

            foreach (AbstractBuffEvent c in kineticAbundance)
            {
                if (c is BuffApplyEvent)
                {
                    kinStart = (int)c.Time;
                    //kinSource = log.PlayerList.FirstOrDefault(x => x.AgentItem == c.By);
                    kinSource = (AbstractMasterActor)log.PlayerList.FirstOrDefault(x => x.AgentItem == c.By) ?? TrashMobs.FirstOrDefault(x => x.AgentItem == c.By);
                }
                else
                {
                    int kinEnd = (int)c.Time;
                    if (kinSource != null)
                    {
                        replay.Actors.Add(new LineActor(0, (kinStart, kinEnd), "rgba(0, 0, 255, 0.4)", new AgentConnector(p), new AgentConnector(kinSource)));
                    }
                }
            }
        }
コード例 #12
0
        //
        protected static List <AbstractBuffEvent> GetFilteredList(CombatData combatData, long buffID, AbstractMasterActor target, bool beginWithStart)
        {
            bool needStart = beginWithStart;
            List <AbstractBuffEvent> main     = combatData.GetBoonData(buffID).Where(x => x.To == target.AgentItem && (x is BuffApplyEvent || x is BuffRemoveAllEvent)).ToList();
            List <AbstractBuffEvent> filtered = new List <AbstractBuffEvent>();

            for (int i = 0; i < main.Count; i++)
            {
                AbstractBuffEvent c = main[i];
                if (needStart && c is BuffApplyEvent)
                {
                    needStart = false;
                    filtered.Add(c);
                }
                else if (!needStart && c is BuffRemoveAllEvent)
                {
                    // consider only last remove event before another application
                    if ((i == main.Count - 1) || (i < main.Count - 1 && main[i + 1] is BuffApplyEvent))
                    {
                        needStart = true;
                        filtered.Add(c);
                    }
                }
            }
            return(filtered);
        }