- // Case 3: Moving through the vacated square
- p2 = pos.piece_on(f2);
- if (piece_is_slider(p2) && (between_bb(f2, t2) & f1))
- return true;
-
- // Case 4: The destination square for m2 is defended by the moving piece in m1
- p1 = pos.piece_on(t1);
- if (pos.attacks_from(p1, t1) & t2)
- return true;
-
- // Case 5: Discovered check, checking piece is the piece moved in m1
- ksq = pos.king_square(pos.side_to_move());
- if ( piece_is_slider(p1)
- && (between_bb(t1, ksq) & f2)
- && (pos.attacks_from(p1, t1, pos.pieces() ^ f2) & ksq))
- return true;
-
- return false;
- }
-
-
- // connected_threat() tests whether it is safe to forward prune a move or if
- // is somehow connected to the threat move returned by null search.
-
- bool connected_threat(const Position& pos, Move m, Move threat) {
-
- assert(is_ok(m));
- assert(is_ok(threat));
- assert(!pos.is_capture_or_promotion(m));
- assert(!pos.is_passed_pawn_push(m));
-
- Square mfrom, mto, tfrom, tto;
+ // If the threatened piece has value less than or equal to the value of the
+ // threat piece, don't prune moves which defend it.
+ if ( pos.is_capture(second)
+ && ( PieceValue[MG][pos.piece_on(m2from)] >= PieceValue[MG][pos.piece_on(m2to)]
+ || type_of(pos.piece_on(m2from)) == KING))
+ {
+ // Update occupancy as if the piece and the threat are moving
+ Bitboard occ = pos.pieces() ^ m1from ^ m1to ^ m2from;
+ Piece piece = pos.piece_on(m1from);