feature-attributes #7
8
Assets/Scriptables.meta
generated
Normal file
8
Assets/Scriptables.meta
generated
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1d13d7aac40657841955febd4faabbfa
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
19
Assets/Scriptables/EnemyAttributes.asset
generated
Normal file
19
Assets/Scriptables/EnemyAttributes.asset
generated
Normal file
@ -0,0 +1,19 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: c5304ff6dfe84844887d751cee48606a, type: 3}
|
||||
m_Name: EnemyAttributes
|
||||
m_EditorClassIdentifier:
|
||||
STR: {fileID: 0}
|
||||
CON: {fileID: 0}
|
||||
SPD: {fileID: 0}
|
||||
RNG: {fileID: 0}
|
||||
MND: {fileID: 0}
|
8
Assets/Scriptables/EnemyAttributes.asset.meta
generated
Normal file
8
Assets/Scriptables/EnemyAttributes.asset.meta
generated
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d5bf638cf02c5b94cb9874d4414c1b8a
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
14
Assets/Scriptables/StatEffect.asset
generated
Normal file
14
Assets/Scriptables/StatEffect.asset
generated
Normal file
@ -0,0 +1,14 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 494a21c06960ec442a7a6806f8aefedb, type: 3}
|
||||
m_Name: StatEffect
|
||||
m_EditorClassIdentifier:
|
8
Assets/Scriptables/StatEffect.asset.meta
generated
Normal file
8
Assets/Scriptables/StatEffect.asset.meta
generated
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4c96040df8ebed746832db7857b25bed
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,38 +1,24 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
[Serializable]
|
||||
public struct Attribute
|
||||
{
|
||||
[SerializeField]
|
||||
private long _base;
|
||||
public long Base;
|
||||
|
||||
public Attribute(long stat)
|
||||
{
|
||||
_base = stat;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Permanently increase the stat value.
|
||||
/// </summary>
|
||||
/// <param name="by">Increase amount.</param>
|
||||
public void LevelUp(long by)
|
||||
{
|
||||
_base += by;
|
||||
}
|
||||
public Attribute(long stat) { Base = stat; }
|
||||
|
||||
/// <summary>
|
||||
/// Calculates the stat value with accumulated buff and debuff modifiers.
|
||||
/// </summary>
|
||||
/// <param name="baseBonus">Additive bonus applied before multiplicative scaling.</param>
|
||||
/// <param name="permyriadBonus">Multiplicative scaling in hundredths of a percent. E.g., 625 permyriad corresponds to 6.25%.</param>
|
||||
/// <param name="flatBonus">Additive bonus applied after multiplicative scaling.</param>
|
||||
/// <returns>(base + baseBonus) * (100% + permyriadBonus) + flatBonus, bounded below by 0.</returns>
|
||||
public long Calc(long baseBonus, long permyriadBonus, long flatBonus)
|
||||
public long Calc(EffectSO effect)
|
||||
{
|
||||
var r = _base + baseBonus;
|
||||
var m = permyriadBonus + 10000;
|
||||
r = r * (m / 10000) + (r / 10000) * (m % 10000) + flatBonus;
|
||||
var r = Base + effect.Base;
|
||||
var m = effect.Permyriad + 10000;
|
||||
r = r * (m / 10000) + (r / 10000) * (m % 10000) + effect.Flat;
|
||||
if (r <= 0)
|
||||
{
|
||||
return 0;
|
||||
|
45
Assets/Scripts/EffectSO.cs
Normal file
45
Assets/Scripts/EffectSO.cs
Normal file
@ -0,0 +1,45 @@
|
||||
using UnityEngine;
|
||||
|
||||
[CreateAssetMenu(fileName = "StatEffect", menuName = "Stat Effect")]
|
||||
public class EffectSO : ScriptableObject
|
||||
{
|
||||
/// <summary>
|
||||
/// Additive change applied before multiplicative scaling.
|
||||
/// </summary>
|
||||
public long Base;
|
||||
/// <summary>
|
||||
/// Multiplicative scaling in units of hundredth of a percent.
|
||||
/// E.g., 625 permyriad is 6.25%.
|
||||
/// </summary>
|
||||
public long Permyriad;
|
||||
/// <summary>
|
||||
/// Additive change applied after multiplicative scaling.
|
||||
/// </summary>
|
||||
public long Flat;
|
||||
|
||||
/// <summary>
|
||||
/// Create a new attribute effect instance.
|
||||
/// </summary>
|
||||
/// <param name="baseBonus"></param>
|
||||
/// <param name="permyriad"></param>
|
||||
/// <param name="flat"></param>
|
||||
/// <returns></returns>
|
||||
public static EffectSO New(long baseBonus = 0, long permyriad = 0, long flat = 0)
|
||||
{
|
||||
var effect = ScriptableObject.CreateInstance<EffectSO>();
|
||||
effect.Base = baseBonus;
|
||||
effect.Permyriad = permyriad;
|
||||
effect.Flat = flat;
|
||||
return effect;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a new EffectSO from a percentage.
|
||||
/// </summary>
|
||||
/// <param name="p">Percentage. E.g., 6.25f results in a Permyriad of 625.</param>
|
||||
/// <returns>Effect with the given percentage.</returns>
|
||||
public static EffectSO FromPercent(float p)
|
||||
{
|
||||
return New(permyriad: (long)(p * 100));
|
||||
}
|
||||
}
|
11
Assets/Scripts/EffectSO.cs.meta
generated
Normal file
11
Assets/Scripts/EffectSO.cs.meta
generated
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 494a21c06960ec442a7a6806f8aefedb
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
18
Assets/Scripts/EnemyAttributesSO.cs
Normal file
18
Assets/Scripts/EnemyAttributesSO.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using UnityEngine;
|
||||
|
||||
[CreateAssetMenu(fileName = "EnemyAttributes", menuName = "Enemy Attributes")]
|
||||
public class EnemyAttributesSO : ScriptableObject
|
||||
{
|
||||
[SerializeField] private Attribute STR;
|
||||
[SerializeField] private Attribute CON;
|
||||
[SerializeField] private Attribute SPD;
|
||||
[SerializeField] private Attribute RNG;
|
||||
[SerializeField] private Attribute MND;
|
||||
public long XP { get; private set; }
|
||||
public long Threat { get; private set; }
|
||||
|
||||
public static EnemyAttributesSO New()
|
||||
{
|
||||
return ScriptableObject.CreateInstance<EnemyAttributesSO>();
|
||||
}
|
||||
}
|
11
Assets/Scripts/EnemyAttributesSO.cs.meta
generated
Normal file
11
Assets/Scripts/EnemyAttributesSO.cs.meta
generated
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c5304ff6dfe84844887d751cee48606a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
18
Assets/Scripts/HeroAttributesSO.cs
Normal file
18
Assets/Scripts/HeroAttributesSO.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class HeroAttributesSO : ScriptableObject
|
||||
{
|
||||
[SerializeField] private Attribute STR;
|
||||
[SerializeField] private Attribute MAG;
|
||||
[SerializeField] private Attribute DEX;
|
||||
[SerializeField] private Attribute CON;
|
||||
[SerializeField] private Attribute CHA;
|
||||
[SerializeField] private Attribute FTH;
|
||||
|
||||
public static HeroAttributesSO New()
|
||||
{
|
||||
return ScriptableObject.CreateInstance<HeroAttributesSO>();
|
||||
}
|
||||
}
|
11
Assets/Scripts/HeroAttributesSO.cs.meta
generated
Normal file
11
Assets/Scripts/HeroAttributesSO.cs.meta
generated
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 538672e6491e46748a1cc27fe3a52455
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -7,19 +7,18 @@
|
||||
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 effect = EffectSO.New(baseBonus, permyriadBonus, flatBonus);
|
||||
return attr.Calc(effect);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user