1
0
Fork 0

update move generation for pinned pieces

This commit is contained in:
Paul-Nicolas Madelaine 2025-11-05 23:47:00 +01:00
parent 2426a0cdb3
commit d500f525f7
2 changed files with 33 additions and 12 deletions

View file

@ -136,6 +136,22 @@ static LINES: BySquare<BySquare<Bitboard>> = by_square!(a, BySquare([Bitboard(0)
}) })
}); });
static BISHOP_LINES: BySquare<Bitboard> = by_square!(sq, Bitboard(0), {
let mut res = 0;
loop_bishop_directions!(d, {
res |= RAYS.get(sq).get(d).0;
});
Bitboard(res)
});
static ROOK_LINES: BySquare<Bitboard> = by_square!(sq, Bitboard(0), {
let mut res = 0;
loop_rook_directions!(d, {
res |= RAYS.get(sq).get(d).0;
});
Bitboard(res)
});
static SEGMENTS: BySquare<BySquare<Bitboard>> = by_square!(a, BySquare([Bitboard(0); 64]), { static SEGMENTS: BySquare<BySquare<Bitboard>> = by_square!(a, BySquare([Bitboard(0); 64]), {
by_square!(b, Bitboard(0), { by_square!(b, Bitboard(0), {
let mut res = 0; let mut res = 0;
@ -240,6 +256,14 @@ pub(crate) fn line(a: Square, b: Square) -> Bitboard {
*LINES.get(a).get(b) *LINES.get(a).get(b)
} }
#[inline] #[inline]
pub(crate) fn bishop_lines(square: Square) -> Bitboard {
*BISHOP_LINES.get(square)
}
#[inline]
pub(crate) fn rook_lines(square: Square) -> Bitboard {
*ROOK_LINES.get(square)
}
#[inline]
pub(crate) fn segment(a: Square, b: Square) -> Bitboard { pub(crate) fn segment(a: Square, b: Square) -> Bitboard {
*SEGMENTS.get(a).get(b) *SEGMENTS.get(a).get(b)
} }

View file

@ -995,13 +995,10 @@ impl Position {
} }
let blockers_x_ray = blockers & !(x | y); let blockers_x_ray = blockers & !(x | y);
let pinned_diagonally = (lookup::bishop(king_square, blockers_x_ray) & theirs.bishop()) let pinned = ((lookup::bishop(king_square, blockers_x_ray) & theirs.bishop())
.map(|sq| lookup::segment(king_square, sq)) | (lookup::rook(king_square, blockers_x_ray) & theirs.rook()))
.reduce_or(); .map(|sq| lookup::segment(king_square, sq))
let pinned_horizontally = (lookup::rook(king_square, blockers_x_ray) & theirs.rook()) .reduce_or();
.map(|sq| lookup::segment(king_square, sq))
.reduce_or();
let pinned = pinned_diagonally | pinned_horizontally;
let checker = checkers.first(); let checker = checkers.first();
let block_check = checker let block_check = checker
@ -1173,8 +1170,8 @@ impl Position {
// pinned pieces // pinned pieces
{ {
let aux = |moves: &mut T, role, mask| { let aux = |moves: &mut T, role, role_mask| {
for from in global_mask_from & *ours.get(role) & mask { for from in global_mask_from & pinned & role_mask & *ours.get(role) {
moves.extend( moves.extend(
(global_mask_to & !us & pinned & lookup::line(king_square, from)).map( (global_mask_to & !us & pinned & lookup::line(king_square, from)).map(
|to| RawMove { |to| RawMove {
@ -1188,13 +1185,13 @@ impl Position {
} }
}; };
if moves.roles(Role::Bishop) { if moves.roles(Role::Bishop) {
aux(moves, Role::Bishop, pinned_diagonally); aux(moves, Role::Bishop, lookup::bishop_lines(king_square));
} }
if moves.roles(Role::Rook) { if moves.roles(Role::Rook) {
aux(moves, Role::Rook, pinned_horizontally); aux(moves, Role::Rook, lookup::rook_lines(king_square));
} }
if moves.roles(Role::Queen) { if moves.roles(Role::Queen) {
aux(moves, Role::Queen, pinned); aux(moves, Role::Queen, !Bitboard::new());
} }
} }
} }