captureThreshold = 0;
curMove = lastMove = moves;
- badCaptures = moves + MAX_MOVES;
+ lastBadCapture = moves + MAX_MOVES - 1;
if (p.in_check())
phase = EVASION;
cur->score = PieceValueMidgame[pos.piece_on(to_sq(m))]
- type_of(pos.piece_moved(m));
- if (is_promotion(m))
- cur->score += PieceValueMidgame[promotion_piece_type(m)];
+ if (type_of(m) == PROMOTION)
+ 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));
}
}
switch (++phase) {
case CAPTURES_S1: case CAPTURES_S3: case CAPTURES_S4: case CAPTURES_S5: case CAPTURES_S6:
- lastMove = generate<MV_CAPTURE>(pos, moves);
+ lastMove = generate<CAPTURES>(pos, moves);
score_captures();
return;
return;
case QUIETS_1_S1:
- lastQuiet = lastMove = generate<MV_QUIET>(pos, moves);
+ lastQuiet = lastMove = generate<QUIETS>(pos, moves);
score_noncaptures();
lastMove = std::partition(curMove, lastMove, has_positive_score);
sort<MoveStack>(curMove, lastMove);
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:
- lastMove = generate<MV_EVASION>(pos, moves);
+ lastMove = generate<EVASIONS>(pos, moves);
score_evasions();
return;
case QUIET_CHECKS_S3:
- lastMove = generate<MV_QUIET_CHECK>(pos, moves);
+ lastMove = generate<QUIET_CHECKS>(pos, moves);
return;
case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT: case RECAPTURE:
{
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;