-
-/// MovePicker::get_next_move() is the most important method of the MovePicker
-/// class. It returns a new legal move every time it is called, until there
-/// are no more moves left of the types we are interested in.
-
-Move MovePicker::get_next_move() {
-
- Move move;
-
- while (true)
- {
- // If we already have a list of generated moves, pick the best move from
- // the list, and return it.
- move = pick_move_from_list();
- if (move != MOVE_NONE)
- {
- assert(move_is_ok(move));
- return move;
- }
-
- // Next phase
- phaseIndex++;
- switch (PhaseTable[phaseIndex]) {
-
- case PH_TT_MOVE:
- if (ttMove != MOVE_NONE)
- {
- assert(move_is_ok(ttMove));
- if (move_is_legal(pos, ttMove, pinned))
- return ttMove;
- }
- break;
-
- case PH_MATE_KILLER:
- if (mateKiller != MOVE_NONE)
- {
- assert(move_is_ok(mateKiller));
- if (move_is_legal(pos, mateKiller, pinned))
- return mateKiller;
- }
- break;
-
- case PH_GOOD_CAPTURES:
- numOfMoves = generate_captures(pos, moves);
- score_captures();
- std::sort(moves, moves + numOfMoves);
- movesPicked = 0;
- checkLegal = true;
- break;
-
- case PH_KILLERS:
- movesPicked = numOfMoves = 0;
- checkLegal = false;
- if (killer1 != MOVE_NONE && move_is_legal(pos, killer1, pinned) && !pos.move_is_capture(killer1))
- moves[numOfMoves++].move = killer1;
- if (killer2 != MOVE_NONE && move_is_legal(pos, killer2, pinned) && !pos.move_is_capture(killer2) )
- moves[numOfMoves++].move = killer2;
- break;
-
- case PH_NONCAPTURES:
- checkKillers = (numOfMoves != 0); // previous phase is PH_KILLERS
- numOfMoves = generate_noncaptures(pos, moves);
- score_noncaptures();
- std::sort(moves, moves + numOfMoves);
- movesPicked = 0;
- checkLegal = true;
- break;
-
- case PH_BAD_CAPTURES:
- // It's probably a good idea to use SEE move ordering here. FIXME
- movesPicked = 0;
- break;
-
- case PH_EVASIONS:
- assert(pos.is_check());
- numOfMoves = generate_evasions(pos, moves, pinned);
- score_evasions();
- std::sort(moves, moves + numOfMoves);
- movesPicked = 0;
- break;
-
- case PH_QCAPTURES:
- numOfMoves = generate_captures(pos, moves);
- score_qcaptures();
- std::sort(moves, moves + numOfMoves);
- movesPicked = 0;
- break;
-
- case PH_QCHECKS:
- // Perhaps we should order moves move here? FIXME
- numOfMoves = generate_non_capture_checks(pos, moves, dc);
- movesPicked = 0;
- break;
-
- case PH_STOP:
- return MOVE_NONE;
-
- default:
- assert(false);
- return MOVE_NONE;
- }
- }
+/// MovePicker constructor for quiescence search
+MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const ButterflyHistory* mh,
+ const CapturePieceToHistory* cph,
+ const PieceToHistory** ch,
+ Square rs)
+ : pos(p), mainHistory(mh), captureHistory(cph), continuationHistory(ch), ttMove(ttm), recaptureSquare(rs), depth(d)
+{
+ assert(d <= 0);
+
+ stage = (pos.checkers() ? EVASION_TT : QSEARCH_TT) +
+ !( ttm
+ && (pos.checkers() || depth > DEPTH_QS_RECAPTURES || to_sq(ttm) == recaptureSquare)
+ && pos.pseudo_legal(ttm));