protected virtual float CalculateFinalValue() { float finalValue = baseValue; float sumPercentAdd = 0; for (int i = 0; i < _attrModifiers.Count; i++) { AttrModifier mod = _attrModifiers[i]; if (mod.type == AttrModType.FLAT) { finalValue += mod.baseValue; } else if (mod.type == AttrModType.PERCENT_ADD) { sumPercentAdd += mod.baseValue; if (i + 1 >= _attrModifiers.Count || _attrModifiers[i + 1].type != AttrModType.PERCENT_ADD) { finalValue *= 1 + sumPercentAdd; sumPercentAdd = 0; } } else if (mod.type == AttrModType.PERCENT_MULT) { finalValue *= 1 + mod.baseValue; } } // 12.0001f != 12f return((float)Math.Round(finalValue, 4)); }
//protected override float CalculateFinalValue() //{ // float value = base.CalculateFinalValue(); // if (value > baseValue) // { // return baseValue; // } // return value; //} public override void AddModifier(AttrModifier mod) { float delta = 0f; switch (mod.type) { case AttrModType.FLAT: delta = value + mod.baseValue - baseValue; break; case AttrModType.PERCENT_MULT: delta = value * (1f + mod.baseValue) - baseValue; break; case AttrModType.PERCENT_ADD: delta = value * (1f + mod.baseValue) - baseValue; break; } if (delta <= 0) // If baseValue not reached after modifier addition { base.AddModifier(mod); } else if (delta > 0) // If the baseValue will be exceeded, then add difference between current value and basevalue { base.AddModifier(new AttrModifier(baseValue - value, AttrModType.FLAT)); } }
public bool RemoveModifier(AttrModifier mod) { if (_attrModifiers.Remove(mod)) { isDirty = true; return(true); } return(false); }
//Comparaison fonction to be used to sort the modifier list, in AddModifier private int CompareModOrder(AttrModifier a, AttrModifier b) { if (a.order < b.order) { return(-1); } else if (a.order > b.order) { return(1); } return(0); //if both have same order }
public AttrDefinition(string name, TypeSpecifier typeSpecifier, AttrModifier modifier, Location location) : base(location) { this.name = name; this.typeSpecifier = typeSpecifier; this.modifier = modifier; fieldBuilder = null; reader = null; writer = null; }
public SharedAttrDefinition(string name, TypeSpecifier typeSpecifier, Expression value, AttrModifier modifier, Location location) : base(name, typeSpecifier, modifier, location) { this.value = value; }
public virtual void AddModifier(AttrModifier mod) { isDirty = true; _attrModifiers.Add(mod); _attrModifiers.Sort(CompareModOrder); }