private async void BtnExport_OnClick(object sender, RoutedEventArgs e) { // Get input field values var deckIndex = ComboBoxDeckPicker.SelectedIndex; var deck = deckIndex <= 0 ? (Guid?)null : decks.ElementAt(deckIndex - 1).DeckId; var region = (StatsRegion)ComboBoxRegion.SelectedItem; var time = (TimeFrame)ComboBoxTime.SelectedItem; var mode = (GameMode)ComboBoxMode.SelectedItem; // create exporting objects var filter = new StatsFilter(deck, region, mode, time); // TODO: needs to be selectable with further export types var exporter = new CSVExporter(); // set up and open save dialog SaveFileDialog dlg = new SaveFileDialog(); dlg.FileName = GetDefaultFileName(); dlg.DefaultExt = "." + exporter.FileExtension; dlg.InitialDirectory = Settings.Default.DefaultExportPath; dlg.Filter = exporter.Name + " Files | *." + exporter.FileExtension; Nullable<bool> result = dlg.ShowDialog(); // close export dialog await Hearthstone_Deck_Tracker.API.Core.MainWindow.HideMetroDialogAsync(this); // Process save file dialog box results if (result == true) { // Save document string filename = dlg.FileName; await Converter.Export(exporter, filter, filename); } }
public Stats(StatsFilter bonusType, Monster vsMonster) { this.OriginalItem = null; this.Damage = 0; this.Accuracy = 0; this.CriticalRate = 0; this.Defense = 0; this.MagicDefense = 0; this.Hp = 0; if (bonusType == StatsFilter.Damage) this.Damage = 1 / (1 + vsMonster.Defense / 100.0); if (bonusType == StatsFilter.MagicAttack) this.Damage = 1 / (1 + vsMonster.MagicDefense / 100.0); if (bonusType == StatsFilter.Accuracy) this.Accuracy = 0.01; if (bonusType == StatsFilter.CriticalRate) this.CriticalRate = 0.01; if (bonusType == StatsFilter.Defense) this.Defense = 0.01; if (bonusType == StatsFilter.MagicDefense) this.MagicDefense = 0.01; if (bonusType == StatsFilter.Hp) this.Hp = 1; }
private static Dictionary<ItemSlot, Stats[]> removeRedundantItems(IEnumerable<Item> items, Hero hero, Monster monster, StatsFilter statsMask) { var itemGroups = items.Select(x => new Stats(x, hero, monster)).GroupBy(x => x.OriginalItem.Slot); var filteredItems = new Dictionary<ItemSlot, Stats[]>(); foreach (var itemGroup in itemGroups) { var filteredList = new List<Stats>(); foreach (var item in itemGroup) { bool redundant = false; var superiorTo = new HashSet<Stats>(); foreach (var filteredItem in filteredList) { if (item.isSuperiorTo(filteredItem, statsMask)) superiorTo.Add(filteredItem); redundant |= item.isInferiorTo(filteredItem, statsMask); } foreach (var toRemove in superiorTo) filteredList.Remove(toRemove); if (!redundant) filteredList.Add(item); } if (filteredList.Count == 0) { var maxDamage = itemGroup.Max(x => x.Damage); filteredList.Add(itemGroup.First(x => Math.Abs(x.Damage - maxDamage) < 1e-3)); } filteredItems.Add(itemGroup.Key, filteredList.ToArray()); } return filteredItems; }
public void TestCsvHelper() { var exporter = new CSVExporter(); var filter = new StatsFilter(); var file = "sample-export.csv"; exporter.To(file, filter.Apply(stats)); var count = TestHelper.CountLines(file); Assert.AreEqual(10, count); }
public bool isSuperiorTo(Stats other, StatsFilter statsMask) { return((this.Damage >= other.Damage || !statsMask.HasFlag(StatsFilter.Damage)) && (this.Accuracy >= other.Accuracy || !statsMask.HasFlag(StatsFilter.Accuracy)) && (this.CriticalRate >= other.CriticalRate || !statsMask.HasFlag(StatsFilter.CriticalRate)) && (this.Defense >= other.Defense || !statsMask.HasFlag(StatsFilter.Defense)) && (this.MagicDefense >= other.MagicDefense || !statsMask.HasFlag(StatsFilter.MagicDefense)) && (this.Hp >= other.Hp || !statsMask.HasFlag(StatsFilter.Hp))); }
public Stats(StatsFilter bonusType, Monster vsMonster) { this.OriginalItem = null; this.Damage = 0; this.Accuracy = 0; this.CriticalRate = 0; this.Defense = 0; this.MagicDefense = 0; this.Hp = 0; if (bonusType == StatsFilter.Damage) { this.Damage = 1 / (1 + vsMonster.Defense / 100.0); } if (bonusType == StatsFilter.MagicAttack) { this.Damage = 1 / (1 + vsMonster.MagicDefense / 100.0); } if (bonusType == StatsFilter.Accuracy) { this.Accuracy = 0.01; } if (bonusType == StatsFilter.CriticalRate) { this.CriticalRate = 0.01; } if (bonusType == StatsFilter.Defense) { this.Defense = 0.01; } if (bonusType == StatsFilter.MagicDefense) { this.MagicDefense = 0.01; } if (bonusType == StatsFilter.Hp) { this.Hp = 1; } }
private void CheckSelection(object o) { switch (Convert.ToInt32(o)) { case 1: if (ItemTypeFilterTabContent == null) { ItemTypeFilterTabContent = new ItemTypeFilter(this); } ((ItemTypeFilterTabContent as ItemTypeFilter).DataContext as ItemTypeFilterControl).FilterEnabled = true; break; case 2: if (WeaponFilterTabContent == null) { WeaponFilterTabContent = new WeaponFilter(this); } ((WeaponFilterTabContent as WeaponFilter).DataContext as WeaponFilterControl).FilterEnabled = true; break; case 3: if (ArmourFilterTabContent == null) { ArmourFilterTabContent = new ArmourFilter(this); } ((ArmourFilterTabContent as ArmourFilter).DataContext as ArmourFilterControl).FilterEnabled = true; break; case 4: if (SocketFilterTabContent == null) { SocketFilterTabContent = new SocketFilter(this); } ((SocketFilterTabContent as SocketFilter).DataContext as SocketFilterControl).FilterEnabled = true; break; case 5: if (RequirementFilterTabContent == null) { RequirementFilterTabContent = new RequirementsFilter(this); } ((RequirementFilterTabContent as RequirementsFilter).DataContext as RequirementsFilterControl).FilterEnabled = true; break; case 6: if (MapFilterTabContent == null) { MapFilterTabContent = new MapFilter(this); } ((MapFilterTabContent as MapFilter).DataContext as MapFilterControl).FilterEnabled = true; break; case 7: if (MiscellaneousFilterTabContent == null) { MiscellaneousFilterTabContent = new MiscellaneousFilter(this); } ((MiscellaneousFilterTabContent as MiscellaneousFilter).DataContext as MiscellaneousFilterControl).FilterEnabled = true; break; case 8: if (StatsFilterTabContent == null) { StatsFilterTabContent = new StatsFilter(this); } ((StatsFilterTabContent as StatsFilter).DataContext as StatsFilterControl).FilterEnabled = true; break; } }
public static Dictionary<ItemSlot, Stats[]> RelevantFor(Hero hero, int maxItemLevel, Monster monster, StatsFilter statsMask) { return removeRedundantItems( MakeItems(maxItemLevel), hero, monster, statsMask); }
public bool isSuperiorTo(Stats other, StatsFilter statsMask) { return (this.Damage >= other.Damage || !statsMask.HasFlag(StatsFilter.Damage)) && (this.Accuracy >= other.Accuracy || !statsMask.HasFlag(StatsFilter.Accuracy)) && (this.CriticalRate >= other.CriticalRate || !statsMask.HasFlag(StatsFilter.CriticalRate)) && (this.Defense >= other.Defense || !statsMask.HasFlag(StatsFilter.Defense)) && (this.MagicDefense >= other.MagicDefense || !statsMask.HasFlag(StatsFilter.MagicDefense)) && (this.Hp >= other.Hp || !statsMask.HasFlag(StatsFilter.Hp)); }
public void TestUnknownDeckId() { var filter = new StatsFilter(new Guid(), StatsRegion.All, GameMode.All, TimeFrame.AllTime); var filtered = filter.Apply(stats); Assert.AreEqual(0, filtered.Count); }
public void TestTimeFrameFilter() { var filter = new StatsFilter(null, StatsRegion.All, GameMode.All, TimeFrame.Last7Days); var filtered = filter.Apply(stats); Assert.AreEqual(7, filtered.Count); }
public void TestSingleDeckNoStats() { var filter = new StatsFilter(empty, StatsRegion.All, GameMode.All, TimeFrame.AllTime); var filtered = filter.Apply(stats); Assert.AreEqual(0, filtered.Count); }
public void TestRegionFilter() { var filter = new StatsFilter(null, StatsRegion.EU, GameMode.All, TimeFrame.AllTime); var filtered = filter.Apply(stats); Assert.AreEqual(5, filtered.Count); }
public void TestDefaultFilterReturnsAll() { var filter = new StatsFilter(); var filtered = filter.Apply(stats); Assert.AreEqual(9, filtered.Count); }
private static Dictionary <ItemSlot, Stats[]> removeRedundantItems(IEnumerable <Item> items, Hero hero, Monster monster, StatsFilter statsMask) { var itemGroups = items.Select(x => new Stats(x, hero, monster)).GroupBy(x => x.OriginalItem.Slot); var filteredItems = new Dictionary <ItemSlot, Stats[]>(); foreach (var itemGroup in itemGroups) { var filteredList = new List <Stats>(); foreach (var item in itemGroup) { bool redundant = false; var superiorTo = new HashSet <Stats>(); foreach (var filteredItem in filteredList) { if (item.isSuperiorTo(filteredItem, statsMask)) { superiorTo.Add(filteredItem); } redundant |= item.isInferiorTo(filteredItem, statsMask); } foreach (var toRemove in superiorTo) { filteredList.Remove(toRemove); } if (!redundant) { filteredList.Add(item); } } if (filteredList.Count == 0) { var maxDamage = itemGroup.Max(x => x.Damage); filteredList.Add(itemGroup.First(x => Math.Abs(x.Damage - maxDamage) < 1e-3)); } filteredItems.Add(itemGroup.Key, filteredList.ToArray()); } return(filteredItems); }
public static Dictionary <ItemSlot, Stats[]> RelevantFor(Hero hero, int maxItemLevel, Monster monster, StatsFilter statsMask) { return(removeRedundantItems( MakeItems(maxItemLevel), hero, monster, statsMask)); }