Example #1
0
        public static List <object> GetDMGTargetStatData(Statistics.FinalStats stats)
        {
            List <object> data = new List <object>
            {
                stats.DirectDamageCount,
                stats.CritableDirectDamageCount,
                stats.CriticalRate,
                stats.CriticalDmg,

                stats.ScholarRate,
                stats.ScholarDmg,
                stats.DirectDamage,

                stats.MovingRate,
                stats.MovingDamage,

                stats.FlankingRate,

                stats.GlanceRate,

                stats.Missed,
                stats.Interrupts,
                stats.Invulned,

                stats.EagleRate,
                stats.EagleDmg,
                stats.FlankingDmg
            };

            return(data);
        }
Example #2
0
 public JsonStats(Statistics.FinalStats stats)
 {
     DirectDamageCount         = stats.DirectDamageCount;
     CritableDirectDamageCount = stats.CritableDirectDamageCount;
     CriticalRate = stats.CriticalCount;
     CriticalDmg  = stats.CriticalDmg;
     FlankingRate = stats.FlankingCount;
     GlanceRate   = stats.GlanceCount;
     Missed       = stats.Missed;
     Interrupts   = stats.Interrupts;
     Invulned     = stats.Invulned;
 }
Example #3
0
        private void CreateBossDMGStatsTable(int phaseIndex)
        {
            //generate dmgstats table=
            WriteLine(new [] { "Sub Group", "Profession", "Name",
                               "Critical%", "Critical hits", "Critical DMG",
                               "Scholar%", "Scholar hits", "Scholar DMG", "Scholar % increase",
                               "Moving%", "Moving Hits", "Moving DMG", "Moving % increase",
                               "Flanking%", "Flanking hits",
                               "Glancing%", "Glancing Hits",
                               "Blind%", "Blind Hits",
                               "Total Hits",
                               "Hits to Interupt", "Hits Invulned", "Time wasted", "Time saved", "Weapon Swaps" });
            int count = 0;

            foreach (Player player in _log.PlayerList)
            {
                if (player.Account == ":Conjured Sword")
                {
                    continue;
                }
                Statistics.FinalStatsAll stats     = player.GetStatsAll(_log, phaseIndex);
                Statistics.FinalStats    statsBoss = player.GetStatsTarget(_log, phaseIndex, _log.LegacyTarget);
                Dictionary <string, List <Statistics.DamageModifierData> > damageMods = player.GetDamageModifierData(_log, _log.LegacyTarget);
                Statistics.DamageModifierData scholar = new Statistics.DamageModifierData(0, 0, 0, 0);
                Statistics.DamageModifierData moving  = new Statistics.DamageModifierData(0, 0, 0, 0);
                if (damageMods.TryGetValue("Scholar Rune", out var schoDict))
                {
                    scholar = schoDict[phaseIndex];
                }
                if (damageMods.TryGetValue("Moving Bonus", out var moveDict))
                {
                    moving = moveDict[phaseIndex];
                }

                WriteLine(new [] { player.Group.ToString(), player.Prof, player.Character,
                                   Math.Round((double)(statsBoss.CriticalRate) / statsBoss.CritableDirectDamageCount * 100, 1).ToString(), statsBoss.CriticalRate.ToString(), statsBoss.CriticalDmg.ToString(),
                                   Math.Round((double)(scholar.HitCount) / scholar.TotalHitCount * 100, 1).ToString(), scholar.HitCount.ToString(), scholar.DamageGain.ToString(), Math.Round(100.0 * (scholar.TotalDamage / (double)(scholar.TotalDamage - scholar.DamageGain) - 1.0), 3).ToString(),
                                   Math.Round((double)(moving.HitCount) / moving.TotalHitCount * 100, 1).ToString(), moving.HitCount.ToString(), moving.DamageGain.ToString(), Math.Round(100.0 * (moving.TotalDamage / (double)(moving.TotalDamage - moving.DamageGain) - 1.0), 3).ToString(),
                                   Math.Round(statsBoss.FlankingRate / (double)statsBoss.DirectDamageCount * 100, 1).ToString(), statsBoss.FlankingRate.ToString(),
                                   Math.Round(statsBoss.GlanceRate / (double)statsBoss.DirectDamageCount * 100, 1).ToString(), statsBoss.GlanceRate.ToString(),
                                   Math.Round(statsBoss.Missed / (double)statsBoss.DirectDamageCount * 100, 1).ToString(), statsBoss.Missed.ToString(),
                                   statsBoss.DirectDamageCount.ToString(),
                                   statsBoss.Interrupts.ToString(), statsBoss.Invulned.ToString(), stats.TimeWasted.ToString(), stats.TimeSaved.ToString(), stats.SwapCount.ToString() });
                count++;
            }
            while (count < 15)//so each graph has equal spacing
            {
                NewLine();
                count++;
            }
        }
