bool Position::pl_move_is_legal(Move m) const {
- return pl_move_is_legal(m, pinned_pieces(side_to_move()));
+ // If we're in check, all pseudo-legal moves are legal, because our
+ // check evasion generator only generates true legal moves.
+ return is_check() || pl_move_is_legal(m, pinned_pieces(side_to_move()));
}
bool Position::pl_move_is_legal(Move m, Bitboard pinned) const {
assert(is_ok());
assert(move_is_ok(m));
assert(pinned == pinned_pieces(side_to_move()));
-
- // If we're in check, all pseudo-legal moves are legal, because our
- // check evasion generator only generates true legal moves.
- if (is_check())
- return true;
+ assert(!is_check());
// Castling moves are checked for legality during move generation.
if (move_is_castle(m))
void Position::init_zobrist() {
- for(Piece p = WP; p <= BK; p++)
- for(Square s = SQ_A1; s <= SQ_H8; s++)
- zobrist[color_of_piece(p)][type_of_piece(p)][s] = genrand_int64();
+ for (int i = 0; i < 2; i++)
+ for (int j = 0; j < 8; j++)
+ for (int k = 0; k < 64; k++)
+ zobrist[i][j][k] = Key(genrand_int64());
- zobEp[0] = 0ULL;
- for(int i = 1; i < 64; i++)
- zobEp[i] = genrand_int64();
+ for (int i = 0; i < 64; i++)
+ zobEp[i] = Key(genrand_int64());
- for(int i = 15; i >= 0; i--)
- zobCastle[(i&8) | (i&1) | ((i&2) << 1) | ((i&4) >> 1)] = genrand_int64();
+ for (int i = 0; i < 16; i++)
+ zobCastle[i] = genrand_int64();
zobSideToMove = genrand_int64();
for (int i = 0; i < 2; i++)
for (int j = 0; j < 8; j++)
for (int k = 0; k < 16; k++)
- zobMaterial[i][j][k] = (k > 0)? genrand_int64() : 0LL;
+ zobMaterial[i][j][k] = (k > 0)? Key(genrand_int64()) : Key(0LL);
for (int i = 0; i < 16; i++)
- zobMaterial[0][KING][i] = zobMaterial[1][KING][i] = 0ULL;
+ zobMaterial[0][KING][i] = zobMaterial[1][KING][i] = Key(0ULL);
}