From d9b96f0e492583bfb461e7e3c9510ddeae1e3fce Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 8 Jan 2011 13:06:51 +0100 Subject: [PATCH] Fix reading a book under-promotion move This is an old Glaurung bug that prevented a Polyglot book move to be read correctly in case of underpromotion. This patch fixes the bug restoring support for both queen and underpromotions. No functional change. Signed-off-by: Marco Costalba --- src/book.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/book.cpp b/src/book.cpp index 7b5be186..85a88fcb 100644 --- a/src/book.cpp +++ b/src/book.cpp @@ -435,11 +435,27 @@ Move Book::get_move(const Position& pos, bool findBestMove) { if (!bookMove) return MOVE_NONE; + // A PolyGlot book move is encoded as follows: + // + // bit 0- 5: destination square (from 0 to 63) + // bit 6-11: origin square (from 0 to 63) + // bit 12-13-14: promotion piece (from KNIGHT == 1 to QUEEN == 4) + // + // Castling moves follow "king captures rook" representation. So in case + // book move is a promotion we have to convert to our representation, in + // all other cases we can directly compare with a Move after having + // masked out special Move's flags that are not supported by PolyGlot. + int p = (bookMove >> 12) & 7; + + if (p) + bookMove = int(make_promotion_move(move_from(Move(bookMove)), + move_to(Move(bookMove)), PieceType(p + 1))); + // Verify the book move is legal MoveStack mlist[MOVES_MAX]; MoveStack* last = generate(pos, mlist); for (MoveStack* cur = mlist; cur != last; cur++) - if ((int(cur->move) & 07777) == bookMove) + if ((int(cur->move) & ~(3 << 14)) == bookMove) // Mask out special flags return cur->move; return MOVE_NONE; -- 2.39.2