public override void OnInspectorGUI()
    {
        Actor myActor = target as Actor;

        Actor.ActionSource[] sourceValues = Enum.GetValues(typeof(Actor.ActionSource)) as Actor.ActionSource[];
        string[]             sourceNames  = Enum.GetNames(typeof(Actor.ActionSource));

        SelectionList <Actor.ActionSource> sources = new SelectionList <Actor.ActionSource>(sourceValues, sourceNames);

        myActor.actionEffectSource = sources.RadioList("Action Source", myActor.actionEffectSource, 3);
        myActor.immunities         = sources.CheckboxList("Immunities", myActor.immunities, 3);
    }
    public override void OnInspectorGUI()
    {
        #region Actor Stats
        Actor myActor = target as Actor;

        #region Actor Name
        myActor.actorName = EditorGUILayout.TextField("Actor Name: ", myActor.actorName);
        #endregion

        #region Action Target
        myActor.actionTarget = (Actor.ActionTarget)EditorGUILayout.EnumPopup("Action Target: ", myActor.actionTarget);

        #endregion

        #region Action Effect
        myActor.actionEffect = (Actor.ActionEffect)EditorGUILayout.EnumPopup("Action Effect: ", myActor.actionEffect);
        #endregion

        #region AES & Immunities
        Actor.ActionSource[] sourceValues = Enum.GetValues(typeof(Actor.ActionSource)) as Actor.ActionSource[];
        string[]             sourceNames  = Enum.GetNames(typeof(Actor.ActionSource));

        SelectionList <Actor.ActionSource> sources = new SelectionList <Actor.ActionSource>(sourceValues, sourceNames);
        myActor.actionEffectSource = sources.RadioList("Action Source: ", myActor.actionEffectSource, 3);
        myActor.immunities         = sources.CheckboxList("Immunities: ", myActor.immunities, 3);
        #endregion

        #region MaxHit Points
        string mhpLabel        = "Max Hit Points: ";
        int    newMaxHitPoints = myActor.GetComponent <Actor>().maxHitPoints;
        newMaxHitPoints = EditorGUILayout.IntSlider(mhpLabel, newMaxHitPoints, 0, 1500);
        myActor.GetComponent <Actor>().maxHitPoints = newMaxHitPoints;
        #endregion

        #region Hit Points
        string hpLabel      = "Hit Points: ";
        int    newHitPoints = myActor.GetComponent <Actor>().hitPoints;
        newHitPoints = EditorGUILayout.IntSlider(hpLabel, newHitPoints, 1, 100);
        myActor.GetComponent <Actor>().hitPoints = newHitPoints;
        #endregion

        #region Initiative
        string iLabel        = "Initiative: ";
        int    newInitiative = myActor.GetComponent <Actor>().initiative;
        newInitiative = EditorGUILayout.IntSlider(iLabel, newInitiative, 10, 100);
        myActor.GetComponent <Actor>().initiative = newInitiative;

        #endregion

        #region Damage
        string dLabel    = "Damage: ";
        int    newDamage = myActor.GetComponent <Actor>().damage;
        newDamage = EditorGUILayout.IntSlider(dLabel, newDamage, 0, 180);
        myActor.GetComponent <Actor>().damage = newDamage;
        #endregion

        #region Percent Chance to Hit
        string pchLabel = "Percent Chance To Hit:  ";
        int    newPcth  = myActor.GetComponent <Actor>().percentChanceToHit;
        newPcth = EditorGUILayout.IntSlider(pchLabel, newPcth, 0, 100);
        myActor.GetComponent <Actor>().percentChanceToHit = newPcth;
        #endregion

        #region Board Position
        Actor.Position[] positionValues          = Enum.GetValues(typeof(Actor.Position)) as Actor.Position[];
        string[]         positionNames           = Enum.GetNames(typeof(Actor.Position));
        SelectionList <Actor.Position> positions = new SelectionList <Actor.Position>(positionValues, positionNames);
        myActor.boardPosition = positions.PositionGrid("Board Position: ", myActor.boardPosition, 3);
        #endregion
        #endregion

        #region AI Authoring
        if (errorBoxStyle == null)
        {
            InitializeStyles();
        }

        showDerivedProperties = EditorGUILayout.Foldout(showDerivedProperties, new GUIContent("Derived Properties", "Properties based on static unit stats."));
        if (showDerivedProperties)
        {
            derivedStats = AssetDatabase.LoadAssetAtPath("Assets/DerivedProperties.asset", typeof(DerivedStatList)) as DerivedStatList;
            if (derivedStats == null)
            {
                UnityEngine.MonoBehaviour.print("Nope, not there");
                derivedStats = ScriptableObject.CreateInstance <DerivedStatList>();
                AssetDatabase.CreateAsset(derivedStats, "Assets/DerivedProperties.asset");
                AssetDatabase.SaveAssets();
            }

            int nameFieldWidth = 80;
            for (int i = 0; i < derivedStats.Length; i++)
            {
                int statNameWidth = (int)EditorStyles.textField.CalcSize(new GUIContent(derivedStats.list[i].statName + " ")).x;
                if (statNameWidth > nameFieldWidth)
                {
                    nameFieldWidth = statNameWidth;
                }
            }

            bool derivedPropEquationChanged = false;

            EditorGUILayout.BeginVertical();
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Name", GUILayout.Width(nameFieldWidth));
            EditorGUILayout.LabelField("Expression");
            EditorGUILayout.LabelField("Current Value", GUILayout.MaxWidth(90));
            EditorGUILayout.EndHorizontal();

            for (int i = 0; i < (derivedStats != null ? derivedStats.Length : 0); i++)
            {
                EditorGUILayout.BeginHorizontal();


                derivedStats.list[i].statName = EditorGUILayout.TextField(derivedStats.list[i].statName, GUILayout.Width(nameFieldWidth));

                int    derivedValue = 0;
                string derivedEquationErrorMessage = string.Empty;


                if (!derivedStats.list[i].TryEvaluate((target as Actor), derivedStats, out derivedValue))
                {
                    derivedEquationErrorMessage = "Invalid expression.";
                }

                string newDerivedPropEquation = EditorGUILayout.TextField(derivedStats.list[i].expression, derivedEquationErrorMessage.Length == 0 ? EditorStyles.textField : errorBoxStyle);
                if (derivedEquationErrorMessage.Length > 0)
                {
                    GUI.Label(GUILayoutUtility.GetLastRect(), new GUIContent(string.Empty, derivedEquationErrorMessage));
                }
                else
                {
                    EditorGUILayout.LabelField(derivedValue.ToString(), GUILayout.MaxWidth(90));
                }

                if (newDerivedPropEquation != derivedStats.list[i].expression)
                {
                    derivedPropEquationChanged = true;
                }

                derivedStats.list[i].expression = newDerivedPropEquation;

                EditorGUILayout.EndHorizontal();
            }

            EditorGUILayout.EndVertical();

            bool added = false;
            if (GUILayout.Button("Add"))
            {
                added = true;
                if (derivedStats == null)
                {
                    derivedStats = new DerivedStatList();
                }

                List <DerivedStat> newDerivedStats;
                if (derivedStats.list != null)
                {
                    newDerivedStats = new List <DerivedStat>(derivedStats.list);
                }
                else
                {
                    newDerivedStats = new List <DerivedStat>();
                }
                newDerivedStats.Add(new DerivedStat());

                derivedStats.list = newDerivedStats.ToArray();
                this.Repaint();
            }

            if (GUI.changed || added)
            {
                EditorUtility.SetDirty(derivedStats);
                serializedObject.ApplyModifiedProperties();
                AssetDatabase.SaveAssets();
            }

            if (derivedPropEquationChanged)
            {
                this.Repaint();
            }
            DrawDefaultInspector();
        }
        #endregion
    }
    public override void OnInspectorGUI()
    {
        Actor editActor = target as Actor;

        Actor.ActionSource[] immTypeVal  = Enum.GetValues(typeof(Actor.ActionSource)) as Actor.ActionSource[];
        string[]             immTypeName = Enum.GetNames(typeof(Actor.ActionSource));
        for (int i = 0; i < immTypeName.Length; i++)
        {
            immTypeName[i] += '\t';
        }

        Actor.Position[] posVal  = Enum.GetValues(typeof(Actor.Position)) as Actor.Position[];
        string[]         posName = Enum.GetNames(typeof(Actor.Position));
        for (int i = 0; i < posName.Length; i++)
        {
            posName[i] += '\t';
        }

        immunityList = new SelectionList <Actor.ActionSource>(immTypeVal, immTypeName);
        positionList = new SelectionList <Actor.Position>(posVal, posName);

        #region Name, and HP
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Name");
        actName = GUILayout.TextField(editActor.actorName);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Max Hit Points");
        maxHP = EditorGUILayout.IntSlider(maxHP, 1, 10000);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Current Hit Points");
        currentHP = EditorGUILayout.IntSlider(currentHP, 0, maxHP);
        EditorGUILayout.EndHorizontal();
        #endregion

        #region Position
        editPosition = EditorGUILayout.Foldout(editPosition, "Position");
        if (editPosition)
        {
            boardPos = positionList.RadioList("", boardPos, 2);
        }
        #endregion

        #region Damage
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Damage");
        dmg = EditorGUILayout.IntSlider(dmg, 0, 180);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Effect");
        EditorGUILayout.EnumFlagsField(effect);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Damage Type");
        EditorGUILayout.EnumFlagsField(dmgType);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Attack type");
        EditorGUILayout.EnumFlagsField(targetType);
        EditorGUILayout.EndHorizontal();
        #endregion

        #region Immunities
        editImmunity = EditorGUILayout.Foldout(editImmunity, "Immunities");
        if (editImmunity)
        {
            immunities = immunityList.CheckboxList("Immunities", immunities, 2);
        }
        #endregion

        #region AI
        editAI = EditorGUILayout.Foldout(editAI, "AI Options");
        if (editAI)
        {
            derivedStats = AssetDatabase.LoadAssetAtPath("Assets/DerivedProperties.asset", typeof(DerivedStatList)) as DerivedStatList;
            if (derivedStats == null)
            {
                derivedStats = ScriptableObject.CreateInstance <DerivedStatList>();
                AssetDatabase.CreateAsset(derivedStats, "Assets/DerivedProperties.asset");
                AssetDatabase.SaveAssets();
            }

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Chance to Hit");
            chanceToHit = EditorGUILayout.IntSlider(chanceToHit, 0, 100);
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Inititive");
            init  = EditorGUILayout.IntSlider(init, 5, 100);
            init  = init / 5;
            init *= 5;
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("AI Targeting Filters");
            EditorGUILayout.LabelField("Filter order does matter (Ordered top to bottom)");
            EditorGUILayout.Separator();

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Name", GUILayout.MaxWidth(80));
            EditorGUILayout.LabelField("Expression");
            EditorGUILayout.EndHorizontal();

            FilterLayout();

            EditorGUILayout.Separator();
            bool added = false;
            if (GUILayout.Button("Add Filter"))
            {
                added = true;
                AddButtonOnClick();
            }

            if (GUI.changed || added)
            {
                EditorUtility.SetDirty(derivedStats);
                serializedObject.ApplyModifiedProperties();
                AssetDatabase.SaveAssets();
            }
        }
        #endregion

        #region Assignment
        editActor.actorName          = actName;
        editActor.boardPosition      = boardPos;
        editActor.maxHitPoints       = maxHP;
        editActor.damage             = dmg;
        editActor.actionEffect       = effect;
        editActor.actionEffectSource = dmgType;
        editActor.immunities         = immunities;
        editActor.actionTarget       = targetType;
        editActor.percentChanceToHit = chanceToHit;
        editActor.initiative         = init;
        editActor.hitPoints          = currentHP;
        #endregion
    }
