Encounter / Assets / Scripts / ScriptableObjects / ApparelSO.cs
ApparelSO.cs
Raw
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.VisualScripting;

#if UNITY_EDITOR
using UnityEditor;
#endif

[CreateAssetMenu(fileName = "New Apparel", menuName = "Config/Items/New Apparel")]
public class ApparelSO : ItemSO
{
    public enum Type
    {
        Armored,
        Leather,
        Magic,
        Plated,
        Enhancement,
        Accessory
    }
    public enum Location
    {
        Head,
        Chest,
        Leggings,
        Neck,
        RingLocOne,
        RingLocTwo,
        Relic
    }
    public enum ApparelEffect
    {
        Defense,
        Resistances,
        HealthRegen,
        ManaRegen,
        DamageModifier,
        ToHitModifier,
        GiveSpell,
        GiveAbility,
        Stats,
        MoreMana,
        MoreHealth,
        Other
    }

    public Location ApparelLocation = Location.Head;
    public Type ApparelType = Type.Armored;
    
    public List<ApparelEffect> ApparelEffects;
    
    public int Defense;
    public List<SpellSO.Element> ApparelElementResistances;
    public List<WeaponSO.Type> ApparelTypeResistances;
    [Range(0,100)][Tooltip("Percentage is in INT amount (0-100)")] public int HealthRegeneration;
    [Range(0,100)][Tooltip("Percentage is in INT amount (0-100)")] public int ManaRegeneration;
    public int Damage;
    public int ToHit;
    public List<SpellSO> Spells;
    public List<AbilitySO> Abilities;
    [Tooltip("0 - STR | 1 - INT | 2 - CON | 3 - DEX | 4 - CHA | 5 - WIS | 6 - LCK")] public List<Vector2Int> StatMods;
    public int ExtraMana;
    public int ExtraHealth;
    public int FlagValue;

    public bool RequiresWeatherType;
    public List<ClimateManager.Weather> RequiredWeather;

    public bool AddSpells;
    public List<SpellSO> SpellsToAdd;
    public bool AddAbilities;
    public List<AbilitySO> AbilitiesToAdd;
}

#if UNITY_EDITOR
[CustomEditor(typeof(ApparelSO))]
public class ApparelSOEditor : ItemSOEditor
{
    private ApparelSO container;

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

    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("ApparelLocation"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("ApparelType"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Description"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("HelperEffects"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Item_Sprite"));

        EditorGUILayout.Space(10);
        EditorGUILayout.LabelField("Shop Properties", EditorStyles.boldLabel);
        container.Value = EditorGUILayout.IntField("Value", container.Value);
        container.Cost = EditorGUILayout.IntField("Cost", container.Cost);
        EditorGUILayout.Space(5);
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Item_Rarity"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("CantBeSold"));

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

        foreach (ApparelSO.ApparelEffect effect in container.ApparelEffects)
        {
            switch (effect)
            {
                case ApparelSO.ApparelEffect.Defense:
                    container.Defense = EditorGUILayout.IntField("Defense", container.Defense);
                    container.Defense = Mathf.Clamp(container.Defense, 0, int.MaxValue);
                    break;
                case ApparelSO.ApparelEffect.Resistances:
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("ApparelElementResistances"));
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("ApparelTypeResistances"));
                    break;
                case ApparelSO.ApparelEffect.HealthRegen:
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("HealthRegeneration"));
                    break;
                case ApparelSO.ApparelEffect.ManaRegen:
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("ManaRegeneration"));
                    break;
                case ApparelSO.ApparelEffect.DamageModifier:
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("Damage"));
                    break;
                case ApparelSO.ApparelEffect.ToHitModifier:
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("ToHit"));
                    break;
                case ApparelSO.ApparelEffect.GiveSpell:
                    EditorGUILayout.PropertyField(serializedObject.FindPropertyOrFail("Spells"));
                    break;
                case ApparelSO.ApparelEffect.GiveAbility:
                    EditorGUILayout.PropertyField(serializedObject.FindPropertyOrFail("Abilities"));
                    break;
                case ApparelSO.ApparelEffect.Stats:
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("StatMods"));
                    break;
                case ApparelSO.ApparelEffect.MoreMana:
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("ExtraMana"));
                    break;
                case ApparelSO.ApparelEffect.MoreHealth:
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("ExtraHealth"));
                    break;
                case ApparelSO.ApparelEffect.Other:
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("FlagValue"));
                    break;
            }
        }

        EditorGUILayout.Space(15);
        EditorGUILayout.PropertyField(serializedObject.FindProperty("RequiresWeatherType"));
        if (container.RequiresWeatherType)
            EditorGUILayout.PropertyField(serializedObject.FindProperty("RequiredWeather"));

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

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

            if (container.Requirements.Contains(ItemSO.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, MaxPrimeStatReqs);
                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(ItemSO.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, MaxSecondaryStatReqs);
                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(ItemSO.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, MaxItemRequirement);
                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(10);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("AddSpells"));
            if (container.AddSpells)
                EditorGUILayout.PropertyField(serializedObject.FindProperty("SpellsToAdd"));
            EditorGUILayout.PropertyField(serializedObject.FindProperty("AddAbilities"));
            if (container.AddAbilities)
                EditorGUILayout.PropertyField(serializedObject.FindProperty("AbilitiesToAdd"));
        }

        serializedObject.ApplyModifiedProperties();
    }
}
#endif