public virtual bool RemoveModifier(CStatModifier mod) { if (statModifiers.Remove(mod)) { isDirty = true; return(true); } return(false); }
protected virtual int CompareModifierOrder(CStatModifier a, CStatModifier b) { if (a.Order < b.Order) { return(-1); } else if (a.Order > b.Order) { return(1); } return(0); //if (a.Order == b.Order) }
protected virtual float CalculateFinalValue() { float finalValue = MyBaseValue; float sumPercentAdd = 0; statModifiers.Sort(CompareModifierOrder); for (int i = 0; i < statModifiers.Count; i++) { CStatModifier mod = statModifiers[i]; switch (mod.Type) { case StatModType.Flat: finalValue += mod.Value; break; case StatModType.Percent: switch (mod.Effect) { case StatModEffect.Add: sumPercentAdd += mod.Value; if (i + 1 >= statModifiers.Count || statModifiers[i + 1].Type != StatModType.Percent || StatModifiers[i + 1].Effect != StatModEffect.Add) { finalValue *= 1 + sumPercentAdd; sumPercentAdd = 0; } break; case StatModEffect.Subtract: break; case StatModEffect.Multiply: finalValue *= 1 + mod.Value; break; case StatModEffect.Divide: break; } break; } } // Workaround for float calculation errors, like displaying 12.00001 instead of 12 return((float)Math.Round(finalValue, 4)); }
public virtual void AddModifier(CStatModifier mod) { isDirty = true; statModifiers.Add(mod); }