1
0
Fork 0

wip: checkers computation

This commit is contained in:
Paul-Nicolas Madelaine 2025-12-18 00:26:13 +01:00
parent bc0422a53e
commit 7e70405027

View file

@ -828,15 +828,6 @@ impl Position {
let forward = turn.forward(); let forward = turn.forward();
let x = lookup::bishop(king_square, blockers);
let y = lookup::rook(king_square, blockers);
let checkers = lookup::pawn_attack(turn, king_square) & theirs.pawn()
| lookup::knight(king_square) & theirs.knight()
| x & theirs.bishop()
| y & theirs.rook();
moves.checkers(checkers)?;
if moves.roles(Role::King) && global_mask_from.contains(king_square) { if moves.roles(Role::King) && global_mask_from.contains(king_square) {
let attacked = { let attacked = {
let blockers = blockers ^ ours.king(); let blockers = blockers ^ ours.king();
@ -894,9 +885,21 @@ impl Position {
} }
} }
if checkers.len() > 1 { let x = lookup::bishop(king_square, blockers);
let y = lookup::rook(king_square, blockers);
let mut checkers = lookup::pawn_attack(turn, king_square) & theirs.pawn()
| lookup::knight(king_square) & theirs.knight()
| x & theirs.bishop()
| y & theirs.rook();
moves.checkers(checkers)?;
let checker = checkers.next();
if !checkers.is_empty() {
return ControlFlow::Continue(()); return ControlFlow::Continue(());
} }
let block_check = checker
.map(|checker| lookup::segment(king_square, checker))
.unwrap_or(Bitboard(!0));
let target_mask = global_mask_to & block_check;
let blockers_x_ray = blockers & !(x | y); let blockers_x_ray = blockers & !(x | y);
let pinned = ((lookup::bishop(king_square, blockers_x_ray) & theirs.bishop()) let pinned = ((lookup::bishop(king_square, blockers_x_ray) & theirs.bishop())
@ -904,12 +907,6 @@ impl Position {
.map(|sq| lookup::segment(king_square, sq)) .map(|sq| lookup::segment(king_square, sq))
.reduce_or(); .reduce_or();
let checker = checkers.first();
let block_check = checker
.map(|checker| lookup::segment(king_square, checker))
.unwrap_or(Bitboard(!0));
let target_mask = global_mask_to & block_check;
// pawns // pawns
if moves.roles(Role::Pawn) { if moves.roles(Role::Pawn) {
let kside = match turn { let kside = match turn {