private IElement GetElement(Player player, PowerUpDefinitionValue value) { var relations = value.RelatedValues; IElement result = value.ConstantValue; if (relations != null) { var elements = relations .Select(r => new AttributeRelationshipElement( new[] { player.Attributes.GetOrCreateAttribute(r.InputAttribute) }, r.InputOperand, r.InputOperator)) .Cast <IElement>(); if (value.ConstantValue != null) { elements = elements.Concat(value.ConstantValue.GetAsEnumerable()); } result = new AttributeRelationshipElement(elements.ToList(), 1.0F, InputOperator.Multiply); } if (result == null) { throw new ArgumentException(); } return(result); }
/// <summary> /// Creates a new element on this attribute system with the specified power up value. /// </summary> /// <param name="attributeSystem">The attribute system.</param> /// <param name="value">The value.</param> /// <returns>The added element.</returns> public static IElement CreateElement(this IAttributeSystem attributeSystem, PowerUpDefinitionValue value) { var relations = value.RelatedValues; IElement result = value.ConstantValue; if (relations?.Any() ?? false) { var elements = relations .Select(r => new AttributeRelationshipElement( new[] { attributeSystem.GetOrCreateAttribute(r.InputAttribute) }, r.InputOperand, r.InputOperator)) .Cast <IElement>(); if (value.ConstantValue != null) { elements = elements.Concat(value.ConstantValue.GetAsEnumerable()); } result = new AttributeRelationshipElement(elements.ToList(), 1.0F, InputOperator.Multiply); } if (result == null) { throw new ArgumentException($"The passed {nameof(PowerUpDefinitionValue)} doesn't have a constant value or related values.", nameof(value)); } return(result); }
public void InputOperatorPower() { const int element1Value = 1; const int element2Value = 2; const int inputOperand = 10; var element1 = new SimpleElement { Value = element1Value }; var element2 = new SimpleElement { Value = element2Value }; var relationshipElement = new AttributeRelationshipElement(new[] { element1, element2 }, inputOperand, InputOperator.Exponentiate); Assert.That(relationshipElement.Value, Is.EqualTo(Math.Pow(element1Value + element2Value, inputOperand))); }
public void InputOperatorMultiply() { const int element1Value = 1; const int element2Value = 2; const int inputOperand = 10; var element1 = new SimpleElement { Value = element1Value }; var element2 = new SimpleElement { Value = element2Value }; var relationshipElement = new AttributeRelationshipElement(new[] { element1, element2 }, inputOperand, InputOperator.Multiply); Assert.That(relationshipElement.Value, Is.EqualTo((element1Value + element2Value) * inputOperand)); }
public void ValueChangedEventWhenElementChanges() { const int element1Value = 1; const int element2Value = 2; const int inputOperand = 10; var element1 = new SimpleElement { Value = element1Value }; var element2 = new SimpleElement { Value = element2Value }; var relationshipElement = new AttributeRelationshipElement(new[] { element1, element2 }, inputOperand, InputOperator.Add); var eventCalled = false; relationshipElement.ValueChanged += (sender, e) => eventCalled = true; element1.Value = 2; Assert.That(eventCalled, Is.True); }
public void ValueChangesWhenElementChanges() { const int element1Value = 1; const int element2Value = 2; const int inputOperand = 10; var element1 = new SimpleElement { Value = element1Value }; var element2 = new SimpleElement { Value = element2Value }; var relationshipElement = new AttributeRelationshipElement(new[] { element1, element2 }, inputOperand, InputOperator.Add); Assert.That(relationshipElement.Value, Is.EqualTo(element1Value + element2Value + inputOperand)); const int element1NewValue = 2; element1.Value = element1NewValue; Assert.That(relationshipElement.Value, Is.EqualTo(element1NewValue + element2Value + inputOperand)); }