Add forgotten files 1.4.70b
[polyglot.git] / piece.cpp
1 \r
2 // piece.cpp\r
3 \r
4 // includes\r
5 \r
6 #include <cstring>\r
7 \r
8 #include "colour.h"\r
9 #include "piece.h"\r
10 #include "util.h"\r
11 \r
12 // "constants"\r
13 \r
14 static const uint8 MakePawn[ColourNb] = { PieceNone256, BlackPawn256, WhitePawn256 }; // -BW\r
15 \r
16 static const uint8 PieceFrom12[12] = {\r
17    BlackPawn256,   WhitePawn256,\r
18    BlackKnight256, WhiteKnight256,\r
19    BlackBishop256, WhiteBishop256,\r
20    BlackRook256,   WhiteRook256,\r
21    BlackQueen256,  WhiteQueen256,\r
22    BlackKing256,   WhiteKing256,\r
23 };\r
24 \r
25 static const char PieceString[12+1] = "pPnNbBrRqQkK";\r
26 \r
27 // variables\r
28 \r
29 static sint8 PieceTo12[256];\r
30 \r
31 // functions\r
32 \r
33 // piece_init()\r
34 \r
35 void piece_init() {\r
36 \r
37    int piece;\r
38 \r
39    for (piece = 0; piece < 256; piece++) PieceTo12[piece] = -1;\r
40 \r
41    for (piece = 0; piece < 12; piece++) {\r
42       PieceTo12[PieceFrom12[piece]] = piece;\r
43    }\r
44 }\r
45 \r
46 // piece_is_ok()\r
47 \r
48 bool piece_is_ok(int piece) {\r
49 \r
50    if (piece < 0 || piece >= 256) return false;\r
51 \r
52    if (PieceTo12[piece] < 0) return false;\r
53 \r
54    return true;\r
55 }\r
56 \r
57 // piece_make_pawn()\r
58 \r
59 int piece_make_pawn(int colour) {\r
60 \r
61    ASSERT(colour_is_ok(colour));\r
62 \r
63    return MakePawn[colour];\r
64 }\r
65 \r
66 // piece_pawn_opp()\r
67 \r
68 int piece_pawn_opp(int piece) {\r
69 \r
70    ASSERT(piece==BlackPawn256||piece==WhitePawn256);\r
71 \r
72    return piece ^ 15;\r
73 }\r
74 \r
75 // piece_colour()\r
76 \r
77 int piece_colour(int piece) {\r
78 \r
79    ASSERT(piece_is_ok(piece));\r
80 \r
81    return piece & 3;\r
82 }\r
83 \r
84 // piece_type()\r
85 \r
86 int piece_type(int piece) {\r
87 \r
88    ASSERT(piece_is_ok(piece));\r
89 \r
90    return piece & ~3;\r
91 }\r
92 \r
93 // piece_is_pawn()\r
94 \r
95 bool piece_is_pawn(int piece) {\r
96 \r
97    ASSERT(piece_is_ok(piece));\r
98 \r
99    return (piece & PawnFlags) != 0;\r
100 }\r
101 \r
102 // piece_is_knight()\r
103 \r
104 bool piece_is_knight(int piece) {\r
105 \r
106    ASSERT(piece_is_ok(piece));\r
107 \r
108    return (piece & KnightFlag) != 0;\r
109 }\r
110 \r
111 // piece_is_bishop()\r
112 \r
113 bool piece_is_bishop(int piece) {\r
114 \r
115    ASSERT(piece_is_ok(piece));\r
116 \r
117    return (piece & QueenFlags) == BishopFlag;\r
118 }\r
119 \r
120 // piece_is_rook()\r
121 \r
122 bool piece_is_rook(int piece) {\r
123 \r
124    ASSERT(piece_is_ok(piece));\r
125 \r
126    return (piece & QueenFlags) == RookFlag;\r
127 }\r
128 \r
129 // piece_is_queen()\r
130 \r
131 bool piece_is_queen(int piece) {\r
132 \r
133    ASSERT(piece_is_ok(piece));\r
134 \r
135    return (piece & QueenFlags) == QueenFlags;\r
136 }\r
137 \r
138 // piece_is_king()\r
139 \r
140 bool piece_is_king(int piece) {\r
141 \r
142    ASSERT(piece_is_ok(piece));\r
143 \r
144    return (piece & KingFlag) != 0;\r
145 }\r
146 \r
147 // piece_is_slider()\r
148 \r
149 bool piece_is_slider(int piece) {\r
150 \r
151    ASSERT(piece_is_ok(piece));\r
152 \r
153    return (piece & QueenFlags) != 0;\r
154 }\r
155 \r
156 // piece_to_12()\r
157 \r
158 int piece_to_12(int piece) {\r
159 \r
160    ASSERT(piece_is_ok(piece));\r
161 \r
162    return PieceTo12[piece];\r
163 }\r
164 \r
165 // piece_from_12()\r
166 \r
167 int piece_from_12(int piece) {\r
168 \r
169    ASSERT(piece>=0&&piece<12);\r
170 \r
171    return PieceFrom12[piece];\r
172 }\r
173 \r
174 // piece_to_char()\r
175 \r
176 int piece_to_char(int piece) {\r
177 \r
178    ASSERT(piece_is_ok(piece));\r
179 \r
180    return PieceString[piece_to_12(piece)];\r
181 }\r
182 \r
183 // piece_from_char()\r
184 \r
185 int piece_from_char(int c) {\r
186 \r
187    const char * ptr;\r
188 \r
189    ptr = strchr(PieceString,c);\r
190    if (ptr == NULL) return PieceNone256;\r
191 \r
192    return piece_from_12(ptr-PieceString);\r
193 }\r
194 \r
195 // char_is_piece()\r
196 \r
197 bool char_is_piece(int c) {\r
198 \r
199    return strchr("PNBRQK",c) != NULL;\r
200 }\r
201 \r
202 // end of piece.cpp\r
203 \r