using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; namespace Kryz.CharacterStats.Examples { public class CharacterStats : MonoBehaviour { [Header("---------------------------------------------------------------------------------------------")] [Header("Primary Stats:")] public CharacterStat Cunning; public CharacterStat Flow; public CharacterStat Presence; //Secondary [Space] [Header("---------------------------------------------------------------------------------------------")] [Header("Offensive Stats:")] [Space] public CharacterStat AttackDamage; public CharacterStat SpellDamage; public CharacterStat AttackSpeed; public CharacterStat CritChance; public CharacterStat CritDamage; public CharacterStat AuraPower; [Space] [Header("---------------------------------------------------------------------------------------------")] [Header("Resource Stats:")] [Space] public CharacterStat MaxHealth; public CharacterStat HealthRegen; public CharacterStat MaxMana; public CharacterStat ManaRegen; [Space] [Header("---------------------------------------------------------------------------------------------")] [Header("Defensive Stats:")] [Space] public CharacterStat Armor; public CharacterStat MagicResistance; public CharacterStat DodgeChance; public CharacterStat BlockChance; public CharacterStat BlockEffectiveness; [Space] [Header("---------------------------------------------------------------------------------------------")] [Header("Misc Stats:")] [Space] public CharacterStat AreaEffectiveness; public CharacterStat CooldownReduction; public CharacterStat MovementSpeed; public CharacterStat ReputationGainIncrease; public CharacterStat GoldCostReduction; //Awakening Related //public CharacterStat public Dictionary primaryStatsDictionary = new Dictionary(); public Dictionary secondaryStatsDictionary = new Dictionary(); public UnityEvent onUpdateStatValues = new UnityEvent(); public UnityEvent onAllStatsUpdated = new UnityEvent(); protected virtual void Awake() { primaryStatsDictionary.Add(nameof(Cunning).ToLower(), Cunning); primaryStatsDictionary.Add(nameof(Flow).ToLower(), Flow); primaryStatsDictionary.Add(nameof(Presence).ToLower(), Presence); secondaryStatsDictionary.Add(nameof(AttackDamage).ToLower(), AttackDamage); secondaryStatsDictionary.Add(nameof(SpellDamage).ToLower(), SpellDamage); secondaryStatsDictionary.Add(nameof(AttackSpeed).ToLower(), AttackSpeed); secondaryStatsDictionary.Add(nameof(CritChance).ToLower(), CritChance); secondaryStatsDictionary.Add(nameof(CritDamage).ToLower(), CritDamage); secondaryStatsDictionary.Add(nameof(AuraPower).ToLower(), AuraPower); secondaryStatsDictionary.Add(nameof(HealthRegen).ToLower(), HealthRegen); secondaryStatsDictionary.Add(nameof(ManaRegen).ToLower(), ManaRegen); secondaryStatsDictionary.Add(nameof(MaxHealth).ToLower(), MaxHealth); secondaryStatsDictionary.Add(nameof(MaxMana).ToLower(), MaxMana); secondaryStatsDictionary.Add(nameof(Armor).ToLower(), Armor); secondaryStatsDictionary.Add(nameof(MagicResistance).ToLower(), MagicResistance); secondaryStatsDictionary.Add(nameof(DodgeChance).ToLower(), DodgeChance); secondaryStatsDictionary.Add(nameof(BlockChance).ToLower(), BlockChance); secondaryStatsDictionary.Add(nameof(BlockEffectiveness).ToLower(), BlockEffectiveness); secondaryStatsDictionary.Add(nameof(AreaEffectiveness).ToLower(), AreaEffectiveness); secondaryStatsDictionary.Add(nameof(CooldownReduction).ToLower(), CooldownReduction); secondaryStatsDictionary.Add(nameof(MovementSpeed).ToLower(), MovementSpeed); secondaryStatsDictionary.Add(nameof(ReputationGainIncrease).ToLower(), ReputationGainIncrease); secondaryStatsDictionary.Add(nameof(GoldCostReduction).ToLower(), GoldCostReduction); onUpdateStatValues.AddListener(UpdateSecondaryStatsBasedOnPrimaryStats); } public void IncreaseAllStatPoints(int amount) { onUpdateStatValues.Invoke(); } public void UpdateSecondaryStatsBasedOnPrimaryStats() { //Remove previous CritChance.RemoveAllModifiersFromSource(GameConstants.ObjectSources.CunningSource); CritDamage.RemoveAllModifiersFromSource(GameConstants.ObjectSources.CunningSource); MovementSpeed.RemoveAllModifiersFromSource(GameConstants.ObjectSources.CunningSource); //HealthRegen.RemoveAllModifiersFromSource(GameConstants.ObjectSources.FlowSource); MaxMana.RemoveAllModifiersFromSource(GameConstants.ObjectSources.FlowSource); ManaRegen.RemoveAllModifiersFromSource(GameConstants.ObjectSources.FlowSource); CooldownReduction.RemoveAllModifiersFromSource(GameConstants.ObjectSources.FlowSource); AttackSpeed.RemoveAllModifiersFromSource(GameConstants.ObjectSources.FlowSource); //ResourceCostReduction.RemoveAllModifiersFromSource(GameConstants.ObjectSources.FlowSource); AreaEffectiveness.RemoveAllModifiersFromSource(GameConstants.ObjectSources.PresenceSource); ReputationGainIncrease.RemoveAllModifiersFromSource(GameConstants.ObjectSources.PresenceSource); GoldCostReduction.RemoveAllModifiersFromSource(GameConstants.ObjectSources.PresenceSource); AuraPower.RemoveAllModifiersFromSource(GameConstants.ObjectSources.PresenceSource); //Add refreshed values CritChance.AddModifier(new StatModifier(Cunning.Value * GameConstants.CharacterStatsBalancing.CritChanceIncreasePerCunning, StatModType.Flat, GameConstants.ObjectSources.CunningSource)); CritDamage.AddModifier(new StatModifier(Cunning.Value * GameConstants.CharacterStatsBalancing.CritDamageIncreasePerCunning, StatModType.Flat, GameConstants.ObjectSources.CunningSource)); //DodgeChance.AddModifier(new StatModifier(Cunning.Value * GameConstants.CharacterStatInfluence.DodgeChanceIncreasePerCunning, StatModType.Flat, GameConstants.ObjectSources.CunningSource)); MovementSpeed.AddModifier(new StatModifier(Cunning.Value * GameConstants.CharacterStatsBalancing.MovementSpeedIncreasePerCunning, StatModType.Flat, GameConstants.ObjectSources.CunningSource)); //HealthRegen.AddModifier(new StatModifier(Flow.Value * GameConstants.CharacterStatInfluence.HealthRegenIncreasePerFlow, StatModType.Flat, GameConstants.ObjectSources.FlowSource)); MaxMana.AddModifier(new StatModifier(Flow.Value * GameConstants.CharacterStatsBalancing.MaxManaIncreasePerFlow, StatModType.Flat, GameConstants.ObjectSources.FlowSource)); ManaRegen.AddModifier(new StatModifier(Flow.Value * GameConstants.CharacterStatsBalancing.ManaRegenIncreasePerFlow, StatModType.Flat, GameConstants.ObjectSources.FlowSource)); CooldownReduction.AddModifier(new StatModifier(Flow.Value * GameConstants.CharacterStatsBalancing.CooldownReductionIncreasePerFlow, StatModType.Flat, GameConstants.ObjectSources.FlowSource)); AttackSpeed.AddModifier(new StatModifier(Flow.Value * GameConstants.CharacterStatsBalancing.AttackSpeedIncreasePerFlow, StatModType.Flat, GameConstants.ObjectSources.FlowSource)); //ResourceCostReduction.AddModifier(new StatModifier(Flow.Value * GameConstants.CharacterStatInfluence.ResourceCostReductionPerFlow, StatModType.Flat, GameConstants.ObjectSources.FlowSource)); AreaEffectiveness.AddModifier(new StatModifier(Presence.Value * GameConstants.CharacterStatsBalancing.AreaEffectivenessIncreasePerPresence, StatModType.Flat, GameConstants.ObjectSources.PresenceSource)); ReputationGainIncrease.AddModifier(new StatModifier(Presence.Value * GameConstants.CharacterStatsBalancing.ReputationGainIncreasePerPresence, StatModType.Flat, GameConstants.ObjectSources.PresenceSource)); GoldCostReduction.AddModifier(new StatModifier(Presence.Value * GameConstants.CharacterStatsBalancing.GoldCostReductionPerPresence, StatModType.Flat, GameConstants.ObjectSources.PresenceSource)); AuraPower.AddModifier(new StatModifier(Presence.Value * GameConstants.CharacterStatsBalancing.AuraPowerPerPresence, StatModType.Flat, GameConstants.ObjectSources.PresenceSource)); Debug.Log(this.gameObject.name + " has relative power level of: " + GetRelativePowerLevel()); onAllStatsUpdated.Invoke(); } 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; } } }