diff --git a/src/movepick.cpp b/src/movepick.cpp index 4d2d3116..d0ceaf1c 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -246,15 +246,36 @@ void MovePicker::score_captures() { } void MovePicker::score_noncaptures() { - for(int i = 0; i < numOfMoves; i++) { - Move m = moves[i].move; - if(m == killer1) - moves[i].score = HistoryMax + 2; - else if(m == killer2) - moves[i].score = HistoryMax + 1; - else - moves[i].score = H.move_ordering_score(pos->piece_on(move_from(m)), m); + + bool all_zero = true; + for (int i = 0; i < numOfMoves; i++) + { + Move m = moves[i].move; + if (m == killer1) + { + moves[i].score = HistoryMax + 2; + all_zero = false; + } + else if (m == killer2) + { + moves[i].score = HistoryMax + 1; + all_zero = false; + } + else + { + moves[i].score = H.move_ordering_score(pos->piece_on(move_from(m)), m); + if (all_zero && moves[i].score != 0) + all_zero = false; + } } + if (!all_zero) + return; + + // If we don't have at least one history score then + // try to order using psq tables difference between + // from square and to square. + for (int i = 0; i < numOfMoves; i++) + moves[i].score = pos->mg_pst_delta(moves[i].move); } void MovePicker::score_evasions() { diff --git a/src/position.h b/src/position.h index 9acb2966..25596bf6 100644 --- a/src/position.h +++ b/src/position.h @@ -278,6 +278,7 @@ public: Value eg_value() const; Value non_pawn_material(Color c) const; Phase game_phase() const; + Value mg_pst_delta(Move m) const; // Game termination checks bool is_mate(); @@ -681,6 +682,11 @@ inline Value Position::mg_pst(Color c, PieceType pt, Square s) const { return MgPieceSquareTable[piece_of_color_and_type(c, pt)][s]; } +inline Value Position::mg_pst_delta(Move m) const { + return MgPieceSquareTable[piece_on(move_from(m))][move_to(m)] + -MgPieceSquareTable[piece_on(move_from(m))][move_from(m)]; +} + inline Value Position::eg_pst(Color c, PieceType pt, Square s) const { return EgPieceSquareTable[piece_of_color_and_type(c, pt)][s]; }