Esempio n. 1
0
    IEnumerator SelectAbility()
    {
        int potentialDamage = 0;

        AbilitySelected = null;
        AbilityTarget   = null;
        PlayerControlledBoardUnit newTarget = null;

        foreach (AbilityDescription ability in currentUnit.AbilityActivator.ListOfAbilities)           //Find the most damage we can do
        {
            if (ability.AbilityTargetType == AbilityDescription.TargetType.TargetEnemy)
            {
                int newPotentialDamage = CheckPotentialDamage(ability, ref newTarget);
                if (newPotentialDamage > potentialDamage)
                {
                    AbilityTarget   = newTarget;
                    AbilitySelected = ability;
                }
            }
        }

        if (AbilitySelected == null || AbilityTarget == null)           //No ability to use
        {
            EndTurn();
        }
        else
        {
            StartCoroutine("TargetAbility");
        }
        yield return(null);
    }
Esempio n. 2
0
 public void FinishAbility()
 {
     BoardManager.instance.FinishAbility();
     TemplateManager.instance.FinishAbility();
     AbilityInProgress = null;
     targetHexagon     = null;
 }
Esempio n. 3
0
 public AskToPerformAction(AbilityDescription description, ActionInfo actionInfo, AbilityPart afterAction = null
                           )
 {
     Description = description;
     ActionInfo  = actionInfo;
     AfterAction = afterAction;
 }
Esempio n. 4
0
 public AskAquireLockAction(AbilityDescription description, Func <GenericShip> targetShip, Func <string> showMessage, AbilityPart action)
 {
     Description   = description;
     GetTargetShip = targetShip;
     GetMessage    = showMessage;
     Action        = action;
 }
Esempio n. 5
0
    /// <summary>
    /// State called when selecting what kind of attack to use
    /// </summary>
    void StateSelectAttack()
    {
        if (Input.GetButtonDown("Cancel") || Input.GetKeyDown(KeyCode.Escape))
        {
            EnterStateEndOfTurn();
        }
        if (!CurrentlySelectedUnit.CanCastAbility())            //if we are silenced or something, we cant select an ability
        {
            return;
        }

        if (Input.GetButtonDown("Ability1"))            //Choose ability 1
        {
            if ((currentAbility = CurrentlySelectedUnit.AbilityActivator.ActivateAbility(0)) != null)
            {
                CombatUIManager.instance.PressButton(0, true);
                EnterStateTargetAttack();
            }
            else
            {
                CombatUIManager.instance.PressButton(0, false);
            }
        }
        else if (Input.GetButtonDown("Ability2"))              //Choose ability 2
        {
            if ((currentAbility = CurrentlySelectedUnit.AbilityActivator.ActivateAbility(1)) != null)
            {
                CombatUIManager.instance.PressButton(1, true);
                EnterStateTargetAttack();
            }
            else
            {
                CombatUIManager.instance.PressButton(1, false);
            }
        }
        else if (Input.GetButtonDown("Ability3"))              //Choose ability 3
        {
            if ((currentAbility = CurrentlySelectedUnit.AbilityActivator.ActivateAbility(2)) != null)
            {
                CombatUIManager.instance.PressButton(2, true);
                EnterStateTargetAttack();
            }
            else
            {
                CombatUIManager.instance.PressButton(2, false);
            }
        }
        else if (Input.GetButtonDown("Ability4"))              //Choose ability 4
        {
            if ((currentAbility = CurrentlySelectedUnit.AbilityActivator.ActivateAbility(3)) != null)
            {
                CombatUIManager.instance.PressButton(3, true);
                EnterStateTargetAttack();
            }
            else
            {
                CombatUIManager.instance.PressButton(3, false);
            }
        }
    }
Esempio n. 6
0
 public SelectShipAction(AbilityDescription abilityDescription, SelectShipFilter filter, AbilityPart action, AiSelectShipPlan aiSelectShipPlan)
 {
     AbilityDescription = abilityDescription;
     Filter             = filter;
     Action             = action;
     AiSelectShipPlan   = aiSelectShipPlan;
     ShowSkipButton     = true;
 }
