#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; void moves_init(moves_t *moves); void moves_deinit(moves_t moves); void moves_init_wcapacity(moves_t *moves, 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); bool square_attacked(position_t position, square_t square, u8 by_color); void get_legal_moves(moves_t *moves, position_t position); #ifdef MOVES_INTERNAL 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_INTERNAL #endif // !MOVES_H