Example #1
0
    /// <summary>
    /// Receive an update from a clicked cableTile and handle input.
    /// </summary>
    /// <param name="cableTile"></param>
    /// <param name="key"></param>
    public void CableTileUpdate(UnityCableTile cableTile, KeyCode key)
    {
        if (lastSelectedTile != null)
        {
            if (cableTile.gameObject == lastSelectedTile)
            {
                //Reveal / RotateLeft on Mouse 0
                if (key == KeyCode.Mouse0)
                {
                    if (cableTile.CableState == CableTile.CableStates.Hidden)
                    {
                        cableTile.Reveal();
                    }
                    else if (cableTile.CableState == CableTile.CableStates.Revealed)
                    {
                        cableTile.Rotate(UnityCableTile.TransformRotationDirections.Left);
                    }
                }
                //RotateRight on Mouse 1
                else if (key == KeyCode.Mouse1)
                {
                    cableTile.Rotate(UnityCableTile.TransformRotationDirections.Right);
                }
            }
            else
            {
                //Select the Tile on Mouse 0 then Reveal if it is Hidden
                if (key == KeyCode.Mouse0)
                {
                    SelectTile();
                }
                //Swap with the last selected tile on Mouse 1
                else if (key == KeyCode.Mouse1)
                {
                    SwapTiles(cableTile.gameObject, ref lastSelectedTile);
                }
            }
        }
        else
        {
            //Select the Tile on Mouse 0 then Reveal if it is Hidden
            if (key == KeyCode.Mouse0)
            {
                SelectTile();
            }
        }

        void SelectTile()
        {
            cableTile.Select();
            if (lastSelectedTile != null)
            {
                lastSelectedTile.GetComponent <UnityCableTile>().Deselect();
            }
            lastSelectedTile = cableTile.gameObject;

            if (cableTile.CableState == CableTile.CableStates.Hidden)
            {
                cableTile.Reveal();
            }
        }
    }
        /// <summary>
        /// Evaluate the grid's tiles and update for a new valid connection if possible.
        /// </summary>
        /// <param name="grid">The grid to be evaluated.</param>
        public void Evaluate(UnityGrid grid)
        {
            if (grid.State == UnityGrid.GridStates.Unsolved)
            {
                //Check for valid starting tile before checking the grid and connect it if necessary
                if (grid.CableTileGrid[0, 0].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[0].IsValid)
                {
                    if (grid.CableTileGrid[0, 0].GetComponent <UnityCableTile>().CableState != CableTile.CableStates.Connected)
                    {
                        grid.CableTileGrid[0, 0].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected;
                        grid.LastConnectedTile = grid.CableTileGrid[0, 0];
                    }
                    else
                    {
                        UnityCableTile lastConnectedTile = grid.LastConnectedTile.GetComponent <UnityCableTile>();

                        //i - vertical, j - horizontal
                        for (int i = 0; i < grid.CableTileGrid.GetLength(0); i++)
                        {
                            for (int j = 0; j < grid.CableTileGrid.GetLength(1); j++)
                            {
                                if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>() == lastConnectedTile)
                                {
                                    //Check if this is the EndTile and mark Solved IF it has a valid Right
                                    if (grid.CableTileGrid[i, j] == grid.CableTileGrid[grid.CableTileGrid.GetLength(0) - 1, grid.CableTileGrid.GetLength(1) - 1] &&
                                        grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[2].IsValid == true)
                                    {
                                        grid.State = UnityGrid.GridStates.Solved;
                                        Debug.Log("Solved!");
                                    }

                                    //Check Tile to Right
                                    else if (CanConnectRight(i, j))
                                    {
                                        grid.CableTileGrid[i, j + 1].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected;
                                        grid.LastConnectedTile = grid.CableTileGrid[i, j + 1];
                                    }
                                    //Check Tile to Bottom
                                    else if (CanConnectBottom(i, j))
                                    {
                                        grid.CableTileGrid[i + 1, j].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected;
                                        grid.LastConnectedTile = grid.CableTileGrid[i + 1, j];
                                    }
                                    //Check Tile to Top
                                    else if (CanConnectTop(i, j))
                                    {
                                        grid.CableTileGrid[i - 1, j].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected;
                                        grid.LastConnectedTile = grid.CableTileGrid[i - 1, j];
                                    }
                                    //Check Tile to Left
                                    else if (CanConnectLeft(i, j))
                                    {
                                        grid.CableTileGrid[i, j - 1].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected;
                                        grid.LastConnectedTile = grid.CableTileGrid[i, j - 1];
                                    }
                                }
                            }
                        }
                    }
                }
            }

            #region Surrounding-Tile Checkers
            bool CanConnectRight(int i, int j)
            {
                //Return false Immediately if it goes beyond grid bounds.
                if (j + 1 > grid.CableTileGrid.GetLength(1) - 1)
                {
                    return(false);
                }
                if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[2].IsValid &&
                    grid.CableTileGrid[i, j + 1].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[0].IsValid &&
                    grid.CableTileGrid[i, j + 1].GetComponent <UnityCableTile>().CableState == CableTile.CableStates.Revealed)
                {
                    return(true);
                }

                return(false);
            }

            bool CanConnectBottom(int i, int j)
            {
                //Return false Immediately if it goes beyond grid bounds.
                if (i + 1 > grid.CableTileGrid.GetLength(0) - 1)
                {
                    return(false);
                }

                if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[3].IsValid &&
                    grid.CableTileGrid[i + 1, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[1].IsValid &&
                    grid.CableTileGrid[i + 1, j].GetComponent <UnityCableTile>().CableState == CableTile.CableStates.Revealed)
                {
                    return(true);
                }

                return(false);
            }

            bool CanConnectTop(int i, int j)
            {
                if (i - 1 < 0)
                {
                    return(false);
                }

                if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[1].IsValid &&
                    grid.CableTileGrid[i - 1, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[3].IsValid &&
                    grid.CableTileGrid[i - 1, j].GetComponent <UnityCableTile>().CableState == CableTile.CableStates.Revealed)
                {
                    return(true);
                }

                return(false);
            }

            bool CanConnectLeft(int i, int j)
            {
                if (j - 1 < 0)
                {
                    return(false);
                }

                if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[0].IsValid &&
                    grid.CableTileGrid[i, j - 1].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[2].IsValid &&
                    grid.CableTileGrid[i, j - 1].GetComponent <UnityCableTile>().CableState == CableTile.CableStates.Revealed)
                {
                    return(true);
                }

                return(false);
            }

            #endregion
        }