private void addSkills9()
    {
        EnemyTimer setOnPlayer = EnemyTimer.Create(() => true, 9f, -1, skillTrans);

        setOnPlayer.addSetSkill((Orb o) => o.getOrbValue() == ORB_VALUE.ZERO ? ORB_VALUE.NINE : o.getOrbValue());
        skillList.Add(setOnPlayer);

        EnemyBoardSkill setFivesToNullify = EnemyBoardSkill.MarkIfSkill(() => GameController.Instance.isTurnMod(4, 2), (Orb o) => o.getOrbValue() == ORB_VALUE.FIVE, 0.1f, skillTrans);

        setFivesToNullify.addSetSkill(0.1f, (Orb o) => ORB_VALUE.NULLIFY);
        skillList.Add(setFivesToNullify);

        Func <bool> wtu = () => {
            List <Enemy> eList = GameController.Instance.getCurrEnemies();
            foreach (Enemy e in eList)
            {
                if (e.getState().number == 6)
                {
                    return(false);
                }
            }
            return(GameController.Instance.isTurnMod(4, 1));
        };
        EnemyBoardSkill setNinesToStop = EnemyBoardSkill.MarkIfSkill(wtu, (Orb o) => o.getOrbValue() == ORB_VALUE.NINE, 0.1f, skillTrans);

        setNinesToStop.addSetSkill(0.1f, (Orb o) => ORB_VALUE.STOP);
        skillList.Add(setNinesToStop);

        Func <Orb, bool> allOrbsGreaterThan = (Orb o) => {
            int range = 6 - (3 - GameController.Instance.getCurrEnemies().Count);
            return(o.isDigit() && o.getIntValue() >= range);
        };
        EnemyBoardSkill markGreater = EnemyBoardSkill.MarkIfSkill(() => GameController.Instance.isTurnMod(3, 2), allOrbsGreaterThan, 0.1f, skillTrans);

        skillList.Add(markGreater);
        Func <int> getDmg = () => {
            List <Orb> markedOrbs = Board.Instance.getAllMarkedOrbsBy(getSkillID(markGreater, markGreater.getActivatedTurn()), null);
            int        sum        = 0;
            foreach (Orb o in markedOrbs)
            {
                if (o.isDigit())
                {
                    sum += o.getIntValue();
                }
            }
            return(sum * -3);
        };

        skillList.Add(EnemyAttack.Create(() => GameController.Instance.isTurnMod(3, 2), false, () => Player.Instance.gameObject, getDmg, skillTrans));
    }
    private void addSkills6()
    {
        EnemyTimer rmvOnPlayer = EnemyTimer.Create(() => true, 6f, -1, skillTrans);

        rmvOnPlayer.addRmvSkill((Orb o) => o.isDigit() && o.isEven());
        skillList.Add(rmvOnPlayer);

        Func <ORB_VALUE, OrbSpawnRate> decreasedEvens = (ORB_VALUE orbVal) => {
            if ((int)orbVal <= 9)
            {
                return((int)orbVal % 2 == 0 ? OrbSpawnRate.DECREASED : OrbSpawnRate.INCREASED);
            }
            return(Board.getDefaultOrbSpawnRates()[(int)orbVal]);
        };

        skillList.Add(EnemyOrbSkill.Create(() => true, decreasedEvens, -1, skillTrans));

        Func <bool>     wtu           = () => GameController.Instance.getCurrEnemies().Count == 1 ? GameController.Instance.isTurnMod(2) : false;
        EnemyBoardSkill set369ToEmpty = EnemyBoardSkill.MarkIfSkill(wtu, (Orb o) => o.getOrbValue() == ORB_VALUE.THREE || o.getOrbValue() == ORB_VALUE.SIX || o.getOrbValue() == ORB_VALUE.NINE, 0.1f, skillTrans);

        set369ToEmpty.addSetSkill(0.1f, (Orb o) => ORB_VALUE.EMPTY);
        skillList.Add(set369ToEmpty);

        EnemyBoardSkill markAll = EnemyBoardSkill.MarkIfSkill(() => GameController.Instance.isTurnMod(3, 1), (Orb o) => true, 0.1f, skillTrans);

        skillList.Add(markAll);
        Func <int> getDmg = () => {
            List <Orb> markedOrbs = Board.Instance.getAllMarkedOrbsBy(getSkillID(markAll, markAll.getActivatedTurn()), null);
            int        sum        = 0;
            foreach (Orb o in markedOrbs)
            {
                if (o.isDigit())
                {
                    sum += o.getIntValue();
                }
            }
            return(sum * -6);
        };

        skillList.Add(EnemyAttack.Create(() => GameController.Instance.isTurnMod(3, 1), false, () => Player.Instance.gameObject, getDmg, skillTrans));
    }
    private void addSkills81()
    {
        Func <bool>     wtu0       = () => GameController.Instance.getCurrEnemies().Count == 2 ? GameController.Instance.isTurnMod(4, 1) : GameController.Instance.isTurnMod(2);
        EnemyBoardSkill onesToStop = EnemyBoardSkill.MarkIfSkill(wtu0, (Orb o) => o.getOrbValue() == ORB_VALUE.ONE, 0.1f, skillTrans);

        onesToStop.addSetSkill(0.1f, (Orb o) => ORB_VALUE.STOP);
        skillList.Add(onesToStop);

        Func <bool>     wtu1            = () => GameController.Instance.getCurrEnemies().Count == 2 ? GameController.Instance.isTurnMod(4, 3) : GameController.Instance.isTurnMod(2, 1);
        EnemyBoardSkill sevensToNullify = EnemyBoardSkill.MarkIfSkill(wtu1, (Orb o) => o.getOrbValue() == ORB_VALUE.SEVEN, 0.1f, skillTrans);

        sevensToNullify.addSetSkill(0.1f, (Orb o) => ORB_VALUE.NULLIFY);
        skillList.Add(sevensToNullify);

        Func <bool>      wtu2    = () => GameController.Instance.getCurrEnemies().Count == 2 ? GameController.Instance.isTurnMod(2, 1) : true;
        Func <Orb, bool> is369   = (Orb o) => o.isUnmarked() && (o.getOrbValue() == ORB_VALUE.THREE || o.getOrbValue() == ORB_VALUE.SIX || o.getOrbValue() == ORB_VALUE.NINE);
        EnemyBoardSkill  mark369 = EnemyBoardSkill.MarkIfSkill(wtu2, is369, 0.1f, skillTrans);

        mark369.addMarkRemainSkill();
        skillList.Add(mark369);
        Func <int> getDmg = () => {
            List <Orb> markedOrbs = Board.Instance.getAllMarkedOrbsBy(getSkillID(mark369, mark369.getLastActivatedTurn()), null);
            int        sum        = 0;
            foreach (Orb o in markedOrbs)
            {
                sum += o.getIntValue();
            }
            return(-sum * markedOrbs.Count);
        };
        Func <bool> wtu2a = () => GameController.Instance.getCurrEnemies().Count == 2 ? GameController.Instance.isTurnMod(2) : true;

        skillList.Add(EnemyAttack.Create(wtu2a, false, () => Player.Instance.gameObject, getDmg, skillTrans));
        Func <Orb, bool> markedBy369 = (Orb o) => o.getIsMarkedBy(getSkillID(mark369, mark369.getLastActivatedTurn()));
        EnemyBoardSkill  clear369    = EnemyBoardSkill.MarkIfSkill(wtu2a, markedBy369, 0, skillTrans);

        clear369.addRmvSkill(0.1f);
        skillList.Add(clear369);

        Func <bool>      wtu3      = () => GameController.Instance.getCurrEnemies().Count == 2 ? GameController.Instance.isTurnMod(2, 1) : false;
        EnemyBoardSkill  markPivot = null;
        Func <Orb, bool> getPivot  = (Orb o) => {
            for (int c = 0; c < Board.COLUMNS; c++)
            {
                for (int r = 0; r < Board.ROWS; r++)
                {
                    if (Board.Instance.getOrb(c, r).getIsMarkedBy(getSkillID(markPivot, markPivot.getActivatedTurn())))
                    {
                        return(false);
                    }
                }
            }
            System.Random rand          = new System.Random(getRandomSeedByTurn(markPivot));
            List <Orb>    potentialOrbs = new List <Orb>();
            for (int c = 0; c < Board.COLUMNS; c++)
            {
                for (int r = 0; r < Board.ROWS; r++)
                {
                    if (Board.Instance.getOrb(c, r).isUnmarked())
                    {
                        potentialOrbs.Add(Board.Instance.getOrb(c, r));
                    }
                }
            }
            int pivotIndex = rand.Next(potentialOrbs.Count);
            if (potentialOrbs.Count > 0 && o == potentialOrbs[pivotIndex])
            {
                return(true);
            }
            return(false);
        };

        markPivot = EnemyBoardSkill.MarkIfSkill(wtu3, getPivot, 0.1f, skillTrans, 0);
        markPivot.addMarkRemainSkill();
        skillList.Add(markPivot);
        Func <bool> wtu3a = () => GameController.Instance.getCurrEnemies().Count == 2 ? GameController.Instance.isTurnMod(2) : false;
        Func <List <Vector2Int> > plusPivot = () => {
            List <Vector2Int> plus  = new List <Vector2Int>();
            Vector2Int        pivot = new Vector2Int(-1, -1);
            for (int c = 0; c < Board.COLUMNS; c++)
            {
                for (int r = 0; r < Board.ROWS; r++)
                {
                    if (Board.Instance.getOrb(c, r).getIsMarkedBy(getSkillID(markPivot, markPivot.getLastActivatedTurn())))
                    {
                        pivot = new Vector2Int(c, r);
                    }
                }
            }
            if (pivot.x != -1 && pivot.y != -1)
            {
                bool reachedEnd = false;
                for (int offset = 0; !reachedEnd; offset++)
                {
                    reachedEnd = true;
                    if (pivot.x + offset < Board.COLUMNS)
                    {
                        plus.Add(new Vector2Int(pivot.x + offset, pivot.y));
                        reachedEnd = false;
                    }
                    if (pivot.y + offset < Board.ROWS)
                    {
                        plus.Add(new Vector2Int(pivot.x, pivot.y + offset));
                        reachedEnd = false;
                    }
                    if (pivot.x - offset >= 0)
                    {
                        plus.Add(new Vector2Int(pivot.x - offset, pivot.y));
                        reachedEnd = false;
                    }
                    if (pivot.y - offset >= 0)
                    {
                        plus.Add(new Vector2Int(pivot.x, pivot.y - offset));
                        reachedEnd = false;
                    }
                }
            }
            plus = plus.Distinct().ToList();
            return(plus);
        };
        EnemyBoardSkill decPlusPivot = EnemyBoardSkill.MarkOrderSkill(wtu3a, plusPivot, 0.1f, skillTrans);

        decPlusPivot.addRmvSkill(0.1f);
        skillList.Add(decPlusPivot);

        Func <bool>     wtu4    = () => GameController.Instance.getCurrEnemies().Count != 2;
        EnemyBoardSkill decPlus = EnemyBoardSkill.MarkOrderSkill(wtu4, null, 0.1f, skillTrans);

        decPlus.addRmvSkill(0.1f);
        skillList.Add(decPlus);
    }
    // to-do: go ham on turns when minibosses die for attack and skill 3
    private void addSkills3()
    {
        EnemyTimer decOnPlayer = EnemyTimer.Create(() => true, 3f, -1, skillTrans);

        decOnPlayer.addIncSkill((Orb o) => - 1);
        skillList.Add(decOnPlayer);

        EnemyBoardSkill setFoursToNullify = EnemyBoardSkill.MarkIfSkill(() => GameController.Instance.isTurnMod(4), (Orb o) => o.getOrbValue() == ORB_VALUE.FOUR, 0.1f, skillTrans);

        setFoursToNullify.addSetSkill(0.1f, (Orb o) => ORB_VALUE.NULLIFY);
        skillList.Add(setFoursToNullify);

        Func <bool> wtu = () => {
            List <Enemy> eList = GameController.Instance.getCurrEnemies();
            foreach (Enemy e in eList)
            {
                if (e.getState().number == 6)
                {
                    return(false);
                }
            }
            return(GameController.Instance.isTurnMod(4, 3));
        };
        EnemyBoardSkill setHealsToAnti = EnemyBoardSkill.MarkIfSkill(wtu, (Orb o) => o.getOrbValue() == ORB_VALUE.ZERO, 0.1f, skillTrans);

        setHealsToAnti.addSetSkill(0.1f, (Orb o) => ORB_VALUE.POISON);
        skillList.Add(setHealsToAnti);


        Func <Orb, bool> allOrbsLessThan = (Orb o) => {
            int range = 3 + (3 - GameController.Instance.getCurrEnemies().Count);
            return(o.isDigit() && o.getIntValue() <= range);
        };
        EnemyBoardSkill markLess = EnemyBoardSkill.MarkIfSkill(() => GameController.Instance.isTurnMod(3), allOrbsLessThan, 0.1f, skillTrans);

        skillList.Add(markLess);
        Func <int> getDmg = () => {
            List <Orb> markedOrbs = Board.Instance.getAllMarkedOrbsBy(getSkillID(markLess, markLess.getActivatedTurn()), null);
            int        sum        = 0;
            foreach (Orb o in markedOrbs)
            {
                if (o.isDigit())
                {
                    sum += o.getIntValue();
                }
            }
            return(sum * -9);
        };

        skillList.Add(EnemyAttack.Create(() => GameController.Instance.isTurnMod(3), false, () => Player.Instance.gameObject, getDmg, skillTrans));
    }
    private void addSkills64()
    {
        Func <bool>     wtu0        = () => GameController.Instance.getCurrEnemies().Count == 2 ? GameController.Instance.isTurnMod(4) : GameController.Instance.isTurnMod(2);
        EnemyBoardSkill healsToAnti = EnemyBoardSkill.MarkIfSkill(wtu0, (Orb o) => o.getOrbValue() == ORB_VALUE.ZERO, 0.1f, skillTrans);

        healsToAnti.addSetSkill(0.1f, (Orb o) => ORB_VALUE.POISON);
        skillList.Add(healsToAnti);

        Func <bool>     wtu1         = () => GameController.Instance.getCurrEnemies().Count == 2 ? GameController.Instance.isTurnMod(4, 2) : GameController.Instance.isTurnMod(2, 1);
        EnemyBoardSkill fivesToEmpty = EnemyBoardSkill.MarkIfSkill(wtu1, (Orb o) => o.getOrbValue() == ORB_VALUE.FIVE, 0.1f, skillTrans);

        fivesToEmpty.addSetSkill(0.1f, (Orb o) => ORB_VALUE.EMPTY);
        skillList.Add(fivesToEmpty);

        Func <bool>      wtu2    = () => GameController.Instance.getCurrEnemies().Count == 2 ? GameController.Instance.isTurnMod(2) : true;
        Func <Orb, bool> is248   = (Orb o) => o.isUnmarked() && (o.getOrbValue() == ORB_VALUE.TWO || o.getOrbValue() == ORB_VALUE.FOUR || o.getOrbValue() == ORB_VALUE.EIGHT);
        EnemyBoardSkill  mark248 = EnemyBoardSkill.MarkIfSkill(wtu2, is248, 0.1f, skillTrans);

        mark248.addMarkRemainSkill();
        skillList.Add(mark248);
        Func <int> getDmg = () => {
            List <Orb> markedOrbs = Board.Instance.getAllMarkedOrbsBy(getSkillID(mark248, mark248.getLastActivatedTurn()), null);
            int        sum        = 0;
            foreach (Orb o in markedOrbs)
            {
                sum += o.getIntValue();
            }
            return(-sum * markedOrbs.Count);
        };
        Func <bool> wtu2a = () => GameController.Instance.getCurrEnemies().Count == 2 ? GameController.Instance.isTurnMod(2, 1) : true;

        skillList.Add(EnemyAttack.Create(wtu2a, false, () => Player.Instance.gameObject, getDmg, skillTrans));
        Func <Orb, bool> markedBy248 = (Orb o) => o.getIsMarkedBy(getSkillID(mark248, mark248.getLastActivatedTurn()));
        EnemyBoardSkill  clear248    = EnemyBoardSkill.MarkIfSkill(wtu2a, markedBy248, 0, skillTrans);

        clear248.addRmvSkill(0.1f);
        skillList.Add(clear248);

        Func <bool>      wtu3      = () => GameController.Instance.getCurrEnemies().Count == 2 ? GameController.Instance.isTurnMod(2) : false;
        EnemyBoardSkill  markPivot = null;
        Func <Orb, bool> getPivot  = (Orb o) => {
            for (int c = 0; c < Board.COLUMNS; c++)
            {
                for (int r = 0; r < Board.ROWS; r++)
                {
                    if (Board.Instance.getOrb(c, r).getIsMarkedBy(getSkillID(markPivot, markPivot.getActivatedTurn())))
                    {
                        return(false);
                    }
                }
            }
            System.Random rand          = new System.Random(getRandomSeedByTurn(markPivot));
            List <Orb>    potentialOrbs = new List <Orb>();
            for (int c = 0; c < Board.COLUMNS; c++)
            {
                for (int r = 0; r < Board.ROWS; r++)
                {
                    if (Board.Instance.getOrb(c, r).isUnmarked())
                    {
                        potentialOrbs.Add(Board.Instance.getOrb(c, r));
                    }
                }
            }
            int pivotIndex = rand.Next(potentialOrbs.Count);
            if (potentialOrbs.Count > 0 && o == potentialOrbs[pivotIndex])
            {
                return(true);
            }
            return(false);
        };

        markPivot = EnemyBoardSkill.MarkIfSkill(wtu3, getPivot, 0.1f, skillTrans, 0);
        markPivot.addMarkRemainSkill();
        skillList.Add(markPivot);
        Func <bool> wtu3a = () => GameController.Instance.getCurrEnemies().Count == 2 ? GameController.Instance.isTurnMod(2, 1) : false;
        Func <List <Vector2Int> > plusPivot = () => {
            List <Vector2Int> plus  = new List <Vector2Int>();
            Vector2Int        pivot = new Vector2Int(-1, -1);
            for (int c = 0; c < Board.COLUMNS; c++)
            {
                for (int r = 0; r < Board.ROWS; r++)
                {
                    if (Board.Instance.getOrb(c, r).getIsMarkedBy(getSkillID(markPivot, markPivot.getLastActivatedTurn())))
                    {
                        pivot = new Vector2Int(c, r);
                    }
                }
            }
            if (pivot.x != -1 && pivot.y != -1)
            {
                bool reachedEnd = false;
                for (int offset = 0; !reachedEnd; offset++)
                {
                    reachedEnd = true;
                    if (pivot.x + offset < Board.COLUMNS)
                    {
                        plus.Add(new Vector2Int(pivot.x + offset, pivot.y));
                        reachedEnd = false;
                    }
                    if (pivot.y + offset < Board.ROWS)
                    {
                        plus.Add(new Vector2Int(pivot.x, pivot.y + offset));
                        reachedEnd = false;
                    }
                    if (pivot.x - offset >= 0)
                    {
                        plus.Add(new Vector2Int(pivot.x - offset, pivot.y));
                        reachedEnd = false;
                    }
                    if (pivot.y - offset >= 0)
                    {
                        plus.Add(new Vector2Int(pivot.x, pivot.y - offset));
                        reachedEnd = false;
                    }
                }
            }
            plus = plus.Distinct().ToList();
            return(plus);
        };
        EnemyBoardSkill clearPlusPivot = EnemyBoardSkill.MarkOrderSkill(wtu3a, plusPivot, 0.1f, skillTrans);

        clearPlusPivot.addRmvSkill(0.1f);
        skillList.Add(clearPlusPivot);

        Func <bool>     wtu4      = () => GameController.Instance.getCurrEnemies().Count != 2;
        EnemyBoardSkill clearPlus = EnemyBoardSkill.MarkOrderSkill(wtu4, null, 0.1f, skillTrans);

        clearPlus.addRmvSkill(0.1f);
        skillList.Add(clearPlus);
    }