Skip to content

Commit f5ee320

Browse files
committed
fix long-castling not clearing rook piece properly. fixes #74
1 parent ab0b527 commit f5ee320

1 file changed

Lines changed: 32 additions & 6 deletions

File tree

FiveDChessDataInterface/Builders/BaseGameBuilder.cs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)