From a2f261778bdce392e94fa62fe70944c6c86a9a2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Varga=20D=C3=A1vid=20Lajos?= Date: Wed, 19 Nov 2025 20:47:44 +0100 Subject: [PATCH] implemented move generation method for pawn quiet moves --- engine/src/bitboard/legality.rs | 7 +++++ engine/src/bitboard/movegen.rs | 1 + engine/src/bitboard/movegen/pawns.rs | 38 ++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/engine/src/bitboard/legality.rs b/engine/src/bitboard/legality.rs index f42fdc1..f81973e 100644 --- a/engine/src/bitboard/legality.rs +++ b/engine/src/bitboard/legality.rs @@ -93,6 +93,13 @@ impl Board { } } + #[inline] + pub(in super) fn get_pin_masked_moves(&self, moves: u64, sq: u32) -> u64 { + let sq: usize = sq as usize; + if self.pinned_squares[sq] == 4 { return moves; } + let dir: u8 = self.pinned_squares[sq]; + return moves & (RAY_TABLE[sq][dir as usize] | RAY_TABLE[sq][4 + dir as usize]); + } } // <----- TESTS -----> diff --git a/engine/src/bitboard/movegen.rs b/engine/src/bitboard/movegen.rs index aa5ff96..4dbb76e 100644 --- a/engine/src/bitboard/movegen.rs +++ b/engine/src/bitboard/movegen.rs @@ -2,6 +2,7 @@ mod pawns; use super::board::Board; use super::movebuffer::MoveBuffer; +use super::bitmove::BitMove; impl Board { diff --git a/engine/src/bitboard/movegen/pawns.rs b/engine/src/bitboard/movegen/pawns.rs index e69de29..30d2000 100644 --- a/engine/src/bitboard/movegen/pawns.rs +++ b/engine/src/bitboard/movegen/pawns.rs @@ -0,0 +1,38 @@ +use super::*; + +impl Board { + + fn add_pawn_quiets(&self, buffer: &mut MoveBuffer, move_mask: u64) { + let offset: u8 = self.side_to_move * 6; + let mut pawns: u64 = self.bitboards[offset as usize]; + while pawns != 0 { + let next_sq = pawns.trailing_zeros(); + pawns &= !(1 << next_sq); + + let mut quiets: u64 = self.get_pseudo_pawn_moves(next_sq) & move_mask; + quiets = self.get_pin_masked_moves(quiets, next_sq); + while quiets != 0 { + let to_sq = quiets.trailing_zeros(); + + if (self.side_to_move == 0 && quiets.trailing_zeros() / 8 == 7) + || (self.side_to_move == 1 && quiets.trailing_zeros() / 8 == 0) { + for piece_type in [3, 2, 1, 0] { + buffer.add(BitMove::quiet( + next_sq as u8, + to_sq as u8, + Some(piece_type) + )); + } + } + else { + buffer.add(BitMove::quiet( + next_sq as u8, + to_sq as u8, + None + )); + } + quiets &= !(1 << to_sq); + } + } + } +} \ No newline at end of file