From 2beb8ab30348026b631bd3d8b2e0b4d6fb7af5f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Varga=20D=C3=A1vid=20Lajos?= Date: Sat, 15 Nov 2025 10:31:02 +0100 Subject: [PATCH 1/7] added file and module structure for bitboard::legality.rs --- engine/src/bitboard.rs | 2 ++ engine/src/bitboard/legality.rs | 0 2 files changed, 2 insertions(+) create mode 100644 engine/src/bitboard/legality.rs diff --git a/engine/src/bitboard.rs b/engine/src/bitboard.rs index 890ddc2..806a35c 100644 --- a/engine/src/bitboard.rs +++ b/engine/src/bitboard.rs @@ -1,3 +1,5 @@ mod attackmaps; mod utils; +mod legality; + pub mod board; \ No newline at end of file diff --git a/engine/src/bitboard/legality.rs b/engine/src/bitboard/legality.rs new file mode 100644 index 0000000..e69de29 From cd58a7a321767e20173d7e939275fdf07e93fbb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Varga=20D=C3=A1vid=20Lajos?= Date: Sat, 15 Nov 2025 12:30:01 +0100 Subject: [PATCH 2/7] added methods for detecting pinned pieces --- engine/src/bitboard/legality.rs | 48 +++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/engine/src/bitboard/legality.rs b/engine/src/bitboard/legality.rs index e69de29..7d12e57 100644 --- a/engine/src/bitboard/legality.rs +++ b/engine/src/bitboard/legality.rs @@ -0,0 +1,48 @@ +use super::board::Board; +use super::attackmaps::RAY_TABLE; + +impl Board { + + pub(in super) fn calc_pinned_squares(&mut self) { + self.pinned_squares = [4; 64]; + self.pin_mask = 0u64; + + let friendly_pieces: u64 = self.occupancy[self.side_to_move as usize]; + let offset: usize = 6 * self.side_to_move as usize; + let king_board: u64 = self.bitboards[5 + offset]; + let king_sq: u32 = king_board.trailing_zeros(); + let opponent_queen_bishop_mask: u64 = self.bitboards[8 - offset] | self.bitboards[10 - offset]; + let opponent_queen_rook_mask: u64 = self.bitboards[9 - offset] | self.bitboards[10 - offset]; + + // Queen-Rook directions + self.set_pinned_in_ray_direction(king_sq, friendly_pieces, opponent_queen_rook_mask, 0); + self.set_pinned_in_ray_direction(king_sq, friendly_pieces, opponent_queen_rook_mask, 2); + self.set_pinned_in_ray_direction(king_sq, friendly_pieces, opponent_queen_rook_mask, 4); + self.set_pinned_in_ray_direction(king_sq, friendly_pieces, opponent_queen_rook_mask, 6); + + // Queen-Bishop directions + self.set_pinned_in_ray_direction(king_sq, friendly_pieces, opponent_queen_bishop_mask, 1); + self.set_pinned_in_ray_direction(king_sq, friendly_pieces, opponent_queen_bishop_mask, 3); + self.set_pinned_in_ray_direction(king_sq, friendly_pieces, opponent_queen_bishop_mask, 5); + self.set_pinned_in_ray_direction(king_sq, friendly_pieces, opponent_queen_bishop_mask, 7); + } + + pub(in super) fn set_pinned_in_ray_direction(&mut self, king_sq: u32, friendly_pieces: u64, attackers: u64, dir: u8) { + let is_up: bool = dir / 4 == 0; + let mask: u64 = RAY_TABLE[king_sq as usize][dir as usize]; + let blockers: u64 = self.occupancy[2] & mask; + if blockers == 0 { return; } + let first_blocker_sq: u32 = if is_up { blockers.trailing_zeros() } else { 63 - blockers.leading_zeros() }; + if (friendly_pieces & 1 << first_blocker_sq) != 0 { + let blockers: u64 = blockers & !(1 << first_blocker_sq); + if blockers == 0 { return; } + let second_blocker_sq: u32 = if is_up { blockers.trailing_zeros() } else { 63 - blockers.leading_zeros() }; + + if (attackers & 1 << second_blocker_sq) != 0 { + self.pinned_squares[first_blocker_sq as usize] = dir % 4; + self.pin_mask |= 1 << first_blocker_sq; + } + } + } + +} \ No newline at end of file From f7355f8e7418bf9517441a921c46d88ab13c36c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Varga=20D=C3=A1vid=20Lajos?= Date: Sat, 15 Nov 2025 12:33:18 +0100 Subject: [PATCH 3/7] implemented use of calc_pinned_squares in board.rs --- engine/src/bitboard/board.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/src/bitboard/board.rs b/engine/src/bitboard/board.rs index 7ceb4d6..11a85ce 100644 --- a/engine/src/bitboard/board.rs +++ b/engine/src/bitboard/board.rs @@ -115,7 +115,7 @@ impl Board { } } } - // board.calc_pinned_squares(); + board.calc_pinned_squares(); board.calc_piece_board(); return board; From 296f1f6c3aa2760d87e9d4e0197de3ba447a58cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Varga=20D=C3=A1vid=20Lajos?= Date: Sat, 15 Nov 2025 12:36:11 +0100 Subject: [PATCH 4/7] added file and module structure for checkinfo.rs --- engine/src/bitboard.rs | 1 + engine/src/bitboard/checkinfo.rs | 0 2 files changed, 1 insertion(+) create mode 100644 engine/src/bitboard/checkinfo.rs diff --git a/engine/src/bitboard.rs b/engine/src/bitboard.rs index 806a35c..5c9b419 100644 --- a/engine/src/bitboard.rs +++ b/engine/src/bitboard.rs @@ -1,5 +1,6 @@ mod attackmaps; mod utils; mod legality; +mod checkinfo; pub mod board; \ No newline at end of file diff --git a/engine/src/bitboard/checkinfo.rs b/engine/src/bitboard/checkinfo.rs new file mode 100644 index 0000000..e69de29 From 182aa59ee157303b78b5e931c19b8e72e9992057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Varga=20D=C3=A1vid=20Lajos?= Date: Sat, 15 Nov 2025 12:37:47 +0100 Subject: [PATCH 5/7] defined shape of struct CheckInfo in bitboard::checkinfo.rs --- engine/src/bitboard/checkinfo.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engine/src/bitboard/checkinfo.rs b/engine/src/bitboard/checkinfo.rs index e69de29..de86521 100644 --- a/engine/src/bitboard/checkinfo.rs +++ b/engine/src/bitboard/checkinfo.rs @@ -0,0 +1,5 @@ + +pub struct CheckInfo { + pub check_count: u8, + pub move_mask: u64 +} \ No newline at end of file From ad530e915510d35115230411414e542e9d318c5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Varga=20D=C3=A1vid=20Lajos?= Date: Sat, 15 Nov 2025 12:39:35 +0100 Subject: [PATCH 6/7] added constructor for struct CheckInfo in bitboard::checkinfo.rs --- engine/src/bitboard/checkinfo.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/engine/src/bitboard/checkinfo.rs b/engine/src/bitboard/checkinfo.rs index de86521..f9a9553 100644 --- a/engine/src/bitboard/checkinfo.rs +++ b/engine/src/bitboard/checkinfo.rs @@ -2,4 +2,14 @@ pub struct CheckInfo { pub check_count: u8, pub move_mask: u64 +} + +impl CheckInfo { + + pub fn new() -> Self { + return Self { + check_count: 0, + move_mask: 0xFFFF_FFFF_FFFF_FFFF + } + } } \ No newline at end of file From f9a302c9a037182f67bd7b88ed87368b3ddcf317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Varga=20D=C3=A1vid=20Lajos?= Date: Sat, 15 Nov 2025 12:40:52 +0100 Subject: [PATCH 7/7] implemented method add_checker for CheckInfo in bitboard::checkinfo.rs --- engine/src/bitboard/checkinfo.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engine/src/bitboard/checkinfo.rs b/engine/src/bitboard/checkinfo.rs index f9a9553..b145321 100644 --- a/engine/src/bitboard/checkinfo.rs +++ b/engine/src/bitboard/checkinfo.rs @@ -12,4 +12,10 @@ impl CheckInfo { move_mask: 0xFFFF_FFFF_FFFF_FFFF } } + + #[inline(always)] + pub fn add_checker(&mut self, move_mask: u64) { + self.move_mask &= move_mask; + self.check_count += 1; + } } \ No newline at end of file