X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=9376aa91ad5b06fbf06ca3f27a0b9a79f78e8db6;hp=f4b051ed762a31ac1b1ff48aa72bc82867d6e798;hb=ea5616785e7cc35808d75897282109c51e823caa;hpb=ec5b9994b55a32e0f8d8c6d9684c0f5fc0e4992a diff --git a/src/position.cpp b/src/position.cpp index f4b051ed..9376aa91 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -247,8 +247,8 @@ void Position::set_castle_right(Color c, Square rsq) { 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; } @@ -420,7 +420,7 @@ bool Position::move_attacks_square(Move m, Square s) const { 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)); @@ -452,7 +452,7 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { 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 @@ -467,7 +467,7 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { 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); @@ -517,7 +517,7 @@ bool Position::is_pseudo_legal(const Move m) const { 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)) @@ -608,11 +608,11 @@ bool Position::is_pseudo_legal(const Move m) const { { // 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 @@ -625,7 +625,7 @@ bool Position::is_pseudo_legal(const Move m) const { // 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; } } @@ -840,12 +840,11 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI } // 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 @@ -1151,9 +1150,8 @@ void Position::do_castle_move(Move m) { } // 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); @@ -1224,13 +1222,10 @@ int Position::see_sign(Move m) const { 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); @@ -1340,27 +1335,16 @@ int Position::see(Move m) const { 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; } @@ -1693,7 +1677,7 @@ bool Position::pos_is_ok(int* failedStep) const { 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 @@ -1779,8 +1763,8 @@ bool Position::pos_is_ok(int* failedStep) const { 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; }