diff options
Diffstat (limited to 'src/engine/moves/pawn.c')
| -rw-r--r-- | src/engine/moves/pawn.c | 50 |
1 files changed, 26 insertions, 24 deletions
diff --git a/src/engine/moves/pawn.c b/src/engine/moves/pawn.c index 3cd28b8..0b8993f 100644 --- a/src/engine/moves/pawn.c +++ b/src/engine/moves/pawn.c @@ -1,14 +1,14 @@ #include "../moves.h" +#define add_promote_moves(other_flags) \ + add_move(moves, from, to, .flags = other_flags | MOVE_PROMOTE_Q); \ + add_move(moves, from, to, .flags = other_flags | MOVE_PROMOTE_R); \ + add_move(moves, from, to, .flags = other_flags | MOVE_PROMOTE_B); \ + add_move(moves, from, to, .flags = other_flags | MOVE_PROMOTE_N) + bitboard_t get_white_pawn_forwardmoves(moves_t* moves, position_t position) { bitboard_t enemy_bitboard = blacks(position); - bitboard_t friendly_pieces = - position.bitboards[WHITE_KING] | - position.bitboards[WHITE_QUEEN] | - position.bitboards[WHITE_ROOK] | - position.bitboards[WHITE_BISHOP] | - position.bitboards[WHITE_KNIGHT] | - position.bitboards[WHITE_PAWN]; + bitboard_t friendly_pieces = whites(position); bitboard_t friendly_pawns = position.bitboards[WHITE_PAWN]; bitboard_t y = friendly_pieces | enemy_bitboard; bitboard_t x = ~((friendly_pawns << 8) & y) & (friendly_pawns << 8); @@ -21,13 +21,7 @@ bitboard_t get_white_pawn_forwardmoves(moves_t* moves, position_t position) { } bitboard_t get_black_pawn_forwardmoves(moves_t* moves, position_t position) { bitboard_t enemy_bitboard = whites(position); - bitboard_t friendly_pieces = - position.bitboards[BLACK_KING] | - position.bitboards[BLACK_QUEEN] | - position.bitboards[BLACK_ROOK] | - position.bitboards[BLACK_BISHOP] | - position.bitboards[BLACK_KNIGHT] | - position.bitboards[BLACK_PAWN]; + bitboard_t friendly_pieces = blacks(position); bitboard_t friendly_pawns = position.bitboards[BLACK_PAWN]; bitboard_t y = friendly_pieces | enemy_bitboard; bitboard_t x = ~((friendly_pawns >> 8) & y) & (friendly_pawns >> 8); @@ -84,7 +78,9 @@ void get_pawn_moves(moves_t* moves, position_t position) { if (pawns == 0) next_from = 64; } item &= (item - 1); - add_move(moves, from, to); + if (to >= 56 || to <= 7) { + add_promote_moves(0); + } else add_move(moves, from, to); } } @@ -108,20 +104,24 @@ void get_pawn_moves(moves_t* moves, position_t position) { if (left != 0) { bitboard_t MASK = file_masks[left - 1] & friendly_pawns & PASSANT_RANK; if (MASK != 0) { - add_move( - moves, - left + rank_shift + from_shift, - position.passantable_file + rank_shift - 1 + int from = left + rank_shift + from_shift; + int to = position.passantable_file + rank_shift - 1; + if (to >= 56 || to <= 7) { + add_promote_moves(MOVE_EN_PASSANT | MOVE_CAPTURE); + } else add_move( + moves, from, to, .flags = MOVE_EN_PASSANT | MOVE_CAPTURE ); } } if (right != 0) { bitboard_t MASK = file_masks[right - 1] & friendly_pawns & PASSANT_RANK; if (MASK != 0) { - add_move( - moves, - right + rank_shift + from_shift, - position.passantable_file + rank_shift - 1 + int from = right + rank_shift + from_shift; + int to = position.passantable_file + rank_shift - 1; + if (to >= 56 || to <= 7) { + add_promote_moves(MOVE_EN_PASSANT | MOVE_CAPTURE); + } else add_move( + moves, from, to, .flags = MOVE_EN_PASSANT | MOVE_CAPTURE ); } } @@ -157,7 +157,9 @@ void get_pawn_moves(moves_t* moves, position_t position) { while (MASK) { int to = __builtin_ctzll(MASK); MASK &= MASK - 1; - add_move(moves, from, to); + if (to >= 56 || to <= 7) { + add_promote_moves(MOVE_CAPTURE); + } else add_move(moves, from, to, .flags = MOVE_CAPTURE); } } } |
