コード例 #1
0
ファイル: PriceViewModel.cs プロジェクト: Xustis/Sidekick
        private void InitializeMods(List <Modifier> modifiers, bool normalizeValues = true)
        {
            if (modifiers.Count == 0)
            {
                return;
            }

            PriceFilterCategory category = null;

            foreach (var modifier in modifiers)
            {
                if (category == null)
                {
                    category = new PriceFilterCategory();
                }

                InitializeFilter(category,
                                 nameof(StatFilter),
                                 modifier.Id,
                                 !string.IsNullOrEmpty(modifier.Category) ? $"({modifier.Category}) {modifier.Text}" : modifier.Text,
                                 modifier.Values,
                                 normalizeValues: normalizeValues,
                                 enabled: settings.Modifiers.Contains(modifier.Id)
                                 );
            }

            if (category != null)
            {
                Filters.Add(category);
            }
        }
コード例 #2
0
        private void InitializeMods(List <Modifier> modifiers, bool normalizeValues = true)
        {
            if (modifiers.Count == 0)
            {
                return;
            }

            PriceFilterCategory category = null;

            var settingMods = Item.Category switch
            {
                Category.Accessory => settings.AccessoryModifiers,
                Category.Armour => settings.ArmourModifiers,
                Category.Flask => settings.FlaskModifiers,
                Category.Jewel => settings.JewelModifiers,
                Category.Map => settings.MapModifiers,
                Category.Weapon => settings.WeaponModifiers,
                _ => new List <string>(),
            };

            foreach (var modifier in modifiers)
            {
                if (category == null)
                {
                    category = new PriceFilterCategory();
                }

                if (modifier.OptionValue != null)
                {
                    InitializeFilter(category,
                                     nameof(StatFilter),
                                     modifier.Id,
                                     !string.IsNullOrEmpty(modifier.Category) ? $"({modifier.Category}) {modifier.Text}" : modifier.Text,
                                     modifier.OptionValue,
                                     normalizeValues: normalizeValues,
                                     enabled: settingMods.Contains(modifier.Id) && Item.Rarity != Rarity.Unique
                                     );
                }
                else
                {
                    InitializeFilter(category,
                                     nameof(StatFilter),
                                     modifier.Id,
                                     !string.IsNullOrEmpty(modifier.Category) ? $"({modifier.Category}) {modifier.Text}" : modifier.Text,
                                     modifier.Values,
                                     normalizeValues: normalizeValues,
                                     enabled: settingMods.Contains(modifier.Id) && Item.Rarity != Rarity.Unique
                                     );
                }
            }

            if (category != null)
            {
                Filters.Add(category);
            }
        }
コード例 #3
0
        private void InitializeFilter <T>(PriceFilterCategory category, string type, string id, string label, T value, double delta = 5, bool enabled = false, double?min = null, bool alwaysIncluded = false)
        {
            if (value is bool boolValue)
            {
                if (!boolValue && !alwaysIncluded)
                {
                    return;
                }
            }
            else if (value is int intValue)
            {
                if (intValue == 0 && !alwaysIncluded)
                {
                    return;
                }
                if (min == null)
                {
                    min = (int)Math.Min(intValue - delta, intValue * 0.9);
                }
            }
            else if (value is double doubleValue)
            {
                if (doubleValue == 0 && !alwaysIncluded)
                {
                    return;
                }
                if (min == null)
                {
                    min = (int)Math.Min(doubleValue - delta, doubleValue * 0.9);
                }
            }
            else if (value is IGrouping <string, Magnitude> groupValue)
            {
                min = groupValue.Select(x => x.Min).OrderBy(x => x).FirstOrDefault();
                if (min.HasValue)
                {
                    min = (int)Math.Min(min.Value - delta, min.Value * 0.9);
                }
            }

            var priceFilter = new PriceFilter()
            {
                Enabled  = enabled,
                Type     = type,
                Id       = id,
                Text     = label,
                Min      = min,
                Max      = null,
                HasRange = min.HasValue
            };

            priceFilter.PropertyChanged += async(object sender, PropertyChangedEventArgs e) => { await UpdateQuery(); };

            category.Filters.Add(priceFilter);
        }
