protected static Dictionary <AgentItem, BuffDistributionItem> GetDistrib(BuffDistribution distribs, long boonid)
 {
     if (!distribs.TryGetValue(boonid, out Dictionary <AgentItem, BuffDistributionItem> distrib))
     {
         distrib = new Dictionary <AgentItem, BuffDistributionItem>();
         distribs.Add(boonid, distrib);
     }
     return(distrib);
 }
Example #2
0
        public override void SetBuffDistributionItem(BuffDistribution distribs, long start, long end, long boonid)
        {
            long cDur = GetClampedDuration(start, end);

            if (cDur == 0)
            {
                return;
            }
            foreach (BuffSimulationItemBase item in Stacks)
            {
                item.SetBuffDistributionItem(distribs, start, end, boonid);
            }
        }
 internal FinalBuffs(Buff buff, BuffDistribution buffDistribution, Dictionary <long, long> buffPresence, long phaseDuration)
 {
     if (buff.Type == BuffType.Duration)
     {
         Uptime = Math.Round(100.0 * buffDistribution.GetUptime(buff.ID) / phaseDuration, ParserHelper.BuffDigit);
     }
     else if (buff.Type == BuffType.Intensity)
     {
         Uptime = Math.Round((double)buffDistribution.GetUptime(buff.ID) / phaseDuration, ParserHelper.BuffDigit);
         if (buffPresence.TryGetValue(buff.ID, out long presenceValueBoon))
         {
             Presence = Math.Round(100.0 * presenceValueBoon / phaseDuration, ParserHelper.BuffDigit);
         }
     }
 }
Example #4
0
        private Dictionary <long, FinalBuffs> ComputeBuffs(ParsedEvtcLog log, long start, long end)
        {
            BuffDistribution buffDistribution = GetBuffDistribution(log, start, end);
            var rates = new Dictionary <long, FinalBuffs>();
            Dictionary <long, long> buffPresence = GetBuffPresence(log, start, end);

            long phaseDuration = end - start;

            foreach (Buff buff in GetTrackedBuffs(log))
            {
                if (buffDistribution.HasBuffID(buff.ID))
                {
                    rates[buff.ID] = new FinalBuffs(buff, buffDistribution, buffPresence, phaseDuration);
                }
            }
            return(rates);
        }
        public override void SetBuffDistributionItem(BuffDistribution distribs, long start, long end, long buffID)
        {
            Dictionary <AgentItem, BuffDistributionItem> distrib = distribs.GetDistrib(buffID);
            AgentItem agent = Src;
            long      value = GetValue(start, end);

            if (value == 0)
            {
                return;
            }
            if (distrib.TryGetValue(agent, out BuffDistributionItem toModify))
            {
                toModify.IncrementWaste(value);
            }
            else
            {
                distrib.Add(agent, new BuffDistributionItem(
                                0,
                                0, value, 0, 0, 0));
            }
        }
