- assert(n < 32);
- swapList[n] = -swapList[n - 1] + lastCapturingPieceValue;
- n++;
-
- // Remember the value of the capturing piece, and change the side to move
- // before beginning the next iteration
- lastCapturingPieceValue = seeValues[pt];
- c = opposite_color(c);
- stmAttackers = attackers & pieces_of_color(c);
-
- // Stop after a king capture
- if (pt == KING && stmAttackers)
- {
- assert(n < 32);
- swapList[n++] = QueenValueMidgame*10;
- break;
- }
- } while (stmAttackers);
-
- // Having built the swap list, we negamax through it to find the best
- // achievable score from the point of view of the side to move
- while (--n)
- swapList[n-1] = Min(-swapList[n], swapList[n-1]);
-
- return swapList[0];
-}
-
-
-/// Position::clear() erases the position object to a pristine state, with an
-/// empty board, white to move, and no castling rights.
-
-void Position::clear() {
-
- 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 < 64; i++)
- board[i] = EMPTY;
-
- 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++)
- castleRightsMask[sq] = ALL_CASTLES;
-
- sideToMove = WHITE;
- initialKFile = FILE_E;
- initialKRFile = FILE_H;
- initialQRFile = FILE_A;
-}
-
-
-/// Position::reset_game_ply() simply sets gamePly to 0. It is used from the
-/// UCI interface code, whenever a non-reversible move is made in a
-/// 'position fen <fen> moves m1 m2 ...' command. This makes it possible
-/// for the program to handle games of arbitrary length, as long as the GUI
-/// handles draws by the 50 move rule correctly.
-
-void Position::reset_game_ply() {
-
- st->gamePly = 0;
-}
-
-
-/// Position::put_piece() puts a piece on the given square of the board,
-/// updating the board array, bitboards, and piece counts.
-
-void Position::put_piece(Piece p, Square s) {
-
- Color c = color_of_piece(p);
- PieceType pt = type_of_piece(p);
-
- board[s] = p;
- index[s] = pieceCount[c][pt];
- pieceList[c][pt][index[s]] = s;
-
- set_bit(&(byTypeBB[pt]), s);
- set_bit(&(byColorBB[c]), s);
- set_bit(&byTypeBB[0], s); // HACK: byTypeBB[0] contains all occupied squares.
-
- pieceCount[c][pt]++;
-}
-
-
-/// Position::allow_oo() gives the given side the right to castle kingside.
-/// Used when setting castling rights during parsing of FEN strings.
-
-void Position::allow_oo(Color c) {
-
- st->castleRights |= (1 + int(c));
-}
-
-
-/// Position::allow_ooo() gives the given side the right to castle queenside.
-/// Used when setting castling rights during parsing of FEN strings.
-
-void Position::allow_ooo(Color c) {
-
- st->castleRights |= (4 + 4*int(c));
-}
-
-
-/// Position::compute_key() computes the hash key of the position. The hash
-/// key is usually updated incrementally as moves are made and unmade, the
-/// compute_key() function is only used when a new position is set up, and
-/// to verify the correctness of the hash key when running in debug mode.
-
-Key Position::compute_key() const {
-
- Key result = Key(0ULL);
-
- for (Square s = SQ_A1; s <= SQ_H8; s++)
- if (square_is_occupied(s))
- result ^= zobrist[color_of_piece_on(s)][type_of_piece_on(s)][s];
-
- if (ep_square() != SQ_NONE)
- result ^= zobEp[ep_square()];
-
- result ^= zobCastle[st->castleRights];
- if (side_to_move() == BLACK)
- result ^= zobSideToMove;
-
- return result;
-}
-
-
-/// Position::compute_pawn_key() computes the hash key of the position. The
-/// hash key is usually updated incrementally as moves are made and unmade,
-/// the compute_pawn_key() function is only used when a new position is set
-/// up, and to verify the correctness of the pawn hash key when running in
-/// debug mode.
-
-Key Position::compute_pawn_key() const {