/// <summary> /// Converts attribute constraints to pseudo attribute constraints with the set Tags, WeaponClass, /// OffHand and check-tagged keystones where possible. /// Str, Int and Dex are not removed from the attribute constraint list but still converted. /// </summary> private void ConverteAttributeToPseudoAttributeConstraints() { var keystones = from node in Tree.GetCheckedNodes() where node.Type == NodeType.Keystone select node.Name; var conditionSettings = new ConditionSettings(Tags.Value, OffHand.Value, keystones.ToArray(), WeaponClass.Value); var convertedConstraints = new List <AttributeConstraint>(); foreach (var attributeConstraint in AttributeConstraints) { var attrName = attributeConstraint.Data; // Select the pseudo attributes and the multiplier for attributes which match the given one and evaluate to true. var pseudos = from pseudo in _pseudoAttributes let matches = (from attr in pseudo.Attributes where attr.MatchesAndEvaluates(conditionSettings, attrName) select attr) where matches.Any() select new { PseudoAttribute = pseudo, Multiplier = matches.First().ConversionMultiplier }; // Add attribute target and weight to the pseudo attributes. var converted = false; foreach (var pseudo in pseudos) { var pseudoAttribute = pseudo.PseudoAttribute; converted = true; if (_addedPseudoAttributes.Contains(pseudoAttribute)) { foreach (var pseudoAttributeConstraint in PseudoAttributeConstraints) { if (pseudoAttributeConstraint.Data == pseudoAttribute) { pseudoAttributeConstraint.TargetValue += attributeConstraint.TargetValue * pseudo.Multiplier; } } } else { _addedPseudoAttributes.Add(pseudoAttribute); PseudoAttributeConstraints.Add(new PseudoAttributeConstraint(pseudoAttribute) { TargetValue = attributeConstraint.TargetValue * pseudo.Multiplier }); } } if (converted && attrName != "+# to Intelligence" && attrName != "+# to Dexterity" && attrName != "+# to Strength") { convertedConstraints.Add(attributeConstraint); } } // Update the attribute constraint related collections. foreach (var convertedConstraint in convertedConstraints) { _addedAttributes.Remove(convertedConstraint.Data); AttributeConstraints.Remove(convertedConstraint); } if (convertedConstraints.Count > 0) { AttributesView.Refresh(); NewAttributeConstraint = convertedConstraints[0]; PseudoAttributesView.Refresh(); PseudoAttributesView.MoveCurrentToFirst(); NewPseudoAttributeConstraint.Data = PseudoAttributesView.CurrentItem as PseudoAttribute; } }