Example #6
0
        public override void SetBuffDistributionItem(BuffDistribution distribs, long start, long end, long boonid, ParsedEvtcLog log)
        {
            Dictionary <AgentItem, BuffDistributionItem> distrib = GetDistrib(distribs, boonid);
            AgentItem agent = Src;
            var       value = GetValue(start, end);

            if (value == 0)
            {
                return;
            }
            if (distrib.TryGetValue(agent, out BuffDistributionItem toModify))
            {
                toModify.Waste += value;
                distrib[agent]  = toModify;
            }
            else
            {
                distrib.Add(agent, new BuffDistributionItem(
                                0,
                                0, value, 0, 0, 0));
            }
        }
        private void SetBuffs(ParsedEvtcLog log)
        {
            _buffs = new List <Dictionary <long, FinalBuffs> >();
            List <PhaseData> phases = log.FightData.GetPhases(log);

            for (int phaseIndex = 0; phaseIndex < phases.Count; phaseIndex++)
            {
                BuffDistribution buffDistribution = GetBuffDistribution(log, phaseIndex);
                var rates = new Dictionary <long, FinalBuffs>();
                _buffs.Add(rates);
                Dictionary <long, long> buffPresence = GetBuffPresence(log, phaseIndex);

                PhaseData phase         = phases[phaseIndex];
                long      phaseDuration = phase.DurationInMS;

                foreach (Buff buff in TrackedBuffs)
                {
                    if (buffDistribution.ContainsKey(buff.ID))
                    {
                        rates[buff.ID] = new FinalBuffs(buff, buffDistribution, buffPresence, phaseDuration);
                    }
                }
            }
        }
        internal static Dictionary <long, FinalPlayerBuffs>[] GetBuffsForPlayers(List <Player> playerList, ParsedEvtcLog log, AgentItem agentItem, long start, long end)
        {
            long phaseDuration = end - start;

            var buffDistribution = new Dictionary <Player, BuffDistribution>();

            foreach (Player p in playerList)
            {
                buffDistribution[p] = p.GetBuffDistribution(log, start, end);
            }

            var buffsToTrack = new HashSet <Buff>(buffDistribution.SelectMany(x => x.Value.BuffIDs).Select(x => log.Buffs.BuffsByIds[x]));

            var buffs =
                new Dictionary <long, FinalPlayerBuffs>();
            var activeBuffs =
                new Dictionary <long, FinalPlayerBuffs>();

            foreach (Buff boon in buffsToTrack)
            {
                double totalGeneration       = 0;
                double totalOverstack        = 0;
                double totalWasted           = 0;
                double totalUnknownExtension = 0;
                double totalExtension        = 0;
                double totalExtended         = 0;
                //
                double totalActiveGeneration       = 0;
                double totalActiveOverstack        = 0;
                double totalActiveWasted           = 0;
                double totalActiveUnknownExtension = 0;
                double totalActiveExtension        = 0;
                double totalActiveExtended         = 0;
                bool   hasGeneration     = false;
                int    activePlayerCount = 0;
                foreach (KeyValuePair <Player, BuffDistribution> pair in buffDistribution)
                {
                    BuffDistribution boons = pair.Value;
                    long             playerActiveDuration = pair.Key.GetActiveDuration(log, start, end);
                    if (boons.HasBuffID(boon.ID))
                    {
                        hasGeneration = hasGeneration || boons.HasSrc(boon.ID, agentItem);
                        double generation       = boons.GetGeneration(boon.ID, agentItem);
                        double overstack        = boons.GetOverstack(boon.ID, agentItem);
                        double wasted           = boons.GetWaste(boon.ID, agentItem);
                        double unknownExtension = boons.GetUnknownExtension(boon.ID, agentItem);
                        double extension        = boons.GetExtension(boon.ID, agentItem);
                        double extended         = boons.GetExtended(boon.ID, agentItem);

                        totalGeneration       += generation;
                        totalOverstack        += overstack;
                        totalWasted           += wasted;
                        totalUnknownExtension += unknownExtension;
                        totalExtension        += extension;
                        totalExtended         += extended;
                        if (playerActiveDuration > 0)
                        {
                            activePlayerCount++;
                            totalActiveGeneration       += generation / playerActiveDuration;
                            totalActiveOverstack        += overstack / playerActiveDuration;
                            totalActiveWasted           += wasted / playerActiveDuration;
                            totalActiveUnknownExtension += unknownExtension / playerActiveDuration;
                            totalActiveExtension        += extension / playerActiveDuration;
                            totalActiveExtended         += extended / playerActiveDuration;
                        }
                    }
                }
                totalGeneration       /= phaseDuration;
                totalOverstack        /= phaseDuration;
                totalWasted           /= phaseDuration;
                totalUnknownExtension /= phaseDuration;
                totalExtension        /= phaseDuration;
                totalExtended         /= phaseDuration;

                if (hasGeneration)
                {
                    var uptime       = new FinalPlayerBuffs();
                    var uptimeActive = new FinalPlayerBuffs();
                    buffs[boon.ID]       = uptime;
                    activeBuffs[boon.ID] = uptimeActive;
                    if (boon.Type == BuffType.Duration)
                    {
                        uptime.Generation      = Math.Round(100.0 * totalGeneration / playerList.Count, ParserHelper.BuffDigit);
                        uptime.Overstack       = Math.Round(100.0 * (totalOverstack + totalGeneration) / playerList.Count, ParserHelper.BuffDigit);
                        uptime.Wasted          = Math.Round(100.0 * (totalWasted) / playerList.Count, ParserHelper.BuffDigit);
                        uptime.UnknownExtended = Math.Round(100.0 * (totalUnknownExtension) / playerList.Count, ParserHelper.BuffDigit);
                        uptime.ByExtension     = Math.Round(100.0 * (totalExtension) / playerList.Count, ParserHelper.BuffDigit);
                        uptime.Extended        = Math.Round(100.0 * (totalExtended) / playerList.Count, ParserHelper.BuffDigit);
                        //
                        if (activePlayerCount > 0)
                        {
                            uptimeActive.Generation      = Math.Round(100.0 * totalActiveGeneration / activePlayerCount, ParserHelper.BuffDigit);
                            uptimeActive.Overstack       = Math.Round(100.0 * (totalActiveOverstack + totalActiveGeneration) / activePlayerCount, ParserHelper.BuffDigit);
                            uptimeActive.Wasted          = Math.Round(100.0 * (totalActiveWasted) / activePlayerCount, ParserHelper.BuffDigit);
                            uptimeActive.UnknownExtended = Math.Round(100.0 * (totalActiveUnknownExtension) / activePlayerCount, ParserHelper.BuffDigit);
                            uptimeActive.ByExtension     = Math.Round(100.0 * (totalActiveExtension) / activePlayerCount, ParserHelper.BuffDigit);
                            uptimeActive.Extended        = Math.Round(100.0 * (totalActiveExtended) / activePlayerCount, ParserHelper.BuffDigit);
                        }
                    }
                    else if (boon.Type == BuffType.Intensity)
                    {
                        uptime.Generation      = Math.Round(totalGeneration / playerList.Count, ParserHelper.BuffDigit);
                        uptime.Overstack       = Math.Round((totalOverstack + totalGeneration) / playerList.Count, ParserHelper.BuffDigit);
                        uptime.Wasted          = Math.Round((totalWasted) / playerList.Count, ParserHelper.BuffDigit);
                        uptime.UnknownExtended = Math.Round((totalUnknownExtension) / playerList.Count, ParserHelper.BuffDigit);
                        uptime.ByExtension     = Math.Round((totalExtension) / playerList.Count, ParserHelper.BuffDigit);
                        uptime.Extended        = Math.Round((totalExtended) / playerList.Count, ParserHelper.BuffDigit);
                        //
                        if (activePlayerCount > 0)
                        {
                            uptimeActive.Generation      = Math.Round(totalActiveGeneration / activePlayerCount, ParserHelper.BuffDigit);
                            uptimeActive.Overstack       = Math.Round((totalActiveOverstack + totalActiveGeneration) / activePlayerCount, ParserHelper.BuffDigit);
                            uptimeActive.Wasted          = Math.Round((totalActiveWasted) / activePlayerCount, ParserHelper.BuffDigit);
                            uptimeActive.UnknownExtended = Math.Round((totalActiveUnknownExtension) / activePlayerCount, ParserHelper.BuffDigit);
                            uptimeActive.ByExtension     = Math.Round((totalActiveExtension) / activePlayerCount, ParserHelper.BuffDigit);
                            uptimeActive.Extended        = Math.Round((totalActiveExtended) / activePlayerCount, ParserHelper.BuffDigit);
                        }
                    }
                }
            }

            return(new Dictionary <long, FinalPlayerBuffs>[] { buffs, activeBuffs });
        }
        internal static Dictionary <long, FinalPlayerBuffs>[] GetBuffsForSelf(ParsedEvtcLog log, Player player, long start, long end)
        {
            var buffs       = new Dictionary <long, FinalPlayerBuffs>();
            var activeBuffs = new Dictionary <long, FinalPlayerBuffs>();

            BuffDistribution        selfBuffs    = player.GetBuffDistribution(log, start, end);
            Dictionary <long, long> buffPresence = player.GetBuffPresence(log, start, end);

            long phaseDuration        = end - start;
            long playerActiveDuration = player.GetActiveDuration(log, start, end);

            foreach (Buff boon in player.GetTrackedBuffs(log))
            {
                if (selfBuffs.HasBuffID(boon.ID))
                {
                    var uptime = new FinalPlayerBuffs
                    {
                        Uptime          = 0,
                        Generation      = 0,
                        Overstack       = 0,
                        Wasted          = 0,
                        UnknownExtended = 0,
                        ByExtension     = 0,
                        Extended        = 0
                    };
                    var uptimeActive = new FinalPlayerBuffs
                    {
                        Uptime          = 0,
                        Generation      = 0,
                        Overstack       = 0,
                        Wasted          = 0,
                        UnknownExtended = 0,
                        ByExtension     = 0,
                        Extended        = 0
                    };
                    buffs[boon.ID]       = uptime;
                    activeBuffs[boon.ID] = uptimeActive;
                    double generationValue       = selfBuffs.GetGeneration(boon.ID, player.AgentItem);
                    double uptimeValue           = selfBuffs.GetUptime(boon.ID);
                    double overstackValue        = selfBuffs.GetOverstack(boon.ID, player.AgentItem);
                    double wasteValue            = selfBuffs.GetWaste(boon.ID, player.AgentItem);
                    double unknownExtensionValue = selfBuffs.GetUnknownExtension(boon.ID, player.AgentItem);
                    double extensionValue        = selfBuffs.GetExtension(boon.ID, player.AgentItem);
                    double extendedValue         = selfBuffs.GetExtended(boon.ID, player.AgentItem);
                    if (boon.Type == BuffType.Duration)
                    {
                        uptime.Uptime          = Math.Round(100.0 * uptimeValue / phaseDuration, ParserHelper.BuffDigit);
                        uptime.Generation      = Math.Round(100.0 * generationValue / phaseDuration, ParserHelper.BuffDigit);
                        uptime.Overstack       = Math.Round(100.0 * (overstackValue + generationValue) / phaseDuration, ParserHelper.BuffDigit);
                        uptime.Wasted          = Math.Round(100.0 * wasteValue / phaseDuration, ParserHelper.BuffDigit);
                        uptime.UnknownExtended = Math.Round(100.0 * unknownExtensionValue / phaseDuration, ParserHelper.BuffDigit);
                        uptime.ByExtension     = Math.Round(100.0 * extensionValue / phaseDuration, ParserHelper.BuffDigit);
                        uptime.Extended        = Math.Round(100.0 * extendedValue / phaseDuration, ParserHelper.BuffDigit);
                        //
                        if (playerActiveDuration > 0)
                        {
                            uptimeActive.Uptime          = Math.Round(100.0 * uptimeValue / playerActiveDuration, ParserHelper.BuffDigit);
                            uptimeActive.Generation      = Math.Round(100.0 * generationValue / playerActiveDuration, ParserHelper.BuffDigit);
                            uptimeActive.Overstack       = Math.Round(100.0 * (overstackValue + generationValue) / playerActiveDuration, ParserHelper.BuffDigit);
                            uptimeActive.Wasted          = Math.Round(100.0 * wasteValue / playerActiveDuration, ParserHelper.BuffDigit);
                            uptimeActive.UnknownExtended = Math.Round(100.0 * unknownExtensionValue / playerActiveDuration, ParserHelper.BuffDigit);
                            uptimeActive.ByExtension     = Math.Round(100.0 * extensionValue / playerActiveDuration, ParserHelper.BuffDigit);
                            uptimeActive.Extended        = Math.Round(100.0 * extendedValue / playerActiveDuration, ParserHelper.BuffDigit);
                        }
                    }
                    else if (boon.Type == BuffType.Intensity)
                    {
                        uptime.Uptime          = Math.Round(uptimeValue / phaseDuration, ParserHelper.BuffDigit);
                        uptime.Generation      = Math.Round(generationValue / phaseDuration, ParserHelper.BuffDigit);
                        uptime.Overstack       = Math.Round((overstackValue + generationValue) / phaseDuration, ParserHelper.BuffDigit);
                        uptime.Wasted          = Math.Round(wasteValue / phaseDuration, ParserHelper.BuffDigit);
                        uptime.UnknownExtended = Math.Round(unknownExtensionValue / phaseDuration, ParserHelper.BuffDigit);
                        uptime.ByExtension     = Math.Round(extensionValue / phaseDuration, ParserHelper.BuffDigit);
                        uptime.Extended        = Math.Round(extendedValue / phaseDuration, ParserHelper.BuffDigit);
                        //
                        if (playerActiveDuration > 0)
                        {
                            uptimeActive.Uptime          = Math.Round(uptimeValue / playerActiveDuration, ParserHelper.BuffDigit);
                            uptimeActive.Generation      = Math.Round(generationValue / playerActiveDuration, ParserHelper.BuffDigit);
                            uptimeActive.Overstack       = Math.Round((overstackValue + generationValue) / playerActiveDuration, ParserHelper.BuffDigit);
                            uptimeActive.Wasted          = Math.Round(wasteValue / playerActiveDuration, ParserHelper.BuffDigit);
                            uptimeActive.UnknownExtended = Math.Round(unknownExtensionValue / playerActiveDuration, ParserHelper.BuffDigit);
                            uptimeActive.ByExtension     = Math.Round(extensionValue / playerActiveDuration, ParserHelper.BuffDigit);
                            uptimeActive.Extended        = Math.Round(extendedValue / playerActiveDuration, ParserHelper.BuffDigit);
                        }
                        //
                        if (buffPresence.TryGetValue(boon.ID, out long presenceValueBoon))
                        {
                            uptime.Presence = Math.Round(100.0 * presenceValueBoon / phaseDuration, ParserHelper.BuffDigit);
                            //
                            if (playerActiveDuration > 0)
                            {
                                uptimeActive.Presence = Math.Round(100.0 * presenceValueBoon / playerActiveDuration, ParserHelper.BuffDigit);
                            }
                        }
                    }
                }
            }
            return(new Dictionary <long, FinalPlayerBuffs>[] { buffs, activeBuffs });
        }
        public override void SetBuffDistributionItem(BuffDistribution distribs, long start, long end, long boonid, ParsedEvtcLog log)
        {
            Dictionary <AgentItem, BuffDistributionItem> distrib = GetDistrib(distribs, boonid);
            long cDur = GetClampedDuration(start, end);

            if (cDur == 0)
            {
                return;
            }
            AgentItem agent     = _src;
            AgentItem seedAgent = _seedSrc;

            if (distrib.TryGetValue(agent, out BuffDistributionItem toModify))
            {
                toModify.Value += cDur;
                distrib[agent]  = toModify;
            }
            else
            {
                distrib.Add(agent, new BuffDistributionItem(
                                cDur,
                                0, 0, 0, 0, 0));
            }
            if (_isExtension)
            {
                if (distrib.TryGetValue(agent, out toModify))
                {
                    toModify.Extension += cDur;
                    distrib[agent]      = toModify;
                }
                else
                {
                    distrib.Add(agent, new BuffDistributionItem(
                                    0,
                                    0, 0, 0, cDur, 0));
                }
            }
            if (agent != seedAgent)
            {
                if (distrib.TryGetValue(seedAgent, out toModify))
                {
                    toModify.Extended += cDur;
                    distrib[seedAgent] = toModify;
                }
                else
                {
                    distrib.Add(seedAgent, new BuffDistributionItem(
                                    0,
                                    0, 0, 0, 0, cDur));
                }
            }
            if (agent == ParserHelper._unknownAgent)
            {
                if (distrib.TryGetValue(seedAgent, out toModify))
                {
                    toModify.UnknownExtension += cDur;
                    distrib[seedAgent]         = toModify;
                }
                else
                {
                    distrib.Add(seedAgent, new BuffDistributionItem(
                                    0,
                                    0, 0, cDur, 0, 0));
                }
            }
        }
 public override void SetBuffDistributionItem(BuffDistribution distribs, long start, long end, long boonid)
 {
     Stacks.First().SetBuffDistributionItem(distribs, start, end, boonid);
 }
        public override void SetBuffDistributionItem(BuffDistribution distribs, long start, long end, long buffID)
        {
            Dictionary <AgentItem, BuffDistributionItem> distrib = distribs.GetDistrib(buffID);
            long cDur = GetClampedDuration(start, end);

            if (cDur == 0)
            {
                return;
            }
            AgentItem agent     = _src;
            AgentItem seedAgent = _seedSrc;

            if (distrib.TryGetValue(agent, out BuffDistributionItem toModify))
            {
                toModify.IncrementValue(cDur);
            }
            else
            {
                distrib.Add(agent, new BuffDistributionItem(
                                cDur,
                                0, 0, 0, 0, 0));
            }
            if (_isExtension)
            {
                if (distrib.TryGetValue(agent, out toModify))
                {
                    toModify.IncrementExtension(cDur);
                }
                else
                {
                    distrib.Add(agent, new BuffDistributionItem(
                                    0,
                                    0, 0, 0, cDur, 0));
                }
            }
            if (agent != seedAgent)
            {
                if (distrib.TryGetValue(seedAgent, out toModify))
                {
                    toModify.IncrementExtended(cDur);
                }
                else
                {
                    distrib.Add(seedAgent, new BuffDistributionItem(
                                    0,
                                    0, 0, 0, 0, cDur));
                }
            }
            if (agent == ParserHelper._unknownAgent)
            {
                if (distrib.TryGetValue(seedAgent, out toModify))
                {
                    toModify.IncrementUnknownExtension(cDur);
                }
                else
                {
                    distrib.Add(seedAgent, new BuffDistributionItem(
                                    0,
                                    0, 0, cDur, 0, 0));
                }
            }
        }
 public abstract void SetBuffDistributionItem(BuffDistribution distribs, long start, long end, long boonid, ParsedEvtcLog log);
