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

#if UNITY_EDITOR
using UnityEditor;
#endif

[CreateAssetMenu(fileName = "New Modifier", menuName = "Config/New Modifier")]
public class ModifierSO : ScriptableObject
{
    public enum Effect
    {
        Stat,
        HPRegen,
        ManaRegen,
        ArmorModifier,
        Accuracy,
        Crit,
        DamageModifier,
        DOT,
        Other
    }

    public enum Type
    {
        Buff,
        Debuff
    }

    public string Name;
    public Effect Modifier;
    public Type Mod_Type;
    public Sprite Mod_Sprite;
    public bool Is_Value;
    public bool Is_Percent;
    public bool Is_Dice;
    public int Value;
    public int FlagValue;
    public List<EntityStats.Stat> StatModified;
    [Range(0, 100)] public int Percent;
    public List<Dice.DiceR> Dice_Value;
    public List<Dice.DiceR> Length_Of_Effect;
    public int LengthOfEffectNoDice;
    [TextArea(3, 12)] public string Description;

    public bool ModifierAppliedAtEndOfEffect;
    public ModifierSO EndModifier;
}

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

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

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

        EditorGUILayout.LabelField("Effect", EditorStyles.boldLabel);
        EditorGUILayout.Space(10);
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Name"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Description"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Modifier"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Mod_Type"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Mod_Sprite"));
        EditorGUILayout.Space(15);

        if (container.Modifier is ModifierSO.Effect.Other)
        {
            container.FlagValue = EditorGUILayout.IntField("Flag Value", container.FlagValue);
            EditorGUILayout.Space(10);
        }

        EditorGUILayout.LabelField("Type of Value", EditorStyles.boldLabel);
        EditorGUILayout.Space(10);
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Is_Value"));
        if (container.Is_Value)
        {
            container.Value = EditorGUILayout.IntField("Value", container.Value);
            if (container.Modifier is not ModifierSO.Effect.Accuracy && container.Modifier is not ModifierSO.Effect.ArmorModifier)
                EditorGUILayout.PropertyField(serializedObject.FindProperty("StatModified"));
        }

        EditorGUILayout.Space(20);
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Is_Percent"));
        if (container.Is_Percent)
            container.Percent = EditorGUILayout.IntField("Percentage Value (0-100)", container.Percent);

        EditorGUILayout.Space(20);
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Is_Dice"));
        if (container.Is_Dice)
            EditorGUILayout.PropertyField(serializedObject.FindProperty("Dice_Value"));

        EditorGUILayout.Space(20);
        EditorGUILayout.LabelField("Length Of Time For Modifier", EditorStyles.boldLabel);
        EditorGUILayout.Space(10);
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Length_Of_Effect"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("LengthOfEffectNoDice"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("ModifierAppliedAtEndOfEffect"));

        if (container.ModifierAppliedAtEndOfEffect)
            EditorGUILayout.PropertyField(serializedObject.FindProperty("EndModifier"));
        

        serializedObject.ApplyModifiedProperties();
    }
}
#endif