2025-10-01 18:45:11 +01:00

139 lines
4.4 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 EntityEventBroker userBroker;
private CharacterStats stats;
private DamageOutputModifierEffectInstance damageOutputModifier;
private bool isCrit;
public override void ApplyEffect(Taggable user, List<Taggable> targets, BaseAbility source)
{
if (user == null) return;
userBroker = user.GetComponent<EntityEventBroker>();
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)
{
ApplyEffect(user, target, source, targets.Count);
//targetHealth.ChangeValue(GetCorrectValueSign(user, target), (int)damageType, isCrit);
}
//targetHealth.ChangeValue(target.targetTag == TargettingTag.Enemy ? -value : value);
}
}
}
private void ApplyEffect(Taggable user, Taggable target, BaseAbility source, int totalTargetsHit)
{
if (user == null)
{
Debug.LogError("ApplyEffect user is null");
return;
}
if (target == null)
{
Debug.LogError("ApplyEffect target is null");
return;
}
if (user.AlliedTagsContains(target.targetTag))
{
HealArgs args = CObjectPool<HealArgs>.Get();
args.source = source;
args.effect = this;
args.user = user;
args.target = target;
args.currentValue = baseValue;
args.outgoingAccumulator = 0f;
args.incomingAccumulator= 0f;
args.applicationMethod = EffectApplicationMethod.Hit;
args.isCrit = false;
args.totalTargetsHit = totalTargetsHit;
userBroker.OnOutgoingHeal.Invoke(args);
userBroker.OnOutgoingHealProcessed.Invoke(args);
targetHealth.ApplyHeal(args);
CObjectPool<HealArgs>.Release(args);
}
else
{
DamageArgs args = CObjectPool<DamageArgs>.Get();
args.sourceAbility = source;
args.sourceEffect = this;
args.user = user;
args.target = target;
args.currentValue = -baseValue;
args.outgoingAccumulator = 0f;
args.incomingAccumulator = 0f;
args.damageType = damageType;
args.applicationMethod = EffectApplicationMethod.Hit;
args.isCrit = false;
args.totalTargetsHit = totalTargetsHit;
args.targetDead = false;
userBroker.OnOutgoingDamage.Invoke(args);
userBroker.OnOutgoingDamageProcessed.Invoke(args);
targetHealth.ApplyDamage(args);
CObjectPool<DamageArgs>.Release(args);
}
}
}