so when i start the game it gives me the starting number of traits i have assigned on the progression asset but if i use them and level up it dosnt give me the ammount i have on the second element of the array for example i start with 4 trait point and the next element i was them to have 8 i have to start with four then set the second element to 8 for it to give me 8 point if i set them all to a single number like 1 then itll go negative and just act weird
heres my trait store
namespace RPG.Stats
{
public class TraitStore : MonoBehaviour, IModifierProvider, ISaveable, IPredicateEvaluator
{
[SerializeField] Traitbonus[] bonusConfig;
[System.Serializable]
class Traitbonus
{
public Trait trait;
public Stat stat;
public float additiveBonusPerPoint = 0;
public float percentageBonusPerPoint = 0;
}
Dictionary<Trait, int> assingedPoints = new Dictionary<Trait, int>();
Dictionary<Trait, int> stagedPoints = new Dictionary<Trait, int>();
Dictionary<Stat, Dictionary<Trait, float>> additiveBonusCache;
Dictionary<Stat, Dictionary<Trait, float>> percentageBonusCache;
private void Awake()
{
additiveBonusCache = new Dictionary<Stat, Dictionary<Trait, float>>();
percentageBonusCache = new Dictionary<Stat, Dictionary<Trait, float>>();
foreach (var bonus in bonusConfig)
{
if (!additiveBonusCache.ContainsKey(bonus.stat))
{
additiveBonusCache[bonus.stat] = new Dictionary<Trait, float>();
}
if (!percentageBonusCache.ContainsKey(bonus.stat))
{
percentageBonusCache[bonus.stat] = new Dictionary<Trait, float>();
}
additiveBonusCache[bonus.stat][bonus.trait] = bonus.additiveBonusPerPoint;
percentageBonusCache[bonus.stat][bonus.trait] = bonus.percentageBonusPerPoint;
}
}
// int unAssignedPoints = 10;
public int GetProposedPoints(Trait trait)
{
return GetPoints(trait) + GetStagedPoints(trait);
}
public int GetPoints(Trait trait)
{
return assingedPoints.ContainsKey(trait) ? assingedPoints[trait] : 0;
}
public int GetStagedPoints(Trait trait)
{
return stagedPoints.ContainsKey(trait) ? stagedPoints[trait] : 0;
}
public void AssignPoints(Trait trait, int points)
{
if (!CanAssignPoints(trait, points)) return;
stagedPoints[trait] = GetStagedPoints(trait) + points;
//unAssignedPoints -= points;
}
public bool CanAssignPoints(Trait trait, int points)
{
if (GetStagedPoints(trait) + points < 0) return false;
if (GetUnAssignedPoints() < points) return false;
return true;
}
public int GetUnAssignedPoints()
{
return GetAssignablePoints() - GetTotalProposedPoints();
}
public int GetTotalProposedPoints()
{
int total = 0;
foreach (int points in assingedPoints.Values)
{
total += points;
}
foreach (int points in stagedPoints.Values)
{
total += points;
}
return total;
}
public void Commit()
{
foreach (Trait trait in stagedPoints.Keys)
{
assingedPoints[trait] = GetProposedPoints(trait);
}
stagedPoints.Clear();
}
public int GetAssignablePoints()
{
return (int)GetComponent<BaseStats>().GetStat(Stat.TotalTraitPoints);
}
public IEnumerable<float> GetAddititveModifers(Stat stat)
{
if (!additiveBonusCache.ContainsKey(stat)) yield break;
foreach (Trait trait in additiveBonusCache[stat].Keys)
{
float bonus = additiveBonusCache[stat][trait];
yield return bonus * GetPoints(trait);
}
}
public IEnumerable<float> GetPercentageModifiers(Stat stat)
{
if (!percentageBonusCache.ContainsKey(stat)) yield break;
foreach (Trait trait in percentageBonusCache[stat].Keys)
{
float bonus = percentageBonusCache[stat][trait];
yield return bonus * GetPoints(trait);
}
}
public object CaptureState()
{
return assingedPoints;
}
public void RestoreState(object state)
{
assingedPoints = new Dictionary<Trait, int>((IDictionary<Trait, int>)state);
}
public bool? Evaluate(string predicate, string[] parameters)
{
if (predicate == "MinimumTrait")
{
if (Enum.TryParse<Trait>(parameters[0], out Trait trait))
{
return GetPoints(trait) >= Int32.Parse(parameters[1]);
}
//int.Parse()
}
return null;
}
}
}
heres my progression
namespace RPG.Stats
{
[CreateAssetMenu(fileName = "Progression", menuName = "Stats/New Progression", order = 0)]
public class Progression : ScriptableObject
{
[SerializeField] ProgressionCharacterClass[] characterClasses = null;
Dictionary<CharacterClass, Dictionary<Stat, float[]>> lookupTable = null;
public float GetStat(Stat stat, CharacterClass characterClass, int level, float Fallback = 0)
{
BuildLookup();
if (!lookupTable[characterClass].ContainsKey(stat))
{
//return 0;
return Fallback;
}
float[] levels = lookupTable[characterClass][stat];
if (levels.Length == 0)
{
//return 0;
return Fallback;
}
if (levels.Length < level)
{
return levels[levels.Length -1];
}
return levels[level - 1];
}
public int GetLevels(Stat stat, CharacterClass characterClass)
{
BuildLookup();
float[] levels = lookupTable[characterClass][stat];
return levels.Length;
}
private void BuildLookup()
{
if (lookupTable != null) return;
lookupTable = new Dictionary<CharacterClass, Dictionary<Stat, float[]>>();
foreach (ProgressionCharacterClass progressionClass in characterClasses)
{
var statLookupTable = new Dictionary<Stat, float[]>();
foreach (ProgressionStat progressionStat in progressionClass.stats)
{
statLookupTable[progressionStat.stat] = progressionStat.levels;
}
lookupTable[progressionClass.characterClass] = statLookupTable;
}
}
[System.Serializable]
class ProgressionCharacterClass
{
public CharacterClass characterClass;
public ProgressionStat[] stats;
}
[System.Serializable]
class ProgressionStat
{
public Stat stat;
public float[] levels;
}
}
}
i cant seem to find an issue with it but it could be obvious and i just dont see it