set_bit(&(byTypeBB[promotion]), to);
board[to] = piece_of_color_and_type(us, promotion);
+ // Update material key
+ st->materialKey ^= zobMaterial[us][PAWN][pieceCount[us][PAWN]];
+ st->materialKey ^= zobMaterial[us][promotion][pieceCount[us][promotion]+1];
+
// Update piece counts
pieceCount[us][PAWN]--;
pieceCount[us][promotion]++;
key ^= zobrist[us][PAWN][to] ^ zobrist[us][promotion][to];
st->pawnKey ^= zobrist[us][PAWN][to];
- // Update material key
- st->materialKey ^= zobMaterial[us][PAWN][pieceCount[us][PAWN]];
- st->materialKey ^= zobMaterial[us][promotion][pieceCount[us][promotion]+1];
-
// Partially revert and update incremental scores
st->mgValue -= pst<MidGame>(us, PAWN, to);
st->mgValue += pst<MidGame>(us, promotion, to);
st->mgValue += (sideToMove == WHITE)? TempoValueMidgame : -TempoValueMidgame;
st->egValue += (sideToMove == WHITE)? TempoValueEndgame : -TempoValueEndgame;
+
+ assert(is_ok());
}
pieceCount[them][capture]--;
// Update piece list, move the last piece at index[capsq] position
+ //
+ // WARNING: This is a not perfectly revresible operation. When we
+ // will reinsert the captured piece in undo_move() we will put it
+ // at the end of the list and not in its original place, it means
+ // index[] and pieceList[] are not guaranteed to be invariant to a
+ // do_move() + undo_move() sequence.
Square lastPieceSquare = pieceList[them][capture][pieceCount[them][capture]];
index[lastPieceSquare] = index[capsq];
pieceList[them][capture][index[lastPieceSquare]] = lastPieceSquare;
void Position::do_castle_move(Move m) {
- assert(is_ok());
assert(move_is_ok(m));
assert(move_is_castle(m));
st->mgValue += (sideToMove == WHITE)? TempoValueMidgame : -TempoValueMidgame;
st->egValue += (sideToMove == WHITE)? TempoValueEndgame : -TempoValueEndgame;
+
+ assert(is_ok());
}
// Finally point our state pointer back to the previous state
st = st->previous;
+
+ assert(is_ok());
}
// Finally point our state pointer back to the previous state
st = st->previous;
+
+ assert(is_ok());
}
// Locate the least valuable attacker to the destination square
// and use it to initialize from square.
+ stmAttackers = attackers & pieces_of_color(us);
PieceType pt;
- for (pt = PAWN; !(attackers & pieces_of_color_and_type(us, pt)); pt++)
+ for (pt = PAWN; !(stmAttackers & pieces_of_type(pt)); pt++)
assert(pt < KING);
- from = first_1(attackers & pieces_of_color_and_type(us, pt));
+ from = first_1(stmAttackers & pieces_of_type(pt));
piece = piece_on(from);
}
for (Color c = WHITE; c <= BLACK; c++)
for (PieceType pt = PAWN; pt <= KING; pt++)
{
- b = pieces_of_color_and_type(c, pt);
+ b = pieces_of_color(c) & pieces_of_type(pt);
while(b)
{
s = pop_1st_bit(&b);
for (PieceType pt = KNIGHT; pt <= QUEEN; pt++)
{
- Bitboard b = pieces_of_color_and_type(c, pt);
+ Bitboard b = pieces_of_color(c) & pieces_of_type(pt);
while (b)
{
assert(piece_on(first_1(b)) == piece_of_color_and_type(c, pt));
MoveStack moves[256];
- return is_check() && !generate_evasions(*this, moves, pinned_pieces(sideToMove));
+ return is_check() && (generate_evasions(*this, moves, pinned_pieces(sideToMove)) == moves);
}
do_null_move(st1);
MoveStack mlist[120];
- int count;
bool result = false;
Bitboard dc = discovered_check_candidates(sideToMove);
Bitboard pinned = pinned_pieces(sideToMove);
// Generate pseudo-legal non-capture and capture check moves
- count = generate_non_capture_checks(*this, mlist, dc);
- count += generate_captures(*this, mlist + count);
+ MoveStack* last = generate_non_capture_checks(*this, mlist, dc);
+ last = generate_captures(*this, last);
// Loop through the moves, and see if one of them is mate
- for (int i = 0; i < count; i++)
+ for (MoveStack* cur = mlist; cur != last; cur++)
{
- Move move = mlist[i].move;
-
+ Move move = cur->move;
if (!pl_move_is_legal(move, pinned))
continue;
if (debugPieceCounts)
for (Color c = WHITE; c <= BLACK; c++)
for (PieceType pt = PAWN; pt <= KING; pt++)
- if (pieceCount[c][pt] != count_1s(pieces_of_color_and_type(c, pt)))
+ if (pieceCount[c][pt] != count_1s(pieces_of_color(c) & pieces_of_type(pt)))
return false;
if (failedStep) (*failedStep)++;
for(PieceType pt = PAWN; pt <= KING; pt++)
for(int i = 0; i < pieceCount[c][pt]; i++)
{
- if (piece_on(piece_list(c, pt, i)) != piece_of_color_and_type(c, pt))
+ if (piece_on(piece_list(c, pt, i)) != (pieces_of_color(c) & pieces_of_type(pt)))
return false;
if (index[piece_list(c, pt, i)] != i)