Example #14
0
        internal static (List <Dictionary <long, FinalPlayerBuffs> >, List <Dictionary <long, FinalPlayerBuffs> >) GetBuffsForPlayers(List <Player> playerList, ParsedEvtcLog log, AgentItem agentItem)
        {
            var uptimesByPhase       = new List <Dictionary <long, FinalPlayerBuffs> >();
            var uptimesActiveByPhase = new List <Dictionary <long, FinalPlayerBuffs> >();

            List <PhaseData> phases = log.FightData.GetPhases(log);

            for (int phaseIndex = 0; phaseIndex < phases.Count; phaseIndex++)
            {
                PhaseData phase         = phases[phaseIndex];
                long      phaseDuration = phase.DurationInMS;

                var boonDistributions = new Dictionary <Player, BuffDistribution>();
                foreach (Player p in playerList)
                {
                    boonDistributions[p] = p.GetBuffDistribution(log, phaseIndex);
                }

                var boonsToTrack = new HashSet <Buff>(boonDistributions.SelectMany(x => x.Value).Select(x => log.Buffs.BuffsByIds[x.Key]));

                var final =
                    new Dictionary <long, FinalPlayerBuffs>();
                var finalActive =
                    new Dictionary <long, FinalPlayerBuffs>();

                foreach (Buff boon in boonsToTrack)
                {
                    double totalGeneration       = 0;
                    double totalOverstack        = 0;
                    double totalWasted           = 0;
                    double totalUnknownExtension = 0;
                    double totalExtension        = 0;
                    double totalExtended         = 0;
                    //
                    double totalActiveGeneration       = 0;
                    double totalActiveOverstack        = 0;
                    double totalActiveWasted           = 0;
                    double totalActiveUnknownExtension = 0;
                    double totalActiveExtension        = 0;
                    double totalActiveExtended         = 0;
                    bool   hasGeneration     = false;
                    int    activePlayerCount = 0;
                    foreach (KeyValuePair <Player, BuffDistribution> pair in boonDistributions)
                    {
                        BuffDistribution boons = pair.Value;
                        long             playerActiveDuration = phase.GetActorActiveDuration(pair.Key, log);
                        if (boons.ContainsKey(boon.ID))
                        {
                            hasGeneration = hasGeneration || boons.HasSrc(boon.ID, agentItem);
                            double generation       = boons.GetGeneration(boon.ID, agentItem);
                            double overstack        = boons.GetOverstack(boon.ID, agentItem);
                            double wasted           = boons.GetWaste(boon.ID, agentItem);
                            double unknownExtension = boons.GetUnknownExtension(boon.ID, agentItem);
                            double extension        = boons.GetExtension(boon.ID, agentItem);
                            double extended         = boons.GetExtended(boon.ID, agentItem);

                            totalGeneration       += generation;
                            totalOverstack        += overstack;
                            totalWasted           += wasted;
                            totalUnknownExtension += unknownExtension;
                            totalExtension        += extension;
                            totalExtended         += extended;
                            if (playerActiveDuration > 0)
                            {
                                activePlayerCount++;
                                totalActiveGeneration       += generation / playerActiveDuration;
                                totalActiveOverstack        += overstack / playerActiveDuration;
                                totalActiveWasted           += wasted / playerActiveDuration;
                                totalActiveUnknownExtension += unknownExtension / playerActiveDuration;
                                totalActiveExtension        += extension / playerActiveDuration;
                                totalActiveExtended         += extended / playerActiveDuration;
                            }
                        }
                    }
                    totalGeneration       /= phaseDuration;
                    totalOverstack        /= phaseDuration;
                    totalWasted           /= phaseDuration;
                    totalUnknownExtension /= phaseDuration;
                    totalExtension        /= phaseDuration;
                    totalExtended         /= phaseDuration;

                    if (hasGeneration)
                    {
                        var uptime       = new FinalPlayerBuffs();
                        var uptimeActive = new FinalPlayerBuffs();
                        final[boon.ID]       = uptime;
                        finalActive[boon.ID] = uptimeActive;
                        if (boon.Type == BuffType.Duration)
                        {
                            uptime.Generation      = Math.Round(100.0 * totalGeneration / playerList.Count, ParserHelper.BuffDigit);
                            uptime.Overstack       = Math.Round(100.0 * (totalOverstack + totalGeneration) / playerList.Count, ParserHelper.BuffDigit);
                            uptime.Wasted          = Math.Round(100.0 * (totalWasted) / playerList.Count, ParserHelper.BuffDigit);
                            uptime.UnknownExtended = Math.Round(100.0 * (totalUnknownExtension) / playerList.Count, ParserHelper.BuffDigit);
                            uptime.ByExtension     = Math.Round(100.0 * (totalExtension) / playerList.Count, ParserHelper.BuffDigit);
                            uptime.Extended        = Math.Round(100.0 * (totalExtended) / playerList.Count, ParserHelper.BuffDigit);
                            //
                            if (activePlayerCount > 0)
                            {
                                uptimeActive.Generation      = Math.Round(100.0 * totalActiveGeneration / activePlayerCount, ParserHelper.BuffDigit);
                                uptimeActive.Overstack       = Math.Round(100.0 * (totalActiveOverstack + totalActiveGeneration) / activePlayerCount, ParserHelper.BuffDigit);
                                uptimeActive.Wasted          = Math.Round(100.0 * (totalActiveWasted) / activePlayerCount, ParserHelper.BuffDigit);
                                uptimeActive.UnknownExtended = Math.Round(100.0 * (totalActiveUnknownExtension) / activePlayerCount, ParserHelper.BuffDigit);
                                uptimeActive.ByExtension     = Math.Round(100.0 * (totalActiveExtension) / activePlayerCount, ParserHelper.BuffDigit);
                                uptimeActive.Extended        = Math.Round(100.0 * (totalActiveExtended) / activePlayerCount, ParserHelper.BuffDigit);
                            }
                        }
                        else if (boon.Type == BuffType.Intensity)
                        {
                            uptime.Generation      = Math.Round(totalGeneration / playerList.Count, ParserHelper.BuffDigit);
                            uptime.Overstack       = Math.Round((totalOverstack + totalGeneration) / playerList.Count, ParserHelper.BuffDigit);
                            uptime.Wasted          = Math.Round((totalWasted) / playerList.Count, ParserHelper.BuffDigit);
                            uptime.UnknownExtended = Math.Round((totalUnknownExtension) / playerList.Count, ParserHelper.BuffDigit);
                            uptime.ByExtension     = Math.Round((totalExtension) / playerList.Count, ParserHelper.BuffDigit);
                            uptime.Extended        = Math.Round((totalExtended) / playerList.Count, ParserHelper.BuffDigit);
                            //
                            if (activePlayerCount > 0)
                            {
                                uptimeActive.Generation      = Math.Round(totalActiveGeneration / activePlayerCount, ParserHelper.BuffDigit);
                                uptimeActive.Overstack       = Math.Round((totalActiveOverstack + totalActiveGeneration) / activePlayerCount, ParserHelper.BuffDigit);
                                uptimeActive.Wasted          = Math.Round((totalActiveWasted) / activePlayerCount, ParserHelper.BuffDigit);
                                uptimeActive.UnknownExtended = Math.Round((totalActiveUnknownExtension) / activePlayerCount, ParserHelper.BuffDigit);
                                uptimeActive.ByExtension     = Math.Round((totalActiveExtension) / activePlayerCount, ParserHelper.BuffDigit);
                                uptimeActive.Extended        = Math.Round((totalActiveExtended) / activePlayerCount, ParserHelper.BuffDigit);
                            }
                        }
                    }
                }

                uptimesByPhase.Add(final);
                uptimesActiveByPhase.Add(finalActive);
            }

            return(uptimesByPhase, uptimesActiveByPhase);
        }
