Fix crashes
This commit is contained in:
parent
77ff697df7
commit
9528fb9849
|
@ -447,7 +447,7 @@ proc getAttacksTo*(self: ChessBoard, square: Square, attacker: PieceColor): Bitb
|
||||||
result = result or self.getSlidingAttacks(square, attacker)
|
result = result or self.getSlidingAttacks(square, attacker)
|
||||||
|
|
||||||
|
|
||||||
proc updateCheckers(self: ChessBoard) =
|
proc updateChecksAndPins(self: ChessBoard) =
|
||||||
let
|
let
|
||||||
side = self.getSideToMove()
|
side = self.getSideToMove()
|
||||||
king = self.getBitboard(King, side).toSquare()
|
king = self.getBitboard(King, side).toSquare()
|
||||||
|
@ -491,7 +491,7 @@ proc generatePawnCaptures(self: ChessBoard, moves: var MoveList) =
|
||||||
nonSideToMove = sideToMove.opposite()
|
nonSideToMove = sideToMove.opposite()
|
||||||
pawns = self.getBitboard(Pawn, sideToMove)
|
pawns = self.getBitboard(Pawn, sideToMove)
|
||||||
# We can only capture enemy pieces (except the king)
|
# 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)
|
enemyPawns = self.getBitboard(Pawn, nonSideToMove)
|
||||||
rightMovement = pawns.forwardRightRelativeTo(sideToMove)
|
rightMovement = pawns.forwardRightRelativeTo(sideToMove)
|
||||||
leftMovement = pawns.forwardLeftRelativeTo(sideToMove)
|
leftMovement = pawns.forwardLeftRelativeTo(sideToMove)
|
||||||
|
@ -538,7 +538,8 @@ proc generateRookMoves(self: ChessBoard, moves: var MoveList) =
|
||||||
let
|
let
|
||||||
sideToMove = self.getSideToMove()
|
sideToMove = self.getSideToMove()
|
||||||
occupancy = self.getOccupancy()
|
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)
|
rooks = self.getBitboard(Rook, sideToMove) or self.getBitboard(Queen, sideToMove)
|
||||||
for square in rooks:
|
for square in rooks:
|
||||||
let
|
let
|
||||||
|
@ -555,7 +556,8 @@ proc generateBishopMoves(self: ChessBoard, moves: var MoveList) =
|
||||||
## Helper of generateSlidingMoves to generate bishop moves
|
## Helper of generateSlidingMoves to generate bishop moves
|
||||||
let
|
let
|
||||||
sideToMove = self.getSideToMove()
|
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()
|
occupancy = self.getOccupancy()
|
||||||
bishops = self.getBitboard(Bishop, sideToMove) or self.getBitboard(Queen, sideToMove)
|
bishops = self.getBitboard(Bishop, sideToMove) or self.getBitboard(Queen, sideToMove)
|
||||||
for square in bishops:
|
for square in bishops:
|
||||||
|
@ -584,7 +586,7 @@ proc generateKingMoves(self: ChessBoard, moves: var MoveList) =
|
||||||
moveIdx = king.toSquare().uint64
|
moveIdx = king.toSquare().uint64
|
||||||
occupancy = self.getOccupancy()
|
occupancy = self.getOccupancy()
|
||||||
nonSideToMove = sideToMove.opposite()
|
nonSideToMove = sideToMove.opposite()
|
||||||
enemyPieces = self.getOccupancyFor(nonSideToMove)
|
enemyPieces = self.getOccupancyFor(nonSideToMove) and not self.getBitboard(King, nonSideToMove)
|
||||||
# Regular moves
|
# Regular moves
|
||||||
for square in KING_BITBOARDS[moveIdx] and not occupancy:
|
for square in KING_BITBOARDS[moveIdx] and not occupancy:
|
||||||
moves.add(createMove(king, square))
|
moves.add(createMove(king, square))
|
||||||
|
@ -600,7 +602,7 @@ proc generateKnightMoves(self: ChessBoard, moves: var MoveList)=
|
||||||
knights = self.getBitboard(Knight, sideToMove)
|
knights = self.getBitboard(Knight, sideToMove)
|
||||||
occupancy = self.getOccupancy()
|
occupancy = self.getOccupancy()
|
||||||
nonSideToMove = sideToMove.opposite()
|
nonSideToMove = sideToMove.opposite()
|
||||||
enemyPieces = self.getOccupancyFor(nonSideToMove)
|
enemyPieces = self.getOccupancyFor(nonSideToMove) and not self.getBitboard(King, nonSideToMove)
|
||||||
for square in knights:
|
for square in knights:
|
||||||
# Regular moves
|
# Regular moves
|
||||||
for target in KNIGHT_BITBOARDS[square.uint64] and not occupancy:
|
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.generatePawnMoves(moves)
|
||||||
self.generateKnightMoves(moves)
|
self.generateKnightMoves(moves)
|
||||||
self.generateSlidingMoves(moves)
|
self.generateSlidingMoves(moves)
|
||||||
# self.updateCheckers()
|
|
||||||
|
|
||||||
|
|
||||||
proc removePieceFromBitboard(self: ChessBoard, square: Square) =
|
proc removePieceFromBitboard(self: ChessBoard, square: Square) =
|
||||||
|
@ -734,6 +735,7 @@ proc doMove*(self: ChessBoard, move: Move) =
|
||||||
else:
|
else:
|
||||||
# Unreachable
|
# Unreachable
|
||||||
discard
|
discard
|
||||||
|
self.updateChecksAndPins()
|
||||||
|
|
||||||
|
|
||||||
proc spawnPiece(self: ChessBoard, square: Square, piece: Piece) =
|
proc spawnPiece(self: ChessBoard, square: Square, piece: Piece) =
|
||||||
|
|
Loading…
Reference in New Issue