Fix crashes

This commit is contained in:
Mattia Giambirtone 2024-04-20 13:33:42 +02:00
parent 77ff697df7
commit 9528fb9849
1 changed files with 9 additions and 7 deletions

View File

@ -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) =