public void UndoChessMove(Position origin, Position destiny, Piece takenPiece) { Piece returnedPiece = Board.RemovePiece(destiny); returnedPiece.DecreaseQtyMovement(); Board.AddressPiece(returnedPiece, origin); if (takenPiece != null) { Board.AddressPiece(takenPiece, destiny); CapturedPieces.Remove(takenPiece); } //Special move: Castling //Short Castling if (returnedPiece is King && destiny.Column == origin.Column + 2) { Position rookOrigin = new Position(origin.Line, origin.Column + 3); Position rookDestiny = new Position(origin.Line, origin.Column + 1); Piece movedRook = Board.RemovePiece(rookDestiny); movedRook.DecreaseQtyMovement(); Board.AddressPiece(movedRook, rookOrigin); } //Long Castling if (returnedPiece is King && destiny.Column == origin.Column - 2) { Position rookOrigin = new Position(origin.Line, origin.Column - 4); Position rookDestiny = new Position(origin.Line, origin.Column - 1); Piece movedRook = Board.RemovePiece(rookDestiny); movedRook.DecreaseQtyMovement(); Board.AddressPiece(movedRook, rookOrigin); } //Special move: En passant if (returnedPiece is Pawn) { if (origin.Column != destiny.Column && takenPiece == VulnerableToEnPassant) { Piece EnPassantCapture = Board.RemovePiece(destiny); Position EnPassantReturnPosition; if (returnedPiece.Color == Color.White) { EnPassantReturnPosition = new Position(3, destiny.Column); } else { EnPassantReturnPosition = new Position(4, destiny.Column); } Board.AddressPiece(EnPassantCapture, EnPassantReturnPosition); } } }