const Score TempoValue = make_score(48, 22);
// To convert a Piece to and from a FEN char
- const string PieceToChar(".PNBRQK pnbrqk ");
+ const string PieceToChar(" PNBRQK pnbrqk .");
}
void Position::copy(const Position& pos, int th) {
memcpy(this, &pos, sizeof(Position));
+ startState = *st;
st = &startState;
threadID = th;
nodes = 0;
Piece piece = piece_on(sq);
char c = (color_of(piece) == BLACK ? '=' : ' ');
- if (piece == PIECE_NONE && color_of(sq) == DARK)
- piece = PIECE_NONE_DARK_SQ;
+ if (piece == NO_PIECE && !opposite_colors(sq, SQ_A1))
+ piece++; // Index the dot
cout << c << PieceToChar[piece] << c << '|';
}
assert(square_is_ok(s));
- switch (p)
+ switch (type_of(p))
{
- case WB: case BB: return bishop_attacks_bb(s, occ);
- case WR: case BR: return rook_attacks_bb(s, occ);
- case WQ: case BQ: return bishop_attacks_bb(s, occ) | rook_attacks_bb(s, occ);
- default: return StepAttacksBB[p][s];
+ 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);
+ default : return StepAttacksBB[p][s];
}
}
assert(to == ep_square());
assert(piece_on(from) == make_piece(us, PAWN));
assert(piece_on(capsq) == make_piece(them, PAWN));
- assert(piece_on(to) == PIECE_NONE);
+ assert(piece_on(to) == NO_PIECE);
clear_bit(&b, from);
clear_bit(&b, capsq);
return move_is_legal(m);
// Is not a promotion, so promotion piece must be empty
- if (promotion_piece_type(m) - 2 != PIECE_TYPE_NONE)
+ if (promotion_piece_type(m) - 2 != NO_PIECE_TYPE)
return false;
// If the from square is not occupied by a piece belonging to the side to
// move, the move is obviously not legal.
- if (pc == PIECE_NONE || color_of(pc) != us)
+ if (pc == NO_PIECE || color_of(pc) != us)
return false;
// The destination square cannot be occupied by a friendly piece
assert(&newSt != st);
nodes++;
- Key key = st->key;
+ Key k = st->key;
// Copy some fields of old state to our new StateInfo object except the ones
// which are recalculated from scratch anyway, then switch our state pointer
st = &newSt;
// Update side to move
- key ^= zobSideToMove;
+ 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.
if (is_castle(m))
{
- st->key = key;
+ st->key = k;
do_castle_move<true>(m);
return;
}
assert(pt == PAWN);
assert(to == st->epSquare);
assert(relative_rank(us, to) == RANK_6);
- assert(piece_on(to) == PIECE_NONE);
+ assert(piece_on(to) == NO_PIECE);
assert(piece_on(capsq) == make_piece(them, PAWN));
- board[capsq] = PIECE_NONE;
+ board[capsq] = NO_PIECE;
}
st->pawnKey ^= zobrist[them][PAWN][capsq];
pieceList[them][capture][pieceCount[them][capture]] = SQ_NONE;
// Update hash keys
- key ^= zobrist[them][capture][capsq];
+ k ^= zobrist[them][capture][capsq];
st->materialKey ^= zobrist[them][capture][pieceCount[them][capture]];
// Update incremental scores
}
// Update hash key
- key ^= zobrist[us][pt][from] ^ zobrist[us][pt][to];
+ k ^= zobrist[us][pt][from] ^ zobrist[us][pt][to];
// Reset en passant square
if (st->epSquare != SQ_NONE)
{
- key ^= zobEp[st->epSquare];
+ k ^= zobEp[st->epSquare];
st->epSquare = SQ_NONE;
}
if ( st->castleRights != CASTLES_NONE
&& (castleRightsMask[from] & castleRightsMask[to]) != ALL_CASTLES)
{
- key ^= zobCastle[st->castleRights];
+ k ^= zobCastle[st->castleRights];
st->castleRights &= castleRightsMask[from] & castleRightsMask[to];
- key ^= zobCastle[st->castleRights];
+ k ^= zobCastle[st->castleRights];
}
// Prefetch TT access as soon as we know key is updated
- prefetch((char*)TT.first_entry(key));
+ prefetch((char*)TT.first_entry(k));
// Move the piece
Bitboard move_bb = make_move_bb(from, to);
do_move_bb(&occupied, move_bb);
board[to] = board[from];
- board[from] = PIECE_NONE;
+ board[from] = NO_PIECE;
// Update piece lists, index[from] is not updated and becomes stale. This
// works as long as index[] is accessed just by known occupied squares.
&& (attacks_from<PAWN>(from + pawn_push(us), us) & pieces(PAWN, them)))
{
st->epSquare = Square((from + to) / 2);
- key ^= zobEp[st->epSquare];
+ k ^= zobEp[st->epSquare];
}
if (is_promotion(m))
pieceList[us][promotion][index[to]] = to;
// Update hash keys
- key ^= zobrist[us][PAWN][to] ^ zobrist[us][promotion][to];
+ k ^= zobrist[us][PAWN][to] ^ zobrist[us][promotion][to];
st->pawnKey ^= zobrist[us][PAWN][to];
st->materialKey ^= zobrist[us][promotion][pieceCount[us][promotion]++]
^ zobrist[us][PAWN][pieceCount[us][PAWN]];
st->capturedType = capture;
// Update the key with the final value
- st->key = key;
+ st->key = k;
// Update checkers bitboard, piece must be already moved
st->checkersBB = 0;
do_move_bb(&occupied, move_bb);
board[from] = board[to];
- board[to] = PIECE_NONE;
+ board[to] = NO_PIECE;
// Update piece lists, index[to] is not updated and becomes stale. This
// works as long as index[] is accessed just by known occupied squares.
assert(pt == PAWN);
assert(to == st->previous->epSquare);
assert(relative_rank(us, to) == RANK_6);
- assert(piece_on(capsq) == PIECE_NONE);
+ assert(piece_on(capsq) == NO_PIECE);
}
// Restore the captured piece
// Update board
Piece king = make_piece(us, KING);
Piece rook = make_piece(us, ROOK);
- board[kfrom] = board[rfrom] = PIECE_NONE;
+ board[kfrom] = board[rfrom] = NO_PIECE;
board[kto] = king;
board[rto] = rook;
if (Do)
{
// Reset capture field
- st->capturedType = PIECE_TYPE_NONE;
+ st->capturedType = NO_PIECE_TYPE;
// Update incremental scores
st->value += pst_delta(king, kfrom, kto);
{
Square capQq = to - pawn_push(side_to_move());
- assert(capturedType == PIECE_TYPE_NONE);
+ assert(capturedType == NO_PIECE_TYPE);
assert(type_of(piece_on(capQq)) == PAWN);
// Remove the captured pawn
for (Square sq = SQ_A1; sq <= SQ_H8; sq++)
{
- board[sq] = PIECE_NONE;
+ board[sq] = NO_PIECE;
castleRightsMask[sq] = ALL_CASTLES;
}
sideToMove = WHITE;
zobSideToMove = rk.rand<Key>();
zobExclusion = rk.rand<Key>();
- for (Piece p = WP; p <= WK; p++)
+ for (Piece p = W_PAWN; p <= W_KING; p++)
{
Score ps = make_score(PieceValueMidgame[p], PieceValueEndgame[p]);
// Are the king squares in the position correct?
if (failedStep) (*failedStep)++;
- if (piece_on(king_square(WHITE)) != WK)
+ if (piece_on(king_square(WHITE)) != W_KING)
return false;
if (failedStep) (*failedStep)++;
- if (piece_on(king_square(BLACK)) != BK)
+ if (piece_on(king_square(BLACK)) != B_KING)
return false;
// Do both sides have exactly one king?
if (!can_castle(f))
continue;
- Piece rook = (f & (WHITE_OO | WHITE_OOO) ? WR : BR);
+ Piece rook = (f & (WHITE_OO | WHITE_OOO) ? W_ROOK : B_ROOK);
if ( castleRightsMask[castleRookSquare[f]] != (ALL_CASTLES ^ f)
|| piece_on(castleRookSquare[f]) != rook)