Esempio n. 7
0
    /// <summary>
    /// Highlights hexagons for an ability
    /// </summary>
    public void HighlightAbility(Hexagon currentHexagon, AbilityDescription ability, bool TemplateUse = false)
    {
        int range = ability.castRange;

        if (CombatManager.instance.CurrentlySelectedUnit.isEnfeebled)
        {
            range = Mathf.RoundToInt(ability.castRange * .5f);
        }
        HighlightLOSNeighbors(currentHexagon, range, ability.AbilityTargetType, TemplateUse);
    }
Esempio n. 8
0
 /// <summary>
 /// Adds a new ability to the list of abilities
 /// </summary>
 public void AddNewAbility()
 {
     if (newAbility == null || ListOfAbilities.Contains(newAbility))
     {
         newAbility = null;
         return;
     }
     ListOfAbilities.Add(newAbility);
     newAbility = null;
 }
Esempio n. 9
0
 public void SetAbilities(PlayerControlledBoardUnit u)
 {
     for (int i = 0; i < u.AbilityActivator.ListOfAbilities.Count; i++)
     {
         AbilityDescription a = u.AbilityActivator.ListOfAbilities [i];
         icons[i].SetIcon(a.AbilityIcon);
         icons[i].SetCooldown(a.Cooldown, a.currentCooldown);
         icons[i].gameObject.SetActive(true);
     }
 }
Esempio n. 10
0
 /// <summary>
 /// Starts highlighting and using a template for an ability
 /// </summary>
 public void StartHighlighting(BoardUnit u, AbilityDescription a)
 {
     CurrentTargets.Clear();
     template           = templates [(int)a.Template].GetComponentInChildren <Template> ();
     TemplateInUse      = true;
     TemplateTargetType = a.TemplateType;
     CurrentUnit        = u;
     template.Enable();
     template.SetScale(a.TemplateSize, a.castRange);
     CurrentTargets = template.CurrentHighlight;
 }
 public EachShipCanDoAction(
     Action <GenericShip, Action> eachShipAction,
     Action onFinish                = null,
     ConditionsBlock conditions     = null,
     AbilityDescription description = null)
 {
     EachShipAction     = eachShipAction;
     OnFinish           = onFinish ?? Triggers.FinishTrigger;
     Conditions         = conditions;
     AbilityDescription = description;
 }
Esempio n. 12
0
    static void Init()
    {
//		AbilityWindow window = (AbilityWindow)EditorWindow.GetWindow (typeof (AbilityWindow));
//		window.Show();
        Debug.Log("Created new ability to Path: \"BattleBots/Resources/Abilities/NewAbility.asset\"");
        AbilityDescription ab = ScriptableObject.CreateInstance <AbilityDescription>();

        AssetDatabase.CreateAsset(ab, @"Assets/BattleBots/Resources/Abilities/NewAbility.asset");
        AssetDatabase.SaveAssets();
        EditorUtility.FocusProjectWindow();
        Selection.activeObject = ab;
    }
Esempio n. 13
0
 public AskToUseAbilityAction
 (
     AbilityDescription description,
     AbilityPart onYes,
     AbilityPart onNo           = null,
     Func <bool> aiUseByDefault = null
 )
 {
     Description    = description;
     OnYes          = onYes;
     OnNo           = onNo;
     AiUseByDefault = aiUseByDefault ?? delegate { return(false); };
 }
 public AskToRotateShipAction
 (
     AbilityDescription description,
     bool rotate90allowed    = true,
     bool rotate180allowed   = true,
     bool rotate0allowed     = false,
     AbilityPart afterAction = null
 )
 {
     Description      = description;
     Rotate90Allowed  = rotate90allowed;
     Rotate180Allowed = rotate180allowed;
     Rotate0Allowed   = rotate0allowed;
     AfterAction      = afterAction;
 }
Esempio n. 15
0
    /// <summary>
    /// Starts the turn for a unit
    /// </summary>
    void StartTurn(PlayerControlledBoardUnit nextUnit)
    {
        CurrentlySelectedUnit = nextUnit as PlayerControlledBoardUnit;
        CombatUIManager.instance.SelectCharacter(nextUnit.transform);
        BoardManager.instance.StartTurn();
        CurrentlySelectedUnit.StartTurn();
        currentAbility = null;

        if (!CurrentlySelectedUnit.CanTakeTurn())
        {
            EnterStateEndOfTurn();
        }
        else
        {
            EnterStateMovementSelection();
        }
    }
