From 9528fb98497d915ab166f02e8500b0da27462e10 Mon Sep 17 00:00:00 2001 From: Mattia Giambirtone Date: Sat, 20 Apr 2024 13:33:42 +0200 Subject: [PATCH] Fix crashes --- Chess/nimfish/nimfish.nim | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Chess/nimfish/nimfish.nim b/Chess/nimfish/nimfish.nim index 7ad1d72..a597d57 100644 --- a/Chess/nimfish/nimfish.nim +++ b/Chess/nimfish/nimfish.nim @@ -447,7 +447,7 @@ proc getAttacksTo*(self: ChessBoard, square: Square, attacker: PieceColor): Bitb result = result or self.getSlidingAttacks(square, attacker) -proc updateCheckers(self: ChessBoard) = +proc updateChecksAndPins(self: ChessBoard) = let side = self.getSideToMove() king = self.getBitboard(King, side).toSquare() @@ -491,7 +491,7 @@ proc generatePawnCaptures(self: ChessBoard, moves: var MoveList) = nonSideToMove = sideToMove.opposite() pawns = self.getBitboard(Pawn, sideToMove) # We can only capture enemy pieces (except the king) - enemyPieces = self.getOccupancyFor(nonSideToMove) + enemyPieces = self.getOccupancyFor(nonSideToMove) and not self.getBitboard(King, nonSideToMove) enemyPawns = self.getBitboard(Pawn, nonSideToMove) rightMovement = pawns.forwardRightRelativeTo(sideToMove) leftMovement = pawns.forwardLeftRelativeTo(sideToMove) @@ -538,7 +538,8 @@ proc generateRookMoves(self: ChessBoard, moves: var MoveList) = let sideToMove = self.getSideToMove() occupancy = self.getOccupancy() - enemyPieces = self.getOccupancyFor(sideToMove.opposite()) + nonSideToMove = sideToMove.opposite() + enemyPieces = self.getOccupancyFor(sideToMove.opposite()) and not self.getBitboard(King, nonSideToMove) rooks = self.getBitboard(Rook, sideToMove) or self.getBitboard(Queen, sideToMove) for square in rooks: let @@ -555,7 +556,8 @@ proc generateBishopMoves(self: ChessBoard, moves: var MoveList) = ## Helper of generateSlidingMoves to generate bishop moves let sideToMove = self.getSideToMove() - enemyPieces = self.getOccupancyFor(sideToMove.opposite()) + nonSideToMove = sideToMove.opposite() + enemyPieces = self.getOccupancyFor(sideToMove.opposite()) and not self.getBitboard(King, nonSideToMove) occupancy = self.getOccupancy() bishops = self.getBitboard(Bishop, sideToMove) or self.getBitboard(Queen, sideToMove) for square in bishops: @@ -584,7 +586,7 @@ proc generateKingMoves(self: ChessBoard, moves: var MoveList) = moveIdx = king.toSquare().uint64 occupancy = self.getOccupancy() nonSideToMove = sideToMove.opposite() - enemyPieces = self.getOccupancyFor(nonSideToMove) + enemyPieces = self.getOccupancyFor(nonSideToMove) and not self.getBitboard(King, nonSideToMove) # Regular moves for square in KING_BITBOARDS[moveIdx] and not occupancy: moves.add(createMove(king, square)) @@ -600,7 +602,7 @@ proc generateKnightMoves(self: ChessBoard, moves: var MoveList)= knights = self.getBitboard(Knight, sideToMove) occupancy = self.getOccupancy() nonSideToMove = sideToMove.opposite() - enemyPieces = self.getOccupancyFor(nonSideToMove) + enemyPieces = self.getOccupancyFor(nonSideToMove) and not self.getBitboard(King, nonSideToMove) for square in knights: # Regular moves for target in KNIGHT_BITBOARDS[square.uint64] and not occupancy: @@ -622,7 +624,6 @@ proc generateMoves*(self: ChessBoard, moves: var MoveList) = self.generatePawnMoves(moves) self.generateKnightMoves(moves) self.generateSlidingMoves(moves) - # self.updateCheckers() proc removePieceFromBitboard(self: ChessBoard, square: Square) = @@ -734,6 +735,7 @@ proc doMove*(self: ChessBoard, move: Move) = else: # Unreachable discard + self.updateChecksAndPins() proc spawnPiece(self: ChessBoard, square: Square, piece: Piece) =