#pragma once #include #include #define FILE_A 0x0101010101010101ULL #define FILE_B 0x0202020202020202ULL #define FILE_C 0x0404040404040404ULL #define FILE_D 0x0808080808080808ULL #define FILE_E 0x1010101010101010ULL #define FILE_F 0x2020202020202020ULL #define FILE_G 0x4040404040404040ULL #define FILE_H 0x8080808080808080ULL #define RANK_1 0x00000000000000FFULL #define RANK_2 0x000000000000FF00ULL #define RANK_3 0x0000000000FF0000ULL #define RANK_4 0x00000000FF000000ULL #define RANK_5 0x000000FF00000000ULL #define RANK_6 0x0000FF0000000000ULL #define RANK_7 0x00FF000000000000ULL #define RANK_8 0xFF00000000000000ULL #define SET_BIT(bb, sq) ((bb) |= (1ULL << (sq))) #define CLEAR_BIT(bb, sq) ((bb) &= ~(1ULL << (sq))) #define GET_BIT(bb, sq) ((bb) & (1ULL << (sq))) #define TOGGLE_BIT(bb, sq) ((bb) ^= (1ULL << (sq))) // King castling helpers. #define BB(sq) (1ULL << (sq)) // a1 = 0, h8 = 63 (rank*8 + file) enum Square { A1,B1,C1,D1,E1,F1,G1,H1, A2,B2,C2,D2,E2,F2,G2,H2, A3,B3,C3,D3,E3,F3,G3,H3, A4,B4,C4,D4,E4,F4,G4,H4, A5,B5,C5,D5,E5,F5,G5,H5, A6,B6,C6,D6,E6,F6,G6,H6, A7,B7,C7,D7,E7,F7,G7,H7, A8,B8,C8,D8,E8,F8,G8,H8 }; #define WK_EMPTY_MASK (BB(F1) | BB(G1)) #define WQ_EMPTY_MASK (BB(B1) | BB(C1) | BB(D1)) #define BK_EMPTY_MASK (BB(F8) | BB(G8)) #define BQ_EMPTY_MASK (BB(B8) | BB(C8) | BB(D8)) // squares king is on / passes / lands (use for attacked-squares test later) #define WK_THRU_MASK (BB(E1) | BB(F1) | BB(G1)) #define WQ_THRU_MASK (BB(E1) | BB(D1) | BB(C1)) #define BK_THRU_MASK (BB(E8) | BB(F8) | BB(G8)) #define BQ_THRU_MASK (BB(E8) | BB(D8) | BB(C8)) // king target squares #define WK_TO G1 #define WQ_TO C1 #define BK_TO G8 #define BQ_TO C8 enum Color { WHITE = 0, BLACK = 1, BOTH = 2 }; enum Piece { P, N, B, R, Q, K, // 0..5 white p, n, b, r, q, k // 6..11 black }; enum Castling { CASTLE_WK = 1 << 0, CASTLE_WQ = 1 << 1, CASTLE_BK = 1 << 2, CASTLE_BQ = 1 << 3 }; enum MoveFlags { MF_NONE = 0, MF_CAPTURE = 1 << 0, MF_PROMO = 1 << 1, MF_ENPASSANT = 1 << 2, MF_CASTLE = 1 << 3, MF_DOUBLE_PUSH = 1 << 4, }; struct Move { uint16_t from; uint16_t to; uint8_t piece; uint8_t promo; uint8_t flags; }; struct Board { uint64_t pieces[12]; // Each set of pieces get a bitboard for each player. uint64_t occ[3]; // Color occupancy bitboards. uint64_t king_square[2]; uint8_t castling_rights; int ep_square; enum Color side_to_move; int halfmove_clock; int fullmove_number; }; void create_knight_attack_cache(); void create_pawn_attack_cache(); void create_king_attack_cache(); void print_board(); void gen_white_pawn_quiet_pushes(const struct Board *board, struct Move *moves, int *count); void gen_black_pawn_quiet_pushes(const struct Board *board, struct Move *moves, int *count); void gen_white_pawn_push_promotions(const struct Board *board, struct Move *moves, int *count); void gen_black_pawn_push_promotions(const struct Board *board, struct Move *moves, int *count); void gen_white_pawn_captures(const struct Board *board, struct Move *moves, int *count); void gen_black_pawn_captures(const struct Board *board, struct Move *moves, int *count); void gen_white_pawn_capture_promotions(const struct Board *board, struct Move *moves, int *count); void gen_black_pawn_capture_promotions(const struct Board *board, struct Move *moves, int *count); int gen_pseudo_moves(const struct Board *board, struct Move *out, bool captures_only);