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