- switch (stage) {
-
- case MAIN_TT:
- case EVASION_TT:
- case QSEARCH_TT:
- case PROBCUT_TT:
- ++stage;
- return ttMove;
-
- case CAPTURE_INIT:
- case PROBCUT_INIT:
- case QCAPTURE_INIT:
- cur = endBadCaptures = moves;
- endMoves = generate<CAPTURES>(pos, cur);
-
- score<CAPTURES>();
- ++stage;
- goto top;
-
- case GOOD_CAPTURE:
- if (select<Best>([&](){
- return pos.see_ge(move, Value(-55 * (cur-1)->value / 1024)) ?
- // Move losing capture to endBadCaptures to be tried later
- true : (*endBadCaptures++ = move, false); }))
- return move;
-
- // Prepare the pointers to loop over the refutations array
- cur = std::begin(refutations);
- endMoves = std::end(refutations);
-
- // If the countermove is the same as a killer, skip it
- if ( refutations[0].move == refutations[2].move
- || refutations[1].move == refutations[2].move)
- --endMoves;
-
- ++stage;
- /* fallthrough */
-
- case REFUTATION:
- if (select<Next>([&](){ return move != MOVE_NONE
- && !pos.capture(move)
- && pos.pseudo_legal(move); }))
- return move;
- ++stage;
- /* fallthrough */
-
- case QUIET_INIT:
- cur = endBadCaptures;
- endMoves = generate<QUIETS>(pos, cur);
-
- score<QUIETS>();
- partial_insertion_sort(cur, endMoves, -4000 * depth / ONE_PLY);
- ++stage;
- /* fallthrough */
-
- case QUIET:
- if ( !skipQuiets
- && select<Next>([&](){return move != refutations[0]
- && move != refutations[1]
- && move != refutations[2];}))
- return move;
-
- // Prepare the pointers to loop over the bad captures
- cur = moves;
- endMoves = endBadCaptures;
-
- ++stage;
- /* fallthrough */
-
- case BAD_CAPTURE:
- return select<Next>(Any);
-
- case EVASION_INIT:
- cur = moves;
- endMoves = generate<EVASIONS>(pos, cur);
-
- score<EVASIONS>();
- ++stage;
- /* fallthrough */
-
- case EVASION:
- return select<Best>(Any);
-
- case PROBCUT:
- return select<Best>([&](){ return pos.see_ge(move, threshold); });
-
- case QCAPTURE:
- if (select<Best>([&](){ return depth > DEPTH_QS_RECAPTURES
- || to_sq(move) == recaptureSquare; }))
- return move;
-
- // If we did not find any move and we do not try checks, we have finished
- if (depth != DEPTH_QS_CHECKS)
- return MOVE_NONE;
-
- ++stage;
- /* fallthrough */
-
- case QCHECK_INIT:
- cur = moves;
- endMoves = generate<QUIET_CHECKS>(pos, cur);
-
- ++stage;
- /* fallthrough */
-
- case QCHECK:
- return select<Next>(Any);
- }
-
- assert(false);
- return MOVE_NONE; // Silence warning
+ switch (stage)
+ {
+
+ case MAIN_TT :
+ case EVASION_TT :
+ case QSEARCH_TT :
+ case PROBCUT_TT :
+ ++stage;
+ return ttMove;
+
+ case CAPTURE_INIT :
+ case PROBCUT_INIT :
+ case QCAPTURE_INIT :
+ cur = endBadCaptures = moves;
+ endMoves = generate<CAPTURES>(pos, cur);
+
+ score<CAPTURES>();
+ partial_insertion_sort(cur, endMoves, std::numeric_limits<int>::min());
+ ++stage;
+ goto top;
+
+ case GOOD_CAPTURE :
+ if (select<Next>([&]() {
+ // Move losing capture to endBadCaptures to be tried later
+ return pos.see_ge(*cur, -cur->value / 18) ? true
+ : (*endBadCaptures++ = *cur, false);
+ }))
+ return *(cur - 1);
+
+ ++stage;
+ [[fallthrough]];
+
+ case QUIET_INIT :
+ if (!skipQuiets)
+ {
+ cur = endBadCaptures;
+ endMoves = beginBadQuiets = endBadQuiets = generate<QUIETS>(pos, cur);
+
+ score<QUIETS>();
+ partial_insertion_sort(cur, endMoves, quiet_threshold(depth));
+ }
+
+ ++stage;
+ [[fallthrough]];
+
+ case GOOD_QUIET :
+ if (!skipQuiets && select<Next>([]() { return true; }))
+ {
+ if ((cur - 1)->value > -7998 || (cur - 1)->value <= quiet_threshold(depth))
+ return *(cur - 1);
+
+ // Remaining quiets are bad
+ beginBadQuiets = cur - 1;
+ }
+
+ // Prepare the pointers to loop over the bad captures
+ cur = moves;
+ endMoves = endBadCaptures;
+
+ ++stage;
+ [[fallthrough]];
+
+ case BAD_CAPTURE :
+ if (select<Next>([]() { return true; }))
+ return *(cur - 1);
+
+ // Prepare the pointers to loop over the bad quiets
+ cur = beginBadQuiets;
+ endMoves = endBadQuiets;
+
+ ++stage;
+ [[fallthrough]];
+
+ case BAD_QUIET :
+ if (!skipQuiets)
+ return select<Next>([]() { return true; });
+
+ return Move::none();
+
+ case EVASION_INIT :
+ cur = moves;
+ endMoves = generate<EVASIONS>(pos, cur);
+
+ score<EVASIONS>();
+ ++stage;
+ [[fallthrough]];
+
+ case EVASION :
+ return select<Best>([]() { return true; });
+
+ case PROBCUT :
+ return select<Next>([&]() { return pos.see_ge(*cur, threshold); });
+
+ case QCAPTURE :
+ return select<Next>([]() { return true; });
+ }
+
+ assert(false);
+ return Move::none(); // Silence warning