예제 #1
0
        public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases)
        {
            List <PhaseData> phases = GetInitialPhase(log);
            NPC mainTarget          = Targets.Find(x => x.ID == (int)ParseEnum.TargetIDS.Samarog);

            if (mainTarget == null)
            {
                throw new InvalidOperationException("Samarog not found");
            }
            phases[0].Targets.Add(mainTarget);
            if (!requirePhases)
            {
                return(phases);
            }
            // Determined check
            phases.AddRange(GetPhasesByInvul(log, 762, mainTarget, true, true));
            for (int i = 1; i < phases.Count; i++)
            {
                PhaseData phase = phases[i];
                if (i % 2 == 0)
                {
                    phase.Name = "Split " + i / 2;
                    var ids = new List <int>
                    {
                        (int)Rigom,
                        (int)Guldhem
                    };
                    AddTargetsToPhase(phase, ids, log);
                    foreach (NPC t in phase.Targets)
                    {
                        t.OverrideName(t.Character + " " + i / 2);
                    }
                }
                else
                {
                    phase.Name = "Phase " + (i + 1) / 2;
                    phase.Targets.Add(mainTarget);
                }
            }
            return(phases);
        }
예제 #2
0
        internal override List <PhaseData> GetPhases(ParsedEvtcLog log, bool requirePhases)
        {
            List <PhaseData> phases = GetInitialPhase(log);
            NPC mainTarget          = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.Samarog);

            if (mainTarget == null)
            {
                throw new MissingKeyActorsException("Samarog not found");
            }
            phases[0].AddTarget(mainTarget);
            if (!requirePhases)
            {
                return(phases);
            }
            // Determined check
            phases.AddRange(GetPhasesByInvul(log, 762, mainTarget, true, true));
            for (int i = 1; i < phases.Count; i++)
            {
                PhaseData phase = phases[i];
                if (i % 2 == 0)
                {
                    phase.Name = "Split " + i / 2;
                    var ids = new List <int>
                    {
                        (int)ArcDPSEnums.TrashID.Rigom,
                        (int)ArcDPSEnums.TrashID.Guldhem
                    };
                    AddTargetsToPhaseAndFit(phase, ids, log);
                    foreach (NPC t in phase.Targets)
                    {
                        t.OverrideName(t.Character + " " + i / 2);
                    }
                }
                else
                {
                    phase.Name = "Phase " + (i + 1) / 2;
                    phase.AddTarget(mainTarget);
                }
            }
            return(phases);
        }
예제 #3
0
        internal override List <PhaseData> GetPhases(ParsedEvtcLog log, bool requirePhases)
        {
            List <PhaseData> phases = GetInitialPhase(log);
            NPC mainTarget          = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.Sabir);

            if (mainTarget == null)
            {
                throw new MissingKeyActorsException("Sabir not found");
            }
            phases[0].AddTarget(mainTarget);
            if (!requirePhases)
            {
                return(phases);
            }
            IReadOnlyList <AbstractCastEvent> cls = mainTarget.GetCastEvents(log, 0, log.FightData.FightEnd);
            var  wallopingWinds = cls.Where(x => x.SkillId == 56094).ToList();
            long start = 0, end = 0;

            for (int i = 0; i < wallopingWinds.Count; i++)
            {
                AbstractCastEvent wallopinbWind = wallopingWinds[i];
                end = wallopinbWind.Time;
                var phase = new PhaseData(start, end, "Phase " + (i + 1));
                phase.AddTarget(mainTarget);
                phases.Add(phase);
                AbstractCastEvent nextAttack = cls.FirstOrDefault(x => x.Time >= wallopinbWind.EndTime && (x.SkillId == 56620 || x.SkillId == 56629 || x.SkillId == 56307));
                if (nextAttack == null)
                {
                    break;
                }
                start = nextAttack.Time;
                if (i == wallopingWinds.Count - 1)
                {
                    phase = new PhaseData(start, log.FightData.FightEnd, "Phase " + (i + 2));
                    phase.AddTarget(mainTarget);
                    phases.Add(phase);
                }
            }

            return(phases);
        }
        public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases)
        {
            long             fightDuration = log.FightData.FightDuration;
            List <PhaseData> phases        = GetInitialPhase(log);
            Target           mainTarget    = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.SoullessHorror);

            if (mainTarget == null)
            {
                throw new InvalidOperationException("Main target of the fight not found");
            }
            phases[0].Targets.Add(mainTarget);
            if (!requirePhases)
            {
                return(phases);
            }
            List <CastLog> howling = mainTarget.GetCastLogs(log, 0, log.FightData.FightDuration).Where(x => x.SkillId == 48662).ToList();
            long           start   = 0;
            int            i       = 1;

            foreach (CastLog c in howling)
            {
                PhaseData phase = new PhaseData(start, Math.Min(c.Time, fightDuration))
                {
                    Name = "Pre-Breakbar " + i++
                };
                phase.Targets.Add(mainTarget);
                start = c.Time + c.ActualDuration;
                phases.Add(phase);
            }
            if (fightDuration - start > 3000)
            {
                PhaseData lastPhase = new PhaseData(start, fightDuration)
                {
                    Name = "Final"
                };
                lastPhase.Targets.Add(mainTarget);
                phases.Add(lastPhase);
            }
            phases.RemoveAll(x => x.GetDuration() <= 1000);
            return(phases);
        }
