using UnityEngine; using System.Collections.Generic; using Kryz.CharacterStats.Examples; using Kryz.CharacterStats; [CreateAssetMenu(fileName = "DamageOverTimeEffect", menuName = "RiftMayhem/AbilitySystem/Effects/Damage Over Time Effect", order = 1)] public class DamageOverTimeEffect : StatusEffect { [Space] public float baseDamagePerTick; public float tickRate = 1f; public DamageOverTimeType damageType; private float finalTickValue; private CharacterStats stats; public override void ApplyEffect(Taggable user, List targets) { base.ApplyEffect(user, targets); finalTickValue = CalculateFinalDamage(user); if (applyToTargetsHit) { foreach (Taggable target in targets) { BaseDamageOverTimeEffectInstance dotInstance = GetOrAddCorrectInstance(target); dotInstance.owner.RPC((nameof(dotInstance.RPC_ApplyDamageOverTimeEffect)+damageType.ToString()), dotInstance.owner.Owner, StatusEffectIndexer.Instance.StatusEffects.IndexOf(this), finalTickValue); } } if (applyToSelf) { BaseDamageOverTimeEffectInstance dotInstance = GetOrAddCorrectInstance(user); dotInstance.ApplyEffect(this, finalTickValue); } } private BaseDamageOverTimeEffectInstance GetOrAddCorrectInstance(Taggable target) { switch (damageType) { case DamageOverTimeType.Burn: return target.GetComponent() ?? target.gameObject.AddComponent(); case DamageOverTimeType.Poison: return target.GetComponent() ?? target.gameObject.AddComponent(); case DamageOverTimeType.Bleed: return target.GetComponent() ?? target.gameObject.AddComponent(); default: throw new System.ArgumentException("Unknown damage type"); } } private float CalculateFinalDamage(Taggable user) { float finalDamage = baseDamagePerTick; if (user == null) return finalDamage; CharacterStats stats = user.GetComponent(); if (stats == null) return finalDamage; foreach (var statInfluence in influencingStats) { if (stats.primaryStatsDictionary.TryGetValue(statInfluence.statTag.name.ToLower(), out CharacterStat stat)) { finalDamage += stat.Value * statInfluence.percentInfluence; } else if (stats.secondaryStatsDictionary.TryGetValue(statInfluence.statTag.name.ToLower(), out CharacterStat secondaryStat)) { finalDamage += secondaryStat.Value * statInfluence.percentInfluence; } } return finalDamage; } }