@@ -570,14 +570,40 @@ public BaseGameBuilder Add5DPGNMoves(string pgn) {
570570 newCbm . pieces [ srcPos . ToLowerInvariant ( ) [ 0 ] - 97 , int . Parse ( srcPos . Substring ( 1 , 1 ) ) - 1 ] = new ChessBoard . ChessPiece ( ChessBoard . ChessPiece . PieceKind . Empty , false ) ;
571571
572572 if ( isKing && ( Math . Abs ( srcPosX - dstPosX ) > 1 || Math . Abs ( srcPosY - dstPosY ) > 1 ) ) {
573- var rookDstPosX = ( srcPosX + dstPosX ) / 2 ;
574- var rookDstPosY = ( srcPosY + dstPosY ) / 2 ;
573+ // points towards where the source rook was, as the king and rook get swapped
574+ var kingMoveVectorX = Math . Sign ( dstPosX - srcPosX ) ;
575+ var kingMoveVectorY = Math . Sign ( dstPosY - srcPosY ) ;
575576
576- var rookSrcPosX = dstPosX + ( rookDstPosX - srcPosX ) ;
577- var rookSrcPosY = dstPosY + ( rookDstPosY - srcPosY ) ;
578577
579- newCbm . pieces [ rookDstPosX , rookDstPosY ] = new ChessBoard . ChessPiece ( ChessBoard . ChessPiece . PieceKind . Rook , srcPiece . IsBlack ) ;
580- newCbm . pieces [ rookSrcPosX , rookSrcPosY ] = new ChessBoard . ChessPiece ( ChessBoard . ChessPiece . PieceKind . Empty , false ) ;
578+ var rookPiece = new ChessBoard . ChessPiece ( ChessBoard . ChessPiece . PieceKind . Rook , srcPiece . IsBlack ) ;
579+ int rookSrcX = srcPosX ;
580+ int rookSrcY = srcPosY ;
581+ while ( true ) {
582+ rookSrcX += kingMoveVectorX ; // go one step
583+ rookSrcY += kingMoveVectorY ;
584+
585+ var piece = srcBoard . pieces [ rookSrcX , rookSrcY ] ;
586+ if ( ! piece . IsEmpty ) // find first piece along this vector
587+ break ;
588+ }
589+
590+ if ( ! srcBoard . pieces [ rookSrcX , rookSrcY ] . Equals ( rookPiece ) ) {
591+ throw new Exception ( "couldnt find the rook that participated in the castling move?" ) ;
592+ }
593+
594+ // it might be that the king has moved to where the rook used to be, in that case we dont have to remove the old rook
595+ if ( ! newCbm . pieces [ rookSrcX , rookSrcY ] . IsEmpty && newCbm . pieces [ rookSrcX , rookSrcY ] . Kind != ChessBoard . ChessPiece . PieceKind . King )
596+ newCbm . pieces [ rookSrcX , rookSrcY ] = new ChessBoard . ChessPiece ( ChessBoard . ChessPiece . PieceKind . Empty , false ) ;
597+
598+ var rookDstPosX = dstPosX - kingMoveVectorX ;
599+ var rookDstPosY = dstPosY - kingMoveVectorY ;
600+ if ( newCbm . pieces [ rookDstPosX , rookDstPosY ] . IsEmpty ||
601+ newCbm . pieces [ rookDstPosX , rookDstPosY ] . Equals ( new ChessBoard . ChessPiece ( ChessBoard . ChessPiece . PieceKind . King , srcPiece . IsBlack ) ) ) {
602+ // if all went well, the original piece should have been empty or a king, then we should replace that with the rook
603+ newCbm . pieces [ rookDstPosX , rookDstPosY ] = rookPiece ;
604+ } else {
605+ throw new Exception ( "tried to replace a non-empty and non-king piece during castling" ) ;
606+ }
581607 }
582608
583609 newCbm . normalMove = new Timeline . Move2D ( srcPosY , srcPosX , dstPosY , dstPosX ) ;
0 commit comments