Add forgotten files 1.4.70b
[polyglot.git] / piece.c
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
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
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
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
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
77 int piece_colour(int piece) {
78
79    ASSERT(piece_is_ok(piece));
80
81    return piece & 3;
82 }
83
84 // piece_type()
85
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
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
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
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
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
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
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
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
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
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
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
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
197 bool char_is_piece(int c) {
198
199    return strchr("PNBRQK",c) != NULL;
200 }
201
202 // end of piece.cpp
203