private static CraftingSubcondition CreateCraftingSubcondition(SubconditionAggregateType aggregateType, StatValueType statType, int?min, int?max, params ConditionAffix[] affixes)
        {
            CraftingSubcondition subcondition = new CraftingSubcondition
            {
                AggregateType = aggregateType, AggregateMin = min, AggregateMax = max, ValueType = statType
            };

            subcondition.PrefixConditions.AddRange(affixes.ToList());
            return(subcondition);
        }
Beispiel #2
0
        public void AddSubcondition()
        {
            var subcondition        = new CraftingSubcondition();
            var subconditionControl = new SubconditionControl(subcondition, _affixes, GetNextIndex(), _itemBase);

            subconditionControl.OnDeleteEvent += (x, y) => RemoveSubcondition(y.Control);

            _craftingCondition.CraftingSubConditions.Add(subcondition);
            SubconditionControls.Add(subconditionControl);
            SelectedSubcondition = subconditionControl;
            OnPropertyChanged(nameof(SelectedSubcondition));
            OnPropertyChanged(nameof(SubconditionControls));
        }
        public SubconditionControl(CraftingSubcondition subCondition, List <Affix> affixes, int index, ItemBase itemBase)
        {
            SubconditionName = string.IsNullOrEmpty(subCondition.Name) ? "Subcondition " + index : subCondition.Name;

            Index                 = index;
            SubCondition          = subCondition;
            AggregateTypeMin      = subCondition.AggregateMin;
            AggregateTypeMax      = subCondition.AggregateMax;
            PrefixConditions      = new SubconditionAffixesControl(subCondition.PrefixConditions, affixes, AffixType.Prefix, itemBase, subCondition.ValueType);
            SuffixConditions      = new SubconditionAffixesControl(subCondition.SuffixConditions, affixes, AffixType.Suffix, itemBase, subCondition.ValueType);
            MetaConditions        = new SubconditionAffixesControl(subCondition.MetaConditions, affixes, AffixType.Meta, itemBase, subCondition.ValueType);
            SelectedAggregateType = subCondition.AggregateType.ToString();
            SelectedValueType     = subCondition.ValueType.ToString();

            DataContext = this;
            InitializeComponent();
        }
        private bool IsSubconditionValid(CraftingSubcondition subcondition, Equipment item)
        {
            var prefixResolutions =
                subcondition.PrefixConditions.Select(
                    x => ResolveCondition(x, item, AffixType.Prefix, subcondition.ValueType)).ToList();

            var suffixResolutions =
                subcondition.SuffixConditions.Select(
                    x => ResolveCondition(x, item, AffixType.Suffix, subcondition.ValueType)).ToList();

            var metaResolutions =
                subcondition.MetaConditions.Select(
                    x => ResolveCondition(x, item, AffixType.Meta, subcondition.ValueType)).ToList();

            var allResolutions = prefixResolutions
                                 .Concat(suffixResolutions)
                                 .Concat(metaResolutions)
                                 .ToList();

            var matched = allResolutions.Count(x => x.IsMatch);
            var sum     = allResolutions.Where(x => x.IsPresent).Sum(x => x.Values.Sum());

            switch (subcondition.AggregateType)
            {
            case SubconditionAggregateType.Count:
                return((!subcondition.AggregateMin.HasValue || matched >= subcondition.AggregateMin) && (!subcondition.AggregateMax.HasValue || matched <= subcondition.AggregateMax));

            case SubconditionAggregateType.And:
                return(allResolutions.All(x => x.IsPresent && x.IsMatch));

            case SubconditionAggregateType.If:
                return(allResolutions.Where(x => x.IsPresent).All(x => x.IsMatch));

            case SubconditionAggregateType.Not:
                return(!allResolutions.Any(x => x.IsMatch));

            case SubconditionAggregateType.Sum:
                return((!subcondition.AggregateMin.HasValue || sum >= subcondition.AggregateMin) && (!subcondition.AggregateMax.HasValue || sum <= subcondition.AggregateMax));

            default:
                throw new InvalidOperationException($"The subcondition aggregate type {Enum.GetName(typeof(SubconditionAggregateType), subcondition.AggregateType)} is not recognized");
            }
        }
Beispiel #5
0
        public SubconditionControlViewModel(CraftingSubcondition subCondition, List <Affix> affixes, int index, PoeCrafting.Entities.ItemBase itemBase)
        {
            SubconditionName = string.IsNullOrEmpty(subCondition.Name) ? "JsonSubcondition " + index : subCondition.Name;

            Index            = index;
            SubCondition     = subCondition;
            AggregateTypeMin = subCondition.AggregateMin;
            AggregateTypeMax = subCondition.AggregateMax;

            PrefixConditionsModel = new SubconditionAffixesControlViewModel(subCondition.PrefixConditions, affixes, AffixType.Prefix, itemBase, subCondition.ValueType);
            SuffixConditionsModel = new SubconditionAffixesControlViewModel(subCondition.SuffixConditions, affixes, AffixType.Suffix, itemBase, subCondition.ValueType);
            MetaConditionsModel   = new SubconditionAffixesControlViewModel(subCondition.MetaConditions, affixes, AffixType.Meta, itemBase, subCondition.ValueType);

            PrefixConditions = new SubconditionAffixesControlView(PrefixConditionsModel);
            SuffixConditions = new SubconditionAffixesControlView(SuffixConditionsModel);
            MetaConditions   = new SubconditionAffixesControlView(MetaConditionsModel);

            SelectedAggregateType = subCondition.AggregateType.ToString();
            SelectedValueType     = subCondition.ValueType.ToString();
        }