- while (true)
- {
- while (cur == endMoves && stage != STOP)
- generate_next_stage();
-
- switch (stage) {
-
- case MAIN_SEARCH: case EVASION: case QSEARCH_WITH_CHECKS:
- case QSEARCH_WITHOUT_CHECKS: case PROBCUT:
- ++cur;
- return ttMove;
-
- case GOOD_CAPTURES:
- move = pick_best(cur++, endMoves);
- if (move != ttMove)
- {
- if (pos.see_sign(move) >= VALUE_ZERO)
- return move;
-
- // Losing capture, move it to the tail of the array
- *endBadCaptures-- = move;
- }
- break;
-
- case KILLERS:
- move = *cur++;
- if ( move != MOVE_NONE
- && move != ttMove
- && pos.pseudo_legal(move)
- && !pos.capture(move))
- return move;
- break;
-
- case GOOD_QUIETS: case BAD_QUIETS:
- move = *cur++;
- if ( move != ttMove
- && move != killers[0]
- && move != killers[1]
- && move != killers[2])
- return move;
- break;
-
- case BAD_CAPTURES:
- return *cur--;
-
- case ALL_EVASIONS: case QCAPTURES_1: case QCAPTURES_2:
- move = pick_best(cur++, endMoves);
- if (move != ttMove)
- return move;
- break;
-
- case PROBCUT_CAPTURES:
- move = pick_best(cur++, endMoves);
- if (move != ttMove && pos.see(move) > threshold)
- return move;
- break;
-
- case RECAPTURES:
- move = pick_best(cur++, endMoves);
- if (to_sq(move) == recaptureSquare)
- return move;
- break;
-
- case CHECKS:
- move = *cur++;
- if (move != ttMove)
- return move;
- break;
-
- case STOP:
+ // If we did not find any move and we do not try checks, we have finished
+ if (depth != DEPTH_QS_CHECKS)