Example #4
0
 public JsonStats(Statistics.FinalStats stats)
 {
     DirectDamageCount         = stats.DirectDamageCount;
     CritableDirectDamageCount = stats.CritableDirectDamageCount;
     CriticalRate = stats.CriticalRate;
     CriticalDmg  = stats.CriticalDmg;
     ScholarRate  = stats.ScholarRate;
     ScholarDmg   = stats.ScholarDmg;
     EagleRate    = stats.EagleRate;
     EagleDmg     = stats.EagleDmg;
     MovingRate   = stats.MovingRate;
     MovingDamage = stats.MovingDamage;
     FlankingDmg  = stats.FlankingDmg;
     FlankingRate = stats.FlankingRate;
     GlanceRate   = stats.GlanceRate;
     Missed       = stats.Missed;
     Interrupts   = stats.Interrupts;
     Invulned     = stats.Invulned;
     DirectDamage = stats.DirectDamage;
 }
        public static List <object> GetDMGTargetStatData(Statistics.FinalStats stats)
        {
            List <object> data = new List <object>
            {
                stats.DirectDamageCount,         // 0
                stats.CritableDirectDamageCount, // 1
                stats.CriticalRate,              // 2
                stats.CriticalDmg,               // 3

                stats.FlankingRate,              // 4

                stats.GlanceRate,                // 5

                stats.Missed,                    // 6
                stats.Interrupts,                // 7
                stats.Invulned                   // 8
            };

            return(data);
        }
        private void CreateBossDMGStatsTable(int phaseIndex)
        {
            //generate dmgstats table=
            WriteLine(new [] { "Sub Group", "Profession", "Name",
                               "Critical%", "Critical hits", "Critical DMG",
                               "Scholar%", "Scholar hits", "Scholar DMG", "Scholar % increase",
                               "Moving%", "Moving Hits", "Moving DMG", "Moving % increase",
                               "Flanking%", "Flanking hits",
                               "Glancing%", "Glancing Hits",
                               "Blind%", "Blind Hits",
                               "Total Hits",
                               "Hits to Interupt", "Hits Invulned", "Time wasted", "Time saved", "Weapon Swaps" });
            int count = 0;

            foreach (Player player in _log.PlayerList)
            {
                Statistics.FinalDPS      dpsBoss   = _statistics.DpsBoss[_log.Boss][player][phaseIndex];
                Statistics.FinalStatsAll stats     = _statistics.StatsAll[player][phaseIndex];
                Statistics.FinalStats    statsBoss = _statistics.StatsBoss[_log.Boss][player][phaseIndex];

                WriteLine(new [] { player.Group.ToString(), player.Prof, player.Character,
                                   Math.Round((Double)(statsBoss.CriticalRate) / statsBoss.CritablePowerLoopCount * 100, 1).ToString(), statsBoss.CriticalRate.ToString(), statsBoss.CriticalDmg.ToString(),
                                   Math.Round((Double)(statsBoss.ScholarRate) / statsBoss.PowerLoopCount * 100, 1).ToString(), statsBoss.ScholarRate.ToString(), statsBoss.ScholarDmg.ToString(), Math.Round(100.0 * (dpsBoss.PlayerPowerDamage / (Double)(dpsBoss.PlayerPowerDamage - statsBoss.ScholarDmg) - 1.0), 3).ToString(),
                                   Math.Round((Double)(statsBoss.MovingRate) / statsBoss.PowerLoopCount * 100, 1).ToString(), statsBoss.MovingRate.ToString(), statsBoss.MovingDamage.ToString(), Math.Round(100.0 * (dpsBoss.PlayerPowerDamage / (Double)(dpsBoss.PlayerPowerDamage - statsBoss.MovingDamage) - 1.0), 3).ToString(),
                                   Math.Round(statsBoss.FlankingRate / (Double)statsBoss.PowerLoopCount * 100, 1).ToString(), statsBoss.FlankingRate.ToString(),
                                   Math.Round(statsBoss.GlanceRate / (Double)statsBoss.PowerLoopCount * 100, 1).ToString(), statsBoss.GlanceRate.ToString(),
                                   Math.Round(statsBoss.Missed / (Double)statsBoss.PowerLoopCount * 100, 1).ToString(), statsBoss.Missed.ToString(),
                                   statsBoss.PowerLoopCount.ToString(),
                                   statsBoss.Interrupts.ToString(), statsBoss.Invulned.ToString(), stats.TimeWasted.ToString(), stats.TimeSaved.ToString(), stats.SwapCount.ToString() });
                count++;
            }
            while (count < 15)//so each graph has equal spacing
            {
                NewLine();
                count++;
            }
        }
        private void CreateDPSTable(int phaseIndex)
        {
            PhaseData phase = _statistics.Phases[phaseIndex];

            WriteLine(new[] { "Sub Group", "Profession", "Role", "Name", "Account", "WepSet1_1", "WepSet1_2", "WepSet2_1", "WepSet2_2",
                              "Boss DPS", "Boss DMG", "Boss Power DPS", "Boss Power DMG", "Boss Condi DPS", "Boss Condi DMG",
                              "All DPS", "All DMG", "All Power DPS", "All Power DMG", "All Condi DPS", "All Condi DMG",
                              "Times Downed", "Time Died", "Percent Alive" });

            int count = 0;

            foreach (Player player in _log.PlayerList)
            {
                Statistics.FinalDPS      dps       = _statistics.DpsAll[player][phaseIndex];
                Statistics.FinalDPS      dpsBoss   = _statistics.DpsBoss[_log.Boss][player][phaseIndex];
                Statistics.FinalStatsAll stats     = _statistics.StatsAll[player][phaseIndex];
                Statistics.FinalStats    statsBoss = _statistics.StatsBoss[_log.Boss][player][phaseIndex];
                string deathString   = "";
                string deadthTooltip = "";
                if (stats.Died != 0.0)
                {
                    if (stats.Died < 0)
                    {
                        deathString = -stats.Died + " time(s)";
                    }
                    else
                    {
                        TimeSpan timedead = TimeSpan.FromMilliseconds(stats.Died);
                        deathString   = timedead.Minutes + " m " + timedead.Seconds + " s";
                        deadthTooltip = Math.Round((timedead.TotalMilliseconds / phase.GetDuration()) * 100, 1) + "%";
                    }
                }
                else
                {
                    deadthTooltip = "Never died";
                }
                string[] wep   = player.GetWeaponsArray(_log);
                string   build = "";
                if (player.Condition > 0)
                {
                    build += " Condi:" + player.Condition;
                }
                if (player.Concentration > 0)
                {
                    build += " Concentration:" + player.Concentration;
                }
                if (player.Healing > 0)
                {
                    build += " Healing:" + player.Healing;
                }
                if (player.Toughness > 0)
                {
                    build += " Toughness:" + player.Toughness;
                }
                WriteLine(new [] { player.Group.ToString(), player.Prof, build, player.Character, player.Account.TrimStart(':'), wep[0], wep[1], wep[2], wep[3],
                                   dpsBoss.Dps.ToString(), dpsBoss.Damage.ToString(), dpsBoss.PowerDps.ToString(), dpsBoss.PowerDamage.ToString(), dpsBoss.CondiDps.ToString(), dpsBoss.CondiDamage.ToString(),
                                   dps.Dps.ToString(), dps.Damage.ToString(), dps.PowerDps.ToString(), dps.PowerDamage.ToString(), dps.CondiDps.ToString(), dps.CondiDamage.ToString(),
                                   stats.DownCount.ToString(), deathString, deadthTooltip });
                count++;
            }
            while (count < 15)//so each graph has equal spacing
            {
                NewLine();
                count++;
            }
        }
        private void calculateStats()
        {
            foreach (Player player in log.getPlayerList())
            {
                Statistics.FinalStats[] phaseStats = new Statistics.FinalStats[phases.Count];
                for (int phaseIndex = 0; phaseIndex < phases.Count; phaseIndex++)
                {
                    Statistics.FinalStats final = new Statistics.FinalStats();

                    PhaseData phase = phases[phaseIndex];
                    long      start = phase.getStart() + log.getBossData().getFirstAware();
                    long      end   = phase.getEnd() + log.getBossData().getFirstAware();

                    List <DamageLog> damageLogs     = player.getDamageLogs(0, log, phase.getStart(), phase.getEnd());
                    List <DamageLog> damageLogsBoss = player.getDamageLogs(log.getBoss().getInstid(), log, phase.getStart(), phase.getEnd());
                    List <CastLog>   castLogs       = player.getCastLogs(log, phase.getStart(), phase.getEnd());

                    int instid = player.getInstid();

                    final.powerLoopCount = 0;
                    final.criticalRate   = 0;
                    final.criticalDmg    = 0;
                    final.scholarRate    = 0;
                    final.scholarDmg     = 0;
                    final.movingRate     = 0;
                    final.flankingRate   = 0;
                    final.glanceRate     = 0;
                    final.missed         = 0;
                    final.interupts      = 0;
                    final.invulned       = 0;
                    final.wasted         = 0;
                    final.timeWasted     = 0;
                    final.saved          = 0;
                    final.timeSaved      = 0;

                    final.powerLoopCountBoss = 0;
                    final.criticalRateBoss   = 0;
                    final.criticalDmgBoss    = 0;
                    final.scholarRateBoss    = 0;
                    final.scholarDmgBoss     = 0;
                    final.movingRateBoss     = 0;
                    final.flankingRateBoss   = 0;
                    final.glanceRateBoss     = 0;
                    final.missedBoss         = 0;
                    final.interuptsBoss      = 0;
                    final.invulnedBoss       = 0;

                    foreach (DamageLog log in damageLogs)
                    {
                        if (log.isCondi() == 0)
                        {
                            if (log.getResult() == ParseEnum.Result.Crit)
                            {
                                final.criticalRate++;
                                final.criticalDmg += log.getDamage();
                            }

                            if (log.isNinety() > 0)
                            {
                                final.scholarRate++;
                                final.scholarDmg += (int)(log.getDamage() / 11.0); //regular+10% damage
                            }

                            final.movingRate   += log.isMoving();
                            final.flankingRate += log.isFlanking();

                            if (log.getResult() == ParseEnum.Result.Glance)
                            {
                                final.glanceRate++;
                            }

                            if (log.getResult() == ParseEnum.Result.Blind)
                            {
                                final.missed++;
                            }

                            if (log.getResult() == ParseEnum.Result.Interrupt)
                            {
                                final.interupts++;
                            }

                            if (log.getResult() == ParseEnum.Result.Absorb)
                            {
                                final.invulned++;
                            }
                            final.powerLoopCount++;
                        }
                    }
                    foreach (DamageLog log in damageLogsBoss)
                    {
                        if (log.isCondi() == 0)
                        {
                            if (log.getResult() == ParseEnum.Result.Crit)
                            {
                                final.criticalRateBoss++;
                                final.criticalDmgBoss += log.getDamage();
                            }

                            if (log.isNinety() > 0)
                            {
                                final.scholarRateBoss++;
                                final.scholarDmgBoss += (int)(log.getDamage() / 11.0); //regular+10% damage
                            }

                            final.movingRateBoss   += log.isMoving();
                            final.flankingRateBoss += log.isFlanking();

                            if (log.getResult() == ParseEnum.Result.Glance)
                            {
                                final.glanceRateBoss++;
                            }

                            if (log.getResult() == ParseEnum.Result.Blind)
                            {
                                final.missedBoss++;
                            }

                            if (log.getResult() == ParseEnum.Result.Interrupt)
                            {
                                final.interuptsBoss++;
                            }

                            if (log.getResult() == ParseEnum.Result.Absorb)
                            {
                                final.invulnedBoss++;
                            }
                            final.powerLoopCountBoss++;
                        }
                    }
                    foreach (CastLog cl in castLogs)
                    {
                        if (cl.endActivation() == ParseEnum.Activation.CancelCancel)
                        {
                            final.wasted++;
                            final.timeWasted += cl.getActDur();
                        }
                        if (cl.endActivation() == ParseEnum.Activation.CancelFire)
                        {
                            final.saved++;
                            if (cl.getActDur() < cl.getExpDur())
                            {
                                final.timeSaved += cl.getExpDur() - cl.getActDur();
                            }
                        }
                    }

                    final.timeSaved  = final.timeSaved / 1000f;
                    final.timeWasted = final.timeWasted / 1000f;

                    final.totalDmg       = damageLogs.Sum(x => x.getDamage());
                    final.powerLoopCount = final.powerLoopCount == 0 ? 1 : final.powerLoopCount;

                    final.totalDmgBoss       = damageLogsBoss.Sum(x => x.getDamage());
                    final.powerLoopCountBoss = final.powerLoopCountBoss == 0 ? 1 : final.powerLoopCountBoss;

                    // Counts
                    CombatData combatData = log.getCombatData();
                    final.swapCount  = combatData.getStates(instid, ParseEnum.StateChange.WeaponSwap, start, end).Count();
                    final.downCount  = combatData.getStates(instid, ParseEnum.StateChange.ChangeDown, start, end).Count();
                    final.dodgeCount = combatData.getSkillCount(instid, 65001, start, end) + combatData.getBuffCount(instid, 40408, start, end); //dodge = 65001 mirage cloak =40408
                    final.ressCount  = combatData.getSkillCount(instid, 1066, start, end);                                                       //Res = 1066

                    // R.I.P
                    List <CombatItem> dead = combatData.getStates(instid, ParseEnum.StateChange.ChangeDead, start, end);
                    final.died = 0.0;
                    if (dead.Count() > 0)
                    {
                        final.died = dead[0].getTime() - start;
                    }

                    List <CombatItem> disconect = combatData.getStates(instid, ParseEnum.StateChange.Despawn, start, end);
                    final.dcd = 0.0;
                    if (disconect.Count() > 0)
                    {
                        final.dcd = disconect[0].getTime() - start;
                    }

                    phaseStats[phaseIndex] = final;
                }
                statistics.stats[player] = phaseStats;
            }
        }