예제 #5
0
        public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases)
        {
            List <PhaseData> phases = GetInitialPhase(log);
            NPC mainTarget          = Targets.Find(x => x.ID == (int)ParseEnum.TargetIDS.Sabir);

            if (mainTarget == null)
            {
                throw new InvalidOperationException("Sabir not found");
            }
            phases[0].Targets.Add(mainTarget);
            if (!requirePhases)
            {
                return(phases);
            }
            List <AbstractCastEvent> cls = mainTarget.GetCastLogs(log, 0, log.FightData.FightEnd);
            var  wallopingWinds = cls.Where(x => x.SkillId == 56094).ToList();
            long start = 0, end = 0;

            for (int i = 0; i < wallopingWinds.Count; i++)
            {
                AbstractCastEvent wW = wallopingWinds[i];
                end = wW.Time;
                var phase = new PhaseData(start, end, "Phase " + (i + 1));
                phase.Targets.Add(mainTarget);
                phases.Add(phase);
                AbstractCastEvent nextAttack = cls.FirstOrDefault(x => x.Time >= end + wW.ActualDuration && (x.SkillId == 56620 || x.SkillId == 56629 || x.SkillId == 56307));
                if (nextAttack == null)
                {
                    break;
                }
                start = nextAttack.Time;
                if (i == wallopingWinds.Count - 1)
                {
                    phase = new PhaseData(start, log.FightData.FightEnd, "Phase " + (i + 2));
                    phase.Targets.Add(mainTarget);
                    phases.Add(phase);
                }
            }

            return(phases);
        }
예제 #6
0
        private static List <PhaseData> GetTargetPhases(ParsedLog log, NPC target, string baseName)
        {
            long start         = 0;
            long end           = 0;
            long fightDuration = log.FightData.FightEnd;
            var  targetPhases  = new List <PhaseData>();
            var  states        = new List <AbstractTimeCombatEvent>();

            states.AddRange(log.CombatData.GetEnterCombatEvents(target.AgentItem));
            states.AddRange(GetFilteredList(log.CombatData, 762, target, true).Where(x => x is BuffApplyEvent));
            states.AddRange(log.CombatData.GetDeadEvents(target.AgentItem));
            states.Sort((x, y) => x.Time.CompareTo(y.Time));
            for (int i = 0; i < states.Count; i++)
            {
                AbstractTimeCombatEvent state = states[i];
                if (state is EnterCombatEvent)
                {
                    start = state.Time;
                    if (i == states.Count - 1)
                    {
                        targetPhases.Add(new PhaseData(start, fightDuration));
                    }
                }
                else
                {
                    end = Math.Min(state.Time, fightDuration);
                    targetPhases.Add(new PhaseData(start, end));
                    if (i == states.Count - 1 && targetPhases.Count < 3)
                    {
                        targetPhases.Add(new PhaseData(end, fightDuration));
                    }
                }
            }
            for (int i = 0; i < targetPhases.Count; i++)
            {
                PhaseData phase = targetPhases[i];
                phase.Name = baseName + " P" + (i + 1);
                phase.Targets.Add(target);
            }
            return(targetPhases);
        }
예제 #7
0
        public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases)
        {
            List <PhaseData> phases = GetInitialPhase(log);
            NPC mama = Targets.Find(x => x.ID == (int)ParseEnum.TargetIDS.MAMA);

            if (mama == null)
            {
                throw new InvalidOperationException("Error Encountered: MAMA not found");
            }
            phases[0].Targets.Add(mama);
            if (!requirePhases)
            {
                return(phases);
            }
            phases.AddRange(GetPhasesByInvul(log, 762, mama, true, true));
            string[] namesMAMA = new[] { "Phase 1", "Red Knight", "Phase 2", "Green Knight", "Phase 3", "Blue Knight", "Phase 4" };
            if (phases.Count - 1 > namesMAMA.Length)
            {
                throw new InvalidOperationException("Error Encountered: too many phases on MAMA");
            }
            for (int i = 1; i < phases.Count; i++)
            {
                PhaseData phase = phases[i];
                phase.Name = namesMAMA[i - 1];
                if (i == 2 || i == 4 || i == 6)
                {
                    var ids = new List <int>
                    {
                        (int)GreenKnight,
                        (int)RedKnight,
                        (int)BlueKnight,
                    };
                    AddTargetsToPhase(phase, ids, log);
                }
                else
                {
                    phase.Targets.Add(mama);
                }
            }
            return(phases);
        }
예제 #8
0
        public static List <PlayerChartDataDto> BuildPlayersGraphData(ParsedLog log, int phaseIndex)
        {
            var       list  = new List <PlayerChartDataDto>();
            PhaseData phase = log.FightData.GetPhases(log)[phaseIndex];

            foreach (Player p in log.PlayerList)
            {
                var pChar = new PlayerChartDataDto()
                {
                    Total        = p.Get1SDamageList(log, phaseIndex, phase, null),
                    Targets      = new List <List <int> >(),
                    HealthStates = ChartDataDto.BuildHealthGraphStates(log, p, log.FightData.GetPhases(log)[phaseIndex], true)
                };
                foreach (NPC target in phase.Targets)
                {
                    pChar.Targets.Add(p.Get1SDamageList(log, phaseIndex, phase, target));
                }
                list.Add(pChar);
            }
            return(list);
        }
    PhaseData CopyPhaseData()
    {
        //Copy over the phase data to the struct for player data.
        data = new PhaseData();

        data.ComboToComplete  = ComboCompletionRequirement;
        data.BossesToComplete = BossCompletionRequirement;
        data.WavesToBoss      = WaveCountForBoss;
        data.ScoreMultiplier  = ScoreMultiplier;
        data.Description      = Description;
        data.IconTextureName  = IconTextureName;

        data.Label = "Phase Name: " + this.name;

        data.PhaseStatistics = GameObjectTracker.GetGOT().PushStatistics("PhaseStat_" + this.name, ScoreMultiplier);

        //Set the name of the phase so we can find in the scene view easily.
        name = "GamePhase_" + name;

        return(data);
    }
        private FinalDPS GetFinalDPS(AbstractPlayer player, int phaseIndex, Boss target)
        {
            PhaseData phase         = _statistics.Phases[phaseIndex];
            double    phaseDuration = (phase.GetDuration()) / 1000.0;
            double    damage;
            double    dps   = 0.0;
            FinalDPS  final = new FinalDPS();

            //DPS
            damage = player.GetDamageLogs(target, _log,
                                          phase.Start, phase.End).Sum(x => x.Damage);

            if (phaseDuration > 0)
            {
                dps = damage / phaseDuration;
            }
            final.Dps    = (int)dps;
            final.Damage = (int)damage;
            //Condi DPS
            damage = player.GetDamageLogs(target, _log,
                                          phase.Start, phase.End).Where(x => x.IsCondi > 0).Sum(x => x.Damage);

            if (phaseDuration > 0)
            {
                dps = damage / phaseDuration;
            }
            final.CondiDps    = (int)dps;
            final.CondiDamage = (int)damage;
            //Power DPS
            damage = final.Damage - final.CondiDamage;
            if (phaseDuration > 0)
            {
                dps = damage / phaseDuration;
            }
            final.PowerDps          = (int)dps;
            final.PowerDamage       = (int)damage;
            final.PlayerPowerDamage = player.GetJustPlayerDamageLogs(target, _log,
                                                                     phase.Start, phase.End).Where(x => x.IsCondi == 0).Sum(x => x.Damage);
            return(final);
        }
