public void Make_BlackCastleRemovesRights() { var board = Create("r3k2r/8/8/8/8/8/8/R3K2R w KQkq -"); var boardReference = Create("r3k2r/8/8/8/8/8/8/R3K2R w KQkq -"); var move = MoveBuilder.CreateCastle(Colour.Black, MoveType.CastleKing); board.MakeMove(move); Assert.True(board.WhiteCanCastleKingSide); Assert.True(board.WhiteCanCastleQueenSide); Assert.False(board.BlackCanCastleKingSide); Assert.False(board.BlackCanCastleQueenSide); board.UnMakeMove(move); TestHelpers.AssertEqual(board, boardReference); }
private void AddCastles(MoveGenerationWorkspace workspace, Square kingSquare) { var relativeBitBoard = workspace.RelativeBitBoard; if (!relativeBitBoard.CanCastleKingSide && !relativeBitBoard.CanCastleQueenSide) { return; } // We lose castle rights if any piece moves so they MUST be in correct locations if (relativeBitBoard.CanCastleKingSide) { var kingSideRookIndex = relativeBitBoard.KingSideRookStartSquare.ToSquareIndex(); var kingToRook = AttackBitmaps.Paths[kingSquare.Index][kingSideRookIndex]; var squaresBetween = kingToRook & ~relativeBitBoard.KingStartSquare & ~relativeBitBoard.KingSideRookStartSquare; if ((squaresBetween & relativeBitBoard.OccupiedSquares) == 0) { var stepSquares = relativeBitBoard.KingSideCastleStep1 | relativeBitBoard.KingSideCastleStep2; var safeSquaresAsList = FindSafeSquares(workspace, stepSquares.ToList()); var safeSquares = (SquareFlag)0; foreach (var safeSquare in safeSquaresAsList) { safeSquares |= safeSquare; } if (squaresBetween == safeSquares) { workspace.NonCaptureMoveBuffer.Add(MoveBuilder.CreateCastle(relativeBitBoard.Colour, MoveType.CastleKing)); } } } if (relativeBitBoard.CanCastleQueenSide) { var queenSideRookIndex = relativeBitBoard.QueenSideRookStartSquare.ToSquareIndex(); var kingToRook = AttackBitmaps.Paths[kingSquare.Index][queenSideRookIndex]; var squaresBetween = kingToRook & ~relativeBitBoard.KingStartSquare & ~relativeBitBoard.QueenSideRookStartSquare; if ((squaresBetween & relativeBitBoard.OccupiedSquares) == 0) { var stepSquares = relativeBitBoard.QueenSideCastleStep1 | relativeBitBoard.QueenSideCastleStep2; var safeSquaresAsList = FindSafeSquares(workspace, stepSquares.ToList()); var safeSquares = (SquareFlag)0; foreach (var safeSquare in safeSquaresAsList) { safeSquares |= safeSquare; } // On Queen side the King doesn't pass through B file so we don't look for Check there var squaresBetweenMinusFirstRookStep = squaresBetween & ~relativeBitBoard.QueenSideRookStep1Square; if (squaresBetweenMinusFirstRookStep == safeSquares) { workspace.NonCaptureMoveBuffer.Add(MoveBuilder.CreateCastle(relativeBitBoard.Colour, MoveType.CastleQueen)); } } } }