Esempio n. 16
0
    public void ReceiveAbilityHit(AbilityDescription a, List <AbilityModifier> mods)
    {
        foreach (StatusEffect e in a.buffs)
        {
            if (((BuffEffect)e).BuffType == BuffEffect.Buff.ApplyForceField)
            {
                ForceFielded = true;
            }

            e.HexDuration = a.HexDuration;
            HexEffects.Add(e);
        }
        foreach (StatusEffect e in a.debuffs)
        {
            e.HexDuration = a.HexDuration;
            HexEffects.Add(e);
        }
    }
Esempio n. 17
0
    /// <summary>
    /// Checks the ability exists in the AssetDatabase
    /// </summary>
    string CheckAbilityExists(string name)
    {
        AbilityDescription _exists = (AbilityDescription)AssetDatabase.
                                     LoadAssetAtPath("Assets/BattleBots/Resources/Abilities/" + name + ".asset", typeof(AbilityDescription));

        if (_exists != null)
        {
            return(_exists.name);
        }
        else
        {
            if (name.Length > 0 && !name.EndsWith(" Not Found"))
            {
                return(name + " Not Found");
            }
            else
            {
                return(name);
            }
        }
    }
Esempio n. 18
0
    /// <summary>
    /// Check how much damage an ability can do
    /// </summary>
    public int CheckPotentialDamage(AbilityDescription ability, ref PlayerControlledBoardUnit a)
    {
        List <PlayerControlledBoardUnit> units = BoardManager.instance.GetEnemiesInRange(currentUnit.CurrentlyOccupiedHexagon,
                                                                                         ability.castRange, ability.AbilityTargetType);

        if (units.Count == 0)
        {
            return(0);
        }

        PlayerControlledBoardUnit target = units[0];

        if (units.Count > 1)
        {
            target = FindBestTarget(ability, units);
        }
        a = target;


        return(1);
    }
Esempio n. 19
0
 /// <summary>
 /// Used to display an array
 /// </summary>
 public void DisplayAbilities()
 {
     EditorGUI.indentLevel += 1;
     for (int i = 0; i < enemyUnit.ListOfAbilities.Count; i++)
     {
         EditorGUILayout.BeginHorizontal();
         EditorGUILayout.LabelField(enemyUnit.ListOfAbilities[i].DisplayName, GUILayout.MaxWidth(200));
         if (GUILayout.Button("Select"))
         {
             AbilityDescription ab = enemyUnit.ListOfAbilities[i];
             EditorUtility.FocusProjectWindow();
             Selection.activeObject = ab;
         }
         if (GUILayout.Button("Delete"))
         {
             enemyUnit.ListOfAbilities.RemoveAt(i);
             i--;
         }
         EditorGUILayout.EndHorizontal();
     }
     EditorGUI.indentLevel -= 1;
 }
Esempio n. 20
0
    /// <summary>
    /// Activates an ability
    /// </summary>
    public AbilityDescription ActivateAbility(int abilityNumber)
    {
        if (ListOfAbilities[abilityNumber].currentCooldown > 0)
        {
            return(null);
        }

        AbilityInProgress = ListOfAbilities[abilityNumber];

        if (AbilityInProgress.AbilityTargetType != AbilityDescription.TargetType.CustomTemplate)
        {
            BoardManager.instance.HighlightAbility(GetComponent <BoardUnit>().CurrentlyOccupiedHexagon, AbilityInProgress, true);
            TemplateManager.instance.StartHexHighlighting(GetComponent <BoardUnit>(), AbilityInProgress);
        }
        else
        {
            TemplateManager.instance.StartHighlighting(GetComponent <BoardUnit>(), AbilityInProgress);
        }


        return(ListOfAbilities[abilityNumber]);
    }
