예제 #1
0
    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);
    }