From c558800385c39345731697be8cb987d5f616aedb Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sun, 28 Jan 2024 15:53:19 -0800 Subject: [PATCH] [position] Fix a bug in the pawn pushes move generator --- position/src/move_generator/pawn.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/position/src/move_generator/pawn.rs b/position/src/move_generator/pawn.rs index 3d6d5f4..8b9b4cf 100644 --- a/position/src/move_generator/pawn.rs +++ b/position/src/move_generator/pawn.rs @@ -3,7 +3,7 @@ use super::{move_generator_declaration, MoveGeneratorInternal, MoveSet}; use crate::{MoveBuilder, Position}; use chessfriend_bitboard::BitBoard; -use chessfriend_core::{Color, Piece, PlacedPiece, Square}; +use chessfriend_core::{Color, Piece, PlacedPiece, Rank, Square}; #[derive(Debug)] struct MoveIterator(usize, usize); @@ -39,8 +39,20 @@ impl MoveGeneratorInternal for PawnMoveGenerator { impl PawnMoveGenerator { fn pushes(position: &Position, piece: PlacedPiece) -> BitBoard { + let square = piece.square(); + let bitboard: BitBoard = square.into(); + let empty_squares = position.empty_squares(); - BitBoard::pawn_pushes(piece.square(), piece.color()) & empty_squares + + let mut moves = bitboard.shift_north_one() & empty_squares; + if !(bitboard + & BitBoard::rank(Rank::PAWN_STARTING_RANKS[piece.color() as usize].as_index())) + .is_empty() + { + moves |= moves.shift_north_one() & empty_squares; + } + + moves } fn attacks(position: &Position, piece: PlacedPiece) -> BitBoard {