using UnityEngine; namespace ProjectI.Builds { public abstract class AbilityDefinition : ScriptableObject { public int id; public string displayName; [TextArea(2, 5)] public string description; public Sprite icon; public abstract AbilitySlot Slot { get; } public abstract AbilityEffect Effect { get; } public virtual AbilityTraits Traits => AbilityTraitRules.For(Effect); public virtual bool UsesMovementInput => false; public AbilitySlot slot => Slot; public AbilityEffect effect => Effect; public float healthPercent; public float movementPercent; [HideInInspector] public float damagePercent; [HideInInspector] public int statSchemaVersion; public float attackDamagePercent; public float abilityDamagePercent; public double cooldown; public double duration; public float magnitude; public float radius; [Min(.25f)] public double minimumCastInterval = .25; [Tooltip("Automatic: dash waits for movement; barrier and haste refresh one bounded source; instant damage casts remain independent.")] public AbilityRecastPolicy recastPolicy; public AbilityEffectSettings effectSettings; [HideInInspector] public int effectSettingsSchemaVersion; public virtual AbilityEffectParameters ResolveEffectParameters()=>effectSettings!=null&&effectSettingsSchemaVersion>=1 ? new AbilityEffectParameters(effectSettings) : AbilityEffectParameters.Defaults(Effect); public virtual double ResolvedDuration=>duration; public AbilityTuning Tuning => new AbilityTuning(id, slot, effect, healthPercent, movementPercent, statSchemaVersion >= 2 ? attackDamagePercent : damagePercent, cooldown, ResolvedDuration, magnitude, radius, statSchemaVersion >= 2 ? abilityDamagePercent : damagePercent, System.Math.Max(.25, minimumCastInterval), recastPolicy, Traits, ResolveEffectParameters()); public abstract void ActivateServer(AbilityActivationContext context); } }