]> git.sesse.net Git - stockfish/blobdiff - src/movepick.cpp
Fix a crash when quitting while searching
[stockfish] / src / movepick.cpp
index 88b4fe9c6ab9bf320832e34642b7f657de95f186..589c27b3585383be0ac6823907f767b36696d36b 100644 (file)
@@ -72,7 +72,7 @@ namespace {
 /// move ordering is at the current node.
 
 MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h,
-                       SearchStack* ss, Value beta) : pos(p), H(h), depth(d) {
+                       Search::Stack* ss, Value beta) : pos(p), H(h), depth(d) {
   captureThreshold = 0;
   badCaptures = moves + MAX_MOVES;
 
@@ -88,11 +88,14 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h,
       killers[0].move = ss->killers[0];
       killers[1].move = ss->killers[1];
 
-      // Consider sligtly negative captures as good if at low
-      // depth and far from beta.
+      // Consider sligtly negative captures as good if at low depth and far from beta
       if (ss && ss->eval < beta - PawnValueMidgame && d < 3 * ONE_PLY)
           captureThreshold = -PawnValueMidgame;
 
+      // Consider negative captures as good if still enough to reach beta
+      else if (ss && ss->eval > beta)
+          captureThreshold = beta - ss->eval;
+
       phasePtr = MainSearchTable;
   }
 
@@ -138,7 +141,7 @@ MovePicker::MovePicker(const Position& p, Move ttm, const History& h, PieceType
   assert (!pos.in_check());
 
   // In ProbCut we consider only captures better than parent's move
-  captureThreshold = piece_value_midgame(Piece(parentCapture));
+  captureThreshold = PieceValueMidgame[Piece(parentCapture)];
   phasePtr = ProbCutTable;
 
   if (   ttm != MOVE_NONE
@@ -251,11 +254,11 @@ void MovePicker::score_captures() {
   for (MoveStack* cur = moves; cur != lastMove; cur++)
   {
       m = cur->move;
-      cur->score =  piece_value_midgame(pos.piece_on(move_to(m)))
+      cur->score =  PieceValueMidgame[pos.piece_on(move_to(m))]
                   - type_of(pos.piece_on(move_from(m)));
 
       if (is_promotion(m))
-          cur->score += piece_value_midgame(Piece(promotion_piece_type(m)));
+          cur->score += PieceValueMidgame[Piece(promotion_piece_type(m))];
   }
 }
 
@@ -290,7 +293,7 @@ void MovePicker::score_evasions() {
       if ((seeScore = pos.see_sign(m)) < 0)
           cur->score = seeScore - History::MaxValue; // Be sure we are at the bottom
       else if (pos.is_capture(m))
-          cur->score =  piece_value_midgame(pos.piece_on(move_to(m)))
+          cur->score =  PieceValueMidgame[pos.piece_on(move_to(m))]
                       - type_of(pos.piece_on(move_from(m))) + History::MaxValue;
       else
           cur->score = H.value(pos.piece_on(move_from(m)), move_to(m));