// pointer to point to the new, ready to be updated, state.
struct ReducedStateInfo {
Key key, pawnKey, materialKey;
- int castleRights, rule50;
+ int castleRights, rule50, pliesFromNull;
Square epSquare;
Value mgValue, egValue;
Value npMaterial[2];
// Increment the 50 moves rule draw counter. Resetting it to zero in the
// case of non-reversible moves is taken care of later.
st->rule50++;
+ st->pliesFromNull++;
if (move_is_castle(m))
{
rto = relative_square(us, SQ_D1);
}
- // Move the pieces
- Bitboard kmove_bb = make_move_bb(kfrom, kto);
- do_move_bb(&(byColorBB[us]), kmove_bb);
- do_move_bb(&(byTypeBB[KING]), kmove_bb);
- do_move_bb(&(byTypeBB[0]), kmove_bb); // HACK: byTypeBB[0] == occupied squares
-
- Bitboard rmove_bb = make_move_bb(rfrom, rto);
- do_move_bb(&(byColorBB[us]), rmove_bb);
- do_move_bb(&(byTypeBB[ROOK]), rmove_bb);
- do_move_bb(&(byTypeBB[0]), rmove_bb); // HACK: byTypeBB[0] == occupied squares
-
+ // Remove pieces from source squares:
+ clear_bit(&(byColorBB[us]), kfrom);
+ clear_bit(&(byTypeBB[KING]), kfrom);
+ clear_bit(&(byTypeBB[0]), kfrom); // HACK: byTypeBB[0] == occupied squares
+ clear_bit(&(byColorBB[us]), rfrom);
+ clear_bit(&(byTypeBB[ROOK]), rfrom);
+ clear_bit(&(byTypeBB[0]), rfrom); // HACK: byTypeBB[0] == occupied squares
+
+ // Put pieces on destination squares:
+ set_bit(&(byColorBB[us]), kto);
+ set_bit(&(byTypeBB[KING]), kto);
+ set_bit(&(byTypeBB[0]), kto); // HACK: byTypeBB[0] == occupied squares
+ set_bit(&(byColorBB[us]), rto);
+ set_bit(&(byTypeBB[ROOK]), rto);
+ set_bit(&(byTypeBB[0]), rto); // HACK: byTypeBB[0] == occupied squares
+
// Update board array
Piece king = piece_of_color_and_type(us, KING);
Piece rook = piece_of_color_and_type(us, ROOK);
pieceList[us][PAWN][index[to]] = to;
}
+
// Put the piece back at the source square
Bitboard move_bb = make_move_bb(to, from);
do_move_bb(&(byColorBB[us]), move_bb);
assert(piece_on(kto) == piece_of_color_and_type(us, KING));
assert(piece_on(rto) == piece_of_color_and_type(us, ROOK));
-
- // Put the pieces back at the source square
- Bitboard kmove_bb = make_move_bb(kto, kfrom);
- do_move_bb(&(byColorBB[us]), kmove_bb);
- do_move_bb(&(byTypeBB[KING]), kmove_bb);
- do_move_bb(&(byTypeBB[0]), kmove_bb); // HACK: byTypeBB[0] == occupied squares
-
- Bitboard rmove_bb = make_move_bb(rto, rfrom);
- do_move_bb(&(byColorBB[us]), rmove_bb);
- do_move_bb(&(byTypeBB[ROOK]), rmove_bb);
- do_move_bb(&(byTypeBB[0]), rmove_bb); // HACK: byTypeBB[0] == occupied squares
+
+ // Remove pieces from destination squares:
+ clear_bit(&(byColorBB[us]), kto);
+ clear_bit(&(byTypeBB[KING]), kto);
+ clear_bit(&(byTypeBB[0]), kto); // HACK: byTypeBB[0] == occupied squares
+ clear_bit(&(byColorBB[us]), rto);
+ clear_bit(&(byTypeBB[ROOK]), rto);
+ clear_bit(&(byTypeBB[0]), rto); // HACK: byTypeBB[0] == occupied squares
+
+ // Put pieces on source squares:
+ set_bit(&(byColorBB[us]), kfrom);
+ set_bit(&(byTypeBB[KING]), kfrom);
+ set_bit(&(byTypeBB[0]), kfrom); // HACK: byTypeBB[0] == occupied squares
+ set_bit(&(byColorBB[us]), rfrom);
+ set_bit(&(byTypeBB[ROOK]), rfrom);
+ set_bit(&(byTypeBB[0]), rfrom); // HACK: byTypeBB[0] == occupied squares
// Update board
board[rto] = board[kto] = EMPTY;
backupSt.mgValue = st->mgValue;
backupSt.egValue = st->egValue;
backupSt.previous = st->previous;
+ backupSt.pliesFromNull = st->pliesFromNull;
st->previous = &backupSt;
// Save the current key to the history[] array, in order to be able to
sideToMove = opposite_color(sideToMove);
st->epSquare = SQ_NONE;
st->rule50++;
+ st->pliesFromNull = 0;
gamePly++;
st->mgValue += (sideToMove == WHITE)? TempoValueMidgame : -TempoValueMidgame;
st->mgValue = backupSt->mgValue;
st->egValue = backupSt->egValue;
st->previous = backupSt->previous;
+ st->pliesFromNull = backupSt->pliesFromNull;
// Update the necessary information
sideToMove = opposite_color(sideToMove);
return true;
// Draw by repetition?
- for (int i = 2; i < Min(gamePly, st->rule50); i += 2)
+ for (int i = 2; i < Min(Min(gamePly, st->rule50), st->pliesFromNull); i += 2)
if (history[gamePly - i] == st->key)
return true;