mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 16:53:09 +00:00
Add scan for X-ray attacks in piece_attacks_square()
Used to avoid pruning interesting moves. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
52ed0e9563
commit
e71d520758
1 changed files with 24 additions and 10 deletions
|
@ -420,30 +420,44 @@ bool Position::piece_attacks_square(Square f, Square t) const {
|
||||||
|
|
||||||
|
|
||||||
/// Position::move_attacks_square() tests whether a move from the current
|
/// Position::move_attacks_square() tests whether a move from the current
|
||||||
/// position attacks a given square. Only attacks by the moving piece are
|
/// position attacks a given square.
|
||||||
/// considered; the function does not handle X-ray attacks.
|
|
||||||
|
|
||||||
bool Position::move_attacks_square(Move m, Square s) const {
|
bool Position::move_attacks_square(Move m, Square s) const {
|
||||||
|
|
||||||
assert(move_is_ok(m));
|
assert(move_is_ok(m));
|
||||||
assert(square_is_ok(s));
|
assert(square_is_ok(s));
|
||||||
|
|
||||||
|
bool is_attack;
|
||||||
Square f = move_from(m), t = move_to(m);
|
Square f = move_from(m), t = move_to(m);
|
||||||
|
|
||||||
assert(square_is_occupied(f));
|
assert(square_is_occupied(f));
|
||||||
|
|
||||||
switch (piece_on(f))
|
switch (piece_on(f))
|
||||||
{
|
{
|
||||||
case WP: return pawn_attacks_square(WHITE, t, s);
|
case WP: is_attack = pawn_attacks_square(WHITE, t, s); break;
|
||||||
case BP: return pawn_attacks_square(BLACK, t, s);
|
case BP: is_attack = pawn_attacks_square(BLACK, t, s); break;
|
||||||
case WN: case BN: return piece_attacks_square<KNIGHT>(t, s);
|
case WN: case BN: is_attack = piece_attacks_square<KNIGHT>(t, s); break;
|
||||||
case WB: case BB: return piece_attacks_square<BISHOP>(t, s);
|
case WB: case BB: is_attack = piece_attacks_square<BISHOP>(t, s); break;
|
||||||
case WR: case BR: return piece_attacks_square<ROOK>(t, s);
|
case WR: case BR: is_attack = piece_attacks_square<ROOK>(t, s); break;
|
||||||
case WQ: case BQ: return piece_attacks_square<QUEEN>(t, s);
|
case WQ: case BQ: is_attack = piece_attacks_square<QUEEN>(t, s); break;
|
||||||
case WK: case BK: return piece_attacks_square<KING>(t, s);
|
case WK: case BK: is_attack = piece_attacks_square<KING>(t, s); break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
if (is_attack)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Move the piece and scan for X-ray attacks behind it
|
||||||
|
Bitboard occ = occupied_squares();
|
||||||
|
Color us = color_of_piece_on(f);
|
||||||
|
clear_bit(&occ, f);
|
||||||
|
set_bit(&occ, t);
|
||||||
|
Bitboard xray = ( (rook_attacks_bb(s, occ) & rooks_and_queens())
|
||||||
|
|(bishop_attacks_bb(s, occ) & bishops_and_queens())) & pieces_of_color(us);
|
||||||
|
|
||||||
|
// If we have attacks we need to verify that are caused by our move
|
||||||
|
// and are not already existent ones.
|
||||||
|
return xray && (xray ^ (xray & piece_attacks<QUEEN>(s)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue