using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; namespace Kryz.CharacterStats.Examples { public class CharacterStats : MonoBehaviour { //Primary public CharacterStat Strength; public CharacterStat Agility; public CharacterStat Intelligence; public CharacterStat Spirit; public CharacterStat Vitality; //Secondary public CharacterStat AttackDamage; public CharacterStat SpellDamage; public CharacterStat CritChance; public CharacterStat CritDamage; public CharacterStat MaxHealth; public CharacterStat Armor; public CharacterStat MagicResistance; //Awakening Related //public CharacterStat public Dictionary primaryStatsDictionary = new Dictionary(); public Dictionary secondaryStatsDictionary = new Dictionary(); public UnityEvent onUpdateStatValues = new UnityEvent(); protected virtual void Awake() { primaryStatsDictionary.Add(nameof(Strength).ToLower(), Strength); primaryStatsDictionary.Add(nameof(Agility).ToLower(), Agility); primaryStatsDictionary.Add(nameof(Intelligence).ToLower(), Intelligence); primaryStatsDictionary.Add(nameof(Spirit).ToLower(), Spirit); primaryStatsDictionary.Add(nameof(Vitality).ToLower(), Vitality); secondaryStatsDictionary.Add(nameof(AttackDamage).ToLower(), AttackDamage); secondaryStatsDictionary.Add(nameof(SpellDamage).ToLower(), SpellDamage); secondaryStatsDictionary.Add(nameof(CritChance).ToLower(), CritChance); secondaryStatsDictionary.Add(nameof(CritDamage).ToLower(), CritDamage); secondaryStatsDictionary.Add(nameof(MaxHealth).ToLower(), MaxHealth); secondaryStatsDictionary.Add(nameof(Armor).ToLower(), Armor); secondaryStatsDictionary.Add(nameof(MagicResistance).ToLower(), MagicResistance); onUpdateStatValues.AddListener(UpdateSecondaryStatsBasedOnPrimaryStats); } public void IncreaseAllStatPoints(int amount) { Strength.BaseValue += amount; Agility.BaseValue += amount; Intelligence.BaseValue += amount; Spirit.BaseValue += amount; Vitality.BaseValue += amount; onUpdateStatValues.Invoke(); } public void UpdateSecondaryStatsBasedOnPrimaryStats() { //Remove previous AttackDamage.RemoveAllModifiersFromSource(GameConstants.ObjectSources.StrengthSource); AttackDamage.RemoveAllModifiersFromSource(GameConstants.ObjectSources.AgilitySource); SpellDamage.RemoveAllModifiersFromSource(GameConstants.ObjectSources.IntelligenceSource); SpellDamage.RemoveAllModifiersFromSource(GameConstants.ObjectSources.SpiritSource); CritChance.RemoveAllModifiersFromSource(GameConstants.ObjectSources.AgilitySource); CritChance.RemoveAllModifiersFromSource(GameConstants.ObjectSources.IntelligenceSource); CritDamage.RemoveAllModifiersFromSource(GameConstants.ObjectSources.StrengthSource); CritDamage.RemoveAllModifiersFromSource(GameConstants.ObjectSources.AgilitySource); CritDamage.RemoveAllModifiersFromSource(GameConstants.ObjectSources.IntelligenceSource); MaxHealth.RemoveAllModifiersFromSource(GameConstants.ObjectSources.SpiritSource); MaxHealth.RemoveAllModifiersFromSource(GameConstants.ObjectSources.VitalitySource); Armor.RemoveAllModifiersFromSource(GameConstants.ObjectSources.StrengthSource); Armor.RemoveAllModifiersFromSource(GameConstants.ObjectSources.AgilitySource); Armor.RemoveAllModifiersFromSource(GameConstants.ObjectSources.VitalitySource); MagicResistance.RemoveAllModifiersFromSource(GameConstants.ObjectSources.IntelligenceSource); MagicResistance.RemoveAllModifiersFromSource(GameConstants.ObjectSources.SpiritSource); MagicResistance.RemoveAllModifiersFromSource(GameConstants.ObjectSources.VitalitySource); //Add new values AttackDamage.AddModifier(new StatModifier(Strength.Value * GameConstants.CharacterStatsBalancing.AttackDamageIncreaseFromStrength, StatModType.Flat, GameConstants.ObjectSources.StrengthSource)); AttackDamage.AddModifier(new StatModifier(Agility.Value * GameConstants.CharacterStatsBalancing.AttackDamageIncreaseFromAgility, StatModType.Flat, GameConstants.ObjectSources.AgilitySource)); SpellDamage.AddModifier(new StatModifier(Intelligence.Value * GameConstants.CharacterStatsBalancing.SpellDamageIncreaseFromIntelligence, StatModType.Flat, GameConstants.ObjectSources.IntelligenceSource)); SpellDamage.AddModifier(new StatModifier(Spirit.Value * GameConstants.CharacterStatsBalancing.SpellDamageIncreaseFromSpirit, StatModType.Flat, GameConstants.ObjectSources.SpiritSource)); CritChance.AddModifier(new StatModifier(Agility.Value * GameConstants.CharacterStatsBalancing.CritChanceIncreaseFromAgility, StatModType.Flat, GameConstants.ObjectSources.AgilitySource)); CritChance.AddModifier(new StatModifier(Intelligence.Value * GameConstants.CharacterStatsBalancing.CritChanceIncreaseFromIntelligence, StatModType.Flat, GameConstants.ObjectSources.IntelligenceSource)); //CritDamage.AddModifier(new StatModifier(Strength.Value * GameConstants.CharacterStatsBalancing.CritDamageIncreaseFromStrength, StatModType.Flat, GameConstants.ObjectSources.StrengthSource)); //CritDamage.AddModifier(new StatModifier(Agility.Value * GameConstants.CharacterStatsBalancing.CritDamageIncreaseFromAgility, StatModType.Flat, GameConstants.ObjectSources.AgilitySource)); //CritDamage.AddModifier(new StatModifier(Intelligence.Value * GameConstants.CharacterStatsBalancing.CritDamageIncreaseFromIntelligence, StatModType.Flat, GameConstants.ObjectSources.IntelligenceSource)); MaxHealth.AddModifier(new StatModifier(Spirit.Value * GameConstants.CharacterStatsBalancing.MaxHealthIncreaseFromSpirit, StatModType.Flat, GameConstants.ObjectSources.SpiritSource)); MaxHealth.AddModifier(new StatModifier(Vitality.Value * GameConstants.CharacterStatsBalancing.MaxHealthIncreaseFromVitality, StatModType.Flat, GameConstants.ObjectSources.VitalitySource)); //Armor.AddModifier(new StatModifier(Strength.Value * GameConstants.CharacterStatsBalancing.ArmorIncreaseFromStrength, StatModType.Flat, GameConstants.ObjectSources.StrengthSource)); //Armor.AddModifier(new StatModifier(Agility.Value * GameConstants.CharacterStatsBalancing.ArmorIncreaseFromAgility, StatModType.Flat, GameConstants.ObjectSources.AgilitySource)); //Armor.AddModifier(new StatModifier(Vitality.Value * GameConstants.CharacterStatsBalancing.ArmorIncreaseFromVitality, StatModType.Flat, GameConstants.ObjectSources.VitalitySource)); //MagicResistance.AddModifier(new StatModifier(Intelligence.Value * GameConstants.CharacterStatsBalancing.MagicResistanceIncreaseFromIntelligence, StatModType.Flat, GameConstants.ObjectSources.IntelligenceSource)); MagicResistance.AddModifier(new StatModifier(Spirit.Value * GameConstants.CharacterStatsBalancing.MagicResistanceIncreaseFromSpirit, StatModType.Flat, GameConstants.ObjectSources.SpiritSource)); //MagicResistance.AddModifier(new StatModifier(Vitality.Value * GameConstants.CharacterStatsBalancing.MagicResistanceIncreaseFromVitality, StatModType.Flat, GameConstants.ObjectSources.VitalitySource)); Debug.Log(this.gameObject.name + " has relative power level of: " + GetRelativePowerLevel()); } public float GetRelativePowerLevel() { return AttackDamage.Value * 1.1f + SpellDamage.Value * 1.1f + (CritDamage.Value * (CritChance.Value / 100f)) + MaxHealth.Value * 1f + Armor.Value * 1f + MagicResistance.Value * 1f; } } }