예제 #11
0
        private List <PhaseData> GetTargetPhases(ParsedLog log, Target target, string[] names)
        {
            long              start         = 0;
            long              end           = 0;
            long              fightDuration = log.FightData.FightDuration;
            List <PhaseData>  targetPhases  = new List <PhaseData>();
            List <CombatItem> states        = log.CombatData.GetStatesData(target.InstID, ParseEnum.StateChange.EnterCombat, target.FirstAware, target.LastAware);

            states.AddRange(GetFilteredList(log, 762, target, true).Where(x => x.IsBuffRemove == ParseEnum.BuffRemove.None));
            states.AddRange(log.CombatData.GetStatesData(target.InstID, ParseEnum.StateChange.ChangeDead, target.FirstAware, target.LastAware));
            states.Sort((x, y) => x.Time.CompareTo(y.Time));
            for (int i = 0; i < states.Count; i++)
            {
                CombatItem state = states[i];
                if (state.IsStateChange == ParseEnum.StateChange.EnterCombat)
                {
                    start = log.FightData.ToFightSpace(state.Time);
                    if (i == states.Count - 1)
                    {
                        targetPhases.Add(new PhaseData(start, fightDuration));
                    }
                }
                else
                {
                    end = Math.Min(log.FightData.ToFightSpace(state.Time), fightDuration);
                    targetPhases.Add(new PhaseData(start, end));
                    if (i == states.Count - 1 && targetPhases.Count < 3)
                    {
                        targetPhases.Add(new PhaseData(end, fightDuration));
                    }
                }
            }
            for (int i = 0; i < targetPhases.Count; i++)
            {
                PhaseData phase = targetPhases[i];
                phase.Name = names[i];
                phase.Targets.Add(target);
            }
            return(targetPhases);
        }
예제 #12
0
        internal override List <PhaseData> GetPhases(ParsedEvtcLog log, bool requirePhases)
        {
            long             fightDuration = log.FightData.FightEnd;
            List <PhaseData> phases        = GetInitialPhase(log);
            NPC mainTarget = GetMainTarget();

            if (mainTarget == null)
            {
                throw new MissingKeyActorsException("Xera not found");
            }
            phases[0].AddTarget(mainTarget);
            if (requirePhases)
            {
                AbstractBuffEvent invulXera = GetInvulXeraEvent(log, mainTarget);
                // split happened
                if (invulXera != null)
                {
                    var phase1 = new PhaseData(0, invulXera.Time, "Phase 1");
                    phase1.AddTarget(mainTarget);
                    phases.Add(phase1);

                    var glidingEndTime = _xeraSecondPhaseStartTime > 0 ? _xeraSecondPhaseStartTime : fightDuration;
                    var glidingPhase   = new PhaseData(invulXera.Time, glidingEndTime, "Gliding");
                    glidingPhase.AddTargets(Targets.Where(t => t.ID == (int)ArcDPSEnums.TrashID.ChargedBloodstone));
                    phases.Add(glidingPhase);

                    if (_xeraSecondPhaseStartTime > 0)
                    {
                        var phase2 = new PhaseData(_xeraSecondPhaseStartTime, fightDuration, "Phase 2");
                        mainTarget.SetManualHealth(24085950);
                        phase2.AddTarget(mainTarget);
                        phase2.AddTargets(Targets.Where(t => t.ID == (int)ArcDPSEnums.TrashID.BloodstoneShard));
                        //mainTarget.AddCustomCastLog(end, -5, (int)(start - end), ParseEnum.Activation.None, (int)(start - end), ParseEnum.Activation.None, log);
                        phases.Add(phase2);
                    }
                }
            }
            return(phases);
        }
