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