Skip to content

Instantly share code, notes, and snippets.

private float CalculateFinalValue()
{
float finalValue = BaseValue;
float sumPercentAdd = 0; // This will hold the sum of our "PercentAdd" modifiers
for (int i = 0; i < statModifiers.Count; i++)
{
StatModifier mod = statModifiers[i];
if (mod.Type == StatModType.Flat)
@Kryzarel
Kryzarel / StatModifier.cs
Last active December 3, 2017 20:27
Updated with Source variable, for tutorial part 2.
public readonly float Value;
public readonly StatModType Type;
public readonly int Order;
public readonly object Source; // Added this variable
// "Main" constructor. Requires all variables.
public StatModifier(float value, StatModType type, int order, object source) // Added "source" input parameter
{
Value = value;
Type = type;
@Kryzarel
Kryzarel / Item.cs
Created December 3, 2017 20:40
Example Item for CharacterStat tutorial
// Hypothetical item class
public class Item
{
public void Equip(Character c)
{
// We need to store our modifiers in variables before adding them to the stat.
mod1 = new StatModifier(10, StatModType.Flat);
mod2 = new StatModifier(0.1, StatModType.Percent);
c.Strength.AddModifier(mod1);
c.Strength.AddModifier(mod2);
public bool RemoveAllModifiersFromSource(object source)
{
bool didRemove = false;
for (int i = statModifiers.Count - 1; i >= 0; i--)
{
if (statModifiers[i].Source == source)
{
isDirty = true;
didRemove = true;
@Kryzarel
Kryzarel / Item.cs
Created December 3, 2017 21:21
Updated with RemoveAllModifiersFromSource()
public class Item
{
public void Equip(Character c)
{
// Create the modifiers and set the Source to "this"
// Note that we don't need to store the modifiers in variables anymore
c.Strength.AddModifier(new StatModifier(10, StatModType.Flat, this));
c.Strength.AddModifier(new StatModifier(0.1, StatModType.Percent, this));
}
@Kryzarel
Kryzarel / RemoveModifier.cs
Created December 3, 2017 21:23
Updated to set isDirty only when Remove returns true
public bool RemoveModifier(StatModifier mod)
{
if (statModifiers.Remove(mod))
{
isDirty = true;
return true;
}
return false;
}
public readonly ReadOnlyCollection<StatModifier> StatModifiers; // Add this variable
public CharacterStat(float baseValue)
{
BaseValue = baseValue;
statModifiers = new List<StatModifier>();
StatModifiers = statModifiers.AsReadOnly(); // Add this line to the constructor
}
// Add this variable
private float lastBaseValue = float.MinValue;
// Change Value
public float Value {
get {
if(isDirty || lastBaseValue != BaseValue) {
lastBaseValue = BaseValue;
_value = CalculateFinalValue();
isDirty = false;
@Kryzarel
Kryzarel / StatModType.cs
Created December 3, 2017 21:33
Changed default "indexes" of all values
public enum StatModType
{
Flat = 100,
PercentAdd = 200,
PercentMult = 300,
}
@Kryzarel
Kryzarel / CharacterStat_Extendable.cs
Created December 5, 2017 20:08
Changed all private variables, properties and methods to protected. Changed all methods methods to virtual. Showing only lines that were changed.
protected bool isDirty = true;
protected float lastBaseValue;
protected float _value;
public virtual float Value {}
protected readonly List<StatModifier> statModifiers;
public virtual void AddModifier(StatModifier mod);
public virtual bool RemoveModifier(StatModifier mod);
public virtual bool RemoveAllModifiersFromSource(object source);