- // Check extension (~2 Elo)
- else if ( givesCheck
- && (pos.blockers_for_king(~us) & from_sq(move) || pos.see_ge(move)))
- extension = ONE_PLY;
-
- // Shuffle extension
- else if(pos.rule50_count() > 14 && ss->ply > 14 && depth < 3 * ONE_PLY && PvNode)
- extension = ONE_PLY;
-
- // Castling extension
- else if (type_of(move) == CASTLING)
- extension = ONE_PLY;
-
- // Passed pawn extension
- else if ( move == ss->killers[0]
- && pos.advanced_pawn_push(move)
- && pos.pawn_passed(us, to_sq(move)))
- extension = ONE_PLY;
-
- // Calculate new depth for this move
- newDepth = depth - ONE_PLY + extension;
-
- // Step 14. Pruning at shallow depth (~170 Elo)
- if ( !rootNode
- && pos.non_pawn_material(us)
- && bestValue > VALUE_MATED_IN_MAX_PLY)
- {
- // Skip quiet moves if movecount exceeds our FutilityMoveCount threshold
- moveCountPruning = moveCount >= futility_move_count(improving, depth / ONE_PLY);
-
- if ( !captureOrPromotion
- && !givesCheck
- && !pos.advanced_pawn_push(move))
- {
- // Move count based pruning (~30 Elo)
- if (moveCountPruning)
- continue;
-
- // Reduced depth of the next LMR search
- int lmrDepth = std::max(newDepth - reduction<PvNode>(improving, depth, moveCount), DEPTH_ZERO);
- lmrDepth /= ONE_PLY;
-
- // Countermoves based pruning (~20 Elo)
- if ( lmrDepth < 3 + ((ss-1)->statScore > 0 || (ss-1)->moveCount == 1)
- && (*contHist[0])[movedPiece][to_sq(move)] < CounterMovePruneThreshold
- && (*contHist[1])[movedPiece][to_sq(move)] < CounterMovePruneThreshold)
- continue;
-
- // Futility pruning: parent node (~2 Elo)
- if ( lmrDepth < 7
- && !inCheck
- && ss->staticEval + 256 + 200 * lmrDepth <= alpha)
- continue;
-
- // Prune moves with negative SEE (~10 Elo)
- if (!pos.see_ge(move, Value(-29 * lmrDepth * lmrDepth)))
- continue;
- }
- else if (!pos.see_ge(move, -PawnValueEg * (depth / ONE_PLY))) // (~20 Elo)
- continue;
- }
+ // Capture extensions for PvNodes and cutNodes
+ else if ( (PvNode || cutNode)
+ && captureOrPromotion
+ && moveCount != 1)
+ extension = 1;
+
+ // Check extensions
+ else if ( givesCheck
+ && depth > 6
+ && abs(ss->staticEval) > 100)
+ extension = 1;
+
+ // Quiet ttMove extensions
+ else if ( PvNode
+ && move == ttMove
+ && move == ss->killers[0]
+ && (*contHist[0])[movedPiece][to_sq(move)] >= 10000)
+ extension = 1;
+
+ // Add extension to new depth
+ newDepth += extension;
+ ss->doubleExtensions = (ss-1)->doubleExtensions + (extension == 2);