private Square GetMouseSquare() { if (!Camera.main) { return(null); } RaycastHit hit; if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, Mathf.Infinity, LayerMask.GetMask("Board"))) { int x = (int)Mathf.Floor((hit.point.x - boardCenter.x) / tileSize) + 4, y = (int)Mathf.Floor((hit.point.z - boardCenter.z) / tileSize) + 4; return((Square.Exists(x, y)) ? Square.At(x, y) : null); } return(null); }
private bool CanQueensideCastle() { bool overAndIntoCheck = false; foreach (Piece p in Board.instance.GetOpposingPieces(color)) { foreach (Board.Move move in p.GetAvailableMoves(Board.instance.GetBoard())) { Board.Square s = (color == Color.white ? Board.instance.GetSquare(0, 1) : Board.instance.GetSquare(7, 1)); Board.Square s2 = (color == Color.white ? Board.instance.GetSquare(0, 2) : Board.instance.GetSquare(7, 2)); Board.Square s3 = (color == Color.white ? Board.instance.GetSquare(0, 3) : Board.instance.GetSquare(7, 3)); if ((move.file == s.file && move.rank == s.rank) || (move.file == s2.file && move.rank == s2.rank) || (move.file == s3.file && move.rank == s3.rank)) { overAndIntoCheck = true; } } } return !overAndIntoCheck && moveHistory.Count == 0 && checkCount == 0 && (color == Color.white ? Board.instance.GetSquare(0, 1).piece == null : Board.instance.GetSquare(7, 1).piece == null) && (color == Color.white ? Board.instance.GetSquare(0, 2).piece == null : Board.instance.GetSquare(7, 2).piece == null) && (color == Color.white ? Board.instance.GetSquare(0, 3).piece == null : Board.instance.GetSquare(7, 3).piece == null) && (color == Color.white ? Board.instance.GetSquare(0, 0).piece != null && Board.instance.GetSquare(0, 0).piece.moveHistory.Count == 0 : Board.instance.GetSquare(7, 0).piece != null && Board.instance.GetSquare(7, 0).piece.moveHistory.Count == 0); }
private void Take(Square square) { GamePiece g = Get(square); Set(square, null); g.Highlight(false); if (g.color == PieceColor.White) { int index = whitePiecesTaken.Count(x => x != null); whitePiecesTaken[index] = g; g.Move(GetSquareCenter(square), whiteGraveyard.GetChild(index).position); } else { int index = blackPiecesTaken.Count(x => x != null); blackPiecesTaken[index] = g; g.Move(GetSquareCenter(square), blackGraveyard.GetChild(index).position); } }
/* * private Vector3 GetSquareCenter(Square square, bool local = false) * { * return (local) ? tileRight * (square.file + 0.5f) + tileForward * (square.rank + 0.5f) : boardCenter + tileRight * (square.file - 3.5f) + tileForward * (square.rank - 3.5f); * } */ private Vector3 GetSquareCenter(Square square) { return(boardCenter + tileRight * (square.file - 3.5f) + tileForward * (square.rank - 3.5f)); }
private void Set(Square square, GamePiece piece) { gamePieces[8 * square.rank + square.file] = piece; }
private GamePiece Get(Square square) { return(gamePieces[8 * square.rank + square.file]); }
void Update() { if (updateSceneCoroutine != null || board.status != BoardStatus.Playing || resigned) { return; } if (playerAI != null && playerAI.color == board.whoseTurn) { #if UNITY_WEBGL || UNITY_EDITOR if (!findingMove) { playerAI.FindMove(new Board(board)); findingMove = true; } else if (!playerAI.isCalculating) { findingMove = false; #else if (playerAIThread == null) { playerAIThread = new Thread(new ParameterizedThreadStart(playerAI.FindMove)); playerAIThread.Start(new Board(board)); } else if (!playerAIThread.IsAlive) { playerAIThread = null; #endif Move move = playerAI.foundMove; bool success = board.MakeMove(move); Debug.Assert(success); UpdateScene((board.sideEffect != null) ? new List <Move>() { move, board.sideEffect.Value } : new List <Move>() { move }); } } else { mouseSquare = GetMouseSquare(); if (Input.GetMouseButtonDown(0)) { if (mouseSquare != null) { if (selectedSquare == null) // clicked on the board, but no previously selected square { GamePiece g = Get(mouseSquare); if (g != null && g.color == board.whoseTurn) // only select if it's one of the current player's pieces { Square temp = mouseSquare; mouseSquare = null; // remove highlight before selecting selectedSquare = temp; } } else if (mouseSquare == selectedSquare) { selectedSquare = null; mouseSquare = null; // ensures the piece at mouseSquare can be re-highlighted on next update (after piece is finished moving) } else // the player has attempted to make a move { Move move = new Move(selectedSquare, mouseSquare); if (board.MakeMove(move)) { selectedSquare = null; mouseSquare = null; // ensures the piece at mouseSquare can be re-highlighted on next update (after piece is finished moving) GamePiece g = Get(move.from), h = Get(move.to); g.transform.position = GetSquareCenter(move.to); if (h != null) { Take(move.to); waitForPiecesCoroutine = StartCoroutine(WaitForPiecesRoutine(new List <GamePiece>() { g, h })); } else { waitForPiecesCoroutine = StartCoroutine(WaitForPiecesRoutine(new List <GamePiece>() { g })); } Set(move.from, null); Set(move.to, g); UpdateScene((board.sideEffect != null) ? new List <Move>() { board.sideEffect.Value } : null); } } } } } }
// Update is called once per frame void Update() { if (Input.GetKeyDown(KeyCode.Escape)) { SceneManager.LoadScene("Menu"); } if (Input.GetMouseButtonDown(0)) { RaycastHit hitInfo = new RaycastHit(); bool hit = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo); if (hit) { if (hitInfo.transform.gameObject.tag == "Piece") { if (selected) { selected.GetComponent <Light>().enabled = false; } selected = hitInfo.transform.gameObject; selectedPiece = selected.GetComponent <Piece>(); if (selectedPiece.color != turnColor) { return; } Board.instance.ClearMoves(); King k = Board.instance.GetKing(turnColor); foreach (Board.Move m in selectedPiece.GetAvailableMoves(Board.instance.GetBoard())) { if (k.CheckForCheck(Board.instance.GetBoard())) { if (k.checkCount > 1) { selectedPiece = k; break; } List <Board.Move> blocks = GetBlocks(); foreach (Board.Move block in blocks) { if (m.piece == selectedPiece) { Board.instance.CreateMove(m.file, m.rank); } } } else { checkText.text = ""; Board.instance.CreateMove(m.file, m.rank); } } hitInfo.transform.GetComponent <Light>().enabled = true; } else if (hitInfo.transform.gameObject.tag == "Move") { Board.Square square = Board.instance.GetSquareFromString(hitInfo.transform.parent.name); Board.instance.MakeMove(new Board.Move(square.file, square.rank, selectedPiece), selected); Board.instance.GetKing(turnColor).checkCount = 0; SwitchTurns(); StartCoroutine(RotateCamera(selectedPiece.color == Color.white)); } } } }