- assert(is_ok(first));
- assert(is_ok(second));
- assert(color_of(pos.piece_on(from_sq(second))) == ~pos.side_to_move());
- assert(type_of(first) == CASTLE || color_of(pos.piece_on(to_sq(first))) == ~pos.side_to_move());
-
- Square m1from = from_sq(first);
- Square m2from = from_sq(second);
- Square m1to = to_sq(first);
- Square m2to = to_sq(second);
-
- // The piece is the same or second's destination was vacated by the first move
- // We exclude the trivial case where a sliding piece does in two moves what
- // it could do in one move: eg. Ra1a2, Ra2a3.
- if ( m2to == m1from
- || (m1to == m2from && !squares_aligned(m1from, m2from, m2to)))
- return true;
-
- // Second one moves through the square vacated by first one
- if (between_bb(m2from, m2to) & m1from)
- return true;
-
- // Second's destination is defended by the first move's piece
- Bitboard m1att = pos.attacks_from(pos.piece_on(m1to), m1to, pos.pieces() ^ m2from);
- if (m1att & m2to)
- return true;
-
- // Second move gives a discovered check through the first's checking piece
- if (m1att & pos.king_square(pos.side_to_move()))