Code: Select all
bool Tablebase::ProbeLeaf(Engine* engine, Color color, int& scoreOut) const
{
const BitboardBoard& board = engine->GetBitboardBoard();
if (!Probeable(board))
return false;
// Flip vertically so LSB is a8 (seems to be the expected format)
uint64_t white = flipVertical(board.allPieces[0]);
uint64_t black = flipVertical(board.allPieces[1]);
uint64_t kings = flipVertical(board.pieceBitboards[0][static_cast<int>(Pieces::KING) - 1] | board.pieceBitboards[1][static_cast<int>(Pieces::KING) - 1]);
uint64_t queens = flipVertical(board.pieceBitboards[0][static_cast<int>(Pieces::QUEEN) - 1] | board.pieceBitboards[1][static_cast<int>(Pieces::QUEEN) - 1]);
uint64_t rooks = flipVertical(board.pieceBitboards[0][static_cast<int>(Pieces::ROOK) - 1] | board.pieceBitboards[1][static_cast<int>(Pieces::ROOK) - 1]);
uint64_t bishops = flipVertical(board.pieceBitboards[0][static_cast<int>(Pieces::BISHOP) - 1] | board.pieceBitboards[1][static_cast<int>(Pieces::BISHOP) - 1]);
uint64_t knights = flipVertical(board.pieceBitboards[0][static_cast<int>(Pieces::KNIGHT) - 1] | board.pieceBitboards[1][static_cast<int>(Pieces::KNIGHT) - 1]);
uint64_t pawns = flipVertical(board.pieceBitboards[0][static_cast<int>(Pieces::PAWN) - 1] | board.pieceBitboards[1][static_cast<int>(Pieces::PAWN) - 1]);
unsigned rule50 = GameState::halfmoves;
unsigned castling = 0;
unsigned ep = (GameState::enPassantTarget == -1) ? 0 : GameState::enPassantTarget;
bool turn = (color == Color::WHITE);
unsigned wdl = tb_probe_wdl(
white, black, kings, queens, rooks, bishops,
knights, pawns, 0, castling, ep, turn);
if (wdl == TB_RESULT_FAILED)
{
std::cout << "Failed\n";
return false;
}
int dtz = 0;
unsigned result = tb_probe_root(
white, black, kings, queens, rooks, bishops,
knights, pawns, rule50, castling, ep, turn, nullptr);
if (result != TB_RESULT_FAILED)
dtz = TB_GET_DTZ(result);
switch (wdl)
{
case TB_WIN:
case TB_CURSED_WIN:
scoreOut = MATE_VAL - dtz;
return true;
case TB_DRAW:
scoreOut = 0;
return true;
case TB_LOSS:
case TB_BLESSED_LOSS:
scoreOut = -(MATE_VAL - dtz);
return true;
default:
return false;
}
}