X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fposition.cpp;h=690ca59bb4789319d53cce58b573ae01e6f159ac;hb=f25582d4b8860ff9fbe7dcf9873ed2986b1a7ed2;hp=77c0647a940b33165bd4217bfe1a090b5030a3d2;hpb=01a191936eeb3dc3366554b1423c53da2a1ae56a;p=stockfish diff --git a/src/position.cpp b/src/position.cpp index 77c0647a..690ca59b 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -42,7 +42,7 @@ Key Position::zobCastle[16]; Key Position::zobSideToMove; Key Position::zobExclusion; -Score Position::PieceSquareTable[16][64]; +Score Position::pieceSquareTable[16][64]; // Material values arrays, indexed by Piece const Value PieceValueMidgame[17] = { @@ -207,7 +207,7 @@ void Position::from_fen(const string& fen, bool isChess960) { // Various initialisations chess960 = isChess960; - find_checkers(); + st->checkersBB = attackers_to(king_square(sideToMove)) & pieces(opposite_color(sideToMove)); st->key = compute_key(); st->pawnKey = compute_pawn_key(); @@ -245,7 +245,7 @@ void Position::set_castling_rights(char token) { Square sqH = relative_square(c, SQ_H1); Square rsq, ksq = king_square(c); - token = toupper(token); + token = char(toupper(token)); if (token == 'K') for (rsq = sqH; piece_on(rsq) != make_piece(c, ROOK); rsq--) {} @@ -364,7 +364,7 @@ template Bitboard Position::hidden_checkers(Color c) const { Bitboard result = EmptyBoardBB; - Bitboard pinners = pieces_of_color(FindPinned ? opposite_color(c) : c); + Bitboard pinners = pieces(FindPinned ? opposite_color(c) : c); // Pinned pieces protect our king, dicovery checks attack // the enemy king. @@ -384,7 +384,7 @@ Bitboard Position::hidden_checkers(Color c) const { assert(b); if ( !(b & (b - 1)) // Only one bit set? - && (b & pieces_of_color(c))) // Is an our piece? + && (b & pieces(c))) // Is an our piece? result |= b; } return result; @@ -485,7 +485,7 @@ bool Position::move_attacks_square(Move m, Square s) const { do_move_bb(&occ, make_move_bb(f, t)); xray = ( (rook_attacks_bb(s, occ) & pieces(ROOK, QUEEN)) |(bishop_attacks_bb(s, occ) & pieces(BISHOP, QUEEN))) - & pieces_of_color(piece_color(piece_on(f))); + & pieces(piece_color(piece_on(f))); // If we have attacks we need to verify that are caused by our move // and are not already existent ones. @@ -493,19 +493,6 @@ bool Position::move_attacks_square(Move m, Square s) const { } -/// Position::find_checkers() computes the checkersBB bitboard, which -/// contains a nonzero bit for each checking piece (0, 1 or 2). It -/// currently works by calling Position::attackers_to, which is probably -/// inefficient. Consider rewriting this function to use the last move -/// played, like in non-bitboard versions of Glaurung. - -void Position::find_checkers() { - - Color us = side_to_move(); - st->checkersBB = attackers_to(king_square(us)) & pieces_of_color(opposite_color(us)); -} - - /// Position::pl_move_is_legal() tests whether a pseudo-legal move is legal bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { @@ -548,7 +535,7 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { // square is attacked by the opponent. Castling moves are checked // for legality during move generation. if (piece_type(piece_on(from)) == KING) - return move_is_castle(m) || !(attackers_to(move_to(m)) & pieces_of_color(opposite_color(us))); + return move_is_castle(m) || !(attackers_to(move_to(m)) & pieces(opposite_color(us))); // A non-king move is legal if and only if it is not pinned or it // is moving along the ray towards or away from the king. @@ -681,7 +668,7 @@ bool Position::move_is_pl(const Move m) const { { Bitboard b = occupied_squares(); clear_bit(&b, from); - if (attackers_to(move_to(m), b) & pieces_of_color(opposite_color(us))) + if (attackers_to(move_to(m), b) & pieces(opposite_color(us))) return false; } else @@ -1010,7 +997,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI if (moveIsCheck) { if (ep | pm) - st->checkersBB = attackers_to(king_square(them)) & pieces_of_color(us); + st->checkersBB = attackers_to(king_square(them)) & pieces(us); else { // Direct checks @@ -1188,7 +1175,7 @@ void Position::do_castle_move(Move m) { st->rule50 = 0; // Update checkers BB - st->checkersBB = attackers_to(king_square(them)) & pieces_of_color(us); + st->checkersBB = attackers_to(king_square(them)) & pieces(us); // Finish sideToMove = opposite_color(sideToMove); @@ -1491,7 +1478,7 @@ int Position::see(Move m) const { // If the opponent has no attackers we are finished stm = opposite_color(piece_color(piece_on(from))); - stmAttackers = attackers & pieces_of_color(stm); + stmAttackers = attackers & pieces(stm); if (!stmAttackers) return PieceValueMidgame[capturedType]; @@ -1529,7 +1516,7 @@ int Position::see(Move m) const { // move before beginning the next iteration. capturedType = pt; stm = opposite_color(stm); - stmAttackers = attackers & pieces_of_color(stm); + stmAttackers = attackers & pieces(stm); // Stop before processing a king capture if (capturedType == KING && stmAttackers) @@ -1763,11 +1750,11 @@ void Position::init() { for (Square s = SQ_A1; s <= SQ_H8; s++) for (Piece p = WP; p <= WK; p++) - PieceSquareTable[p][s] = make_score(MgPST[p][s], EgPST[p][s]); + pieceSquareTable[p][s] = make_score(MgPST[p][s], EgPST[p][s]); for (Square s = SQ_A1; s <= SQ_H8; s++) for (Piece p = BP; p <= BK; p++) - PieceSquareTable[p][s] = -PieceSquareTable[p-8][flip_square(s)]; + pieceSquareTable[p][s] = -pieceSquareTable[p-8][flip_square(s)]; } @@ -1807,7 +1794,7 @@ void Position::flip() { st->epSquare = flip_square(pos.st->epSquare); // Checkers - find_checkers(); + st->checkersBB = attackers_to(king_square(sideToMove)) & pieces(opposite_color(sideToMove)); // Hash keys st->key = compute_key(); @@ -1881,7 +1868,7 @@ bool Position::is_ok(int* failedStep) const { Color us = side_to_move(); Color them = opposite_color(us); Square ksq = king_square(them); - if (attackers_to(ksq) & pieces_of_color(us)) + if (attackers_to(ksq) & pieces(us)) return false; } @@ -1895,12 +1882,12 @@ bool Position::is_ok(int* failedStep) const { if (debugBitboards) { // The intersection of the white and black pieces must be empty - if ((pieces_of_color(WHITE) & pieces_of_color(BLACK)) != EmptyBoardBB) + if ((pieces(WHITE) & pieces(BLACK)) != EmptyBoardBB) return false; // The union of the white and black pieces must be equal to all // occupied squares - if ((pieces_of_color(WHITE) | pieces_of_color(BLACK)) != occupied_squares()) + if ((pieces(WHITE) | pieces(BLACK)) != occupied_squares()) return false; // Separate piece type bitboards must have empty intersections @@ -1965,10 +1952,10 @@ bool Position::is_ok(int* failedStep) const { for (PieceType pt = PAWN; pt <= KING; pt++) for (int i = 0; i < pieceCount[c][pt]; i++) { - if (piece_on(piece_list(c, pt, i)) != make_piece(c, pt)) + if (piece_on(piece_list(c, pt)[i]) != make_piece(c, pt)) return false; - if (index[piece_list(c, pt, i)] != i) + if (index[piece_list(c, pt)[i]] != i) return false; }