- while (true)
- {
- while (curMove != lastMove)
- {
- switch (phase) {
-
- case PH_TT_MOVES:
- move = (curMove++)->move;
- if ( move != MOVE_NONE
- && move_is_legal(pos, move, pinned))
- return move;
- break;
-
- case PH_GOOD_CAPTURES:
- move = pick_best(curMove++, lastMove).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(int(lastBadCapture - badCaptures) < 63);
- lastBadCapture->move = move;
- lastBadCapture->score = seeValue;
- lastBadCapture++;
- }
- break;
-
- case PH_KILLERS:
- 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:
- 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_BAD_CAPTURES:
- move = pick_best(curMove++, lastMove).move;
- return move;
-
- case PH_EVASIONS:
- case PH_QCAPTURES:
- move = pick_best(curMove++, lastMove).move;
- if ( move != ttMoves[0].move
- && pos.pl_move_is_legal(move, pinned))
- return move;
- break;
-
- case PH_QCHECKS:
- move = (curMove++)->move;
- 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;
- }
- }
- go_next_phase();
- }
-}