예제 #13
0
        public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases)
        {
            long             fightDuration = log.FightData.FightDuration;
            List <PhaseData> phases        = GetInitialPhase(log);
            Target           mainTarget    = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.Slothasor);

            if (mainTarget == null)
            {
                throw new InvalidOperationException("Main target of the fight not found");
            }
            phases[0].Targets.Add(mainTarget);
            if (!requirePhases)
            {
                return(phases);
            }
            List <AbstractCastEvent> sleepy = mainTarget.GetCastLogs(log, 0, log.FightData.FightDuration).Where(x => x.SkillId == 34515).ToList();
            long start = 0;
            int  i     = 1;

            foreach (AbstractCastEvent c in sleepy)
            {
                PhaseData phase = new PhaseData(start, Math.Min(c.Time, fightDuration))
                {
                    Name = "Phase " + i++
                };
                phase.Targets.Add(mainTarget);
                start = c.Time + c.ActualDuration;
                phases.Add(phase);
            }
            PhaseData lastPhase = new PhaseData(start, fightDuration)
            {
                Name = "Phase " + i++
            };

            lastPhase.Targets.Add(mainTarget);
            phases.Add(lastPhase);
            phases.RemoveAll(x => x.DurationInMS <= 1000);
            return(phases);
        }
        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;
            }
        }
        internal override List <PhaseData> GetPhases(ParsedEvtcLog log, bool requirePhases)
        {
            // generic method for fractals
            List <PhaseData>    phases   = GetInitialPhase(log);
            AbstractSingleActor skorvald = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.Skorvald);

            if (skorvald == null)
            {
                throw new MissingKeyActorsException("Skorvald not found");
            }
            phases[0].AddTarget(skorvald);
            if (!requirePhases)
            {
                return(phases);
            }
            phases.AddRange(GetPhasesByInvul(log, 762, skorvald, true, true));
            for (int i = 1; i < phases.Count; i++)
            {
                PhaseData phase = phases[i];
                if (i % 2 == 0)
                {
                    phase.Name = "Split " + (i) / 2;
                    var ids = new List <int>
                    {
                        (int)ArcDPSEnums.TrashID.FluxAnomaly4,
                        (int)ArcDPSEnums.TrashID.FluxAnomaly3,
                        (int)ArcDPSEnums.TrashID.FluxAnomaly2,
                        (int)ArcDPSEnums.TrashID.FluxAnomaly1,
                    };
                    AddTargetsToPhaseAndFit(phase, ids, log);
                }
                else
                {
                    phase.Name = "Phase " + (i + 1) / 2;
                    phase.AddTarget(skorvald);
                }
            }
            return(phases);
        }
        private void CreateDefTable(int phaseIndex)
        {
            //generate defstats table
            WriteLine(new[] { "Sub Group", "Profession", "Name",
                              "DMG Taken", "DMG Barrier", "Blocked", "Invulned", "Evaded", "Dodges" });
            int       count = 0;
            PhaseData phase = _phases[phaseIndex];

            foreach (Player player in _noFakePlayers)
            {
                FinalDefensesAll defenses = player.GetDefenseStats(_log, phase.Start, phase.End);

                WriteLine(new[] { player.Group.ToString(), player.Spec.ToString(), player.Character,
                                  defenses.DamageTaken.ToString(), defenses.DamageBarrier.ToString(), defenses.BlockedCount.ToString(), defenses.InvulnedCount.ToString(), defenses.EvadedCount.ToString(), defenses.DodgeCount.ToString() });
                count++;
            }
            while (count < 15)//so each graph has equal spacing
            {
                NewLine();
                count++;
            }
        }
예제 #17
0
        private static List <object> GetDefenseStatData(FinalDefensesAll defenses, PhaseData phase)
        {
            var data = new List <object>
            {
                defenses.DamageTaken,
                defenses.DamageBarrier,
                defenses.MissedCount,
                defenses.InterruptedCount,
                defenses.InvulnedCount,
                defenses.EvadedCount,
                defenses.BlockedCount,
                defenses.DodgeCount,
            };

            if (defenses.DownDuration > 0)
            {
                var downDuration = TimeSpan.FromMilliseconds(defenses.DownDuration);
                data.Add(defenses.DownCount);
                data.Add(downDuration.TotalSeconds + " seconds downed, " + Math.Round((downDuration.TotalMilliseconds / phase.DurationInMS) * 100, 1) + "% Downed");
            }
            else
            {
                data.Add(0);
                data.Add("0% downed");
            }

            if (defenses.DeadCount > 0)
            {
                var deathDuration = TimeSpan.FromMilliseconds(defenses.DeadDuration);
                data.Add(defenses.DeadCount);
                data.Add(deathDuration.TotalSeconds + " seconds dead, " + (100.0 - Math.Round((deathDuration.TotalMilliseconds / phase.DurationInMS) * 100, 1)) + "% Alive");
            }
            else
            {
                data.Add(0);
                data.Add("100% Alive");
            }
            return(data);
        }
        private FinalDPS GetFinalDPS(AbstractActor player, int phaseIndex, Target target)
        {
            PhaseData phase         = _statistics.Phases[phaseIndex];
            double    phaseDuration = (phase.GetDuration()) / 1000.0;
            int       damage;
            double    dps   = 0.0;
            FinalDPS  final = new FinalDPS();

            //DPS
            damage = player.GetDamageLogs(target, _log,
                                          phase.Start, phase.End).Sum(x => x.Damage);

            if (phaseDuration > 0)
            {
                dps = damage / phaseDuration;
            }
            final.Dps    = (int)Math.Round(dps);
            final.Damage = damage;
            //Condi DPS
            damage = player.GetDamageLogs(target, _log,
                                          phase.Start, phase.End).Sum(x => x.IsCondi ? x.Damage : 0);

            if (phaseDuration > 0)
            {
                dps = damage / phaseDuration;
            }
            final.CondiDps    = (int)Math.Round(dps);
            final.CondiDamage = damage;
            //Power DPS
            damage = final.Damage - final.CondiDamage;
            if (phaseDuration > 0)
            {
                dps = damage / phaseDuration;
            }
            final.PowerDps    = (int)Math.Round(dps);
            final.PowerDamage = damage;
            return(final);
        }
예제 #19
0
        public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases)
        {
            List <PhaseData> phases     = GetInitialPhase(log);
            Target           mainTarget = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.ValeGuardian);

            if (mainTarget == null)
            {
                throw new InvalidOperationException("Main target of the fight not found");
            }
            phases[0].Targets.Add(mainTarget);
            if (!requirePhases)
            {
                return(phases);
            }
            // Invul check
            phases.AddRange(GetPhasesByInvul(log, 757, mainTarget, true, true));
            string[] namesVG = new[] { "Phase 1", "Split 1", "Phase 2", "Split 2", "Phase 3" };
            for (int i = 1; i < phases.Count; i++)
            {
                PhaseData phase = phases[i];
                phase.Name = namesVG[i - 1];
                if (i == 2 || i == 4)
                {
                    List <ushort> ids = new List <ushort>
                    {
                        (ushort)BlueGuardian,
                        (ushort)GreenGuardian,
                        (ushort)RedGuardian
                    };
                    AddTargetsToPhase(phase, ids, log);
                }
                else
                {
                    phase.Targets.Add(mainTarget);
                }
            }
            return(phases);
        }
