1 2 // piece.h 3 4 #ifndef PIECE_H 5 #define PIECE_H 6 7 // includes 8 9 #include "colour.h" 10 #include "util.h" 11 12 // constants 13 14 const int WhitePawnFlag = 1 << 2; 15 const int BlackPawnFlag = 1 << 3; 16 const int KnightFlag = 1 << 4; 17 const int BishopFlag = 1 << 5; 18 const int RookFlag = 1 << 6; 19 const int KingFlag = 1 << 7; 20 21 const int PawnFlags = WhitePawnFlag | BlackPawnFlag; 22 const int QueenFlags = BishopFlag | RookFlag; 23 24 const int PieceNone64 = 0; 25 const int WhitePawn64 = WhitePawnFlag; 26 const int BlackPawn64 = BlackPawnFlag; 27 const int Knight64 = KnightFlag; 28 const int Bishop64 = BishopFlag; 29 const int Rook64 = RookFlag; 30 const int Queen64 = QueenFlags; 31 const int King64 = KingFlag; 32 33 const int PieceNone256 = 0; 34 const int WhitePawn256 = WhitePawn64 | WhiteFlag; 35 const int BlackPawn256 = BlackPawn64 | BlackFlag; 36 const int WhiteKnight256 = Knight64 | WhiteFlag; 37 const int BlackKnight256 = Knight64 | BlackFlag; 38 const int WhiteBishop256 = Bishop64 | WhiteFlag; 39 const int BlackBishop256 = Bishop64 | BlackFlag; 40 const int WhiteRook256 = Rook64 | WhiteFlag; 41 const int BlackRook256 = Rook64 | BlackFlag; 42 const int WhiteQueen256 = Queen64 | WhiteFlag; 43 const int BlackQueen256 = Queen64 | BlackFlag; 44 const int WhiteKing256 = King64 | WhiteFlag; 45 const int BlackKing256 = King64 | BlackFlag; 46 const int PieceNb = 256; 47 48 const int WhitePawn12 = 0; 49 const int BlackPawn12 = 1; 50 const int WhiteKnight12 = 2; 51 const int BlackKnight12 = 3; 52 const int WhiteBishop12 = 4; 53 const int BlackBishop12 = 5; 54 const int WhiteRook12 = 6; 55 const int BlackRook12 = 7; 56 const int WhiteQueen12 = 8; 57 const int BlackQueen12 = 9; 58 const int WhiteKing12 = 10; 59 const int BlackKing12 = 11; 60 61 // macros 62 63 #define PAWN_MAKE(colour) (PawnMake[colour]) 64 #define PAWN_OPP(pawn) ((pawn)^(WhitePawn256^BlackPawn256)) 65 66 #define PIECE_COLOUR(piece) (((piece)&3)-1) 67 #define PIECE_TYPE(piece) ((piece)&~3) 68 69 #define PIECE_IS_PAWN(piece) (((piece)&PawnFlags)!=0) 70 #define PIECE_IS_KNIGHT(piece) (((piece)&KnightFlag)!=0) 71 #define PIECE_IS_BISHOP(piece) (((piece)&QueenFlags)==BishopFlag) 72 #define PIECE_IS_ROOK(piece) (((piece)&QueenFlags)==RookFlag) 73 #define PIECE_IS_QUEEN(piece) (((piece)&QueenFlags)==QueenFlags) 74 #define PIECE_IS_KING(piece) (((piece)&KingFlag)!=0) 75 #define PIECE_IS_SLIDER(piece) (((piece)&QueenFlags)!=0) 76 77 #define PIECE_TO_12(piece) (PieceTo12[piece]) 78 79 #define PIECE_ORDER(piece) (PieceOrder[piece]) 80 81 #define PAWN_MOVE_INC(colour) (PawnMoveInc[colour]) 82 #define PIECE_INC(piece) (PieceInc[piece]) 83 84 // types 85 86 typedef int inc_t; 87 88 // "constants" 89 90 extern const int PawnMake[ColourNb]; 91 extern const int PieceFrom12[12]; 92 93 extern const inc_t PawnMoveInc[ColourNb]; 94 95 extern const inc_t KnightInc[8+1]; 96 extern const inc_t BishopInc[4+1]; 97 extern const inc_t RookInc[4+1]; 98 extern const inc_t QueenInc[8+1]; 99 extern const inc_t KingInc[8+1]; 100 101 // variables 102 103 extern int PieceTo12[PieceNb]; 104 extern int PieceOrder[PieceNb]; 105 106 extern const inc_t * PieceInc[PieceNb]; 107 108 // functions 109 110 extern void piece_init (); 111 112 extern bool piece_is_ok (int piece); 113 114 extern int piece_from_12 (int piece_12); 115 116 extern int piece_to_char (int piece); 117 extern int piece_from_char (int c); 118 119 #endif // !defined PIECE_H 120 121 // end of piece.h 122 123