public static void GeneratePawnMoves(Board board, MovesList movesList) { int piece = board.side + pawnBit; int direction = board.side == white ? boardWidth : -boardWidth; Func <int, bool> promotionZone; Func <int, bool> pawnStartZone; if (board.side == white) { promotionZone = (int Square) => Square > (int)H6; pawnStartZone = (int square) => square < (int)A3; } else { pawnStartZone = (int Square) => Square > (int)H6; promotionZone = (int square) => square < (int)A3; } for (int i = 0; i < board.pieces[piece].Count; i++) { int square = board.pieces[piece][i]; int toSquare = square + direction; // promotions if (promotionZone(square)) { if (board[toSquare] == empty) { AddMove.PromotionMove(board, Move.Write(square, toSquare, 0, 0, false, false, false), movesList); } //captures if ((board[toSquare + 1] & border) == enemy) { AddMove.PromotionMove(board, Move.Write(square, toSquare + 1, board[toSquare + 1], 0, false, false, false), movesList); } if ((board[toSquare - 1] & border) == enemy) { AddMove.PromotionMove(board, Move.Write(square, toSquare - 1, board[toSquare - 1], 0, false, false, false), movesList); } } else { if (board[toSquare] == empty) { AddMove.QuietPawnMove(board, Move.Write(square, toSquare, 0, 0, false, false, false), movesList); //pawnstart if (pawnStartZone(square) && (board[toSquare + direction] == empty)) { AddMove.QuietPawnMove(board, Move.Write(square, toSquare + direction, 0, 0, false, true, false), movesList); } } //captures if ((board[toSquare + 1] & border) == enemy) { AddMove.PawnCaptureMove(board, Move.Write(square, toSquare + 1, board[toSquare + 1], 0, false, false, false), movesList); } if ((board[toSquare - 1] & border) == enemy) { AddMove.PawnCaptureMove(board, Move.Write(square, toSquare - 1, board[toSquare - 1], 0, false, false, false), movesList); } //enpassant if (toSquare + 1 == board.enpassantSquare) { AddMove.EnpassantMove(board, Move.Write(square, board.enpassantSquare, board[board.enpassantSquare], 0, true, false, false), movesList); } if (toSquare - 1 == board.enpassantSquare) { AddMove.EnpassantMove(board, Move.Write(square, board.enpassantSquare, board[board.enpassantSquare], 0, true, false, false), movesList); } } } }