コード例 #4
0
        private void InitializeMods(List <Mod> mods)
        {
            if (mods.Count == 0)
            {
                return;
            }

            PriceFilterCategory category = null;

            var magnitudes = mods
                             .SelectMany(x => x.Magnitudes)
                             .GroupBy(x => x.Hash)
                             .Select(x => new
            {
                Definition = statDataService.GetById(x.First().Hash),
                Magnitudes = x
            })
                             .ToList();

            foreach (var magnitude in magnitudes)
            {
                if (category == null)
                {
                    category = new PriceFilterCategory()
                    {
                        Label = magnitude.Definition.Category
                    };
                }

                InitializeFilter(category, nameof(StatFilter), magnitude.Definition.Id, magnitude.Definition.Text, magnitude.Magnitudes,
                                 enabled: settings.Modifiers.Contains(magnitude.Definition.Id)
                                 );
            }

            if (category != null)
            {
                Filters.Add(category);
            }
        }
コード例 #5
0
        private void InitializeFilters()
        {
            Filters = new ObservableList <PriceFilterCategory>();

            var propertyCategory = new PriceFilterCategory()
            {
                Label = PriceResources.Filters_Properties
            };

            InitializeFilter(propertyCategory, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.Armor), languageProvider.Language.DescriptionArmour, Item.Armor);
            InitializeFilter(propertyCategory, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.EnergyShield), languageProvider.Language.DescriptionEnergyShield, Item.EnergyShield);
            InitializeFilter(propertyCategory, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.Evasion), languageProvider.Language.DescriptionEvasion, Item.Evasion);
            InitializeFilter(propertyCategory, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.Block), languageProvider.Language.DescriptionChanceToBlock, Item.ChanceToBlock,
                             delta: 1);

            InitializeFilter(propertyCategory, nameof(SearchFilters.MapFilters), nameof(MapFilter.ItemQuantity), languageProvider.Language.DescriptionItemQuantity, Item.ItemQuantity);
            InitializeFilter(propertyCategory, nameof(SearchFilters.MapFilters), nameof(MapFilter.ItemRarity), languageProvider.Language.DescriptionItemRarity, Item.ItemRarity);
            InitializeFilter(propertyCategory, nameof(SearchFilters.MapFilters), nameof(MapFilter.MonsterPackSize), languageProvider.Language.DescriptionMonsterPackSize, Item.MonsterPackSize);
            InitializeFilter(propertyCategory, nameof(SearchFilters.MapFilters), nameof(MapFilter.Blighted), languageProvider.Language.PrefixBlighted, Item.Blighted,
                             enabled: Item.Blighted);

            InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.Quality), languageProvider.Language.DescriptionQuality, Item.Quality,
                             enabled: Item.Rarity == Rarity.Gem && Item.Quality >= 20,
                             min: Item.Rarity == Rarity.Gem && Item.Quality >= 20 ? (double?)Item.Quality : null);
            InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.GemLevel), languageProvider.Language.DescriptionLevel, Item.GemLevel,
                             enabled: Item.GemLevel >= 20,
                             min: Item.GemLevel >= 20 ? Item.GemLevel : (double?)null);
            InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.ItemLevel), languageProvider.Language.DescriptionItemLevel, Item.ItemLevel,
                             enabled: Item.ItemLevel >= 80,
                             min: Item.ItemLevel >= 80 ? (double?)Item.ItemLevel : null);
            InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.Corrupted), languageProvider.Language.DescriptionCorrupted, Item.Corrupted,
                             alwaysIncluded: Item.Rarity == Rarity.Gem || Item.Rarity == Rarity.Unique,
                             enabled: (Item.Rarity == Rarity.Gem || Item.Rarity == Rarity.Unique) && Item.Corrupted);
            InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.CrusaderItem), languageProvider.Language.InfluenceCrusader, Item.Influences.Crusader,
                             enabled: Item.Influences.Crusader);
            InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.ElderItem), languageProvider.Language.InfluenceElder, Item.Influences.Elder,
                             enabled: Item.Influences.Elder);
            InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.HunterItem), languageProvider.Language.InfluenceHunter, Item.Influences.Hunter,
                             enabled: Item.Influences.Hunter);
            InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.RedeemerItem), languageProvider.Language.InfluenceRedeemer, Item.Influences.Redeemer,
                             enabled: Item.Influences.Redeemer);
            InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.ShaperItem), languageProvider.Language.InfluenceShaper, Item.Influences.Shaper,
                             enabled: Item.Influences.Shaper);
            InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.WarlordItem), languageProvider.Language.InfluenceWarlord, Item.Influences.Warlord,
                             enabled: Item.Influences.Warlord);

            InitializeFilter(propertyCategory, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.PhysicalDps), PriceResources.Filters_PDps, Item.Extended.PhysicalDps);
            InitializeFilter(propertyCategory, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.ElementalDps), PriceResources.Filters_EDps, Item.Extended.ElementalDps);
            InitializeFilter(propertyCategory, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.DamagePerSecond), PriceResources.Filters_Dps, Item.Extended.DamagePerSecond);
            InitializeFilter(propertyCategory, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.AttacksPerSecond), languageProvider.Language.DescriptionAttacksPerSecond, Item.AttacksPerSecond,
                             delta: 0.1);
            InitializeFilter(propertyCategory, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.CriticalStrikeChance), languageProvider.Language.DescriptionCriticalStrikeChance, Item.CriticalStrikeChance,
                             delta: 1);

            if (propertyCategory.Filters.Any())
            {
                Filters.Add(propertyCategory);
            }

            InitializeMods(Item.Extended.Mods.Pseudo);
            InitializeMods(Item.Extended.Mods.Implicit);
            InitializeMods(Item.Extended.Mods.Explicit);
            InitializeMods(Item.Extended.Mods.Crafted);
            InitializeMods(Item.Extended.Mods.Enchant);

            if (Filters.Count == 0)
            {
                Filters = null;
            }
        }
