- case PH_BAD_CAPTURES:
- while (movesPicked < numOfBadCaptures)
- {
- Move move = badCaptures[movesPicked++].move;
- if ( move != ttMove
- && move != mateKiller
- && pos.pl_move_is_legal(move, pinned))
- return move;
- }
- break;
-
- case PH_QCAPTURES:
- case PH_QCHECKS:
- while (movesPicked < numOfMoves)
- {
- Move move = moves[movesPicked++].move;
- // Maybe postpone the legality check until after futility pruning?
- if ( move != ttMove
- && pos.pl_move_is_legal(move, pinned))
- return move;
+ while (true)
+ {
+ switch (phase) {
+
+ case PH_TT_MOVES:
+ while (curMove != lastMove)
+ {
+ Move move = (curMove++)->move;
+ if ( move != MOVE_NONE
+ && move_is_legal(pos, move, pinned))
+ return move;
+ }
+ break;
+
+ case PH_GOOD_CAPTURES:
+ while (curMove != lastMove)
+ {
+ Move move = (curMove++)->move;
+ if ( move != ttMoves[0].move
+ && move != ttMoves[1].move
+ && pos.pl_move_is_legal(move, pinned))
+ {
+ // Check for a non negative SEE now
+ int seeValue = pos.see_sign(move);
+ if (seeValue >= 0)
+ return move;
+
+ // Losing capture, move it to the badCaptures[] array, note
+ // that move has now been already checked for legality.
+ assert(numOfBadCaptures < 63);
+ badCaptures[numOfBadCaptures].move = move;
+ badCaptures[numOfBadCaptures++].score = seeValue;
+ }
+ }
+ break;
+
+ case PH_KILLERS:
+ while (curMove != lastMove)
+ {
+ Move move = (curMove++)->move;
+ if ( move != MOVE_NONE
+ && move != ttMoves[0].move
+ && move != ttMoves[1].move
+ && move_is_legal(pos, move, pinned)
+ && !pos.move_is_capture(move))
+ return move;
+ }
+ break;
+
+ case PH_NONCAPTURES:
+ while (curMove != lastMove)
+ {
+ Move move = (curMove++)->move;
+ if ( move != ttMoves[0].move
+ && move != ttMoves[1].move
+ && move != killers[0].move
+ && move != killers[1].move
+ && pos.pl_move_is_legal(move, pinned))
+ return move;
+ }
+ break;
+
+ case PH_EVASIONS:
+ case PH_BAD_CAPTURES:
+ if (curMove != lastMove)
+ return (curMove++)->move;
+ break;
+
+ case PH_QCAPTURES:
+ case PH_QCHECKS:
+ while (curMove != lastMove)
+ {
+ Move move = (curMove++)->move;
+ // Maybe postpone the legality check until after futility pruning?
+ if ( move != ttMoves[0].move
+ && pos.pl_move_is_legal(move, pinned))
+ return move;
+ }
+ break;
+
+ case PH_STOP:
+ return MOVE_NONE;
+
+ default:
+ assert(false);
+ break;