14 static const uint8 MakePawn[ColourNb] = { PieceNone256, BlackPawn256, WhitePawn256 }; // -BW
16 static const uint8 PieceFrom12[12] = {
17 BlackPawn256, WhitePawn256,
18 BlackKnight256, WhiteKnight256,
19 BlackBishop256, WhiteBishop256,
20 BlackRook256, WhiteRook256,
21 BlackQueen256, WhiteQueen256,
22 BlackKing256, WhiteKing256,
25 static const char PieceString[12+1] = "pPnNbBrRqQkK";
29 static sint8 PieceTo12[256];
39 for (piece = 0; piece < 256; piece++) PieceTo12[piece] = -1;
41 for (piece = 0; piece < 12; piece++) {
42 PieceTo12[PieceFrom12[piece]] = piece;
48 bool piece_is_ok(int piece) {
50 if (piece < 0 || piece >= 256) return FALSE;
52 if (PieceTo12[piece] < 0) return FALSE;
59 int piece_make_pawn(int colour) {
61 ASSERT(colour_is_ok(colour));
63 return MakePawn[colour];
68 int piece_pawn_opp(int piece) {
70 ASSERT(piece==BlackPawn256||piece==WhitePawn256);
77 int piece_colour(int piece) {
79 ASSERT(piece_is_ok(piece));
86 int piece_type(int piece) {
88 ASSERT(piece_is_ok(piece));
95 bool piece_is_pawn(int piece) {
97 ASSERT(piece_is_ok(piece));
99 return (piece & PawnFlags) != 0;
104 bool piece_is_knight(int piece) {
106 ASSERT(piece_is_ok(piece));
108 return (piece & KnightFlag) != 0;
113 bool piece_is_bishop(int piece) {
115 ASSERT(piece_is_ok(piece));
117 return (piece & QueenFlags) == BishopFlag;
122 bool piece_is_rook(int piece) {
124 ASSERT(piece_is_ok(piece));
126 return (piece & QueenFlags) == RookFlag;
131 bool piece_is_queen(int piece) {
133 ASSERT(piece_is_ok(piece));
135 return (piece & QueenFlags) == QueenFlags;
140 bool piece_is_king(int piece) {
142 ASSERT(piece_is_ok(piece));
144 return (piece & KingFlag) != 0;
149 bool piece_is_slider(int piece) {
151 ASSERT(piece_is_ok(piece));
153 return (piece & QueenFlags) != 0;
158 int piece_to_12(int piece) {
160 ASSERT(piece_is_ok(piece));
162 return PieceTo12[piece];
167 int piece_from_12(int piece) {
169 ASSERT(piece>=0&&piece<12);
171 return PieceFrom12[piece];
176 int piece_to_char(int piece) {
178 ASSERT(piece_is_ok(piece));
180 return PieceString[piece_to_12(piece)];
185 int piece_from_char(int c) {
189 ptr = strchr(PieceString,c);
190 if (ptr == NULL) return PieceNone256;
192 return piece_from_12(ptr-PieceString);
197 bool char_is_piece(int c) {
199 return strchr("PNBRQK",c) != NULL;