Encounter / Assets / Scripts / ScriptableObjects / AbilitySO.cs
AbilitySO.cs
Raw
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

[CreateAssetMenu(fileName = "New Ability", menuName = "Config/New Ability")]
public class AbilitySO : ScriptableObject
{
    public int ID;
    public string Name;
    public Sprite AbilitySprite;
    [TextArea(3, 12)] public string Description;
    public List<string> HelperEffects;
    public ModifierSO Modifier;
    [Tooltip("0 - STR | 1 - INT | 2 - CON | 3 - DEX | 4 - CHA | 5 - WIS | 6 - LCK")] public Vector2Int SavingThrow;
    public bool ModificationAbility;

    public enum PossReqs
    {
        Stats,
        Sec_Stats,
        Item, 
        Ability
    }
    public bool Has_Requirement;
    public List<PossReqs> Requirements;
    [Tooltip("Switch this on if you want the requirements indicated to be the breakpoint instead of the requirement")]
    public bool RequirementsEntityCantHave;

    // Stats Fields
    public int Number_Of_Stat_Reqs;
    [Tooltip("0 - STR | 1 - INT | 2 - CON | 3 - DEX | 4 - CHA | 5 - WIS | 6 - LCK")]
    public List<Vector3Int> Stats_List;

    // Secondary Stat Fields
    public int Number_Of_Sec_Stat_Reqs;
    [Tooltip("0 - HP | 1 - MP | 2 - Armor")]
    public List<Vector3Int> Sec_Stats_List;

    // Item Fields
    public bool Requires_Specific;
    public int Number_Of_Items;
    public List<string> Item_List;

    public bool Requires_WType;
    public WeaponSO.Type W_Type;

    public bool Requires_AType;
    public ApparelSO.Type A_Type;

    // Ability Fields
    public int Number_Of_Abs;
    public List<string> Ability_List;
}

#if UNITY_EDITOR
[CustomEditor(typeof(AbilitySO))]
public class AbilitySOEditor : Editor
{
    private AbilitySO container;

    private const int Max_Prime_Stat_Reqs = 14;
    private const int Max_Secondary_Stat_Reqs = 6;
    private const int Max_Item_Requirement = 10;
    private const int Max_Ability_Requirements = 10;

