RiftMayhem/Assets/Scripts/AbilitySystem/Effects/MovementSpeedModifierEffect.cs
Pedro Gomes 59c74b1d31 New abilities, bugfix necro autosummon, updated effects
- Knight Challenging Shout AoE Taunt ability
- Mage Firewall AoE Burn ability
- Added support for movement speed modifier effects to slow enemies instead of only buffing allies.
- Added different movement speed minimum cap to enemies and bosses
2024-12-21 20:40:31 +00:00

69 lines
2.7 KiB
C#

using UnityEngine;
using UnityEngine.AI;
using System.Collections.Generic;
using Kryz.CharacterStats.Examples;
using Kryz.CharacterStats;
[CreateAssetMenu(fileName = "MovementSpeedModifierEffect", menuName = "RiftMayhem/AbilitySystem/Effects/Movement Speed Modifier Effect", order = 1)]
public class MovementSpeedModifierEffect : StatusEffect
{
public float speedModifierPercentage;
MovementSpeedModifierEffectInstance targetMovementSpeedModifierEffect;
public override void ApplyEffect(Taggable user, List<Taggable> targets)
{
base.ApplyEffect(user, targets);
if (applyToTargetsHit)
{
foreach (Taggable target in targets)
{
//if (IsAlliedTarget(user, target))
//{
targetMovementSpeedModifierEffect = target.GetComponent<MovementSpeedModifierEffectInstance>();
targetMovementSpeedModifierEffect.owner.RPC(nameof(targetMovementSpeedModifierEffect.RPC_ApplyMovementSpeedModifierEffect), targetMovementSpeedModifierEffect.owner.Owner, StatusEffectIndexer.Instance.StatusEffects.IndexOf(this), GetCorrectValueSign(user, target));
//}
}
}
if (applyToSelf)
{
targetMovementSpeedModifierEffect = user.GetComponent<MovementSpeedModifierEffectInstance>();
targetMovementSpeedModifierEffect.ApplyEffect(this, GetCorrectValueSign(user, user));
}
}
private bool IsAlliedTarget(Taggable user, Taggable target)
{
return user.AlliedTagsContains(target.targetTag);
}
private float CalculateFinalAmount(Taggable user)
{
float finalAmount = speedModifierPercentage;
CharacterStats stats = user.GetComponent<CharacterStats>();
foreach (var statInfluence in influencingStats)
{
if (stats.primaryStatsDictionary.TryGetValue(statInfluence.statTag.name.ToLower(), out CharacterStat stat))
{
finalAmount += stat.Value * statInfluence.percentInfluence;
}
else if (stats.secondaryStatsDictionary.TryGetValue(statInfluence.statTag.name.ToLower(), out CharacterStat secondaryStat))
{
finalAmount += secondaryStat.Value * statInfluence.percentInfluence;
}
}
return finalAmount;
}
private float GetCorrectValueSign(Taggable user, Taggable target)
{
if (user == null) return 0;
if (target == null) return 0;
//return user.targetTag.AlliedTags.Contains(target.targetTag) ? (finalValue * AlliedTargetMultiplier) : (-finalValue * EnemyTargetMultiplier);
return user.AlliedTagsContains(target.targetTag) ? CalculateFinalAmount(user) : -CalculateFinalAmount(user);
}
}