summaryrefslogtreecommitdiff
path: root/include/engine
diff options
context:
space:
mode:
Diffstat (limited to 'include/engine')
-rw-r--r--include/engine/moves.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/include/engine/moves.h b/include/engine/moves.h
new file mode 100644
index 0000000..86c4844
--- /dev/null
+++ b/include/engine/moves.h
@@ -0,0 +1,81 @@
+#ifndef MOVES_H
+#define MOVES_H
+
+#include "../ints.h"
+#include "../bitboard.h"
+
+typedef u8 square_t;
+
+// think about the chess move notation
+// e4, Nf6, Qh3+, Qe1#, a8=Q, i need to store the information needed to
+// recreate this in move_t
+enum {
+ MOVE_CAPTURE = 1,
+ MOVE_SHORT_CASTLE = 1 << 1,
+ MOVE_LONG_CASTLE = 1 << 2,
+
+ // technically these promotation flags can be compressed to only use 2 bits..
+ MOVE_PROMOTE_Q = 1 << 3, // 1 << 5
+ MOVE_PROMOTE_R = 1 << 4, // 2 << 5
+ MOVE_PROMOTE_B = 1 << 5, // 3 << 5
+ MOVE_PROMOTE_N = 1 << 6, // 4 << 5 ? nvm it uses 3
+ MOVE_EN_PASSANT = 1 << 7,
+ MOVE_CHECK = 1 << 8,
+};
+
+typedef struct {
+ square_t from;
+ square_t to;
+ u16 flags;
+} move_t;
+void position_make_move(position_t* position, move_t* move);
+
+typedef struct {
+ move_t* moves;
+ u32 length;
+ u32 capacity;
+} moves_t;
+
+moves_t moves_init();
+moves_t moves_init_wcapacity(u32 capacity);
+moves_t moves_empty();
+
+struct add_move_params {
+ u16 flags;
+};
+#define add_move(moves, from, to, ...) _add_move(\
+ moves, \
+ from, \
+ to, \
+ (struct add_move_params) { .flags = 0, __VA_ARGS__ }\
+)
+void _add_move(
+ moves_t* moves,
+ square_t from,
+ square_t to,
+ struct add_move_params params
+);
+
+void get_pawn_moves(moves_t* moves, position_t position);
+void get_knight_moves(moves_t* moves, position_t position);
+void get_king_moves(moves_t* moves, position_t position);
+void get_rook_moves(moves_t* moves, position_t position);
+void get_bishop_moves(moves_t* moves, position_t position);
+void get_queen_moves(moves_t* moves, position_t position);
+
+void get_moves(moves_t* moves, position_t position);
+
+void __forloop_rook_moves_gen(
+ moves_t* moves,
+ bitboard_t friendly_type,
+ bitboard_t friendly_pieces,
+ bitboard_t enemy_pieces
+);
+void __forloop_bishop_moves_gen(
+ moves_t* moves,
+ bitboard_t friendly_type,
+ bitboard_t friendly_pieces,
+ bitboard_t enemy_pieces
+);
+
+#endif // !MOVES_H