示例#4
0
    public override void OnInspectorGUI()
    {
        Actor myActor = target as Actor;

        //Actor name can not be empty, default to name of game object
        myActor.actorName = EditorGUILayout.TextField("Actor Name", myActor.actorName);
        if (myActor.actorName == "")
        {
            myActor.actorName = myActor.name;
        }

        EditorGUILayout.Space();

        //Max HP must be > 0
        int newHP = EditorGUILayout.DelayedIntField("Max HP", myActor.maxHitPoints);

        if (newHP > 0)
        {
            myActor.maxHitPoints = newHP;
        }

        //Initiative must be between 10 and 100 in steps of 5
        const int STEP = 5;

        myActor.initiative = STEP * (EditorGUILayout.IntSlider("Initiative", myActor.initiative, 10, 100) / STEP);

        //Immunities
        Actor.ActionSource[] sourceValues          = Enum.GetValues(typeof(Actor.ActionSource)) as Actor.ActionSource[];
        string[]             sourceNames           = Enum.GetNames(typeof(Actor.ActionSource));
        SelectionList <Actor.ActionSource> sources = new SelectionList <Actor.ActionSource>(sourceValues, sourceNames);

        isImmunitiesShowing = EditorGUILayout.Foldout(isImmunitiesShowing, "Immunities");
        if (isImmunitiesShowing)
        {
            myActor.immunities = sources.CheckboxList("Immunities", myActor.immunities, 3);
        }

        EditorGUILayout.Space();

        //Action Effect
        Actor.ActionEffect[] effectValues          = Enum.GetValues(typeof(Actor.ActionEffect)) as Actor.ActionEffect[];
        string[]             effectNames           = Enum.GetNames(typeof(Actor.ActionEffect));
        SelectionList <Actor.ActionEffect> effects = new SelectionList <Actor.ActionEffect>(effectValues, effectNames);

        myActor.actionEffect = effects.RadioList("Action Effect", myActor.actionEffect, 3);

        //Damage & Chance to hit
        if (myActor.actionEffect == Actor.ActionEffect.Normal)
        {
            myActor.damage             = EditorGUILayout.IntSlider("Damage", myActor.damage, 0, 180);
            myActor.percentChanceToHit = EditorGUILayout.IntSlider("Percent Chance to Hit", myActor.percentChanceToHit, 0, 100);
        }
        else if (myActor.actionEffect == Actor.ActionEffect.Heal)
        {
            myActor.damage             = EditorGUILayout.IntSlider("Damage", myActor.damage, 0, 180);
            myActor.percentChanceToHit = 100;
        }
        else
        {
            myActor.damage             = 0;
            myActor.percentChanceToHit = EditorGUILayout.IntSlider("Percent Chance to Hit", myActor.percentChanceToHit, 0, 100);
        }

        //Action Effect Source
        myActor.actionEffectSource = (Actor.ActionSource)EditorGUILayout.EnumPopup("Action Effect Source", myActor.actionEffectSource);

        //Action Target
        myActor.actionTarget = (Actor.ActionTarget)EditorGUILayout.EnumPopup("Action Target", myActor.actionTarget);

        //Target Select Rule
        myActor.targetSelectionRule = (Actor.TargetSelectionRule)EditorGUILayout.EnumPopup("Target Selection Rule", myActor.targetSelectionRule);

        //Current Target
        EditorGUILayout.LabelField("Current Target:", myActor.currentTarget.name);

        EditorGUILayout.Space();

        //Board Position
        Actor.Position[] positionValues          = Enum.GetValues(typeof(Actor.Position)) as Actor.Position[];
        string[]         positionNames           = Enum.GetNames(typeof(Actor.Position));
        SelectionList <Actor.Position> positions = new SelectionList <Actor.Position>(positionValues, positionNames);

        isBoardPosShowing = EditorGUILayout.Foldout(isBoardPosShowing, "Board Position");
        if (isBoardPosShowing)
        {
            myActor.boardPosition = positions.PositionGrid("Board Position", myActor.boardPosition, 3);
        }
    }