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