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