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