- /// Variables
-
- MovePicker::MovegenPhase PhaseTable[32];
- int MainSearchPhaseIndex;
- int EvasionsPhaseIndex;
- int QsearchWithChecksPhaseIndex;
- int QsearchWithoutChecksPhaseIndex;
-
-}
-
-
-
-////
-//// Functions
-////
-
-
-/// Constructor for the MovePicker class. Apart from the position for which
-/// it is asked to pick legal moves, MovePicker also wants some information
-/// to help it to return the presumably good moves first, to decide which
-/// moves to return (in the quiescence search, for instance, we only want to
-/// search captures, promotions and some checks) and about how important good
-/// move ordering is at the current node.
-
-MovePicker::MovePicker(const Position& p, bool pv, Move ttm,
- const SearchStack& ss, Depth d) : pos(p) {
- pvNode = pv;
- ttMove = ttm;
- mateKiller = (ss.mateKiller == ttm)? MOVE_NONE : ss.mateKiller;
- killer1 = ss.killers[0];
- killer2 = ss.killers[1];
- depth = d;
- movesPicked = 0;
- numOfMoves = 0;
- numOfBadCaptures = 0;
-
- if (p.is_check())
- phaseIndex = EvasionsPhaseIndex;
- else if (depth > Depth(0))
- phaseIndex = MainSearchPhaseIndex;
- else if (depth == Depth(0))
- phaseIndex = QsearchWithChecksPhaseIndex;
- else
- phaseIndex = QsearchWithoutChecksPhaseIndex;
-
- Color us = pos.side_to_move();
-
- dc = p.discovered_check_candidates(us);
- pinned = p.pinned_pieces(us);
-
- finished = false;
-}
-
-
-/// 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;
+ enum Stages {
+ MAIN_TT, CAPTURE_INIT, GOOD_CAPTURE, REFUTATION, QUIET_INIT, QUIET, BAD_CAPTURE,
+ EVASION_TT, EVASION_INIT, EVASION,
+ PROBCUT_TT, PROBCUT_INIT, PROBCUT,
+ QSEARCH_TT, QCAPTURE_INIT, QCAPTURE, QCHECK_INIT, QCHECK
+ };