1
0
Fork 0

update move generation for pinned pieces

This commit is contained in:
Paul-Nicolas Madelaine 2025-10-22 22:59:53 +02:00
parent c71bbc216f
commit 752150107e

View file

@ -1054,10 +1054,13 @@ impl Position {
}
let blockers_x_ray = blockers & !(x | y);
let pinned = (d.bishop(king_square, blockers_x_ray) & theirs.bishop()
| d.rook(king_square, blockers_x_ray) & theirs.rook())
let pinned_diagonally = (d.bishop(king_square, blockers_x_ray) & theirs.bishop())
.map(|sq| d.segment(king_square, sq))
.reduce_or();
let pinned_horizontally = (d.rook(king_square, blockers_x_ray) & theirs.rook())
.map(|sq| d.segment(king_square, sq))
.reduce_or();
let pinned = pinned_diagonally | pinned_horizontally;
let checker = checkers.first();
let block_check = checker
@ -1223,30 +1226,28 @@ impl Position {
// pinned pieces
{
let aux = |visitor: &mut T, role| {
for from in global_mask_from & *ours.get(role) & pinned {
let aux = |visitor: &mut T, role, mask| {
for from in global_mask_from & *ours.get(role) & mask {
visitor.moves(
(global_mask_to
& d.targets(role, from, blockers)
& !us
& d.line(king_square, from))
.map(|to| RawMove {
(global_mask_to & !us & pinned & d.line(king_square, from)).map(|to| {
RawMove {
kind: MoveType::PieceMove,
from,
to,
role,
}
}),
)
}
};
if visitor.roles(Role::Bishop) {
aux(visitor, Role::Bishop)
aux(visitor, Role::Bishop, pinned_diagonally);
}
if visitor.roles(Role::Rook) {
aux(visitor, Role::Rook)
aux(visitor, Role::Rook, pinned_horizontally);
}
if visitor.roles(Role::Queen) {
aux(visitor, Role::Queen)
aux(visitor, Role::Queen, pinned);
}
}
}