diff --git a/Assets/Scripts/Attribute.cs b/Assets/Scripts/Attribute.cs
index c8c9090..9d2ac95 100644
--- a/Assets/Scripts/Attribute.cs
+++ b/Assets/Scripts/Attribute.cs
@@ -2,35 +2,26 @@ using System.Collections;
using System.Collections.Generic;
using UnityEngine;
-public struct Attribute
+public class Attribute : ScriptableObject
{
- [SerializeField]
- private long _base;
+ public long Base { get; set; }
+ public long BaseBonus { get; set; }
+ public long PermyriadBonus { get; set; }
+ public long FlatBonus { get; set; }
- public Attribute(long stat)
- {
- _base = stat;
- }
-
- ///
- /// Permanently increase the stat value.
- ///
- /// Increase amount.
- public void LevelUp(long by)
- {
- _base += by;
- }
+ 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 long Calc(long baseBonus, long permyriadBonus, long flatBonus)
+ public static long Calc(long baseValue, long baseBonus, long permyriadBonus, long flatBonus)
{
- var r = _base + baseBonus;
+ var r = baseValue + baseBonus;
var m = permyriadBonus + 10000;
r = r * (m / 10000) + (r / 10000) * (m % 10000) + flatBonus;
if (r <= 0)
diff --git a/Assets/Tests/AttributeTest.cs b/Assets/Tests/AttributeTest.cs
index 8668e08..f4b216c 100644
--- a/Assets/Tests/AttributeTest.cs
+++ b/Assets/Tests/AttributeTest.cs
@@ -7,19 +7,21 @@ using UnityEngine.TestTools;
public class AttributeTest
{
[Test]
- [TestCase(1000000, 0, 0, 0, 0, ExpectedResult = 1000000)]
- [TestCase(1000000, 1, 0, 0, 0, ExpectedResult = 1000001)]
- [TestCase(1000000, 0, 2, 0, 0, ExpectedResult = 1000002)]
- [TestCase(1000000, 0, 0, 10000, 0, ExpectedResult = 2000000)]
- [TestCase(1000000, 0, 0, 0, 3, ExpectedResult = 1000003)]
- [TestCase(0, 1000000, 1000000, 5000, 1000, ExpectedResult = 3001000)]
- [TestCase(1000000, 0, 0, -10000, 0, ExpectedResult = 0)]
- [TestCase(1000000, 0, 0, -20000, 0, ExpectedResult = 0)]
- [TestCase(1000000, 0, 0, -20000, 50, ExpectedResult = 0)]
- public long Calc(long startStat, long levelUp, long baseBonus, long permyriadBonus, long flatBonus)
+ [TestCase(1000000, 0, 0, 0, ExpectedResult = 1000000)]
+ [TestCase(1000000, 1, 0, 0, ExpectedResult = 1000001)]
+ [TestCase(1000000, 0, 2, 0, ExpectedResult = 1000200)]
+ [TestCase(1000000, 0, 0, 10000, ExpectedResult = 1010000)]
+ [TestCase(0, 1000000, 5000, 1000000, ExpectedResult = 2500000)]
+ [TestCase(1000000, 0, -10000, 0, ExpectedResult = 0)]
+ [TestCase(1000000, 0, -20000, 0, ExpectedResult = 0)]
+ [TestCase(1000000, 0, -20000, 0, ExpectedResult = 0)]
+ public long Value(long startStat, long baseBonus, long permyriadBonus, long flatBonus)
{
- var attr = new Attribute(startStat);
- attr.LevelUp(levelUp);
- return attr.Calc(baseBonus, permyriadBonus, flatBonus);
+ var attr = ScriptableObject.CreateInstance();
+ attr.Base = startStat;
+ attr.BaseBonus = baseBonus;
+ attr.PermyriadBonus = permyriadBonus;
+ attr.FlatBonus = flatBonus;
+ return attr.Value;
}
}