Example #15
0
        internal static (List <Dictionary <long, FinalPlayerBuffs> >, List <Dictionary <long, FinalPlayerBuffs> >) GetBuffsForSelf(ParsedEvtcLog log, Player player)
        {
            var selfBuffsActive     = new List <Dictionary <long, FinalPlayerBuffs> >();
            var selfBuffs           = new List <Dictionary <long, FinalPlayerBuffs> >();
            List <PhaseData> phases = log.FightData.GetPhases(log);

            for (int phaseIndex = 0; phaseIndex < phases.Count; phaseIndex++)
            {
                var final       = new Dictionary <long, FinalPlayerBuffs>();
                var finalActive = new Dictionary <long, FinalPlayerBuffs>();

                PhaseData phase = phases[phaseIndex];

                BuffDistribution        selfBoons    = player.GetBuffDistribution(log, phaseIndex);
                Dictionary <long, long> buffPresence = player.GetBuffPresence(log, phaseIndex);

                long phaseDuration        = phase.DurationInMS;
                long playerActiveDuration = phase.GetActorActiveDuration(player, log);
                foreach (Buff boon in player.TrackedBuffs)
                {
                    if (selfBoons.ContainsKey(boon.ID))
                    {
                        var uptime = new FinalPlayerBuffs
                        {
                            Uptime          = 0,
                            Generation      = 0,
                            Overstack       = 0,
                            Wasted          = 0,
                            UnknownExtended = 0,
                            ByExtension     = 0,
                            Extended        = 0
                        };
                        var uptimeActive = new FinalPlayerBuffs
                        {
                            Uptime          = 0,
                            Generation      = 0,
                            Overstack       = 0,
                            Wasted          = 0,
                            UnknownExtended = 0,
                            ByExtension     = 0,
                            Extended        = 0
                        };
                        final[boon.ID]       = uptime;
                        finalActive[boon.ID] = uptimeActive;
                        double generationValue       = selfBoons.GetGeneration(boon.ID, player.AgentItem);
                        double uptimeValue           = selfBoons.GetUptime(boon.ID);
                        double overstackValue        = selfBoons.GetOverstack(boon.ID, player.AgentItem);
                        double wasteValue            = selfBoons.GetWaste(boon.ID, player.AgentItem);
                        double unknownExtensionValue = selfBoons.GetUnknownExtension(boon.ID, player.AgentItem);
                        double extensionValue        = selfBoons.GetExtension(boon.ID, player.AgentItem);
                        double extendedValue         = selfBoons.GetExtended(boon.ID, player.AgentItem);
                        if (boon.Type == BuffType.Duration)
                        {
                            uptime.Uptime          = Math.Round(100.0 * uptimeValue / phaseDuration, ParserHelper.BuffDigit);
                            uptime.Generation      = Math.Round(100.0 * generationValue / phaseDuration, ParserHelper.BuffDigit);
                            uptime.Overstack       = Math.Round(100.0 * (overstackValue + generationValue) / phaseDuration, ParserHelper.BuffDigit);
                            uptime.Wasted          = Math.Round(100.0 * wasteValue / phaseDuration, ParserHelper.BuffDigit);
                            uptime.UnknownExtended = Math.Round(100.0 * unknownExtensionValue / phaseDuration, ParserHelper.BuffDigit);
                            uptime.ByExtension     = Math.Round(100.0 * extensionValue / phaseDuration, ParserHelper.BuffDigit);
                            uptime.Extended        = Math.Round(100.0 * extendedValue / phaseDuration, ParserHelper.BuffDigit);
                            //
                            if (playerActiveDuration > 0)
                            {
                                uptimeActive.Uptime          = Math.Round(100.0 * uptimeValue / playerActiveDuration, ParserHelper.BuffDigit);
                                uptimeActive.Generation      = Math.Round(100.0 * generationValue / playerActiveDuration, ParserHelper.BuffDigit);
                                uptimeActive.Overstack       = Math.Round(100.0 * (overstackValue + generationValue) / playerActiveDuration, ParserHelper.BuffDigit);
                                uptimeActive.Wasted          = Math.Round(100.0 * wasteValue / playerActiveDuration, ParserHelper.BuffDigit);
                                uptimeActive.UnknownExtended = Math.Round(100.0 * unknownExtensionValue / playerActiveDuration, ParserHelper.BuffDigit);
                                uptimeActive.ByExtension     = Math.Round(100.0 * extensionValue / playerActiveDuration, ParserHelper.BuffDigit);
                                uptimeActive.Extended        = Math.Round(100.0 * extendedValue / playerActiveDuration, ParserHelper.BuffDigit);
                            }
                        }
                        else if (boon.Type == BuffType.Intensity)
                        {
                            uptime.Uptime          = Math.Round(uptimeValue / phaseDuration, ParserHelper.BuffDigit);
                            uptime.Generation      = Math.Round(generationValue / phaseDuration, ParserHelper.BuffDigit);
                            uptime.Overstack       = Math.Round((overstackValue + generationValue) / phaseDuration, ParserHelper.BuffDigit);
                            uptime.Wasted          = Math.Round(wasteValue / phaseDuration, ParserHelper.BuffDigit);
                            uptime.UnknownExtended = Math.Round(unknownExtensionValue / phaseDuration, ParserHelper.BuffDigit);
                            uptime.ByExtension     = Math.Round(extensionValue / phaseDuration, ParserHelper.BuffDigit);
                            uptime.Extended        = Math.Round(extendedValue / phaseDuration, ParserHelper.BuffDigit);
                            //
                            if (playerActiveDuration > 0)
                            {
                                uptimeActive.Uptime          = Math.Round(uptimeValue / playerActiveDuration, ParserHelper.BuffDigit);
                                uptimeActive.Generation      = Math.Round(generationValue / playerActiveDuration, ParserHelper.BuffDigit);
                                uptimeActive.Overstack       = Math.Round((overstackValue + generationValue) / playerActiveDuration, ParserHelper.BuffDigit);
                                uptimeActive.Wasted          = Math.Round(wasteValue / playerActiveDuration, ParserHelper.BuffDigit);
                                uptimeActive.UnknownExtended = Math.Round(unknownExtensionValue / playerActiveDuration, ParserHelper.BuffDigit);
                                uptimeActive.ByExtension     = Math.Round(extensionValue / playerActiveDuration, ParserHelper.BuffDigit);
                                uptimeActive.Extended        = Math.Round(extendedValue / playerActiveDuration, ParserHelper.BuffDigit);
                            }
                            //
                            if (buffPresence.TryGetValue(boon.ID, out long presenceValueBoon))
                            {
                                uptime.Presence = Math.Round(100.0 * presenceValueBoon / phaseDuration, ParserHelper.BuffDigit);
                                //
                                if (playerActiveDuration > 0)
                                {
                                    uptimeActive.Presence = Math.Round(100.0 * presenceValueBoon / playerActiveDuration, ParserHelper.BuffDigit);
                                }
                            }
                        }
                    }
                }

                selfBuffs.Add(final);
                selfBuffsActive.Add(finalActive);
            }
            return(selfBuffs, selfBuffsActive);
        }
