139 lines
5.1 KiB
C#
139 lines
5.1 KiB
C#
using Kryz.CharacterStats;
|
|
using Kryz.CharacterStats.Examples;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
[CreateAssetMenu(fileName = "InstantEffect", menuName = "RiftMayhem/AbilitySystem/Effects/Instant Effect", order = 1)]
|
|
public class InstantValueEffect : BaseEffect
|
|
{
|
|
public float baseValue;
|
|
public DamageType damageType = DamageType.Attack;
|
|
|
|
[Header("Optional Modifiers for damage / healing based on target")]
|
|
public float AlliedTargetMultiplier = 1f;
|
|
public float EnemyTargetMultiplier = 1f;
|
|
public float FriendlyNPCTargetMultiplier = 1f;
|
|
[Header("Optional apply this to class resource instead:")]
|
|
public bool applyToClassResourceInstead = false;
|
|
public bool applyToSelfResourceInsteadOfHit = false;
|
|
|
|
Health targetHealth;
|
|
ClassResource classResource;
|
|
|
|
private float finalValue;
|
|
private CharacterStats stats;
|
|
private DamageOutputModifierEffectInstance damageOutputModifier;
|
|
|
|
public override void ApplyEffect(Taggable user, List<Taggable> targets)
|
|
{
|
|
if (user == null) return;
|
|
|
|
foreach (Taggable target in targets)
|
|
{
|
|
if (target == null) continue;
|
|
|
|
//Debug.Log($"Applied instant effect of {GetCorrectValueSign(user, target)} to target {target.name}");
|
|
if (applyToClassResourceInstead)
|
|
{
|
|
if (user.IsMinion()) return;
|
|
|
|
if (applyToSelfResourceInsteadOfHit)
|
|
{
|
|
classResource = user.GetComponent<ClassResource>();
|
|
if (classResource != null)
|
|
classResource.ChangeValue(GetCorrectValueSign(user, user));
|
|
}
|
|
else
|
|
{
|
|
classResource = target.GetComponent<ClassResource>();
|
|
if (classResource != null)
|
|
classResource.ChangeValue(GetCorrectValueSign(user, target));
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
targetHealth = target.GetComponent<Health>();
|
|
if (targetHealth != null)
|
|
targetHealth.ChangeValue(GetCorrectValueSign(user, target), (int)damageType);
|
|
//targetHealth.ChangeValue(target.targetTag == TargettingTag.Enemy ? -value : value);
|
|
}
|
|
}
|
|
}
|
|
|
|
private float GetCorrectValueSign(Taggable user, Taggable target)
|
|
{
|
|
if (user == null) return 0;
|
|
if (target == null) return 0;
|
|
|
|
stats = user.GetComponent<CharacterStats>();
|
|
damageOutputModifier = user.GetComponent<DamageOutputModifierEffectInstance>();
|
|
GetFinalValue(stats, damageOutputModifier);
|
|
|
|
//return user.targetTag.AlliedTags.Contains(target.targetTag) ? (finalValue * AlliedTargetMultiplier) : (-finalValue * EnemyTargetMultiplier);
|
|
|
|
|
|
|
|
if(user.AlliedTagsContains(target.targetTag))
|
|
{
|
|
if (target.IsFriendlyNPC())
|
|
return (finalValue * FriendlyNPCTargetMultiplier);
|
|
else
|
|
return (finalValue * AlliedTargetMultiplier);
|
|
}
|
|
else
|
|
return (-finalValue * EnemyTargetMultiplier);
|
|
}
|
|
|
|
/*
|
|
private CharacterStat GetCorrectStat(CharacterStats stats) //TODO: make it use multiple stats correctly
|
|
{
|
|
for (int i = 0; i < influencingStats.Count; i++)
|
|
{
|
|
if (stats.statsDictionary.ContainsKey(influencingStats[i].statTag.name.ToLower()))
|
|
{
|
|
Debug.Log($"Influencing effect using: {influencingStats[i].statTag.name.ToLower()}");
|
|
return stats.statsDictionary[influencingStats[i].statTag.name.ToLower()];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
*/
|
|
|
|
private void GetFinalValue(CharacterStats stats, DamageOutputModifierEffectInstance damageOutputModifier)
|
|
{
|
|
finalValue = baseValue;
|
|
if (stats != null)
|
|
{
|
|
foreach (var statInfluence in 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")) damageType = DamageType.Attack;
|
|
else if (statInfluence.statTag.name.ToLower().Contains("Spell")) damageType = DamageType.Spell;
|
|
}
|
|
|
|
}
|
|
//Debug.Log("FinalValue = " + finalValue + " dmgType = " + damageType);
|
|
if (IsCrit(stats) && !applyToClassResourceInstead)
|
|
{
|
|
finalValue *= (1 + stats.CritDamage.Value / 100f);
|
|
//Debug.Log("FinalValue IsCrit = " + finalValue + " dmgType = " + damageType);
|
|
}
|
|
|
|
finalValue = damageOutputModifier.ModifyDamageOutput(finalValue);
|
|
}
|
|
|
|
private bool IsCrit(CharacterStats stats)
|
|
{
|
|
return Random.Range(0, 100) < stats.CritChance.Value;
|
|
}
|
|
}
|