コード例 #6
0
        private void InitializeFilter <T>(PriceFilterCategory category,
                                          string type,
                                          string id,
                                          string label,
                                          T value,
                                          double delta         = 5,
                                          bool enabled         = false,
                                          double?min           = null,
                                          double?max           = null,
                                          bool alwaysIncluded  = false,
                                          bool normalizeValues = true,
                                          bool applyNegative   = false)
        {
            ModifierOption option = null;

            if (value is bool boolValue)
            {
                if (!boolValue && !alwaysIncluded)
                {
                    return;
                }
            }
            else if (value is int intValue)
            {
                if (intValue == 0 && !alwaysIncluded)
                {
                    return;
                }
                if (min == null && normalizeValues)
                {
                    min = NormalizeMinValue(intValue, delta);
                }
                if (LabelValues.IsMatch(label))
                {
                    label = LabelValues.Replace(label, intValue.ToString());
                }
                else
                {
                    label += $": {value}";
                }
            }
            else if (value is double doubleValue)
            {
                if (doubleValue == 0 && !alwaysIncluded)
                {
                    return;
                }
                if (min == null && normalizeValues)
                {
                    min = NormalizeMinValue(doubleValue, delta);
                }
                if (LabelValues.IsMatch(label))
                {
                    label = LabelValues.Replace(label, doubleValue.ToString("0.00"));
                }
                else
                {
                    label += $": {doubleValue:0.00}";
                }
            }
            else if (value is List <double> groupValue)
            {
                var itemValue = groupValue.OrderBy(x => x).FirstOrDefault();

                if (itemValue >= 0)
                {
                    min = itemValue;
                    if (normalizeValues)
                    {
                        min = NormalizeMinValue(min, delta);
                    }
                }
                else
                {
                    max = itemValue;
                    if (normalizeValues)
                    {
                        max = NormalizeMaxValue(max, delta);
                    }
                }

                if (!groupValue.Any())
                {
                    min = null;
                    max = null;
                }
            }
            else if (value is ModifierOption modifierOption)
            {
                option = modifierOption;
                min    = null;
                max    = null;
            }

            var priceFilter = new PriceFilter()
            {
                Enabled       = enabled,
                Type          = type,
                Id            = id,
                Text          = label,
                Min           = min,
                Max           = max,
                HasRange      = min.HasValue || max.HasValue,
                ApplyNegative = applyNegative,
                Option        = option,
            };

            priceFilter.PropertyChanged += (object sender, PropertyChangedEventArgs e) => { UpdateDebounce(); };

            category.Filters.Add(priceFilter);
        }