Esempio n. 21
0
    /// <summary>
    /// Finds the best target for an ability given a number of targets
    /// </summary>
    public PlayerControlledBoardUnit FindBestTarget(AbilityDescription ability, List <PlayerControlledBoardUnit> targets)
    {
        PlayerControlledBoardUnit currTarget = targets[0];

        float potentialDamage = 0;

        foreach (DebuffEffect debuff in ability.debuffs)
        {
            if (debuff.DebuffType == DebuffEffect.Debuff.Damage)
            {
                potentialDamage += debuff.Damage;
            }
        }

        foreach (PlayerControlledBoardUnit target in targets)
        {
            if (target.CurrentHealth < potentialDamage)             //If we have lethal damage, its a no brainer
            {
                return(target);
            }

            if (target.CurrentHealth / target.MaxHealth           //If we find someone with lower health go for them
                < currTarget.CurrentHealth / currTarget.MaxHealth)
            {
                currTarget = target;
            }

            if (currTarget.UnitClass == PlayerControlledBoardUnit.PlayerClass.Warrior)
            {
                if (target.UnitClass == PlayerControlledBoardUnit.PlayerClass.Wizard ||
                    target.UnitClass == PlayerControlledBoardUnit.PlayerClass.Support)
                {
                    currTarget = target;
                }
            }
        }
        return(currTarget);
    }
Esempio n. 22
0
        private Monster BuildSpecialAbilityList(Monster rv)
        {
            var pos = findStartIndex("Special Abilities");

            if (!pos.HasValue)
            {
                return(rv);
            }
            var position = pos.GetValueOrDefault();

            position++;
            var dataPoint = data[position].InnerHtml;

            while (dataPoint.Trim() != "Description")
            {
                Console.WriteLine("*****");
                Console.WriteLine(dataPoint);
                AbilityDescription ad = null;
                if (dataPoint.Contains("(Ex)") || dataPoint.Contains("(Su)") || dataPoint.Contains("(Sp)"))
                {
                    // dataPoint description
                    ad      = new AbilityDescription();
                    ad.Name = dataPoint;
                    position++;
                    var next = data[position + 1].InnerHtml;
                    do
                    {
                        dataPoint       = data[position].InnerHtml;
                        ad.Description += dataPoint;
                        next            = data[position + 1].InnerHtml;
                        position++;
                    } while (!(next.Contains("(Ex)") || next.Contains("(Su)") || next.Contains("(Sp)") || next == "Description"));
                }
                rv.Abilities.AbilityDescriptions.Add(ad);
                dataPoint = data[position].InnerHtml;
            }
            return(rv);
        }
