Encounter / Assets / Scripts / ScriptableObjects / WeaponSO.cs
WeaponSO.cs
Raw
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static SpellSO;

#if UNITY_EDITOR
using UnityEditor;
#endif

[CreateAssetMenu(fileName = "New Weapon", menuName = "Config/Items/New Weapon")]
public class WeaponSO : ItemSO
{
    public enum Type
    {
        Sharp,
        Blunt,
        Ranged,
        Magic,
        Extended,
        Firearm,
        None
    }

    public List<Dice.DiceR> Damage;
    public int ModifierChance;
    public bool Is_Ranged;
    public bool Two_Handed;
    public Element Weapon_Element = Element.Normal;
    public Type Weapon_Type = Type.None;

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

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

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

    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("Item_Sprite"));

        EditorGUILayout.Space(10);
        EditorGUILayout.LabelField("Weapon Properties", EditorStyles.boldLabel);
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Damage"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("ModifierChance"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Is_Ranged"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Two_Handed"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Weapon_Element"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Weapon_Type"));

        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("Requirements", 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(15);
        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"));

        EditorGUILayout.PropertyField(serializedObject.FindProperty("AddModifiers"));
        if (container.AddModifiers)
            EditorGUILayout.PropertyField(serializedObject.FindProperty("ModifiersToAdd"));

        serializedObject.ApplyModifiedProperties();
    }
}
#endif