コード例 #7
0
        private void InitializeFilters()
        {
            // No filters for prophecies, currencies and divination cards, etc.
            if (Item.Category == Category.DivinationCard ||
                Item.Category == Category.Currency ||
                Item.Category == Category.Prophecy ||
                Item.Category == Category.ItemisedMonster ||
                Item.Category == Category.Leaguestone ||
                Item.Category == Category.Watchstone ||
                Item.Category == Category.Undefined)
            {
                Filters = null;
                return;
            }

            Filters = new ObservableList <PriceFilterCategory>();

            var propertyCategory1 = new PriceFilterCategory();
            var propertyCategory2 = new PriceFilterCategory();

            // Quality
            InitializeFilter(propertyCategory1, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.Quality), languageProvider.Language.DescriptionQuality, Item.Properties.Quality,
                             enabled: Item.Rarity == Rarity.Gem,
                             min: Item.Rarity == Rarity.Gem && Item.Properties.Quality >= 20 ? (double?)Item.Properties.Quality : null);

            // Armour
            InitializeFilter(propertyCategory1, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.Armor), languageProvider.Language.DescriptionArmour, Item.Properties.Armor);
            // Evasion
            InitializeFilter(propertyCategory1, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.Evasion), languageProvider.Language.DescriptionEvasion, Item.Properties.Evasion);
            // Energy shield
            InitializeFilter(propertyCategory1, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.EnergyShield), languageProvider.Language.DescriptionEnergyShield, Item.Properties.EnergyShield);
            // Block
            InitializeFilter(propertyCategory1, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.Block), languageProvider.Language.DescriptionChanceToBlock, Item.Properties.ChanceToBlock,
                             delta: 1);

            // Gem level
            InitializeFilter(propertyCategory1, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.GemLevel), languageProvider.Language.DescriptionLevel, Item.Properties.GemLevel,
                             enabled: true,
                             min: Item.Properties.GemLevel);

            // Item quantity
            InitializeFilter(propertyCategory1, nameof(SearchFilters.MapFilters), nameof(MapFilter.ItemQuantity), languageProvider.Language.DescriptionItemQuantity, Item.Properties.ItemQuantity);
            // Item rarity
            InitializeFilter(propertyCategory1, nameof(SearchFilters.MapFilters), nameof(MapFilter.ItemRarity), languageProvider.Language.DescriptionItemRarity, Item.Properties.ItemRarity);
            // Monster pack size
            InitializeFilter(propertyCategory1, nameof(SearchFilters.MapFilters), nameof(MapFilter.MonsterPackSize), languageProvider.Language.DescriptionMonsterPackSize, Item.Properties.MonsterPackSize);
            // Blighted
            InitializeFilter(propertyCategory1, nameof(SearchFilters.MapFilters), nameof(MapFilter.Blighted), languageProvider.Language.PrefixBlighted, Item.Properties.Blighted,
                             enabled: Item.Properties.Blighted);
            // Map tier
            InitializeFilter(propertyCategory1, nameof(SearchFilters.MapFilters), nameof(MapFilter.MapTier), languageProvider.Language.DescriptionMapTier, Item.Properties.MapTier,
                             enabled: true,
                             min: Item.Properties.MapTier);

            // Physical Dps
            InitializeFilter(propertyCategory1, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.PhysicalDps), PriceResources.Filters_PDps, Item.Properties.PhysicalDps);
            // Elemental Dps
            InitializeFilter(propertyCategory1, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.ElementalDps), PriceResources.Filters_EDps, Item.Properties.ElementalDps);
            // Total Dps
            InitializeFilter(propertyCategory1, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.DamagePerSecond), PriceResources.Filters_Dps, Item.Properties.DamagePerSecond);
            // Attacks per second
            InitializeFilter(propertyCategory1, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.AttacksPerSecond), languageProvider.Language.DescriptionAttacksPerSecond, Item.Properties.AttacksPerSecond,
                             delta: 0.1);
            // Critical strike chance
            InitializeFilter(propertyCategory1, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.CriticalStrikeChance), languageProvider.Language.DescriptionCriticalStrikeChance, Item.Properties.CriticalStrikeChance,
                             delta: 1);

            // Item level
            InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.ItemLevel), languageProvider.Language.DescriptionItemLevel, Item.ItemLevel,
                             enabled: Item.ItemLevel >= 80 && Item.Properties.MapTier == 0 && Item.Rarity != Rarity.Unique,
                             min: Item.ItemLevel >= 80 ? (double?)Item.ItemLevel : null);

            // Corrupted
            InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.Corrupted), languageProvider.Language.DescriptionCorrupted, Item.Corrupted,
                             alwaysIncluded: Item.Rarity == Rarity.Gem || Item.Rarity == Rarity.Unique,
                             enabled: (Item.Rarity == Rarity.Gem || Item.Rarity == Rarity.Unique) && Item.Corrupted,
                             applyNegative: true);

            // Crusader
            InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.CrusaderItem), languageProvider.Language.InfluenceCrusader, Item.Influences.Crusader,
                             enabled: Item.Influences.Crusader);
            // Elder
            InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.ElderItem), languageProvider.Language.InfluenceElder, Item.Influences.Elder,
                             enabled: Item.Influences.Elder);
            // Hunter
            InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.HunterItem), languageProvider.Language.InfluenceHunter, Item.Influences.Hunter,
                             enabled: Item.Influences.Hunter);
            // Redeemer
            InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.RedeemerItem), languageProvider.Language.InfluenceRedeemer, Item.Influences.Redeemer,
                             enabled: Item.Influences.Redeemer);
            // Shaper
            InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.ShaperItem), languageProvider.Language.InfluenceShaper, Item.Influences.Shaper,
                             enabled: Item.Influences.Shaper);
            // Warlord
            InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.WarlordItem), languageProvider.Language.InfluenceWarlord, Item.Influences.Warlord,
                             enabled: Item.Influences.Warlord);

            if (propertyCategory1.Filters.Any())
            {
                Filters.Add(propertyCategory1);
            }

            if (propertyCategory2.Filters.Any())
            {
                Filters.Add(propertyCategory2);
            }

            // Modifiers
            InitializeMods(Item.Modifiers.Pseudo);
            InitializeMods(Item.Modifiers.Enchant, false);
            InitializeMods(Item.Modifiers.Implicit);
            InitializeMods(Item.Modifiers.Explicit);
            InitializeMods(Item.Modifiers.Crafted);
            InitializeMods(Item.Modifiers.Fractured);

            if (Filters.Count == 0)
            {
                Filters = null;
            }
        }
