/// <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 }