using Kryz.CharacterStats; using Kryz.CharacterStats.Examples; using UnityEngine; public class BasicStatAmplificationCalculator : BrokerInterceptor { float finalValue; protected override void Awake() { base.Awake(); broker.OnOutgoingDamage.Subscribe(CalculateDamageModsBasedOnStats, GameConstants.BrokerEventPriority.BasicStatAmplification); } private void CalculateDamageModsBasedOnStats(DamageArgs args) { finalValue = args.currentValue; if (stats == null) { Debug.LogError("character stat influence calculator: stats null"); return; } for (int i = 0; i < args.sourceEffect.influencingStats.Count; i++) { if(stats.primaryStatsDictionary.TryGetValue(args.sourceEffect.influencingStats[i].statTag.name.ToLower(), out CharacterStat stat)) { finalValue += stat.Value * args.sourceEffect.influencingStats[i].percentInfluence; } else if (stats.secondaryStatsDictionary.TryGetValue(args.sourceEffect.influencingStats[i].statTag.name.ToLower(), out CharacterStat secondaryStat)) { finalValue += secondaryStat.Value * args.sourceEffect.influencingStats[i].percentInfluence; } if (args.sourceEffect.influencingStats[i].statTag.name.ToLower().Contains("attack")) args.damageType = DamageType.Attack; else if (args.sourceEffect.influencingStats[i].statTag.name.ToLower().Contains("spell")) args.damageType = DamageType.Spell; } if (IsCrit(stats)) { finalValue *= (1 + stats.GetStat("critdamage").Value / 100f); args.isCrit = true; } else args.isCrit = false; args.currentValue = finalValue; } private bool IsCrit(CharacterStats stats) { return MathHelpers.RollChancePercent(stats.GetStat("critchance").Value); //return Random.Range(0, 100) < stats.CritChance.Value; } }