예제 #20
0
        private static List <PhaseData> GetSubPhases(AbstractSingleActor eye, ParsedEvtcLog log)
        {
            var res = new List <PhaseData>();
            BuffRemoveAllEvent det762Loss = log.CombatData.GetBuffData(SkillIDs.Determined762).OfType <BuffRemoveAllEvent>().Where(x => x.To == eye.AgentItem).FirstOrDefault();

            if (det762Loss != null)
            {
                int  count = 0;
                long start = det762Loss.Time;
                List <AbstractBuffEvent> det895s = GetFilteredList(log.CombatData, Determined895, eye, true, true);
                foreach (AbstractBuffEvent abe in det895s)
                {
                    if (abe is BuffApplyEvent)
                    {
                        var phase = new PhaseData(start, Math.Min(abe.Time, log.FightData.FightDuration))
                        {
                            Name = eye.Character + " " + (++count)
                        };
                        phase.AddTarget(eye);
                        res.Add(phase);
                    }
                    else
                    {
                        start = Math.Min(abe.Time, log.FightData.FightDuration);
                    }
                }
                if (start < log.FightData.FightDuration)
                {
                    var phase = new PhaseData(start, log.FightData.FightDuration)
                    {
                        Name = eye.Character + " " + (++count)
                    };
                    phase.AddTarget(eye);
                    res.Add(phase);
                }
            }
            return(res);
        }
예제 #21
0
        internal override List <PhaseData> GetPhases(ParsedEvtcLog log, bool requirePhases)
        {
            List <PhaseData>    phases     = GetInitialPhase(log);
            AbstractSingleActor mainTarget = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.ValeGuardian);

            if (mainTarget == null)
            {
                throw new MissingKeyActorsException("Vale Guardian not found");
            }
            phases[0].AddTarget(mainTarget);
            if (!requirePhases)
            {
                return(phases);
            }
            // Invul check
            phases.AddRange(GetPhasesByInvul(log, 757, mainTarget, true, true));
            for (int i = 1; i < phases.Count; i++)
            {
                PhaseData phase = phases[i];
                if (i % 2 == 0)
                {
                    phase.Name = "Split " + (i) / 2;
                    var ids = new List <int>
                    {
                        (int)ArcDPSEnums.TrashID.BlueGuardian,
                        (int)ArcDPSEnums.TrashID.GreenGuardian,
                        (int)ArcDPSEnums.TrashID.RedGuardian
                    };
                    AddTargetsToPhaseAndFit(phase, ids, log);
                }
                else
                {
                    phase.Name = "Phase " + (i + 1) / 2;
                    phase.AddTarget(mainTarget);
                }
            }
            return(phases);
        }
        private void CreateSupTable(int phaseIndex)
        {
            PhaseData phase = _phases[phaseIndex];

            //generate supstats table
            WriteLine(new[] { "Sub Group", "Profession", "Name",
                              "Condi Cleanse", "Condi Cleanse time", "Condi Cleanse Self", "Condi Cleanse time self", "Boon Strips", "Boon Strips time", "Resurrects", "Time Resurecting" });
            int count = 0;

            foreach (Player player in _noFakePlayers)
            {
                FinalToPlayersSupport support = player.GetToPlayerSupportStats(_log, phase.Start, phase.End);

                WriteLine(new[] { player.Group.ToString(), player.Spec.ToString(), player.Character,
                                  support.CondiCleanse.ToString(), support.CondiCleanseTime.ToString(), support.CondiCleanseSelf.ToString(), support.CondiCleanseTimeSelf.ToString(), support.BoonStrips.ToString(), support.BoonStripsTime.ToString(), support.Resurrects.ToString(), support.ResurrectTime.ToString() });
                count++;
            }
            while (count < 15)//so each graph has equal spacing
            {
                NewLine();
                count++;
            }
        }
