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); }
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; }
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++; } }
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; } }