- switch(PhaseTable[phaseIndex]) {
-
- case PH_GOOD_CAPTURES:
- assert(!pos->is_check());
- assert(movesPicked >= 0);
- while(movesPicked < numOfMoves) {
- bestScore = -10000000;
- bestIndex = -1;
- for(int i = movesPicked; i < numOfMoves; i++) {
- if(moves[i].score < 0) {
- // Losing capture, move it to the badCaptures[] array
- assert(numOfBadCaptures < 63);
- badCaptures[numOfBadCaptures++] = moves[i];
- moves[i--] = moves[--numOfMoves];
- }
- else if(moves[i].score > bestScore) {
- bestIndex = i;
- bestScore = moves[i].score;
- }
- }
- if(bestIndex != -1) { // Found a good capture
- move = moves[bestIndex].move;\r
- moves[bestIndex] = moves[movesPicked++];
- if(move != ttMove && move != mateKiller &&
- pos->move_is_legal(move, pinned))
- return move;
- }
- }
- break;
-
- case PH_NONCAPTURES:
- assert(!pos->is_check());
- assert(movesPicked >= 0);
- while(movesPicked < numOfMoves) {
- bestScore = -10000000;
-
- // If this is a PV node or we have only picked a few moves, scan
- // the entire move list for the best move. If many moves have already
- // been searched and it is not a PV node, we are probably failing low
- // anyway, so we just pick the first move from the list.
- if(!All_zero && (pvNode || movesPicked < 12)) {
- bestIndex = -1;
- for(int i = movesPicked; i < numOfMoves; i++)
- if(moves[i].score > bestScore) {
- bestIndex = i;
- bestScore = moves[i].score;
+ while (true)
+ {
+ while (cur == endMoves)
+ generate_next_stage();
+
+ switch (stage) {
+
+ case MAIN_SEARCH: case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT:
+ ++cur;
+ return ttMove;
+
+ case CAPTURES_S1:
+ 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;