1
2 // move.cpp
3
4 // includes
5
6 #ifdef WINCE
7 #include <stdlib.h>
8 #else
9 #include <cstdlib>
10 #endif
11 #include <cstring>
12
13 #include "attack.h"
14 #include "colour.h"
15 #include "list.h"
16 #include "move.h"
17 #include "move_do.h"
18 #include "move_gen.h"
19 #include "move_legal.h"
20 #include "option.h"
21 #include "piece.h"
22 #include "square.h"
23 #include "util.h"
24
25 // "constants"
26
27 static const uint8 PromotePiece[5] = { PieceNone64, Knight64, Bishop64, Rook64, Queen64 };
28
29 // functions
30
31 // move_is_ok()
32
move_is_ok(int move)33 bool move_is_ok(int move) {
34
35 if (move < 0 || move >= 65536) return false;
36
37 if (move == MoveNone) return false;
38
39 return true;
40 }
41
42 // move_make()
43
move_make(int from,int to)44 int move_make(int from, int to) {
45
46 ASSERT(square_is_ok(from));
47 ASSERT(square_is_ok(to));
48
49 return (square_to_64(from) << 6) | square_to_64(to);
50 }
51
52 // move_make_flags()
53
move_make_flags(int from,int to,int flags)54 int move_make_flags(int from, int to, int flags) {
55
56 ASSERT(square_is_ok(from));
57 ASSERT(square_is_ok(to));
58 ASSERT((flags&~0xF000)==0);
59
60 ASSERT(to!=from);
61
62 return (square_to_64(from) << 6) | square_to_64(to) | flags;
63 }
64
65 // move_from()
66
move_from(int move)67 int move_from(int move) {
68
69 int from_64;
70
71 ASSERT(move_is_ok(move));
72
73 from_64 = (move >> 6) & 077;
74
75 return square_from_64(from_64);
76 }
77
78 // move_to()
79
move_to(int move)80 int move_to(int move) {
81
82 int to_64;
83
84 ASSERT(move_is_ok(move));
85
86 to_64 = move & 077;
87
88 return square_from_64(to_64);
89 }
90
91 // move_promote_hack()
92
move_promote_hack(int move)93 int move_promote_hack(int move) {
94
95 unsigned int code;
96
97 ASSERT(move_is_ok(move));
98
99 ASSERT(move_is_promote(move));
100
101 code = (unsigned int) move >> 12;
102 ASSERT(code>=1&&code<=4);
103
104 return PromotePiece[(code > 4) ? 0 : code];
105 }
106
107 // move_is_capture()
108
move_is_capture(int move,const board_t * board)109 bool move_is_capture(int move, const board_t * board) {
110
111 ASSERT(move_is_ok(move));
112 ASSERT(board_is_ok(board));
113
114 if (move_is_en_passant(move,board)) return true;
115 if (board->square[move_to(move)] != Empty) return true;
116
117 return false;
118 }
119
120 // move_is_promote()
121
move_is_promote(int move)122 bool move_is_promote(int move) {
123
124 ASSERT(move_is_ok(move));
125
126 return (move & MoveFlags) != 0;
127 }
128
129 // move_is_en_passant()
130
move_is_en_passant(int move,const board_t * board)131 bool move_is_en_passant(int move, const board_t * board) {
132
133 ASSERT(move_is_ok(move));
134 ASSERT(board_is_ok(board));
135
136 return piece_is_pawn(move_piece(move,board))
137 && move_to(move) == board->ep_square;
138 }
139
140 // move_is_castle()
141
move_is_castle(int move,const board_t * board)142 bool move_is_castle(int move, const board_t * board) {
143
144 ASSERT(move_is_ok(move));
145 ASSERT(board_is_ok(board));
146
147 return colour_equal(board->square[move_to(move)],board->turn);
148 }
149
150 // move_piece()
151
move_piece(int move,const board_t * board)152 int move_piece(int move, const board_t * board) {
153
154 ASSERT(move_is_ok(move));
155 ASSERT(board_is_ok(board));
156
157 return board->square[move_from(move)];
158 }
159
160 // move_capture()
161
move_capture(int move,const board_t * board)162 int move_capture(int move, const board_t * board) {
163
164 ASSERT(move_is_ok(move));
165 ASSERT(board_is_ok(board));
166
167 if (move_is_en_passant(move,board)) {
168 return piece_pawn_opp(move_piece(move,board));
169 }
170
171 return board->square[move_to(move)];
172 }
173
174 // move_promote()
175
move_promote(int move,const board_t * board)176 int move_promote(int move, const board_t * board) {
177
178 int code;
179
180 ASSERT(move_is_ok(move));
181 ASSERT(board_is_ok(board));
182
183 if (move_is_promote(move)) {
184 code = move >> 12;
185 ASSERT(code>=1&&code<=4);
186 return PromotePiece[code] | board->turn;
187 }
188
189 return Empty;
190 }
191
192 // move_is_check()
193
move_is_check(int move,const board_t * board)194 bool move_is_check(int move, const board_t * board) {
195
196 board_t new_board[1];
197
198 ASSERT(move_is_ok(move));
199 ASSERT(board_is_ok(board));
200
201 board_copy(new_board,board);
202 move_do(new_board,move);
203 ASSERT(!is_in_check(new_board,colour_opp(new_board->turn)));
204
205 return board_is_check(new_board);
206 }
207
208 // move_is_mate()
209
move_is_mate(int move,const board_t * board)210 bool move_is_mate(int move, const board_t * board) {
211
212 board_t new_board[1];
213
214 ASSERT(move_is_ok(move));
215 ASSERT(board_is_ok(board));
216
217 board_copy(new_board,board);
218 move_do(new_board,move);
219 ASSERT(!is_in_check(new_board,colour_opp(new_board->turn)));
220
221 return board_is_mate(new_board);
222 }
223
224
225 // move_order()
226
move_order(int move)227 int move_order(int move) {
228
229 ASSERT(move_is_ok(move));
230
231 return ((move & 07777) << 3) | (move >> 12); // from, to, promote
232 }
233
234 // end of move.cpp
235
236