int f = (rsq < king_square(c) ? WHITE_OOO : WHITE_OO) << c;
st->castleRights |= f;
- castleRightsMask[king_square(c)] ^= f;
- castleRightsMask[rsq] ^= f;
+ castleRightsMask[king_square(c)] |= f;
+ castleRightsMask[rsq] |= f;
castleRookSquare[f] = rsq;
}
Bitboard occ, xray;
Square from = from_sq(m);
Square to = to_sq(m);
- Piece piece = piece_on(from);
+ Piece piece = piece_moved(m);
assert(!square_is_empty(from));
Color us = sideToMove;
Square from = from_sq(m);
- assert(color_of(piece_on(from)) == us);
+ assert(color_of(piece_moved(m)) == us);
assert(piece_on(king_square(us)) == make_piece(us, KING));
// En passant captures are a tricky special case. Because they are rather
Bitboard b = occupied_squares();
assert(to == ep_square());
- assert(piece_on(from) == make_piece(us, PAWN));
+ assert(piece_moved(m) == make_piece(us, PAWN));
assert(piece_on(capsq) == make_piece(them, PAWN));
assert(piece_on(to) == NO_PIECE);
Color them = ~sideToMove;
Square from = from_sq(m);
Square to = to_sq(m);
- Piece pc = piece_on(from);
+ Piece pc = piece_moved(m);
// Use a slower but simpler function for uncommon cases
if (is_special(m))
{
// In case of king moves under check we have to remove king so to catch
// as invalid moves like b1a1 when opposite queen is on c1.
- if (type_of(piece_on(from)) == KING)
+ if (type_of(pc) == KING)
{
Bitboard b = occupied_squares();
b ^= from;
- if (attackers_to(to_sq(m), b) & pieces(~us))
+ if (attackers_to(to, b) & pieces(~us))
return false;
}
else
// Our move must be a blocking evasion or a capture of the checking piece
target = squares_between(checksq, king_square(us)) | checkers();
- if (!(target & to_sq(m)))
+ if (!(target & to))
return false;
}
}
}
// Update castle rights if needed
- if ( st->castleRights != CASTLES_NONE
- && (castleRightsMask[from] & castleRightsMask[to]) != ALL_CASTLES)
+ if (st->castleRights && (castleRightsMask[from] | castleRightsMask[to]))
{
- int cr = castleRightsMask[from] & castleRightsMask[to];
- k ^= zobCastle[st->castleRights & (cr ^ ALL_CASTLES)];
- st->castleRights &= cr;
+ int cr = castleRightsMask[from] | castleRightsMask[to];
+ k ^= zobCastle[st->castleRights & cr];
+ st->castleRights &= ~cr;
}
// Prefetch TT access as soon as we know key is updated
}
// Update castling rights
- int cr = castleRightsMask[kfrom];
- st->key ^= zobCastle[st->castleRights & (cr ^ ALL_CASTLES)];
- st->castleRights &= cr;
+ st->key ^= zobCastle[st->castleRights & castleRightsMask[kfrom]];
+ st->castleRights &= ~castleRightsMask[kfrom];
// Update checkers BB
st->checkersBB = attackers_to(king_square(~us)) & pieces(us);
assert(is_ok(m));
- Square from = from_sq(m);
- Square to = to_sq(m);
-
// Early return if SEE cannot be negative because captured piece value
// is not less then capturing one. Note that king moves always return
// here because king midgame value is set to 0.
- if (PieceValueMidgame[piece_on(to)] >= PieceValueMidgame[piece_on(from)])
+ if (PieceValueMidgame[piece_on(to_sq(m))] >= PieceValueMidgame[piece_moved(m)])
return 1;
return see(m);
void Position::clear() {
+ memset(this, 0, sizeof(Position));
+ startState.epSquare = SQ_NONE;
st = &startState;
- memset(st, 0, sizeof(StateInfo));
- st->epSquare = SQ_NONE;
-
- memset(byColorBB, 0, sizeof(Bitboard) * 2);
- memset(byTypeBB, 0, sizeof(Bitboard) * 8);
- memset(pieceCount, 0, sizeof(int) * 2 * 8);
- memset(index, 0, sizeof(int) * 64);
for (int i = 0; i < 8; i++)
for (int j = 0; j < 16; j++)
pieceList[0][i][j] = pieceList[1][i][j] = SQ_NONE;
for (Square sq = SQ_A1; sq <= SQ_H8; sq++)
- {
board[sq] = NO_PIECE;
- castleRightsMask[sq] = ALL_CASTLES;
- }
- sideToMove = WHITE;
- nodes = 0;
- occupied = 0;
}
if (debugBitboards)
{
// The intersection of the white and black pieces must be empty
- if (!(pieces(WHITE) & pieces(BLACK)))
+ if (pieces(WHITE) & pieces(BLACK))
return false;
// The union of the white and black pieces must be equal to all
Piece rook = (f & (WHITE_OO | WHITE_OOO) ? W_ROOK : B_ROOK);
- if ( castleRightsMask[castleRookSquare[f]] != (ALL_CASTLES ^ f)
- || piece_on(castleRookSquare[f]) != rook)
+ if ( piece_on(castleRookSquare[f]) != rook
+ || castleRightsMask[castleRookSquare[f]] != f)
return false;
}