summaryrefslogtreecommitdiff
path: root/src/engine/moves/pawn.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/moves/pawn.c')
-rw-r--r--src/engine/moves/pawn.c50
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);
}
}
}