Example #16
0
        internal static (FinalBuffsDictionary, FinalBuffsDictionary) GetFinalBuffsDictionary(ParsedEvtcLog log, Buff buff, BuffDistribution buffDistribution, long phaseDuration, long activePhaseDuration)
        {
            var buffs       = new FinalBuffsDictionary();
            var buffsActive = new FinalBuffsDictionary();

            foreach (AbstractSingleActor actor in buffDistribution.GetSrcs(buff.ID, log))
            {
                long   gen              = buffDistribution.GetGeneration(buff.ID, actor.AgentItem);
                double generated        = gen;
                double overstacked      = (buffDistribution.GetOverstack(buff.ID, actor.AgentItem) + gen);
                double wasted           = buffDistribution.GetWaste(buff.ID, actor.AgentItem);
                double unknownExtension = buffDistribution.GetUnknownExtension(buff.ID, actor.AgentItem);
                double extension        = buffDistribution.GetExtension(buff.ID, actor.AgentItem);
                double extended         = buffDistribution.GetExtended(buff.ID, actor.AgentItem);


                if (buff.Type == BuffType.Duration)
                {
                    generated        *= 100.0;
                    overstacked      *= 100.0;
                    wasted           *= 100.0;
                    unknownExtension *= 100.0;
                    extension        *= 100.0;
                    extended         *= 100.0;
                }
                buffs.Generated[actor]        = Math.Round(generated / phaseDuration, ParserHelper.BuffDigit);
                buffs.Overstacked[actor]      = Math.Round(overstacked / phaseDuration, ParserHelper.BuffDigit);
                buffs.Wasted[actor]           = Math.Round(wasted / phaseDuration, ParserHelper.BuffDigit);
                buffs.UnknownExtension[actor] = Math.Round(unknownExtension / phaseDuration, ParserHelper.BuffDigit);
                buffs.Extension[actor]        = Math.Round(extension / phaseDuration, ParserHelper.BuffDigit);
                buffs.Extended[actor]         = Math.Round(extended / phaseDuration, ParserHelper.BuffDigit);
                if (activePhaseDuration > 0)
                {
                    buffsActive.Generated[actor]        = Math.Round(generated / activePhaseDuration, ParserHelper.BuffDigit);
                    buffsActive.Overstacked[actor]      = Math.Round(overstacked / activePhaseDuration, ParserHelper.BuffDigit);
                    buffsActive.Wasted[actor]           = Math.Round(wasted / activePhaseDuration, ParserHelper.BuffDigit);
                    buffsActive.UnknownExtension[actor] = Math.Round(unknownExtension / activePhaseDuration, ParserHelper.BuffDigit);
                    buffsActive.Extension[actor]        = Math.Round(extension / activePhaseDuration, ParserHelper.BuffDigit);
                    buffsActive.Extended[actor]         = Math.Round(extended / activePhaseDuration, ParserHelper.BuffDigit);
                }
                else
                {
                    buffsActive.Generated[actor]        = 0.0;
                    buffsActive.Overstacked[actor]      = 0.0;
                    buffsActive.Wasted[actor]           = 0.0;
                    buffsActive.UnknownExtension[actor] = 0.0;
                    buffsActive.Extension[actor]        = 0.0;
                    buffsActive.Extended[actor]         = 0.0;
                }
            }
            return(buffs, buffsActive);
        }