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); }