예제 #23
0
 private static void AddSplitPhase(List <PhaseData> phases, IReadOnlyList <AbstractSingleActor> targets, AbstractSingleActor ministerLi, ParsedEvtcLog log, int phaseID)
 {
     if (targets.All(x => x != null))
     {
         EnterCombatEvent cbtEnter = null;
         foreach (NPC target in targets)
         {
             cbtEnter = log.CombatData.GetEnterCombatEvents(target.AgentItem).LastOrDefault();
             if (cbtEnter != null)
             {
                 break;
             }
         }
         if (cbtEnter != null)
         {
             AbstractBuffEvent nextPhaseStartEvt = log.CombatData.GetBuffData(ministerLi.AgentItem).FirstOrDefault(x => x is BuffRemoveAllEvent && x.BuffID == 762 && x.Time > cbtEnter.Time);
             long phaseEnd = nextPhaseStartEvt != null ? nextPhaseStartEvt.Time : log.FightData.FightEnd;
             var  addPhase = new PhaseData(cbtEnter.Time, phaseEnd, "Split Phase " + phaseID);
             addPhase.AddTargets(targets);
             phases.Add(addPhase);
         }
     }
 }
        internal static List <BuffChartDataDto> BuildBoonGraphData(ParsedEvtcLog log, AbstractSingleActor p, int phaseIndex, Dictionary <long, Buff> usedBuffs)
        {
            var       list          = new List <BuffChartDataDto>();
            PhaseData phase         = log.FightData.GetPhases(log)[phaseIndex];
            var       boonGraphData = p.GetBuffGraphs(log).ToDictionary(x => x.Key, x => x.Value);

            BuildBoonGraphData(list, log.Statistics.PresentBoons, boonGraphData, phase, usedBuffs);
            BuildBoonGraphData(list, log.Statistics.PresentConditions, boonGraphData, phase, usedBuffs);
            BuildBoonGraphData(list, log.Statistics.PresentOffbuffs, boonGraphData, phase, usedBuffs);
            BuildBoonGraphData(list, log.Statistics.PresentSupbuffs, boonGraphData, phase, usedBuffs);
            BuildBoonGraphData(list, log.Statistics.PresentDefbuffs, boonGraphData, phase, usedBuffs);
            foreach (BuffsGraphModel bgm in boonGraphData.Values)
            {
                BuffChartDataDto graph = BuildBuffGraph(bgm, phase, usedBuffs);
                if (graph != null)
                {
                    list.Add(graph);
                }
            }
            if (p.GetType() == typeof(Player))
            {
                foreach (NPC mainTarget in log.FightData.GetMainTargets(log))
                {
                    boonGraphData = mainTarget.GetBuffGraphs(log);
                    foreach (BuffsGraphModel bgm in boonGraphData.Values.Reverse().Where(x => x.Buff.Name == "Compromised" || x.Buff.Name == "Unnatural Signet" || x.Buff.Name == "Fractured - Enemy" || x.Buff.Name == "Erratic Energy"))
                    {
                        BuffChartDataDto graph = BuildBuffGraph(bgm, phase, usedBuffs);
                        if (graph != null)
                        {
                            list.Add(graph);
                        }
                    }
                }
            }
            list.Reverse();
            return(list);
        }
        public static JsonPhase BuildJsonPhase(PhaseData phase, ParsedEvtcLog log)
        {
            var jsPhase = new JsonPhase();

            jsPhase.Start = phase.Start;
            jsPhase.End   = phase.End;
            jsPhase.Name  = phase.Name;
            var targets = new List <int>();

            jsPhase.BreakbarPhase = phase.BreakbarPhase;
            foreach (AbstractSingleActor tar in phase.Targets)
            {
                targets.Add(log.FightData.Logic.Targets.IndexOf(tar));
            }
            jsPhase.Targets = targets;
            IReadOnlyList <PhaseData> phases = log.FightData.GetNonDummyPhases(log);

            if (!jsPhase.BreakbarPhase)
            {
                var subPhases = new List <int>();
                for (int j = 1; j < phases.Count; j++)
                {
                    PhaseData curPhase = phases[j];
                    if (curPhase.Start < jsPhase.Start || curPhase.End > jsPhase.End ||
                        (curPhase.Start == jsPhase.Start && curPhase.End == jsPhase.End) || !curPhase.CanBeSubPhase)
                    {
                        continue;
                    }
                    subPhases.Add(j);
                }
                if (subPhases.Any())
                {
                    jsPhase.SubPhases = subPhases;
                }
            }
            return(jsPhase);
        }
예제 #26
0
        internal override List <PhaseData> GetPhases(ParsedEvtcLog log, bool requirePhases)
        {
            List <PhaseData>    phases     = GetInitialPhase(log);
            AbstractSingleActor mainTarget = Targets.FirstOrDefault(x => x.ID == (int)ArcDPSEnums.TargetID.IcebroodConstruct);

            if (mainTarget == null)
            {
                throw new MissingKeyActorsException("Icebrood Construct not found");
            }
            phases[0].AddTarget(mainTarget);
            if (!requirePhases)
            {
                return(phases);
            }
            // Invul check
            phases.AddRange(GetPhasesByInvul(log, 757, mainTarget, false, true));
            for (int i = 1; i < phases.Count; i++)
            {
                PhaseData phase = phases[i];
                phase.Name = "Phase " + i;
                phase.AddTarget(mainTarget);
            }
            return(phases);
        }
예제 #27
0
        internal override List <PhaseData> GetPhases(ParsedEvtcLog log, bool requirePhases)
        {
            List <PhaseData> phases = GetInitialPhase(log);
            NPC mainTarget          = Targets.Find(x => x.ID == (int)ArcDPSEnums.TargetID.IcebroodConstruct);

            if (mainTarget == null)
            {
                throw new InvalidOperationException("Icebrood Construct not found");
            }
            phases[0].Targets.Add(mainTarget);
            if (!requirePhases)
            {
                return(phases);
            }
            // Invul check
            phases.AddRange(GetPhasesByInvul(log, 757, mainTarget, false, true));
            for (int i = 1; i < phases.Count; i++)
            {
                PhaseData phase = phases[i];
                phase.Name = "Phase " + i;
                phase.Targets.Add(mainTarget);
            }
            return(phases);
        }
예제 #28
0
        public static void SetPhasePerTarget(NPC target, List <PhaseData> phases, ParsedEvtcLog log)
        {
            long             fightDuration = log.FightData.FightEnd;
            EnterCombatEvent phaseStart    = log.CombatData.GetEnterCombatEvents(target.AgentItem).LastOrDefault();

            if (phaseStart != null)
            {
                long      start    = phaseStart.Time;
                DeadEvent phaseEnd = log.CombatData.GetDeadEvents(target.AgentItem).LastOrDefault();
                long      end      = fightDuration;
                if (phaseEnd != null)
                {
                    end = phaseEnd.Time;
                }
                var phase = new PhaseData(start, Math.Min(end, log.FightData.FightEnd));
                phase.Targets.Add(target);
                switch (target.ID)
                {
                case (int)ArcDPSEnums.TargetID.Narella:
                    phase.Name = "Narella";
                    break;

                case (int)ArcDPSEnums.TargetID.Berg:
                    phase.Name = "Berg";
                    break;

                case (int)ArcDPSEnums.TargetID.Zane:
                    phase.Name = "Zane";
                    break;

                default:
                    throw new InvalidOperationException("Unknown target in Bandit Trio");
                }
                phases.Add(phase);
            }
        }
