//Compare two lineups in a specific way. private void CompareLineups(TeamMatch lower, TeamMatch higher, bool isLower, PlayersToCompare compare, RankingCompareType rankingType) { //Get players in the team matches. var lowerPlayerPositions = GetPlayerPositions(lower, true); var higherPlayerPositions = GetPlayerPositions(higher, true); foreach (var lowerPlayerPosition in lowerPlayerPositions) { //Find positions to compare with. Dictionary <Player, List <Lineup.PositionType> > playersPositionsToCompare = GetPlayerPositionsToCompare(lowerPlayerPosition, higherPlayerPositions, compare); //Compare 2 positions. foreach (var higherPlayerPos in playersPositionsToCompare) { //If rankingtype is level, compare the players' levels. //Else, compare category points in the positions that the upper player plays in. if (rankingType == RankingCompareType.Level) { if (!CheckPoints(lowerPlayerPosition.Key.Rankings.LevelPoints, higherPlayerPos.Key.Rankings.LevelPoints)) { AddRuleBreaks(lower, lowerPlayerPosition.Key, higher, higherPlayerPos.Key, isLower); } } else { if (!CompareAbovePlayerPositions(lowerPlayerPosition, higherPlayerPos, rankingType)) { AddRuleBreaks(lower, lowerPlayerPosition.Key, higher, higherPlayerPos.Key, isLower); } } } } }
public void UpdateDetailedStats() { if (PlayersToCompare.Any()) { TopPlayer = PlayersToCompare.OrderByDescending(p => p.HealingBreakdown.Abilities.Sum(a => a.TotalEffectiveHealing)).First(); } AbilityDps = new List <Ability>(); AbilityHps = new List <Ability>(); foreach (var ptc in PlayersToCompare) { #region Damage if (ptc.DamageBreakdown.Abilities.Any()) { long totalDamageDealt = ptc.DamageBreakdown.Abilities.Sum(a => a.TotalDamage); //ptc.DamageBreakdown.TotalHits = ptc.DamageBreakdown.Abilities.Sum(a => a.Statistics.Hits); //ptc.DamageBreakdown.TotalCrits = ptc.DamageBreakdown.Abilities.Sum(a => a.Statistics.Crits); foreach (var playerAbility in ptc.DamageBreakdown.Abilities) { if (!AbilityDps.Any(a => a.AbilityId == playerAbility.AbilityId)) { AbilityDps.Add(playerAbility); } else { var thisAbility = AbilityDps.First(a => a.AbilityId == playerAbility.AbilityId); //long thisAbilityDamage = thisAbility.TotalDamage; //if (playerAbility.TotalDamage > thisAbilityDamage) //{ // thisAbility.TotalDamage = thisAbilityDamage; // thisAbility.DamagePerSecond = thisAbilityDamage/(long) Encounter.Duration.TotalSeconds; //} if (playerAbility.TotalDamage > thisAbility.HighestTotalDamage) { thisAbility.HighestTotalDamage = playerAbility.TotalDamage; } } playerAbility.BreakdownPercentage = playerAbility.TotalDamage > 0 ? ((decimal)playerAbility.TotalDamage / (decimal)totalDamageDealt) * 100 : 0; } } #endregion #region Healing if (ptc.HealingBreakdown.Abilities.Any()) { // Add the abilities we find to the temp list // Use ability names while comparing healing as it seems some healing abilities // have totally different IDs, once we're done and have sorted the temp list, copy it to the main one. long totalHealingDone = ptc.HealingBreakdown.Abilities.Sum(a => a.TotalEffectiveHealing); foreach (var playerAbility in ptc.HealingBreakdown.Abilities) { var thisHealingAbility = AbilityHps.FirstOrDefault( a => a.Name == playerAbility.Name && a.IconPath == playerAbility.IconPath); if (thisHealingAbility == null) { AbilityHps.Add(playerAbility); } else { thisHealingAbility.TotalEffectiveHealing += playerAbility.TotalEffectiveHealing; playerAbility.BreakdownPercentage = playerAbility.TotalEffectiveHealing > 0 ? ((decimal)playerAbility.TotalEffectiveHealing / (decimal)totalHealingDone) * 100 : 0; } } } #endregion } }
//Finds the positions that a position needs to be compared with. private Dictionary <Player, List <Lineup.PositionType> > GetPlayerPositionsToCompare(KeyValuePair <Player, List <Lineup.PositionType> > lowerPosition, Dictionary <Player, List <Lineup.PositionType> > higherPositions, PlayersToCompare compare) { var playersToCompare = new Dictionary <Player, List <Lineup.PositionType> >(); if (compare == PlayersToCompare.SameSex) { playersToCompare = higherPositions.Where(p => p.Key.Sex == lowerPosition.Key.Sex) .ToDictionary(pair => pair.Key, pair => pair.Value); } else if (compare == PlayersToCompare.SameCategory) { playersToCompare = higherPositions.Where(p => lowerPosition.Value.Count(q => p.Value.Contains(q)) > 1) .ToDictionary(pair => pair.Key, pair => pair.Value); } return(playersToCompare); }