From 752150107e178159785202cb2371a3f368d791b6 Mon Sep 17 00:00:00 2001 From: Paul-Nicolas Madelaine Date: Wed, 22 Oct 2025 22:59:53 +0200 Subject: [PATCH] update move generation for pinned pieces --- src/position.rs | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/position.rs b/src/position.rs index d060e97..590c975 100644 --- a/src/position.rs +++ b/src/position.rs @@ -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()) - .map(|sq| d.segment(king_square, sq)) - .reduce_or(); + 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 { - kind: MoveType::PieceMove, - from, - to, - role, + (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); } } }