using std::endl;
Key Position::zobrist[2][8][64];
-Key Position::zobEp[64];
+Key Position::zobEp[8];
Key Position::zobCastle[16];
Key Position::zobSideToMove;
Key Position::zobExclusion;
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;
}
}
// Reset en passant square
if (st->epSquare != SQ_NONE)
{
- k ^= zobEp[st->epSquare];
+ k ^= zobEp[file_of(st->epSquare)];
st->epSquare = SQ_NONE;
}
&& (attacks_from<PAWN>(from + pawn_push(us), us) & pieces(PAWN, them)))
{
st->epSquare = Square((from + to) / 2);
- k ^= zobEp[st->epSquare];
+ k ^= zobEp[file_of(st->epSquare)];
}
if (is_promotion(m))
// Clear en passant square
if (st->epSquare != SQ_NONE)
{
- st->key ^= zobEp[st->epSquare];
+ st->key ^= zobEp[file_of(st->epSquare)];
st->epSquare = SQ_NONE;
}
if (Do)
{
if (st->epSquare != SQ_NONE)
- st->key ^= zobEp[st->epSquare];
+ st->key ^= zobEp[file_of(st->epSquare)];
st->key ^= zobSideToMove;
prefetch((char*)TT.first_entry(st->key));
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);
result ^= zobrist[color_of(piece_on(s))][type_of(piece_on(s))][s];
if (ep_square() != SQ_NONE)
- result ^= zobEp[ep_square()];
+ result ^= zobEp[file_of(ep_square())];
if (sideToMove == BLACK)
result ^= zobSideToMove;
for (Square s = SQ_A1; s <= SQ_H8; s++)
zobrist[c][pt][s] = rk.rand<Key>();
- for (Square s = SQ_A1; s <= SQ_H8; s++)
- zobEp[s] = rk.rand<Key>();
+ for (File f = FILE_A; f <= FILE_H; f++)
+ zobEp[f] = rk.rand<Key>();
for (int cr = CASTLES_NONE; cr <= ALL_CASTLES; cr++)
{