@@ -42,62 +42,47 @@ int turnNumber
4242 HalfMoveClock = halfMoveClock ;
4343 TurnNumber = turnNumber ;
4444 }
45-
46- public GameConditions CalculateEndingConditions ( Board endingBoard , IList < HalfMove > halfMovesFromStart ) {
47- if ( halfMovesFromStart . Count == 0 ) return this ;
48-
49- bool whiteEligibleForCastling = endingBoard . WhiteKing . Position . Equals ( 5 , 1 ) && ! endingBoard . WhiteKing . HasMoved ;
50- bool blackEligibleForCastling = endingBoard . BlackKing . Position . Equals ( 5 , 8 ) && ! endingBoard . BlackKing . HasMoved ;
51- int turnNumberAddend = SideToMove == Side . White
52- ? halfMovesFromStart . Count / 2
53- : ( halfMovesFromStart . Count + 1 ) / 2 ;
45+
46+ public GameConditions CalculateEndingConditions ( Board resultingBoard , HalfMove lastHalfMove ) {
47+ bool whiteKingMoved = lastHalfMove . Piece is King { OwningSide : Side . White } ;
48+ bool whiteQueensideRookMoved = lastHalfMove is {
49+ Piece : Rook { OwningSide : Side . White } ,
50+ Move : { Start : { File : 1 , Rank : 1 } }
51+ } ;
52+ bool whiteKingsideRookMoved = lastHalfMove is {
53+ Piece : Rook { OwningSide : Side . White } ,
54+ Move : { Start : { File : 8 , Rank : 1 } }
55+ } ;
5456
55- return new GameConditions (
56- sideToMove : halfMovesFromStart . Count % 2 == 0 ? SideToMove : SideToMove . Complement ( ) ,
57- whiteCanCastleKingside : whiteEligibleForCastling && endingBoard [ 8 , 1 ] is Rook { HasMoved : false } ,
58- whiteCanCastleQueenside : whiteEligibleForCastling && endingBoard [ 1 , 1 ] is Rook { HasMoved : false } ,
59- blackCanCastleKingside : blackEligibleForCastling && endingBoard [ 8 , 8 ] is Rook { HasMoved : false } ,
60- blackCanCastleQueenside : blackEligibleForCastling && endingBoard [ 1 , 8 ] is Rook { HasMoved : false } ,
61- enPassantSquare : GetEndingEnPassantSquare ( halfMovesFromStart [ ^ 1 ] ) ,
62- halfMoveClock : GetEndingHalfMoveClock ( halfMovesFromStart ) ,
63- turnNumber : TurnNumber + turnNumberAddend
64- ) ;
65- }
66-
67- public GameConditions CalculateEndingConditions ( Board endingBoard , HalfMove lastHalfMove ) {
68- bool whiteEligibleForCastling = endingBoard . WhiteKing . Position . Equals ( 5 , 1 ) && ! endingBoard . WhiteKing . HasMoved ;
69- bool blackEligibleForCastling = endingBoard . BlackKing . Position . Equals ( 5 , 8 ) && ! endingBoard . BlackKing . HasMoved ;
57+ bool blackKingMoved = lastHalfMove . Piece is King { OwningSide : Side . Black } ;
58+ bool blackQueensideRookMoved = lastHalfMove is {
59+ Piece : Rook { OwningSide : Side . Black } ,
60+ Move : { Start : { File : 1 , Rank : 8 } }
61+ } ;
62+ bool blackKingsideRookMoved = lastHalfMove is {
63+ Piece : Rook { OwningSide : Side . Black } ,
64+ Move : { Start : { File : 8 , Rank : 8 } }
65+ } ;
7066
7167 return new GameConditions (
7268 sideToMove : SideToMove . Complement ( ) ,
73- whiteCanCastleKingside : whiteEligibleForCastling && endingBoard [ 8 , 1 ] is Rook { HasMoved : false } ,
74- whiteCanCastleQueenside : whiteEligibleForCastling && endingBoard [ 1 , 1 ] is Rook { HasMoved : false } ,
75- blackCanCastleKingside : blackEligibleForCastling && endingBoard [ 8 , 8 ] is Rook { HasMoved : false } ,
76- blackCanCastleQueenside : blackEligibleForCastling && endingBoard [ 1 , 8 ] is Rook { HasMoved : false } ,
77- enPassantSquare : GetEndingEnPassantSquare ( lastHalfMove ) ,
69+ whiteCanCastleKingside : WhiteCanCastleKingside && ! whiteKingMoved && ! whiteKingsideRookMoved ,
70+ whiteCanCastleQueenside : WhiteCanCastleKingside && ! whiteKingMoved && ! whiteQueensideRookMoved ,
71+ blackCanCastleKingside : BlackCanCastleKingside && ! blackKingMoved && ! blackKingsideRookMoved ,
72+ blackCanCastleQueenside : BlackCanCastleKingside && ! blackKingMoved && ! blackQueensideRookMoved ,
73+ enPassantSquare : GetNextEnPassantSquare ( lastHalfMove ) ,
7874 halfMoveClock : GetNextHalfMoveClock ( lastHalfMove , HalfMoveClock ) ,
7975 turnNumber : TurnNumber + ( SideToMove == Side . White ? 0 : 1 )
8076 ) ;
8177 }
8278
83- private int GetEndingHalfMoveClock ( IEnumerable < HalfMove > movesFromStart ) {
84- int endingHalfMoveClock = HalfMoveClock ;
85-
86- foreach ( HalfMove halfMove in movesFromStart ) {
87- endingHalfMoveClock = GetNextHalfMoveClock ( halfMove , endingHalfMoveClock ) ;
88- }
89-
90- return endingHalfMoveClock ;
91- }
92-
93- private static int GetNextHalfMoveClock ( HalfMove halfMove , int endingHalfMoveClock ) {
94- return halfMove . Piece is Pawn || halfMove . CapturedPiece
79+ private static int GetNextHalfMoveClock ( HalfMove lastHalfMove , int endingHalfMoveClock ) {
80+ return lastHalfMove . Piece is Pawn || lastHalfMove . CapturedPiece
9581 ? 0
9682 : endingHalfMoveClock + 1 ;
9783 }
98-
99- // NOTE ending en passant square can be determined from simply the last half move made.
100- private static Square GetEndingEnPassantSquare ( HalfMove lastHalfMove ) {
84+
85+ private static Square GetNextEnPassantSquare ( HalfMove lastHalfMove ) {
10186 Side lastTurnPieceColor = lastHalfMove . Piece . OwningSide ;
10287 int pawnStartingRank = lastTurnPieceColor == Side . White ? 2 : 7 ;
10388 int pawnEndingRank = lastTurnPieceColor == Side . White ? 4 : 5 ;
0 commit comments