예제 #29
0
        internal JsonPlayer(Player player, ParsedEvtcLog log, RawFormatSettings settings, Dictionary <string, JsonLog.SkillDesc> skillDesc, Dictionary <string, JsonLog.BuffDesc> buffDesc, Dictionary <string, JsonLog.DamageModDesc> damageModDesc, Dictionary <string, HashSet <long> > personalBuffs) : base(player, log, settings, skillDesc, buffDesc)
        {
            IReadOnlyList <PhaseData> phases = log.FightData.GetPhases(log);

            //
            Account         = player.Account;
            Weapons         = player.GetWeaponsArray(log).Select(w => w ?? "Unknown").ToArray();
            Group           = player.Group;
            Profession      = player.Prof;
            ActiveTimes     = phases.Select(x => player.GetActiveDuration(log, x.Start, x.End)).ToList();
            HasCommanderTag = player.HasCommanderTag;
            //
            Support = phases.Select(phase => new JsonStatistics.JsonPlayerSupport(player.GetPlayerSupportStats(log, phase.Start, phase.End))).ToArray();
            var targetDamage1S          = new IReadOnlyList <int> [log.FightData.Logic.Targets.Count][];
            var targetPowerDamage1S     = new IReadOnlyList <int> [log.FightData.Logic.Targets.Count][];
            var targetConditionDamage1S = new IReadOnlyList <int> [log.FightData.Logic.Targets.Count][];
            var targetBreakbarDamage1S  = new IReadOnlyList <double> [log.FightData.Logic.Targets.Count][];
            var dpsTargets       = new JsonStatistics.JsonDPS[log.FightData.Logic.Targets.Count][];
            var statsTargets     = new JsonStatistics.JsonGameplayStats[log.FightData.Logic.Targets.Count][];
            var targetDamageDist = new IReadOnlyList <JsonDamageDist> [log.FightData.Logic.Targets.Count][];

            for (int j = 0; j < log.FightData.Logic.Targets.Count; j++)
            {
                NPC target                     = log.FightData.Logic.Targets[j];
                var graph1SDamageList          = new IReadOnlyList <int> [phases.Count];
                var graph1SPowerDamageList     = new IReadOnlyList <int> [phases.Count];
                var graph1SConditionDamageList = new IReadOnlyList <int> [phases.Count];
                var graph1SBreakbarDamageList  = new IReadOnlyList <double> [phases.Count];
                var targetDamageDistList       = new IReadOnlyList <JsonDamageDist> [phases.Count];
                for (int i = 0; i < phases.Count; i++)
                {
                    PhaseData phase = phases[i];
                    if (settings.RawFormatTimelineArrays)
                    {
                        graph1SDamageList[i]          = player.Get1SDamageList(log, phase.Start, phase.End, target, DamageType.All);
                        graph1SPowerDamageList[i]     = player.Get1SDamageList(log, phase.Start, phase.End, target, DamageType.Power);
                        graph1SConditionDamageList[i] = player.Get1SDamageList(log, phase.Start, phase.End, target, DamageType.Condition);
                        graph1SBreakbarDamageList[i]  = player.Get1SBreakbarDamageList(log, phase.Start, phase.End, target);
                    }
                    targetDamageDistList[i] = JsonDamageDist.BuildJsonDamageDistList(player.GetDamageEvents(target, log, phase.Start, phase.End).GroupBy(x => x.SkillId).ToDictionary(x => x.Key, x => x.ToList()), log, skillDesc, buffDesc);
                }
                if (settings.RawFormatTimelineArrays)
                {
                    targetDamage1S[j]          = graph1SDamageList;
                    targetPowerDamage1S[j]     = graph1SPowerDamageList;
                    targetConditionDamage1S[j] = graph1SConditionDamageList;
                    targetBreakbarDamage1S[j]  = graph1SBreakbarDamageList;
                }
                targetDamageDist[j] = targetDamageDistList;
                dpsTargets[j]       = phases.Select(phase => new JsonStatistics.JsonDPS(player.GetDPSStats(target, log, phase.Start, phase.End))).ToArray();
                statsTargets[j]     = phases.Select(phase => new JsonStatistics.JsonGameplayStats(player.GetGameplayStats(target, log, phase.Start, phase.End))).ToArray();
            }
            if (settings.RawFormatTimelineArrays)
            {
                TargetDamage1S          = targetDamage1S;
                TargetPowerDamage1S     = targetPowerDamage1S;
                TargetConditionDamage1S = targetConditionDamage1S;
                TargetBreakbarDamage1S  = targetBreakbarDamage1S;
            }
            TargetDamageDist = targetDamageDist;
            DpsTargets       = dpsTargets;
            StatsTargets     = statsTargets;
            if (!log.CombatData.HasBreakbarDamageData)
            {
                TargetBreakbarDamage1S = null;
            }
            //
            BuffUptimes   = GetPlayerJsonBuffsUptime(player, phases.Select(phase => player.GetBuffs(BuffEnum.Self, log, phase.Start, phase.End)).ToList(), log, settings, buffDesc, personalBuffs);
            SelfBuffs     = GetPlayerBuffGenerations(phases.Select(phase => player.GetBuffs(BuffEnum.Self, log, phase.Start, phase.End)).ToList(), log, buffDesc);
            GroupBuffs    = GetPlayerBuffGenerations(phases.Select(phase => player.GetBuffs(BuffEnum.Group, log, phase.Start, phase.End)).ToList(), log, buffDesc);
            OffGroupBuffs = GetPlayerBuffGenerations(phases.Select(phase => player.GetBuffs(BuffEnum.OffGroup, log, phase.Start, phase.End)).ToList(), log, buffDesc);
            SquadBuffs    = GetPlayerBuffGenerations(phases.Select(phase => player.GetBuffs(BuffEnum.Squad, log, phase.Start, phase.End)).ToList(), log, buffDesc);
            //
            BuffUptimesActive   = GetPlayerJsonBuffsUptime(player, phases.Select(phase => player.GetActiveBuffs(BuffEnum.Self, log, phase.Start, phase.End)).ToList(), log, settings, buffDesc, personalBuffs);
            SelfBuffsActive     = GetPlayerBuffGenerations(phases.Select(phase => player.GetActiveBuffs(BuffEnum.Self, log, phase.Start, phase.End)).ToList(), log, buffDesc);
            GroupBuffsActive    = GetPlayerBuffGenerations(phases.Select(phase => player.GetActiveBuffs(BuffEnum.Group, log, phase.Start, phase.End)).ToList(), log, buffDesc);
            OffGroupBuffsActive = GetPlayerBuffGenerations(phases.Select(phase => player.GetActiveBuffs(BuffEnum.OffGroup, log, phase.Start, phase.End)).ToList(), log, buffDesc);
            SquadBuffsActive    = GetPlayerBuffGenerations(phases.Select(phase => player.GetActiveBuffs(BuffEnum.Squad, log, phase.Start, phase.End)).ToList(), log, buffDesc);
            //
            IReadOnlyList <Consumable> consumables = player.GetConsumablesList(log, 0, log.FightData.FightEnd);

            if (consumables.Any())
            {
                var consumablesJSON = new List <JsonConsumable>();
                foreach (Consumable food in consumables)
                {
                    if (!buffDesc.ContainsKey("b" + food.Buff.ID))
                    {
                        buffDesc["b" + food.Buff.ID] = new JsonLog.BuffDesc(food.Buff, log);
                    }
                    consumablesJSON.Add(new JsonConsumable(food));
                }
                Consumables = consumablesJSON;
            }
            //
            IReadOnlyList <DeathRecap> deathRecaps = player.GetDeathRecaps(log);

            if (deathRecaps.Any())
            {
                DeathRecap = deathRecaps.Select(x => new JsonDeathRecap(x)).ToList();
            }
            //
            DamageModifiers       = JsonDamageModifierData.GetDamageModifiers(player.GetDamageModifierStats(log, null), log, damageModDesc);
            DamageModifiersTarget = JsonDamageModifierData.GetDamageModifiersTarget(player, log, damageModDesc);
        }
        private void CalculateConditions()
        {
            foreach (Target target in _log.FightData.Logic.Targets)
            {
                Dictionary <long, FinalTargetBuffs>[] stats = new Dictionary <long, FinalTargetBuffs> [_statistics.Phases.Count];
                for (int phaseIndex = 0; phaseIndex < _statistics.Phases.Count; phaseIndex++)
                {
                    BoonDistribution boonDistribution                 = target.GetBoonDistribution(_log, phaseIndex);
                    Dictionary <long, FinalTargetBuffs> rates         = new Dictionary <long, FinalTargetBuffs>();
                    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.TrackedBoons)
                    {
                        if (boonDistribution.ContainsKey(boon.ID))
                        {
                            FinalTargetBuffs buff = new FinalTargetBuffs(_log.PlayerList);
                            rates[boon.ID] = buff;
                            if (boon.Type == Boon.BoonType.Duration)
                            {
                                buff.Uptime = Math.Round(100.0 * boonDistribution.GetUptime(boon.ID) / fightDuration, 2);
                                foreach (Player p in _log.PlayerList)
                                {
                                    long gen = boonDistribution.GetGeneration(boon.ID, p.AgentItem);
                                    buff.Generated[p]        = Math.Round(100.0 * gen / fightDuration, 2);
                                    buff.Overstacked[p]      = Math.Round(100.0 * (boonDistribution.GetOverstack(boon.ID, p.AgentItem) + gen) / fightDuration, 2);
                                    buff.Wasted[p]           = Math.Round(100.0 * boonDistribution.GetWaste(boon.ID, p.AgentItem) / fightDuration, 2);
                                    buff.UnknownExtension[p] = Math.Round(100.0 * boonDistribution.GetUnknownExtension(boon.ID, p.AgentItem) / fightDuration, 2);
                                    buff.Extension[p]        = Math.Round(100.0 * boonDistribution.GetExtension(boon.ID, p.AgentItem) / fightDuration, 2);
                                    buff.Extended[p]         = Math.Round(100.0 * boonDistribution.GetExtended(boon.ID, p.AgentItem) / fightDuration, 2);
                                }
                            }
                            else if (boon.Type == Boon.BoonType.Intensity)
                            {
                                buff.Uptime = Math.Round((double)boonDistribution.GetUptime(boon.ID) / fightDuration, 2);
                                foreach (Player p in _log.PlayerList)
                                {
                                    long gen = boonDistribution.GetGeneration(boon.ID, p.AgentItem);
                                    buff.Generated[p]        = Math.Round((double)gen / fightDuration, 2);
                                    buff.Overstacked[p]      = Math.Round((double)(boonDistribution.GetOverstack(boon.ID, p.AgentItem) + gen) / fightDuration, 2);
                                    buff.Wasted[p]           = Math.Round((double)boonDistribution.GetWaste(boon.ID, p.AgentItem) / fightDuration, 2);
                                    buff.UnknownExtension[p] = Math.Round((double)boonDistribution.GetUnknownExtension(boon.ID, p.AgentItem) / fightDuration, 2);
                                    buff.Extension[p]        = Math.Round((double)boonDistribution.GetExtension(boon.ID, p.AgentItem) / fightDuration, 2);
                                    buff.Extended[p]         = Math.Round((double)boonDistribution.GetExtended(boon.ID, p.AgentItem) / fightDuration, 2);
                                }
                                if (boonPresence.TryGetValue(boon.ID, out long presenceValueBoon))
                                {
                                    buff.Presence = Math.Round(100.0 * presenceValueBoon / fightDuration, 2);
                                }
                                else if (condiPresence.TryGetValue(boon.ID, out long presenceValueCondi))
                                {
                                    buff.Presence = Math.Round(100.0 * presenceValueCondi / fightDuration, 2);
                                }
                            }
                        }
                    }
                    stats[phaseIndex] = rates;
                }
                _statistics.TargetBuffs[target] = stats;
            }
        }