X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fposition.cpp;h=ef510766afcd592e8e29b19f0e88a464447b51b9;hb=3441e0075decb1acd8d3b4020b7822f743613124;hp=5ee0107f4252ec59f7dedbbea6ab85aa60e07292;hpb=a492a9dd079d95faf136a744ff6d47a3d109ad68;p=stockfish diff --git a/src/position.cpp b/src/position.cpp index 5ee0107f..ef510766 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -386,8 +386,8 @@ Bitboard Position::attackers_to(Square s, Bitboard occ) const { return (attacks_from(s, BLACK) & pieces(PAWN, WHITE)) | (attacks_from(s, WHITE) & pieces(PAWN, BLACK)) | (attacks_from(s) & pieces(KNIGHT)) - | (rook_attacks_bb(s, occ) & pieces(ROOK, QUEEN)) - | (bishop_attacks_bb(s, occ) & pieces(BISHOP, QUEEN)) + | (attacks_bb(s, occ) & pieces(ROOK, QUEEN)) + | (attacks_bb(s, occ) & pieces(BISHOP, QUEEN)) | (attacks_from(s) & pieces(KING)); } @@ -401,9 +401,9 @@ Bitboard Position::attacks_from(Piece p, Square s, Bitboard occ) { switch (type_of(p)) { - case BISHOP: return bishop_attacks_bb(s, occ); - case ROOK : return rook_attacks_bb(s, occ); - case QUEEN : return bishop_attacks_bb(s, occ) | rook_attacks_bb(s, occ); + case BISHOP: return attacks_bb(s, occ); + case ROOK : return attacks_bb(s, occ); + case QUEEN : return attacks_bb(s, occ) | attacks_bb(s, occ); default : return StepAttacksBB[p][s]; } } @@ -434,8 +434,8 @@ bool Position::move_attacks_square(Move m, Square s) const { return true; // Scan for possible X-ray attackers behind the moved piece - xray = (rook_attacks_bb(s, occ) & pieces(ROOK, QUEEN, color_of(piece))) - |(bishop_attacks_bb(s, occ) & pieces(BISHOP, QUEEN, color_of(piece))); + xray = (attacks_bb(s, occ) & pieces(ROOK, QUEEN, color_of(piece))) + |(attacks_bb(s, occ) & pieces(BISHOP, QUEEN, color_of(piece))); // Verify attackers are triggered by our move and not already existing return xray && (xray ^ (xray & attacks_from(s))); @@ -475,8 +475,8 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { b ^= capsq; b |= to; - return !(rook_attacks_bb(ksq, b) & pieces(ROOK, QUEEN, them)) - && !(bishop_attacks_bb(ksq, b) & pieces(BISHOP, QUEEN, them)); + return !(attacks_bb(ksq, b) & pieces(ROOK, QUEEN, them)) + && !(attacks_bb(ksq, b) & pieces(BISHOP, QUEEN, them)); } // If the moving piece is a king, check whether the destination @@ -684,8 +684,8 @@ bool Position::move_gives_check(Move m, const CheckInfo& ci) const { b ^= from; b ^= capsq; b |= to; - return (rook_attacks_bb(ksq, b) & pieces(ROOK, QUEEN, us)) - ||(bishop_attacks_bb(ksq, b) & pieces(BISHOP, QUEEN, us)); + return (attacks_bb(ksq, b) & pieces(ROOK, QUEEN, us)) + ||(attacks_bb(ksq, b) & pieces(BISHOP, QUEEN, us)); } // Castling with check ? @@ -707,7 +707,7 @@ bool Position::move_gives_check(Move m, const CheckInfo& ci) const { b ^= rfrom; b |= rto; b |= kto; - return rook_attacks_bb(rto, b) & ksq; + return attacks_bb(rto, b) & ksq; } return false; @@ -752,7 +752,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI k ^= zobSideToMove; // Increment the 50 moves rule draw counter. Resetting it to zero in the - // case of non-reversible moves is taken care of later. + // case of a capture or a pawn move is taken care of later. st->rule50++; st->pliesFromNull++; @@ -843,9 +843,9 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI if ( st->castleRights != CASTLES_NONE && (castleRightsMask[from] & castleRightsMask[to]) != ALL_CASTLES) { - k ^= zobCastle[st->castleRights]; - st->castleRights &= castleRightsMask[from] & castleRightsMask[to]; - k ^= zobCastle[st->castleRights]; + int cr = castleRightsMask[from] & castleRightsMask[to]; + k ^= zobCastle[st->castleRights & (cr ^ ALL_CASTLES)]; + st->castleRights &= cr; } // Prefetch TT access as soon as we know key is updated @@ -1151,12 +1151,9 @@ void Position::do_castle_move(Move m) { } // Update castling rights - st->key ^= zobCastle[st->castleRights]; - st->castleRights &= castleRightsMask[kfrom]; - st->key ^= zobCastle[st->castleRights]; - - // Reset rule 50 counter - st->rule50 = 0; + int cr = castleRightsMask[kfrom]; + st->key ^= zobCastle[st->castleRights & (cr ^ ALL_CASTLES)]; + st->castleRights &= cr; // Update checkers BB st->checkersBB = attackers_to(king_square(~us)) & pieces(us); @@ -1304,8 +1301,8 @@ int Position::see(Move m) const { // and scan for new X-ray attacks behind the attacker. b = stmAttackers & pieces(pt); occ ^= (b & (~b + 1)); - attackers |= (rook_attacks_bb(to, occ) & pieces(ROOK, QUEEN)) - | (bishop_attacks_bb(to, occ) & pieces(BISHOP, QUEEN)); + attackers |= (attacks_bb(to, occ) & pieces(ROOK, QUEEN)) + | (attacks_bb(to, occ) & pieces(BISHOP, QUEEN)); attackers &= occ; // Cut out pieces we've already done @@ -1548,8 +1545,15 @@ void Position::init() { for (Square s = SQ_A1; s <= SQ_H8; s++) zobEp[s] = rk.rand(); - for (int i = 0; i < 16; i++) - zobCastle[i] = rk.rand(); + for (int cr = CASTLES_NONE; cr <= ALL_CASTLES; cr++) + { + Bitboard b = cr; + while (b) + { + Key k = zobCastle[1 << pop_1st_bit(&b)]; + zobCastle[cr] ^= k ? k : rk.rand(); + } + } zobSideToMove = rk.rand(); zobExclusion = rk.rand();