コード例 #8
0
ファイル: PriceViewModel.cs プロジェクト: Xustis/Sidekick
        private void InitializeFilter <T>(PriceFilterCategory category,
                                          string type,
                                          string id,
                                          string label,
                                          T value,
                                          double delta         = 5,
                                          bool enabled         = false,
                                          double?min           = null,
                                          bool alwaysIncluded  = false,
                                          bool normalizeValues = true)
        {
            if (value is bool boolValue)
            {
                if (!boolValue && !alwaysIncluded)
                {
                    return;
                }
            }
            else if (value is int intValue)
            {
                if (intValue == 0 && !alwaysIncluded)
                {
                    return;
                }
                if (min == null && normalizeValues)
                {
                    min = NormalizeValue(intValue, delta);
                }
                if (LabelValues.IsMatch(label))
                {
                    label = LabelValues.Replace(label, intValue.ToString());
                }
                else
                {
                    label += $": {value}";
                }
            }
            else if (value is double doubleValue)
            {
                if (doubleValue == 0 && !alwaysIncluded)
                {
                    return;
                }
                if (min == null && normalizeValues)
                {
                    min = NormalizeValue(doubleValue, delta);
                }
                if (LabelValues.IsMatch(label))
                {
                    label = LabelValues.Replace(label, doubleValue.ToString("0.00"));
                }
                else
                {
                    label += $": {doubleValue:0.00}";
                }
            }
            else if (value is List <double> groupValue)
            {
                min = groupValue.OrderBy(x => x).FirstOrDefault();
                if (normalizeValues)
                {
                    min = NormalizeValue(min, delta);
                }
            }

            var priceFilter = new PriceFilter()
            {
                Enabled  = enabled,
                Type     = type,
                Id       = id,
                Text     = label,
                Min      = min,
                Max      = null,
                HasRange = min.HasValue
            };

            priceFilter.PropertyChanged += async(object sender, PropertyChangedEventArgs e) => { await UpdateQuery(); };

            category.Filters.Add(priceFilter);
        }