54 lines
1.8 KiB
C#
54 lines
1.8 KiB
C#
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;
|
|
}
|
|
foreach (var statInfluence in args.effect.influencingStats)
|
|
{
|
|
if (stats.primaryStatsDictionary.TryGetValue(statInfluence.statTag.name.ToLower(), out CharacterStat stat))
|
|
{
|
|
finalValue += stat.Value * statInfluence.percentInfluence;
|
|
}
|
|
else if (stats.secondaryStatsDictionary.TryGetValue(statInfluence.statTag.name.ToLower(), out CharacterStat secondaryStat))
|
|
{
|
|
finalValue += secondaryStat.Value * statInfluence.percentInfluence;
|
|
}
|
|
if (statInfluence.statTag.name.ToLower().Contains("Attack")) args.damageType = DamageType.Attack;
|
|
else if (statInfluence.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;
|
|
}
|
|
} |