コード例 #1
0
        public LogStatistics GetStatistics()
        {
            // TODO: This method should be mostly moved to the HtmlGenerator.

            var might         = log.Skills.FirstOrDefault(x => x.Id == SkillIds.Might);
            var vulnerability = log.Skills.FirstOrDefault(x => x.Id == SkillIds.Vulnerability);

            if (might != null)
            {
                BuffSimulator.TrackBuff(might, BuffSimulationType.Intensity, 25);
            }
            if (vulnerability != null)
            {
                BuffSimulator.TrackBuff(vulnerability, BuffSimulationType.Intensity, 25);
            }

            var buffData = BuffSimulator.SimulateBuffs(log.Agents, log.Events.OfType <BuffEvent>(), GetEncounterEnd());

            var players = GetPlayers();

            var fightDurationMs          = GetEncounterEnd() - GetEncounterStart();
            var fullFightSquadDamageData = new SquadDamageData(fightDurationMs,
                                                               GetDamageData(players, log.Events.OfType <DamageEvent>(),
                                                                             log.Events.OfType <SkillCastEvent>(), buffData, log.Skills, fightDurationMs).Values);

            var fullFightTargetDamageData = new List <TargetSquadDamageData>();

            foreach (var target in log.EncounterData.Targets)
            {
                var damageData = GetDamageData(
                    players,
                    log.Events
                    .OfType <DamageEvent>()
                    .Where(x => x.Defender == target),
                    log.Events.OfType <SkillCastEvent>(),
                    buffData,
                    log.Skills,
                    fightDurationMs);
                fullFightTargetDamageData.Add(new TargetSquadDamageData(target, fightDurationMs, damageData.Values));
            }

            var eventCounts = new Dictionary <Type, int>();

            foreach (var e in log.Events)
            {
                var type = e.GetType();
                if (!eventCounts.ContainsKey(type))
                {
                    eventCounts[type] = 0;
                }

                eventCounts[type]++;
            }

            var eventCountsByName =
                eventCounts.Select(x => (x.Key.Name, x.Value)).ToDictionary(x => x.Item1, x => x.Item2);

            var playerData = GetPlayerData();

            string encounterName = new LocalizedEncounterNameProvider().GetEncounterName(log.EncounterData, log.GameLanguage);

            return(new LogStatistics(log.StartTime.ServerTime, log.PointOfView, playerData,
                                     fullFightSquadDamageData, fullFightTargetDamageData, buffData, GetResult(), GetMode(),
                                     encounterName, log.EvtcVersion, eventCountsByName, log.Agents, log.Skills));
        }
コード例 #2
0
ファイル: LogAnalyser.cs プロジェクト: greaka/evtc
        /// <summary>
        /// Calculates statistics for an encounter, such as damage done...
        /// </summary>
        /// <param name="log">The processed log.</param>
        /// <param name="apiData">Data from the GW2 API, may be null, some statistics won't be calculated.</param>
        public LogStatistics GetStatistics(Log log, GW2ApiData apiData)
        {
            var encounter = GetEncounter(log);

            var phaseStats = new List <PhaseStats>();

            var might         = log.Skills.FirstOrDefault(x => x.Id == SkillIds.Might);
            var vulnerability = log.Skills.FirstOrDefault(x => x.Id == SkillIds.Vulnerability);

            if (might != null)
            {
                BuffSimulator.TrackBuff(might, BuffSimulationType.Intensity, 25);
            }
            if (vulnerability != null)
            {
                BuffSimulator.TrackBuff(vulnerability, BuffSimulationType.Intensity, 25);
            }

            var buffData = BuffSimulator.SimulateBuffs(log.Agents, log.Events.OfType <BuffEvent>(),
                                                       encounter.GetPhases().Last().EndTime);

            var players = GetPlayers(log).ToArray();

            foreach (var phase in encounter.GetPhases())
            {
                var  targetDamageData = new List <TargetSquadDamageData>();
                long phaseDuration    = phase.EndTime - phase.StartTime;
                foreach (var target in phase.ImportantEnemies)
                {
                    var damageData = GetDamageData(
                        players,
                        phase.Events
                        .OfType <DamageEvent>()
                        .Where(x => x.Defender == target),
                        phase.Events.OfType <SkillCastEvent>(),
                        buffData,
                        log.Skills,
                        phaseDuration);
                    targetDamageData.Add(new TargetSquadDamageData(target, phaseDuration, damageData.Values));
                }

                var totalDamageData = new SquadDamageData(phaseDuration,
                                                          GetDamageData(
                                                              players,
                                                              phase.Events.OfType <DamageEvent>(),
                                                              phase.Events.OfType <SkillCastEvent>(),
                                                              buffData,
                                                              log.Skills,
                                                              phaseDuration).Values
                                                          );

                phaseStats.Add(new PhaseStats(phase.Name, phase.StartTime, phase.EndTime, targetDamageData,
                                              totalDamageData));
            }

            var fightTime = encounter.GetPhases().Sum(x => x.EndTime - x.StartTime);
            var fullFightSquadDamageData = new SquadDamageData(fightTime,
                                                               GetDamageData(players, log.Events.OfType <DamageEvent>(),
                                                                             log.Events.OfType <SkillCastEvent>(), buffData, log.Skills, fightTime).Values);

            var fullFightTargetDamageData = new List <TargetSquadDamageData>();

            foreach (var target in encounter.ImportantEnemies)
            {
                var damageData = GetDamageData(
                    players,
                    log.Events
                    .OfType <DamageEvent>()
                    .Where(x => x.Defender == target),
                    log.Events.OfType <SkillCastEvent>(),
                    buffData,
                    log.Skills,
                    fightTime);
                fullFightTargetDamageData.Add(new TargetSquadDamageData(target, fightTime, damageData.Values));
            }

            var eventCounts = new Dictionary <Type, int>();

            foreach (var e in log.Events)
            {
                var type = e.GetType();
                if (!eventCounts.ContainsKey(type))
                {
                    eventCounts[type] = 0;
                }

                eventCounts[type]++;
            }

            var eventCountsByName =
                eventCounts.Select(x => (x.Key.Name, x.Value)).ToDictionary(x => x.Item1, x => x.Item2);

            var playerData = GetPlayerData(log, apiData);

            return(new LogStatistics(log.StartTime.ServerTime, log.PointOfView, playerData, phaseStats, fullFightSquadDamageData,
                                     fullFightTargetDamageData, buffData, encounter.GetResult(), encounter.GetName(),
                                     log.EVTCVersion, eventCountsByName, log.Agents, log.Skills));
        }