public static EnemyHPBuff Create(Func <bool> wtu, EnemyBuffs buff, Func <Enemy> getTarget, int turnDur, Transform parent)
    {
        EnemyHPBuff HPbuff = Create(parent).AddComponent <EnemyHPBuff>();

        HPbuff.initValues(convertBuffToSkill(buff), wtu, turnDur, 0f);
        HPbuff.buff      = buff;
        HPbuff.getTarget = getTarget;
        return(HPbuff);
    }
 public override void onDestroy(Enemy e)
 {
     if (currTarget != null && currTarget.isAlive())
     {
         currTarget.setBuff(EnemyBuffs.NONE);
     }
     if (isRandom)
     {
         buff = (EnemyBuffs)UnityEngine.Random.Range(1, 4);
     }
     base.onDestroy(e);
 }
    private static EnemySkillType convertBuffToSkill(EnemyBuffs buff)
    {
        switch (buff)
        {
        case EnemyBuffs.DMG_REFLECT: return(EnemySkillType.REFLECT);

        case EnemyBuffs.DMG_MITI_50: return(EnemySkillType.MITIGATE);

        case EnemyBuffs.DMG_ABSORB: return(EnemySkillType.ABSORB);

        default: return(EnemySkillType.REFLECT);
        }
    }
    public bool setBuff(EnemyBuffs buff)
    {
        if (buff != currState.buff && buff != EnemyBuffs.NONE && currState.buff != EnemyBuffs.NONE)
        {
            return(false);
        }
        currState.buff = buff;
        switch (currState.buff)    // Change the health bar.
        {
        case EnemyBuffs.DMG_MITI_50: HPBarIMG.sprite = enemyHPBars[1]; break;

        case EnemyBuffs.DMG_REFLECT: HPBarIMG.sprite = enemyHPBars[2]; break;

        case EnemyBuffs.DMG_ABSORB: HPBarIMG.sprite = enemyHPBars[3]; break;

        default: HPBarIMG.sprite = enemyHPBars[0]; break;
        }
        return(true);
    }
    private void addMedSkill(int index)
    {
        System.Random rand = new System.Random(getRandomSeedByFloor());
        Func <bool> wtu    = () => true;
        Func <ORB_VALUE, OrbSpawnRate> newSpawnRates;

        switch (index)
        {
        case 0:
            wtu = () => GameController.Instance.isTurnMod(3, RNG.Next(3));
            EnemyBoardSkill clearPattern = null;
            clearPattern = EnemyBoardSkill.MarkOrderSkill(wtu, () => getRandomPattern(clearPattern), 0.1f, skillTrans, 1);
            clearPattern.addRmvSkill(0);
            skillList.Add(clearPattern);
            break;

        case 1:
            int numHealReduce = rand.Next(1, 3);
            newSpawnRates = (ORB_VALUE orbVal) => orbVal == ORB_VALUE.ZERO ? OrbSpawnRate.DECREASED : Board.getDefaultOrbSpawnRates()[(int)orbVal];
            wtu           = () => GameController.Instance.isTurnMod(2 * numHealReduce, RNG.Next(numHealReduce));
            skillList.Add(EnemyOrbSkill.Create(wtu, newSpawnRates, numHealReduce, skillTrans));
            break;

        case 2:
            wtu = () => GameController.Instance.isTurnMod(3, RNG.Next(3));
            EnemyBoardSkill setOneDigitAsRand = null;
            Func <Orb, bool> markAllOneDigit  = (Orb o) => {
                System.Random rand2 = new System.Random(getRandomSeedByTurn(setOneDigitAsRand));
                int digitToMark     = rand2.Next(1, 10);
                return(o.getIntValue() == digitToMark);
            };
            Func <Orb, ORB_VALUE> changeDigit = (Orb o) => {
                System.Random rand2 = new System.Random(getRandomSeedByTurn(setOneDigitAsRand));
                List <ORB_VALUE> possibleOrbVals = new List <ORB_VALUE>();
                for (int i = 1; i < 10; i++)
                {
                    possibleOrbVals.Add((ORB_VALUE)i);
                }
                possibleOrbVals.Remove(o.getOrbValue());
                return(possibleOrbVals[rand2.Next(possibleOrbVals.Count)]);
            };
            setOneDigitAsRand = EnemyBoardSkill.MarkIfSkill(wtu, markAllOneDigit, 0.1f, skillTrans);
            setOneDigitAsRand.addSetSkill(0.1f, changeDigit);
            skillList.Add(setOneDigitAsRand);
            break;

        case 3:
            wtu = () => GameController.Instance.isTurnMod(3, RNG.Next(3));
            EnemyBoardSkill replaceWithEmpty = null;
            replaceWithEmpty = EnemyBoardSkill.MarkOrderSkill(wtu, () => getRandomPattern(replaceWithEmpty), 0.1f, skillTrans, 1);
            replaceWithEmpty.addSetSkill(0.1f, (Orb o) => ORB_VALUE.EMPTY);
            skillList.Add(replaceWithEmpty);
            break;

        case 4:
            wtu = () => GameController.Instance.isTurnMod(3, RNG.Next(3));
            EnemyBoardSkill replaceWithStop = null;
            replaceWithStop = EnemyBoardSkill.MarkOrderSkill(wtu, () => getOneLine(replaceWithStop), 0.1f, skillTrans, 1);
            replaceWithStop.addSetSkill(0.1f, (Orb o) => ORB_VALUE.STOP);
            skillList.Add(replaceWithStop);
            break;

        case 5:
            wtu = () => GameController.Instance.isTurnMod(3, RNG.Next(3));
            EnemyBoardSkill allHealsToEmpty = EnemyBoardSkill.MarkIfSkill(wtu, (Orb o) => o.getOrbValue() == ORB_VALUE.ZERO, 0.1f, skillTrans, 1);
            allHealsToEmpty.addSetSkill(0.1f, (Orb o) => ORB_VALUE.EMPTY);
            skillList.Add(allHealsToEmpty);
            break;

        case 6:
            newSpawnRates = (ORB_VALUE orbVal) => OrbSpawnRate.NORMAL;
            skillList.Add(EnemyOrbSkill.Create(wtu, newSpawnRates, -1, skillTrans));
            break;

        case 7:
            int numEmptyInc = rand.Next(1, 3);
            newSpawnRates = (ORB_VALUE orbVal) => orbVal == ORB_VALUE.EMPTY ? OrbSpawnRate.INCREASED : Board.getDefaultOrbSpawnRates()[(int)orbVal];
            wtu           = () => GameController.Instance.isTurnMod(2 * numEmptyInc, RNG.Next(numEmptyInc));
            skillList.Add(EnemyOrbSkill.Create(wtu, newSpawnRates, numEmptyInc, skillTrans));
            break;

        case 8:
            EnemyBuffs hpBuff = (EnemyBuffs)(rand.Next(3) + 1);
            skillList.Add(EnemyHPBuff.Create(() => GameController.Instance.isTurnMod(3, RNG.Next(3)), hpBuff, () => this, 1, skillTrans));
            break;

        case 9:
            wtu = () => GameController.Instance.isTurnMod(3, RNG.Next(3));
            EnemyBoardSkill decFourLines = null;
            decFourLines = EnemyBoardSkill.MarkOrderSkill(wtu, () => getFourLines(decFourLines), 0.1f, skillTrans, 1);
            decFourLines.addIncSkill(0.1f, (Orb o) => - 1);
            skillList.Add(decFourLines);
            break;
        }
    }
    private void addEasySkill(int index)
    {
        System.Random rand = new System.Random(getRandomSeedByFloor());
        Func <bool> wtu    = () => true;
        Func <ORB_VALUE, OrbSpawnRate> newSpawnRates;

        switch (index)
        {
        case 0:
            int numShuffles = rand.Next(1, 3);
            wtu = () => GameController.Instance.isTurnMod(numShuffles, RNG.Next(numShuffles));
            skillList.Add(EnemyBoardSkill.ShuffleSkill(wtu, numShuffles * 5, 0.075f, skillTrans));
            break;

        case 1:
            EnemyBoardSkill clearOneLine = null;
            clearOneLine = EnemyBoardSkill.MarkOrderSkill(wtu, () => getOneLine(clearOneLine), 0.1f, skillTrans);
            clearOneLine.addRmvSkill(0);
            skillList.Add(clearOneLine);
            break;

        case 2:
            bool healSelfOnly = RNG.Next(2) == 0;
            int percentHeal   = rand.Next(1, 6);
            wtu = () => GameController.Instance.isTurnMod(percentHeal, RNG.Next(percentHeal));
            Func <GameObject> getTarget = () => healSelfOnly ? gameObject : GameController.Instance.getCurrEnemies()[RNG.Next(GameController.Instance.getCurrEnemies().Count)].gameObject;
            Func <int> getDmg           = () => getTarget().GetComponent <Enemy>().getState().maxHealth *percentHeal / 10;
            skillList.Add(EnemyAttack.Create(wtu, true, getTarget, getDmg, skillTrans));
            break;

        case 3:
            EnemyBoardSkill setOneLineEmpty = null;
            setOneLineEmpty = EnemyBoardSkill.MarkOrderSkill(wtu, () => getOneLine(setOneLineEmpty), 0.1f, skillTrans, 1);
            setOneLineEmpty.addSetSkill(0.1f, (Orb o) => ORB_VALUE.EMPTY);
            skillList.Add(setOneLineEmpty);
            break;

        case 4:
            wtu = () => GameController.Instance.isTurnMod(3, RNG.Next(3));
            EnemyBoardSkill clearFourLines = null;
            clearFourLines = EnemyBoardSkill.MarkOrderSkill(wtu, () => getFourLines(clearFourLines), 0.1f, skillTrans, 1);
            clearFourLines.addRmvSkill(0);
            skillList.Add(clearFourLines);
            break;

        case 5:
            wtu = () => GameController.Instance.isTurnMod(3, RNG.Next(3));
            EnemyBoardSkill clearAllHeals = EnemyBoardSkill.MarkIfSkill(wtu, (Orb o) => o.getOrbValue() == ORB_VALUE.ZERO, 0.1f, skillTrans, 1);
            clearAllHeals.addRmvSkill(0);
            skillList.Add(clearAllHeals);
            break;

        case 6:
            newSpawnRates = (ORB_VALUE orbVal) => orbVal == ORB_VALUE.NULLIFY ? OrbSpawnRate.DECREASED : Board.getDefaultOrbSpawnRates()[(int)orbVal];
            skillList.Add(EnemyOrbSkill.Create(wtu, newSpawnRates, -1, skillTrans));
            break;

        case 7:
            newSpawnRates = (ORB_VALUE orbVal) => orbVal == (ORB_VALUE)rand.Next(1, 10) ? OrbSpawnRate.MAX : Board.getDefaultOrbSpawnRates()[(int)orbVal];
            wtu           = () => GameController.Instance.isTurnMod(3, RNG.Next(3));
            skillList.Add(EnemyOrbSkill.Create(wtu, newSpawnRates, 1, skillTrans));
            break;

        case 8:
            EnemyBuffs hpBuff       = (EnemyBuffs)(rand.Next(3) + 1);
            Func <Enemy> getTarget2 = () => GameController.Instance.getCurrEnemies()[RNG.Next(GameController.Instance.getCurrEnemies().Count)];
            skillList.Add(EnemyHPBuff.Create(() => GameController.Instance.isTurnMod(2, RNG.Next(2)), hpBuff, getTarget2, 1, skillTrans));
            break;

        case 9:
            EnemyBoardSkill decOneLine = null;
            decOneLine = EnemyBoardSkill.MarkOrderSkill(wtu, () => getOneLine(decOneLine), 0.1f, skillTrans);
            decOneLine.addIncSkill(0.1f, (Orb o) => - 1);
            skillList.Add(decOneLine);
            break;
        }
    }
 public void toggleIsRandom(bool isRandom)
 {
     this.isRandom = isRandom;
     buff          = (EnemyBuffs)UnityEngine.Random.Range(1, 4);
 }