captureThreshold = 0;
curMove = lastMove = moves;
- badCaptures = moves + MAX_MOVES;
+ lastBadCapture = moves + MAX_MOVES - 1;
if (p.in_check())
phase = EVASION;
- type_of(pos.piece_moved(m));
if (is_promotion(m))
- cur->score += PieceValueMidgame[promotion_piece_type(m)];
+ cur->score += PieceValueMidgame[promotion_type(m)];
}
}
void MovePicker::score_noncaptures() {
Move m;
- Square from;
for (MoveStack* cur = moves; cur != lastMove; cur++)
{
m = cur->move;
- from = from_sq(m);
- cur->score = H.value(pos.piece_on(from), to_sq(m));
+ cur->score = H.value(pos.piece_moved(m), to_sq(m));
}
}
return;
case BAD_CAPTURES_S1:
- // Bad captures SEE value is already calculated so just pick them in order
- // to get SEE move ordering.
- curMove = badCaptures;
- lastMove = moves + MAX_MOVES;
+ // Just pick them in reverse order to get MVV/LVA ordering
+ curMove = moves + MAX_MOVES - 1;
+ lastMove = lastBadCapture;
return;
case EVASIONS_S2:
{
assert(captureThreshold <= 0); // Otherwise we cannot use see_sign()
- int seeScore = pos.see_sign(move);
- if (seeScore >= captureThreshold)
+ if (pos.see_sign(move) >= captureThreshold)
return move;
// Losing capture, move it to the tail of the array
- (--badCaptures)->move = move;
- badCaptures->score = seeScore;
+ (lastBadCapture--)->move = move;
}
break;
case KILLERS_S1:
move = (curMove++)->move;
- if ( move != MOVE_NONE
- && pos.is_pseudo_legal(move)
- && move != ttMove
+ if ( move != MOVE_NONE
+ && pos.is_pseudo_legal(move)
+ && move != ttMove
&& !pos.is_capture(move))
return move;
break;
break;
case BAD_CAPTURES_S1:
- move = pick_best(curMove++, lastMove)->move;
- return move;
+ return (curMove--)->move;
case EVASIONS_S2: case CAPTURES_S3: case CAPTURES_S4:
move = pick_best(curMove++, lastMove)->move;