X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=c673225737b2906d428743b8a6f034d60d75d1c9;hp=025a2d722af3ab15a5a3b2cd57fdf1356474b55b;hb=97dd7568edf74f8797e152258ebe30ecdc8bac0d;hpb=e01fefbbaf2c1c70bc5720105855b3b1e2150cd8 diff --git a/src/position.cpp b/src/position.cpp index 025a2d72..c6732257 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -829,6 +829,10 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { 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]++; @@ -845,10 +849,6 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { 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(us, PAWN, to); st->mgValue += pst(us, promotion, to); @@ -886,6 +886,8 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { st->mgValue += (sideToMove == WHITE)? TempoValueMidgame : -TempoValueMidgame; st->egValue += (sideToMove == WHITE)? TempoValueEndgame : -TempoValueEndgame; + + assert(is_ok()); } @@ -937,6 +939,12 @@ void Position::do_capture_move(Bitboard& key, PieceType capture, Color them, Squ 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; @@ -953,7 +961,6 @@ void Position::do_capture_move(Bitboard& key, PieceType capture, Color them, Squ void Position::do_castle_move(Move m) { - assert(is_ok()); assert(move_is_ok(m)); assert(move_is_castle(m)); @@ -1042,6 +1049,8 @@ void Position::do_castle_move(Move m) { st->mgValue += (sideToMove == WHITE)? TempoValueMidgame : -TempoValueMidgame; st->egValue += (sideToMove == WHITE)? TempoValueEndgame : -TempoValueEndgame; + + assert(is_ok()); } @@ -1146,6 +1155,8 @@ void Position::undo_move(Move m) { // Finally point our state pointer back to the previous state st = st->previous; + + assert(is_ok()); } @@ -1210,6 +1221,8 @@ void Position::undo_castle_move(Move m) { // Finally point our state pointer back to the previous state st = st->previous; + + assert(is_ok()); } @@ -1689,7 +1702,7 @@ bool Position::is_mate() const { MoveStack moves[256]; - return is_check() && !generate_evasions(*this, moves, pinned_pieces(sideToMove)); + return is_check() && (generate_evasions(*this, moves, pinned_pieces(sideToMove)) == moves); } @@ -1709,20 +1722,18 @@ bool Position::has_mate_threat(Color c) { 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;