-MovePicker::MovePicker(const Position& p, Move ttm, Depth d,
- const History& h, SearchStack* ss, bool useNullMove) : pos(p), H(h) {
- ttMoves[0] = ttm;
- if (ss)
+MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h,
+ SearchStack* ss, Value beta) : pos(p), H(h), depth(d) {
+ captureThreshold = 0;
+ badCaptures = moves + MAX_MOVES;
+
+ assert(d > DEPTH_ZERO);
+
+ if (p.in_check())
+ {
+ killers[0].move = killers[1].move = MOVE_NONE;
+ phasePtr = EvasionTable;
+ }
+ else
+ {
+ killers[0].move = ss->killers[0];
+ killers[1].move = ss->killers[1];
+
+ // Consider sligtly negative captures as good if at low
+ // depth and far from beta.
+ if (ss && ss->eval < beta - PawnValueMidgame && d < 3 * ONE_PLY)
+ captureThreshold = -PawnValueMidgame;
+
+ 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)