Fix duck chess en passant FEN setup
authorFabian Fichter <ianfab@users.noreply.github.com>
Wed, 11 Dec 2024 20:39:30 +0000 (21:39 +0100)
committerFabian Fichter <ianfab@users.noreply.github.com>
Wed, 11 Dec 2024 21:30:09 +0000 (22:30 +0100)
Closes #832.

src/position.cpp
test.py

index 5278c01..81fa3c7 100644 (file)
@@ -438,14 +438,14 @@ Position& Position::set(const Variant* v, const string& fenStr, bool isChess960,
               // 2)
               // a) side to move have a pawn threatening epSquare
               // b) there is an enemy pawn one or two (for triple steps) squares in front of epSquare
-              // c) there is no piece on epSquare or behind epSquare
+              // c) there is no (non-wall) piece on epSquare or behind epSquare
               if (   (var->enPassantRegion & epSquare)
                   && (   !var->fastAttacks
                       || (var->enPassantTypes[sideToMove] & ~piece_set(PAWN))
                       || (   pawn_attacks_bb(~sideToMove, epSquare) & pieces(sideToMove, PAWN)
                           && (   (pieces(~sideToMove, PAWN) & (epSquare + pawn_push(~sideToMove)))
                               || (pieces(~sideToMove, PAWN) & (epSquare + 2 * pawn_push(~sideToMove))))
-                          && !(pieces() & (epSquare | (epSquare + pawn_push(sideToMove)))))))
+                          && !((pieces(WHITE) | pieces(BLACK)) & (epSquare | (epSquare + pawn_push(sideToMove)))))))
                   st->epSquares |= epSquare;
           }
   }
diff --git a/test.py b/test.py
index bef4e5f..03f656b 100644 (file)
--- a/test.py
+++ b/test.py
@@ -470,6 +470,11 @@ class TestPyffish(unittest.TestCase):
         result = sf.get_fen("pocketknight", "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR[Nn] w KQkq - 0 1", ["N@e4"])
         self.assertEqual(result, "rnbqkbnr/pppppppp/8/8/4N3/8/PPPPPPPP/RNBQKBNR[n] b KQkq - 0 1")
 
+        # duck chess en passant
+        fen = "r1b1k3/pp3pb1/4p3/2p2p2/2PpP2q/1P1P1P2/P1K1*3/RN1Q2N1 b q e3 0 17"
+        result = sf.get_fen("duck", fen, [])
+        self.assertEqual(result, fen)
+
         # SFEN
         result = sf.get_fen("shogi", SHOGI, [], False, True)
         self.assertEqual(result, SHOGI_SFEN)