using Photon.Pun; using System.Collections; using System.Collections.Generic; using UnityEngine; //[CreateAssetMenu(fileName = "BaseAbility", menuName = "RiftMayhem/AbilitySystem/Abilities/Base Ability", order = 1)] public class BaseAbility : ScriptableObject { public string displayName; public Sprite Icon; public List targettingTags = new List(); public List tags = new List(); public List abilityEffects = new List(); [Space] public float castTime; public float manaCost; public float healthCost = 0; public float classResourceCost = 0; public float percentMaxManaCost = 0; public float percentMaxHealthCost = 0; public float cooldown; public bool castableWhileMoving; public AbilityAnimationType animationType; Mana userMana; protected Health userHealth; private float maxManaCostInValue; private float maxHealthCostInValue; private float finalManaCost; private float finalHealthCost; public virtual void Execute(PhotonView user, Taggable userTag) { SpendResourcesNecessary(user, userTag); //for (int i = 0; i < abilityEffects.Count; i++) //{ // Debug.Log($"Ability {this.name} applied {abilityEffects[i].name} effect at xtarget"); //} } public virtual void Execute(PhotonView user, Taggable userTag, Vector3 point) { SpendResourcesNecessary(user, userTag); } public virtual void Execute(PhotonView user, Taggable userTag, Transform target) { SpendResourcesNecessary(user, userTag); } public virtual void SpendResourcesNecessary(PhotonView user, Taggable userTag) { userMana = user.GetComponent(); maxManaCostInValue = userMana.GetMaxValue() * percentMaxManaCost; finalManaCost = manaCost + maxManaCostInValue; userHealth = user.GetComponent(); maxHealthCostInValue = userHealth.GetMaxValue() * percentMaxHealthCost; finalHealthCost = healthCost + maxHealthCostInValue; userMana.ChangeValue(-finalManaCost); userHealth.ChangeValue(-finalHealthCost); user.GetComponent()?.ChangeValue(-classResourceCost); } public virtual float GetFinalManaCost(Mana userMana) { maxManaCostInValue = userMana.GetMaxValue() * percentMaxManaCost; finalManaCost = manaCost + maxManaCostInValue; return finalManaCost; } public virtual float GetFinalHealthCost(Health userHealth) { maxHealthCostInValue = userHealth.GetMaxValue() * percentMaxHealthCost; finalHealthCost = healthCost + maxHealthCostInValue; return finalHealthCost; } private void OnValidate() { InitializeUniqueTags(); } private void OnEnable() { InitializeUniqueTags(); } public void InitializeUniqueTags() { tags.Clear(); // Iterate through each effect and add unique GameTags to uniqueTags list foreach (var effect in abilityEffects) { if (effect != null) { foreach (var tag in effect.tags) { if (!tags.Contains(tag)) { tags.Add(tag); } } foreach (var influencingStat in effect.influencingStats) { if(!tags.Contains(influencingStat.statTag)) { tags.Add(influencingStat.statTag); } } } } } }