Esempio n. 23
0
    /// <summary>
    /// Receives an ability hit and applies status effects
    /// </summary>
    public void ReceiveAbilityHit(AbilityDescription ability, List <AbilityModifier> modifiers = null)
    {
        if (modifiers != null)
        {
            foreach (AbilityModifier mod in modifiers)
            {
                if (mod.ModifierType == AbilityModifier.Modifier.RemoveStunEffect)
                {
                    for (int i = 0; i < ability.debuffs.Count; i++)
                    {
                        DebuffEffect e = ability.debuffs [i];
                        if (e.DebuffType == DebuffEffect.Debuff.Stun)
                        {
                            ability.debuffs.RemoveAt(i);
                            i--;
                        }
                    }
                }
            }
        }

        for (int i = 0; i < ability.debuffs.Count; i++)
        {
            DebuffEffect effect = ability.debuffs [i];
            if (effect.RequireUnstableStatic && !hasUnstableStatic)
            {
                ability.debuffs.RemoveAt(i);
                i--;
            }
            else if (effect.RequireUnstableStatic && hasUnstableStatic)
            {
                RemoveUnstableStatic();
            }
        }

        foreach (DebuffEffect effect in ability.debuffs)
        {
            if (effect.DebuffType == DebuffEffect.Debuff.Damage)
            {
                ApplyDamage((int)effect.Damage, modifiers);
            }
            else if (effect.DebuffType == DebuffEffect.Debuff.Slow)
            {
                ApplySlow(effect.SlowPercent);
            }
            else if (effect.DebuffType == DebuffEffect.Debuff.Stun)
            {
                ApplyStun();
            }
            else if (effect.DebuffType == DebuffEffect.Debuff.Silence)
            {
                ApplySilence();
            }
            else if (effect.DebuffType == DebuffEffect.Debuff.Root)
            {
                ApplyRoot();
            }
            else if (effect.DebuffType == DebuffEffect.Debuff.UnstableStatic)
            {
                ApplyUnstableStatic();
            }
            else if (effect.DebuffType == DebuffEffect.Debuff.Enfeeble)
            {
                ApplyEnfeeble();
            }
            else if (effect.DebuffType == DebuffEffect.Debuff.StaticGrip)
            {
                HandleStaticGrip(effect);
            }

            if (effect.EffectDurationType == StatusEffect.EffectDuration.OverTime)
            {
                if (debuffs.Contains(effect))
                {
                    debuffs.Remove(effect);
                }
                debuffs.Add(new DebuffEffect(effect));
            }
        }

        foreach (BuffEffect effect in ability.buffs)
        {
            if (effect.BuffType == BuffEffect.Buff.RemoveDebuffs)
            {
                debuffs.Clear();
                RemoveStuns();
                RemoveSlows();
                RemoveRoots();
                RemoveSilences();
                RemoveUnstableStatic();
            }
            else if (effect.BuffType == BuffEffect.Buff.Absorb)
            {
                ApplyAbsorb((int)effect.amount);
            }
            else if (effect.BuffType == BuffEffect.Buff.FullHeal)
            {
                ApplyHeal(int.MaxValue);
            }
            else if (effect.BuffType == BuffEffect.Buff.Heal)
            {
                ApplyHeal((int)effect.amount);
            }
            else if (effect.BuffType == (BuffEffect.Buff.MovementIncrease))
            {
                ApplyMovementIncrease(Mathf.RoundToInt(effect.amount));
            }
            else if (effect.BuffType == BuffEffect.Buff.StaticShell)
            {
                HandleStaticShell(effect);
            }
            if (effect.EffectDurationType == StatusEffect.EffectDuration.OverTime)
            {
                if (buffs.Contains(effect))
                {
                    buffs.Remove(effect);
                }
                buffs.Add(new BuffEffect(effect));
            }
        }
    }
    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        abilityEditor = (AbilityDescription)target;

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Ability Name");
        abilityEditor.DisplayName = abilityEditor.name;
        abilityEditor.DisplayName = EditorGUILayout.TextField(abilityEditor.DisplayName);
        if (abilityEditor.name != abilityEditor.DisplayName)
        {
            AssetDatabase.RenameAsset(AssetDatabase.GetAssetPath(abilityEditor).ToString(), abilityEditor.DisplayName);
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.LabelField("Tooltip");
        abilityEditor.TooltipText = EditorGUILayout.TextArea(abilityEditor.TooltipText);

//		if (abilityEditor.AbilityIcon != null)
//			GUILayout.Label (abilityEditor.AbilityIcon);

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Drag New Sprite Here", GUILayout.MaxWidth(200));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("newTexture"), GUIContent.none);
        if (Event.current.type == EventType.Repaint && abilityEditor.newTexture != null)          //repaint only to avoid layout errors
        {
            abilityEditor.UpdateIcon();
        }
        EditorGUILayout.EndHorizontal();

//		EditorGUILayout.BeginHorizontal();
//		abilityEditor.AbilityDamageType = (AbilityDescription.DamageType)EditorGUILayout.EnumPopup("Ability Target Type", abilityEditor.AbilityDamageType);
//		EditorGUILayout.EndHorizontal ();

        EditorGUILayout.BeginHorizontal();
        abilityEditor.AbilityTargetType = (AbilityDescription.TargetType)EditorGUILayout.EnumPopup("Ability Target Type", abilityEditor.AbilityTargetType);
        EditorGUILayout.EndHorizontal();

        if (abilityEditor.AbilityTargetType == AbilityDescription.TargetType.TargetHexagon)
        {
            abilityEditor.HexDuration = EditorGUILayout.IntField("Hexagon Duration", abilityEditor.HexDuration);
        }

        if (abilityEditor.AbilityTargetType == AbilityDescription.TargetType.CustomTemplate)
        {
            EditorGUILayout.BeginHorizontal();
            abilityEditor.TemplateType = (TemplateManager.Target)EditorGUILayout.EnumPopup("Template Type", abilityEditor.TemplateType);
            EditorGUILayout.EndHorizontal();
        }

        EditorGUILayout.BeginHorizontal();
        abilityEditor.Template     = (TemplateManager.TargetTemplate)EditorGUILayout.EnumPopup("Template", abilityEditor.Template);
        abilityEditor.TemplateSize = EditorGUILayout.IntField("TemplateSize", abilityEditor.TemplateSize);
        EditorGUILayout.EndHorizontal();
//			EditorGUILayout.BeginHorizontal();
//			EditorGUILayout.LabelField ("TemplateLength", GUILayout.MaxWidth (100));
//			abilityEditor.TemplateLength = EditorGUILayout.IntField (abilityEditor.TemplateLength);
//			EditorGUILayout.LabelField ("TemplateWidth", GUILayout.MaxWidth (100));
//			abilityEditor.TemplateWidth = EditorGUILayout.IntField (abilityEditor.TemplateWidth);
//			EditorGUILayout.EndHorizontal ();


        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Friendly Fire Enabled?");
        abilityEditor.FriendlyFireEnabled = EditorGUILayout.Toggle(abilityEditor.FriendlyFireEnabled);
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.BeginHorizontal();
        if (abilityEditor.FriendlyFireEnabled)
        {
            EditorGUILayout.LabelField("Self Fire Enabled?");
            abilityEditor.SelfFireEnabled = EditorGUILayout.Toggle(abilityEditor.SelfFireEnabled);
        }
        else
        {
            abilityEditor.SelfFireEnabled = false;
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        if (abilityEditor.AbilityTargetType == AbilityDescription.TargetType.CustomTemplate)
        {
            EditorGUILayout.LabelField("Require Valid Hexagon Target");
            abilityEditor.RequireSourceHexagon = EditorGUILayout.Toggle(abilityEditor.RequireSourceHexagon);
        }
        EditorGUILayout.EndHorizontal();

//		EditorGUILayout.BeginHorizontal();
//		EditorGUILayout.LabelField ((abilityEditor.AbilityDamageType == AbilityDescription.DamageType.Heal
//		                             || abilityEditor.AbilityDamageType == AbilityDescription.DamageType.Absorb) ? "Healing" : "Damage");
//		abilityEditor.damage = EditorGUILayout.IntField (abilityEditor.damage);
//		EditorGUILayout.EndHorizontal ();

        EditorGUILayout.BeginHorizontal();
//		if (abilityEditor.AbilityAbilityType == AbilityDescription.AbilityType.AreaOverTime) {
//			EditorGUILayout.LabelField ("Duration");
//			abilityEditor.Duration = EditorGUILayout.IntField (abilityEditor.Duration);
//		}
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Cast Range", GUILayout.MaxWidth(100));
        abilityEditor.castRange = EditorGUILayout.IntField(abilityEditor.castRange);
        EditorGUILayout.LabelField("Cooldown", GUILayout.MaxWidth(100));
        abilityEditor.Cooldown = EditorGUILayout.IntField(abilityEditor.Cooldown);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
//		if (abilityEditor.AbilityAbilityType == AbilityDescription.AbilityType.Area || abilityEditor.AbilityAbilityType == AbilityDescription.AbilityType.AreaOverTime) {
//			EditorGUILayout.LabelField ("AOE Range");
//			abilityEditor.AreaOfEffectDistance = EditorGUILayout.IntField (abilityEditor.AreaOfEffectDistance);
//		}
        EditorGUILayout.EndHorizontal();

        if (GUILayout.Button("Create New Debuff"))
        {
            abilityEditor.debuffs.Add(new DebuffEffect());
        }
        if (abilityEditor.debuffs.Count > 0)
        {
            ShowDebuffList();
        }
        if (GUILayout.Button("Create New Buff"))
        {
            abilityEditor.buffs.Add(new BuffEffect());
        }
        if (abilityEditor.buffs.Count > 0)
        {
            ShowBuffList();
        }
        serializedObject.ApplyModifiedProperties();
        serializedObject.Update();
        EditorUtility.SetDirty(abilityEditor);          //Have to set dirty or it wont update
    }