- bool dangerous;
- Depth ext = extension(pos, move, false, moveIsCapture, moveIsCheck, singleReply, mateThreat, &dangerous);
- Depth newDepth = depth - OnePly + ext;
+ ext = extension(pos, move, false, captureOrPromotion, moveIsCheck, singleReply, mateThreat, &dangerous);
+
+ // Only move extension
+ if ( forbiddenMove == MOVE_NONE
+ && moveCount == 1
+ && ext < OnePly
+ && depth >= 4 * OnePly
+ && tte
+ && (tte->type() & VALUE_TYPE_LOWER)
+ && tte->move() != MOVE_NONE
+ && tte->depth() >= depth - 3 * OnePly)
+ {
+ Value ttValue = value_from_tt(tte->value(), ply);
+ if (abs(ttValue) < VALUE_KNOWN_WIN)
+ {
+ Value excValue = search(pos, ss, ttValue - OnlyMoveMargin, Max(Min(depth / 2, depth - 4 * OnePly), OnePly), ply, false, threadID, tte->move());
+ if (excValue < ttValue - OnlyMoveMargin)
+ ext = (depth >= 8 * OnePly)? OnePly : ext + OnePly / 2;
+ }
+ }
+
+ newDepth = depth - OnePly + ext;
+
+ // Update current move
+ ss[ply].currentMove = move;