From 622773f70a4b43ee8a6f62389b03ad27ed82b5fd Mon Sep 17 00:00:00 2001
From: eug-vs <eugene@eug-vs.xyz>
Date: Sun, 29 Jan 2023 18:16:16 +0300
Subject: fix: do not allow castling after black king moves

---
 src/board/mod.rs | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

(limited to 'src/board/mod.rs')

diff --git a/src/board/mod.rs b/src/board/mod.rs
index 8f5fbde..f710057 100644
--- a/src/board/mod.rs
+++ b/src/board/mod.rs
@@ -540,7 +540,7 @@ impl Board {
     }
 
     /// *Blindlessly* apply a move without any validation
-    /// Move should be validated beforehand
+    /// Legality test should still be performed
     pub fn make_move(&mut self, mov: Move) -> Option<PieceType> {
         let move_source_bb = mov.source.to_bitboard();
         let move_target_bb = mov.target.to_bitboard();
@@ -645,7 +645,7 @@ impl Board {
 
         // Withdraw castling rights when moving rooks or king
         let source_color = Color::from_piece(source_piece) as usize;
-        match source_piece {
+        match source_piece.without_color() {
             PieceType::King => {
                 self.castling_rights[source_color][CastlingSide::King as usize] = false;
                 self.castling_rights[source_color][CastlingSide::Queen as usize] = false;
@@ -978,4 +978,22 @@ mod tests {
         assert_eq!(board.is_square_attacked(Square::B6, Color::Black), true);
     }
 
+    #[test]
+    fn moved_king_castle() {
+        let fen = String::from("4k2r/ppp1n3/8/4R1Pp/5P2/q1P5/P1P1BP2/1K1R4 b - - 2 22");
+        let mut board = Board::from_FEN(fen);
+        board.ply += 1;
+
+        // Shuffle kings around, returning to the same position
+        board.make_move(Move { source: Square::E8, target: Square::F8, kind: MoveKind::Quiet });
+        board.make_move(Move { source: Square::B1, target: Square::A1, kind: MoveKind::Quiet });
+        board.make_move(Move { source: Square::F8, target: Square::E8, kind: MoveKind::Quiet });
+        board.make_move(Move { source: Square::A1, target: Square::B1, kind: MoveKind::Quiet });
+
+        let moves = board.generate_pseudolegal_moves(board.color());
+
+        let castle = moves.iter().find(|m| **m == Move { source: Square::E8, target: Square::G8, kind: MoveKind::Castle });
+        println!("{:?}", board.castling_rights);
+        assert!(castle.is_none(), "Castle should not be allowed after king has moved");
+    }
 }
-- 
cgit v1.2.3