/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
- Copyright (C) 2008 Marco Costalba
+ Copyright (C) 2008-2009 Marco Costalba
Stockfish is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
break;
case PH_BAD_CAPTURES:
+ // It's probably a good idea to use SEE move ordering here. FIXME
movesPicked = 0;
break;
break;
case PH_QCHECKS:
+ // Perhaps we should order moves move here? FIXME
numOfMoves = generate_non_capture_checks(pos, moves, dc);
movesPicked = 0;
break;
else if (m == killer2)
hs = HistoryMax + 1;
else
- hs = H.move_ordering_score(pos.piece_on(move_from(m)), m);
+ hs = H.move_ordering_score(pos.piece_on(move_from(m)), move_to(m));
// Ensure history is always preferred to pst
if (hs > 0)
int seeScore = pos.see(m);
moves[i].score = (seeScore >= 0)? seeScore + HistoryMax : seeScore;
} else
- moves[i].score = H.move_ordering_score(pos.piece_on(move_from(m)), m);
+ moves[i].score = H.move_ordering_score(pos.piece_on(move_from(m)), move_to(m));
}
}
Move MovePicker::pick_move_from_list() {
- Move move;
+ assert(movesPicked >= 0);
+ assert(!pos.is_check() || PhaseTable[phaseIndex] == PH_EVASIONS || PhaseTable[phaseIndex] == PH_STOP);
+ assert( pos.is_check() || PhaseTable[phaseIndex] != PH_EVASIONS);
switch (PhaseTable[phaseIndex]) {
case PH_GOOD_CAPTURES:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
-
- while (movesPicked < numOfMoves)
- {
- move = moves[movesPicked++].move;
- if ( move != ttMove
- && move != mateKiller
- && pos.pl_move_is_legal(move, pinned))
- return move;
- }
- break;
-
case PH_NONCAPTURES:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
-
while (movesPicked < numOfMoves)
{
- move = moves[movesPicked++].move;
+ Move move = moves[movesPicked++].move;
if ( move != ttMove
&& move != mateKiller
&& pos.pl_move_is_legal(move, pinned))
break;
case PH_EVASIONS:
- assert(pos.is_check());
- assert(movesPicked >= 0);
+ if (movesPicked < numOfMoves)
+ return moves[movesPicked++].move;
- while (movesPicked < numOfMoves)
- {
- move = moves[movesPicked++].move;
- return move;
- }
- break;
+ break;
case PH_BAD_CAPTURES:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
- // It's probably a good idea to use SEE move ordering here, instead
- // of just picking the first move. FIXME
while (movesPicked < numOfBadCaptures)
{
- move = badCaptures[movesPicked++].move;
+ Move move = badCaptures[movesPicked++].move;
if ( move != ttMove
&& move != mateKiller
&& pos.pl_move_is_legal(move, pinned))
break;
case PH_QCAPTURES:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
-
- while (movesPicked < numOfMoves)
- {
- 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;
- }
- break;
-
case PH_QCHECKS:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
- // Perhaps we should do something better than just picking the first
- // move here? FIXME
while (movesPicked < numOfMoves)
{
- move = moves[movesPicked++].move;
+ 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;