#ifndef BITBOARD_H #define BITBOARD_H #include "ints.h" #include typedef u64 bitboard_t; enum { WHITE_KING, WHITE_QUEEN, WHITE_ROOK, WHITE_BISHOP, WHITE_KNIGHT, WHITE_PAWN, BLACK_KING, BLACK_QUEEN, BLACK_ROOK, BLACK_BISHOP, BLACK_KNIGHT, BLACK_PAWN, PIECE_TYPE_COUNT, }; enum { WHITE_SHORT_CASTLE = 1 << 0, WHITE_LONG_CASTLE = 1 << 1, BLACK_SHORT_CASTLE = 1 << 2, BLACK_LONG_CASTLE = 1 << 3, }; enum { WHITE_TURN, BLACK_TURN, }; #define BITMASK_RANK_1 255ULL #define BITMASK_RANK_2 65280ULL #define BITMASK_RANK_3 16711680ULL #define BITMASK_RANK_4 4278190080ULL #define BITMASK_RANK_5 1095216660480ULL #define BITMASK_RANK_6 280375465082880ULL #define BITMASK_RANK_7 71776119061217280ULL #define BITMASK_RANK_8 18374686479671623680ULL #define BITMASK_FILE_A 72340172838076673ULL #define BITMASK_FILE_B 144680345676153346ULL #define BITMASK_FILE_C 289360691352306692ULL #define BITMASK_FILE_D 578721382704613384ULL #define BITMASK_FILE_E 1157442765409226768ULL #define BITMASK_FILE_F 2314885530818453536ULL #define BITMASK_FILE_G 4629771061636907072ULL #define BITMASK_FILE_H 9259542123273814144ULL #define occupied_by(bitboard, index) (bitboard & ((bitboard_t)1 << index)) typedef struct { bitboard_t bitboards[PIECE_TYPE_COUNT]; u8 castling; u8 turn; u8 passantable_file; u16 halfmove_clock; u16 fullmove_clock; } position_t; position_t position_starting(); void assert_valid_position(position_t position); bool check_valid_position(position_t position); bitboard_t whites(position_t position); bitboard_t blacks(position_t position); void print_bitboard(bitboard_t bitboard); #endif // BITBOARD_H