private void addSkills11() { Func <Enemy> getEnemy = () => { foreach (Enemy e in GameController.Instance.getCurrEnemies()) { if (e.getEnemyID() != getEnemyID()) { return(e); } } return(null); }; skillList.Add(EnemyHPBuff.Create(() => GameController.Instance.isTurnMod(2), EnemyBuffs.DMG_ABSORB, getEnemy, 1, skillTrans)); EnemyBoardSkill oneEmptyPerDigit = null; Func <Orb, bool> randDigits = (Orb o) => { System.Random rand = new System.Random(getRandomSeedByTurn(oneEmptyPerDigit)); for (int i = 0; i < 10; i++) { List <Orb> currDigit = new List <Orb>(); for (int j = 0; j < Board.COLUMNS; j++) { for (int k = 0; k < Board.ROWS; k++) { Orb z = Board.Instance.getOrb(j, k); if (z.getOrbValue() == (ORB_VALUE)i) { currDigit.Add(z); } } } if (o.getIntValue() == i && currDigit[rand.Next(currDigit.Count)] == o) { return(true); } } return(false); }; oneEmptyPerDigit = EnemyBoardSkill.MarkIfSkill(() => GameController.Instance.isTurnMod(2), randDigits, 0.1f, skillTrans); oneEmptyPerDigit.addSetSkill(0.1f, (Orb o) => ORB_VALUE.EMPTY); skillList.Add(oneEmptyPerDigit); Func <ORB_VALUE, OrbSpawnRate> incAnti = (ORB_VALUE orbVal) => orbVal == ORB_VALUE.POISON ? OrbSpawnRate.INCREASED : Board.getDefaultOrbSpawnRates()[(int)orbVal]; skillList.Add(EnemyOrbSkill.Create(() => GameController.Instance.isTurnMod(2, 1), incAnti, 1, skillTrans)); skillList.Add(EnemyAttack.Create(() => true, false, () => Player.Instance.gameObject, () => (currState.currHealth - currState.maxHealth) / 2 - 100, skillTrans)); skillList.Add(EnemyAttack.Create(() => GameController.Instance.isTurnMod(2), false, () => gameObject, () => currState.currHealth / 2, skillTrans)); }
public IEnumerator getInput() { //getting valid input do { //reseting the stack and its orbs while (selectedOrbs.Count > 0) { selectedOrbs.Last().isSelected = false; selectedOrbs.Last().updateConnectors(); selectedOrbs.Remove(selectedOrbs.Last()); } displayNumBar(); setNumBarColor(NUMBAR_STATE.DEFAULT); //waiting for && getting input yield return(waitForInput); while (!inputReleased() && !GameController.Instance.isPaused) { Vector2 relativeInputPos = getRelativeInputPos(); int c = Mathf.RoundToInt(relativeInputPos.x); int r = Mathf.RoundToInt(relativeInputPos.y); if (0 <= r && r < ROWS && 0 <= c && c < COLUMNS && Mathf.Abs(relativeInputPos.x - c) <= THRESHOLD && Mathf.Abs(relativeInputPos.y - r) <= THRESHOLD) { Orb chosenOrb = orbArray[c][r]; Vector2Int currGridPosition = new Vector2Int(c, r); if (selectedOrbs.Count == 0) { selectedOrbs.Add(chosenOrb); chosenOrb.isSelected = true; } else { Orb head = selectedOrbs.Last(); selectedOrbs.Remove(selectedOrbs.Last()); Vector2Int prevHeadDir = head.prevOrbDir; head.prevOrbDir = Vector2Int.zero; head.isSelected = false; if (!(selectedOrbs.Count >= 1 && currGridPosition.Equals(selectedOrbs.Last().getGridPos()))) //if the player backtracks, then the head orb is removed { selectedOrbs.Add(head); head.prevOrbDir = prevHeadDir; head.isSelected = true; if (!chosenOrb.Equals(head) && chosenOrb.isAdjacentTo(head) && !chosenOrb.isSelected && //if the player moves to a new adjacent orb, then the new orb is put in (numberIsNullified() || head.getOrbValue() != ORB_VALUE.STOP)) // can't move if the current orb is a non-nullified stop orb { head.nextOrbDir = head.directionTo(chosenOrb); selectedOrbs.Add(chosenOrb); chosenOrb.prevOrbDir = chosenOrb.directionTo(head); chosenOrb.isSelected = true; } } else { chosenOrb.nextOrbDir = Vector2Int.zero; } head.updateConnectors(); chosenOrb.updateConnectors(); } } displayNumBar(); yield return(null); } } while (selectedOrbs.Count <= 1); }
private void addHardSkill(int index) { System.Random rand = new System.Random(getRandomSeedByFloor()); Func <bool> wtu = () => true; Func <ORB_VALUE, OrbSpawnRate> newSpawnRates; bool markZeroAndFives = currState.number % 5 == 0; bool isAnti = RNG.Next(2) == 0; switch (index) { case 0: int numNullify = rand.Next(1, 3); wtu = () => GameController.Instance.isTurnMod(2 * numNullify, RNG.Next(numNullify)); Func <Orb, bool> randZeros = (Orb o) => { List <Orb> currZeros = new List <Orb>(); for (int i = 0; i < Board.COLUMNS; i++) { for (int j = 0; j < Board.ROWS; j++) { Orb z = Board.Instance.getOrb(i, j); if (z.getOrbValue() == ORB_VALUE.ZERO) { currZeros.Add(z); } } } for (int i = 0; i < numNullify && currZeros.Count > 0; i++) { int orb = rand.Next(currZeros.Count); if (currZeros[orb] == o) { return(true); } currZeros.RemoveAt(orb); } return(false); }; EnemyBoardSkill zerosToNullify = EnemyBoardSkill.MarkIfSkill(wtu, randZeros, 0.1f, skillTrans); zerosToNullify.addSetSkill(0.1f, (Orb o) => ORB_VALUE.NULLIFY); skillList.Add(zerosToNullify); break; case 1: int numOrbReduce = rand.Next(1, 4); newSpawnRates = (ORB_VALUE orbVal) => { if (markZeroAndFives) { return(orbVal == ORB_VALUE.ZERO || orbVal == ORB_VALUE.FIVE ? OrbSpawnRate.DECREASED : Board.getDefaultOrbSpawnRates()[(int)orbVal]); } return(orbVal <= ORB_VALUE.NINE && (int)orbVal % 2 == 0 ? OrbSpawnRate.DECREASED : Board.getDefaultOrbSpawnRates()[(int)orbVal]); }; wtu = () => GameController.Instance.isTurnMod(2 * numOrbReduce, RNG.Next(numOrbReduce)); skillList.Add(EnemyOrbSkill.Create(wtu, newSpawnRates, numOrbReduce, skillTrans)); break; case 2: wtu = () => GameController.Instance.isTurnMod(3, RNG.Next(3)); Func <Orb, bool> evensOrFives = (Orb o) => o.isDigit() && o.getIntValue() % (markZeroAndFives ? 5 : 2) == 0; EnemyBoardSkill clearEvensOrFives = EnemyBoardSkill.MarkIfSkill(wtu, evensOrFives, 0.1f, skillTrans); clearEvensOrFives.addRmvSkill(0); skillList.Add(clearEvensOrFives); break; case 3: wtu = () => GameController.Instance.isTurnMod(3, RNG.Next(3)); EnemyBoardSkill replaceWithAntiOrStop = null; replaceWithAntiOrStop = EnemyBoardSkill.MarkOrderSkill(wtu, () => getRandomPattern(replaceWithAntiOrStop), 0.1f, skillTrans, 1); replaceWithAntiOrStop.addSetSkill(0.1f, (Orb o) => isAnti ? ORB_VALUE.POISON : ORB_VALUE.STOP); skillList.Add(replaceWithAntiOrStop); break; case 4: wtu = () => GameController.Instance.isTurnMod(4, RNG.Next(4)); EnemyBoardSkill emptyFourLines = null; emptyFourLines = EnemyBoardSkill.MarkOrderSkill(wtu, () => getFourLines(emptyFourLines), 0.1f, skillTrans, 1); emptyFourLines.addSetSkill(0.1f, (Orb o) => ORB_VALUE.EMPTY); skillList.Add(emptyFourLines); break; case 5: wtu = () => GameController.Instance.isTurnMod(3, RNG.Next(3)); EnemyBoardSkill allHealsToAntiOrStop = EnemyBoardSkill.MarkIfSkill(wtu, (Orb o) => o.getOrbValue() == ORB_VALUE.ZERO, 0.1f, skillTrans, 1); allHealsToAntiOrStop.addSetSkill(0.1f, (Orb o) => isAnti ? ORB_VALUE.POISON : ORB_VALUE.STOP); skillList.Add(allHealsToAntiOrStop); break; case 6: int numNoneZeroTurns = rand.Next(1, 3); newSpawnRates = (ORB_VALUE orbVal) => orbVal == ORB_VALUE.ZERO ? OrbSpawnRate.NONE : Board.getDefaultOrbSpawnRates()[(int)orbVal]; wtu = () => GameController.Instance.isTurnMod(2 * numNoneZeroTurns, RNG.Next(numNoneZeroTurns)); skillList.Add(EnemyOrbSkill.Create(wtu, newSpawnRates, numNoneZeroTurns, skillTrans)); break; case 7: int antiOrStop = rand.Next(2, 4); newSpawnRates = (ORB_VALUE orbVal) => orbVal == (antiOrStop == 2 ? ORB_VALUE.POISON : ORB_VALUE.STOP) ? OrbSpawnRate.INCREASED : Board.getDefaultOrbSpawnRates()[(int)orbVal]; wtu = () => GameController.Instance.isTurnMod(antiOrStop, RNG.Next(antiOrStop - 1)); skillList.Add(EnemyOrbSkill.Create(wtu, newSpawnRates, 1, skillTrans)); break; case 8: int numTimerTurns = rand.Next(1, 3); wtu = () => GameController.Instance.isTurnMod(2 * numTimerTurns, RNG.Next(numTimerTurns)); EnemyTimer numDOT = EnemyTimer.Create(wtu, Mathf.Clamp(currState.number / 10f, 0f, 10f), numTimerTurns, skillTrans); numDOT.addDOTSkill(() => - currState.number); skillList.Add(numDOT); break; case 9: int numDecrement = rand.Next(1, 4); wtu = () => GameController.Instance.isTurnMod(numDecrement + 2, RNG.Next(numDecrement)); EnemyBoardSkill decrementPattern = null; decrementPattern = EnemyBoardSkill.MarkOrderSkill(wtu, () => getRandomPattern(decrementPattern), 0.1f, skillTrans, numDecrement); decrementPattern.addIncSkill(0.1f, (Orb o) => - numDecrement); skillList.Add(decrementPattern); break; } }
private IEnumerator useTimerSkill() { if (timeDelay != null) { yield return(timeDelay); } internalTimer = skillRate; while (isRunning) { while (internalTimer < skillRate) { internalTimer += Time.deltaTime; yield return(null); } if (!isRunning) { break; } System.Random rand = new System.Random(); List <Orb> potentialOrbs = new List <Orb>(); Orb selectedOrb; switch (endSkill) { case EnemySkillType.CLEAR: for (int c = 0; c < Board.COLUMNS; c++) { for (int r = 0; r < Board.ROWS; r++) { Orb o = Board.Instance.getOrb(c, r); if (rmvCondition(o) && !o.getIsMarkedBy(skillID)) { potentialOrbs.Add(o); } } } if (potentialOrbs.Count > 0) { selectedOrb = potentialOrbs[rand.Next(potentialOrbs.Count)]; Vector2Int gridPos = selectedOrb.getGridPos(); yield return(StartCoroutine(Board.Instance.markOrbAt(gridPos.x, gridPos.y, skillID, 0f))); Board.Instance.displayNumBar(); } break; case EnemySkillType.REPLACE: for (int c = 0; c < Board.COLUMNS; c++) { for (int r = 0; r < Board.ROWS; r++) { Orb o = Board.Instance.getOrb(c, r); if (setCondition(o) != o.getOrbValue()) { potentialOrbs.Add(o); } } } if (potentialOrbs.Count > 0) { selectedOrb = potentialOrbs[rand.Next(potentialOrbs.Count)]; selectedOrb.changeValue(setCondition(selectedOrb)); Board.Instance.displayNumBar(); } break; case EnemySkillType.DECREMENT: for (int c = 0; c < Board.COLUMNS; c++) { for (int r = 0; r < Board.ROWS; r++) { Orb o = Board.Instance.getOrb(c, r); int deltaVal = incCondition(o); if (deltaVal != 0 && o.isDigit() && o.getIntValue() + deltaVal <= 9 && o.getIntValue() + deltaVal >= 0) { potentialOrbs.Add(o); } } } if (potentialOrbs.Count > 0) { selectedOrb = potentialOrbs[rand.Next(potentialOrbs.Count)]; selectedOrb.incrementValue(incCondition(selectedOrb)); Board.Instance.displayNumBar(); } break; case EnemySkillType.ATTACK: yield return(StartCoroutine(Player.Instance.inflictDOT(getDOT()))); break; } internalTimer = 0; } }