    private void OnEnable()
    {
        container = target as AbilitySO;
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        EditorGUILayout.LabelField("General Properties", EditorStyles.boldLabel);
        container.ID = EditorGUILayout.IntField("ID", container.ID);
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Name"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Description"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("HelperEffects"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("AbilitySprite"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Modifier"));

        if (container.Modifier != null)
            EditorGUILayout.PropertyField(serializedObject.FindProperty("SavingThrow"));
        
        EditorGUILayout.PropertyField(serializedObject.FindProperty("ModificationAbility"));

        EditorGUILayout.Space(10);
        EditorGUILayout.LabelField("Requirement Properties", EditorStyles.boldLabel);
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Has_Requirement"));

        if (container.Has_Requirement)
        {
            EditorGUILayout.PropertyField(serializedObject.FindProperty("Requirements"));
            EditorGUILayout.PropertyField(serializedObject.FindProperty("RequirementsEntityCantHave"));

            if (container.Requirements.Contains(AbilitySO.PossReqs.Stats))
            {
                EditorGUILayout.Space(10);
                EditorGUILayout.LabelField("Stats Requirements", EditorStyles.boldLabel);

                container.Number_Of_Stat_Reqs = EditorGUILayout.IntField("Number of Stat Requirements", container.Number_Of_Stat_Reqs);
                container.Number_Of_Stat_Reqs = Mathf.Clamp(container.Number_Of_Stat_Reqs, 0, Max_Prime_Stat_Reqs);
                if (container.Stats_List.Count < container.Number_Of_Stat_Reqs)
                {
                    for (int i = 0; i < container.Number_Of_Stat_Reqs; i++)
                        container.Stats_List.Add(new Vector3Int(0, 0, 0));
                }
                else if (container.Stats_List.Count > container.Number_Of_Stat_Reqs)
                    container.Stats_List.Remove(container.Stats_List[^1]);

                EditorGUILayout.PropertyField(serializedObject.FindProperty("Stats_List"));
            }
            if (container.Requirements.Contains(AbilitySO.PossReqs.Sec_Stats))
            {
                EditorGUILayout.Space(10);
                EditorGUILayout.LabelField("Sec Stats Requirements", EditorStyles.boldLabel);

                container.Number_Of_Sec_Stat_Reqs = EditorGUILayout.IntField("Number of Secondary Stat Requirements", container.Number_Of_Sec_Stat_Reqs);
                container.Number_Of_Sec_Stat_Reqs = Mathf.Clamp(container.Number_Of_Sec_Stat_Reqs, 0, Max_Secondary_Stat_Reqs);
                if (container.Sec_Stats_List.Count < container.Number_Of_Sec_Stat_Reqs)
                {
                    for (int i = 0; i < container.Number_Of_Sec_Stat_Reqs; i++)
                        container.Sec_Stats_List.Add(new Vector3Int(0, 0, 0));
                }
                else if (container.Sec_Stats_List.Count > container.Number_Of_Sec_Stat_Reqs)
                    container.Sec_Stats_List.Remove(container.Sec_Stats_List[^1]);

                EditorGUILayout.PropertyField(serializedObject.FindProperty("Sec_Stats_List"));
            }
            if (container.Requirements.Contains(AbilitySO.PossReqs.Item))
            {
                EditorGUILayout.Space(10);
                EditorGUILayout.LabelField("Item Requirements", EditorStyles.boldLabel);

                container.Number_Of_Items = EditorGUILayout.IntField("Number_Of_Items", container.Number_Of_Items);
                container.Number_Of_Items = Mathf.Clamp(container.Number_Of_Items, 0, Max_Item_Requirement);
                
                if (container.Item_List.Count < container.Number_Of_Items)
                {
                    for (int i = 0; i < container.Number_Of_Items; i++)
                        container.Item_List.Add("");
                }
                else if (container.Item_List.Count > container.Number_Of_Items && container.Number_Of_Items > 0)
                    container.Item_List.Remove(container.Item_List[^1]);

                EditorGUILayout.PropertyField(serializedObject.FindProperty("Item_List"));
                
                EditorGUILayout.Space(5);
                EditorGUILayout.PropertyField(serializedObject.FindProperty("Requires_WType"));
                if (container.Requires_WType)
                {
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("W_Type"));
                }
                EditorGUILayout.Space(5);
                EditorGUILayout.PropertyField(serializedObject.FindProperty("Requires_AType"));
                if (container.Requires_AType)
                {
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("A_Type"));
                }
            }
            if (container.Requirements.Contains(AbilitySO.PossReqs.Ability))
            {
                EditorGUILayout.Space(10);
                EditorGUILayout.LabelField("Ability Requirements", EditorStyles.boldLabel);

                container.Number_Of_Abs = EditorGUILayout.IntField("Number of Abilities", container.Number_Of_Abs);
                container.Number_Of_Abs = Mathf.Clamp(container.Number_Of_Abs, 0, Max_Ability_Requirements);
                if (container.Ability_List.Count < container.Number_Of_Abs)
                {
                    for (int i = 0; i < container.Number_Of_Abs; i++)
                        container.Ability_List.Add("");
                }
                else if (container.Ability_List.Count > container.Number_Of_Abs && container.Number_Of_Abs > 0)
                    container.Ability_List.Remove(container.Ability_List[^1]);
                
                EditorGUILayout.PropertyField(serializedObject.FindProperty("Ability_List"));
            }
        }

        serializedObject.ApplyModifiedProperties();
    }
}
#endif