using System.Collections; using System.Collections.Generic; using UnityEngine; public class Attribute : ScriptableObject { public long Base { get; set; } public long BaseBonus { get; set; } public long PermyriadBonus { get; set; } public long FlatBonus { get; set; } public long Value => Calc(Base, BaseBonus, PermyriadBonus, FlatBonus); /// /// Calculates the stat value with accumulated buff and debuff modifiers. /// /// Base value. /// Additive bonus applied before multiplicative scaling. /// Multiplicative scaling in hundredths of a percent. E.g., 625 permyriad corresponds to 6.25%. /// Additive bonus applied after multiplicative scaling. /// (base + baseBonus) * (100% + permyriadBonus) + flatBonus, bounded below by 0. public static long Calc(long baseValue, long baseBonus, long permyriadBonus, long flatBonus) { var r = baseValue + baseBonus; var m = permyriadBonus + 10000; r = r * (m / 10000) + (r / 10000) * (m % 10000) + flatBonus; if (r <= 0) { return 0; } return r; } }