+ phasePtr = MainSearchTable;
+ }
+
+ ttMove = (ttm && pos.move_is_pl(ttm) ? ttm : MOVE_NONE);
+ phasePtr += int(ttMove == MOVE_NONE) - 1;
+ go_next_phase();
+}
+
+MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h, Square recaptureSq)
+ : pos(p), H(h) {
+
+ assert(d <= DEPTH_ZERO);
+
+ if (p.in_check())
+ phasePtr = EvasionTable;
+ else if (d >= DEPTH_QS_CHECKS)
+ phasePtr = QsearchWithChecksTable;
+ else if (d >= DEPTH_QS_RECAPTURES)
+ {
+ phasePtr = QsearchWithoutChecksTable;
+
+ // Skip TT move if is not a capture or a promotion, this avoids
+ // qsearch tree explosion due to a possible perpetual check or
+ // similar rare cases when TT table is full.
+ if (ttm != MOVE_NONE && !pos.move_is_capture_or_promotion(ttm))
+ ttm = MOVE_NONE;
+ }
+ else
+ {
+ phasePtr = QsearchRecapturesTable;
+ recaptureSquare = recaptureSq;
+ ttm = MOVE_NONE;
+ }
+
+ ttMove = (ttm && pos.move_is_pl(ttm) ? ttm : MOVE_NONE);
+ phasePtr += int(ttMove == MOVE_NONE) - 1;
+ go_next_phase();
+}
+
+MovePicker::MovePicker(const Position& p, Move ttm, const History& h, PieceType parentCapture)
+ : pos(p), H(h) {
+
+ assert (!pos.in_check());
+
+ // In ProbCut we consider only captures better than parent's move
+ captureThreshold = piece_value_midgame(Piece(parentCapture));
+ phasePtr = ProbCutTable;
+
+ if ( ttm != MOVE_NONE
+ && (!pos.move_is_capture(ttm) || pos.see(ttm) <= captureThreshold))
+ ttm = MOVE_NONE;
+
+ ttMove = (ttm && pos.move_is_pl(ttm) ? ttm : MOVE_NONE);
+ phasePtr += int(ttMove == MOVE_NONE) - 1;