[bitboard, core, position] Implement proper castle move generation

Add a field to MoveSet called special that flags special moves that should be
generated in the iter() method. This field is a u8. It only tracks castles in
the first and second bits (kingside and queenside, respectively). The move iterator
chains two maps over Option<()> that produce the kingside and queenside castle
moves.

With that done, finish the implementation of Position::player_can_castle by
adding checks for whether the squares between the rook and king are clear, and
that the king would not pass through a check. This is done with BitBoards!

Finally, implement some logic in PositionBuilder that updates the position's
castling flags based on the positions of king and rooks.

Supporting changes:
- Add Color:ALL and iterate on that slice
- Add Castle::ALL and iterator on that slice
- Add a CastlingParameters struct that contains BitBoard properties that describe
  squares that should be clear of pieces and squares that should not be attacked.
This commit is contained in:
Eryn Wells 2024-01-29 14:44:48 -08:00
parent 83a4e47e56
commit 1d7dada987
6 changed files with 234 additions and 60 deletions

View file

@ -10,8 +10,10 @@ pub enum Color {
}
impl Color {
pub fn iter() -> impl Iterator<Item = Color> {
[Color::White, Color::Black].into_iter()
pub const ALL: [Color; 2] = [Color::White, Color::Black];
pub fn iter() -> impl Iterator<Item = &'static Color> {
Color::ALL.iter()
}
pub fn other(&self) -> Color {