/// <summary> /// Evaluates rule that can work one way /// </summary> /// <param name="traits">character traits to modify</param> /// <param name="rule">rules to evaluate</param> private static void EvaluateSimpleRule(CharacterTraits traits, QualityTraitRule rule) { var leadingProperty = traits.GetType().GetProperty(rule.LeadingQuality); var attachedProperty = traits.GetType().GetProperty(rule.AttachedQuality); if (leadingProperty == null || attachedProperty == null) { return; } int leadingValue; int attachedValue; if (ValuesAreWithinRange(traits, rule, leadingProperty, attachedProperty, out leadingValue, out attachedValue)) { return; } if (leadingValue > attachedValue) { //We won't raise if it's a weakness if (!traits.WeakPoints.Contains(rule.AttachedQuality)) { attachedProperty.SetValue(traits, leadingValue - rule.RangeLimit + 1); } } else { //We won't lower it if it's a strong point if (!traits.StrongPoints.Contains(rule.AttachedQuality)) { attachedProperty.SetValue(traits, leadingValue + rule.RangeLimit - 1); } } }
/// <summary> /// /// </summary> /// <param name="traits"></param> /// <param name="rule"></param> /// <param name="leadingProperty"></param> /// <param name="attachedProperty"></param> /// <param name="leadingValue"></param> /// <param name="attachedValue"></param> /// <returns></returns> private static bool ValuesAreWithinRange(CharacterTraits traits, QualityTraitRule rule, PropertyInfo leadingProperty, PropertyInfo attachedProperty, out int leadingValue, out int attachedValue) { leadingValue = (int)leadingProperty.GetValue(traits); attachedValue = (int)attachedProperty.GetValue(traits); return(Math.Abs(leadingValue - attachedValue) <= rule.RangeLimit); }
/// <summary> /// Evaluates rule that can work both ways /// </summary> /// <param name="traits">character traits to modify</param> /// <param name="rule">rules to evaluate</param> private void EvaluateBidirectionalRule(CharacterTraits traits, QualityTraitRule rule) { var leadingProperty = traits.GetType().GetProperty(rule.LeadingQuality); var attachedProperty = traits.GetType().GetProperty(rule.AttachedQuality); if (leadingProperty == null || attachedProperty == null) { return; } int leadingValue; int attachedValue; if (ValuesAreWithinRange(traits, rule, leadingProperty, attachedProperty, out leadingValue, out attachedValue)) { return; } if (leadingValue > attachedValue) { //If the attached is a weak point AND the leading is a NOT a strong point, //then we just lower the leading property. Otherwise we raise the attached quality. if (traits.WeakPoints.Contains(rule.AttachedQuality)) { if (!traits.StrongPoints.Contains(rule.LeadingQuality)) { leadingProperty.SetValue(traits, attachedValue + rule.RangeLimit + 1); } } else { attachedProperty.SetValue(traits, leadingValue - rule.RangeLimit + 1); } } else { //If the leading value is a weakness AND the attached is not a strong point, //we lower the attached property. Otherwise we raise the leading quality if (traits.WeakPoints.Contains(rule.LeadingQuality)) { if (!traits.StrongPoints.Contains(rule.AttachedQuality)) { attachedProperty.SetValue(traits, leadingValue + rule.RangeLimit - 1); } } else { leadingProperty.SetValue(traits, attachedValue - rule.RangeLimit + 1); } } }