13
#include "move_legal.h"
20
static bool move_is_pseudo_debug (int move, board_t * board);
26
bool move_is_pseudo(int move, board_t * board) {
33
ASSERT(move_is_ok(move));
36
ASSERT(!board_is_check(board));
40
if (MOVE_IS_SPECIAL(move)) {
41
return move_is_pseudo_debug(move,board);
44
ASSERT((move&~07777)==0);
49
opp = COLOUR_OPP(board->turn);
53
from = MOVE_FROM(move);
54
ASSERT(SQUARE_IS_OK(from));
56
piece = board->square[from];
57
if (!COLOUR_IS(piece,me)) return false;
59
ASSERT(piece_is_ok(piece));
64
ASSERT(SQUARE_IS_OK(to));
66
capture = board->square[to];
67
if (COLOUR_IS(capture,me)) return false;
71
if (PIECE_IS_PAWN(piece)) {
73
if (SQUARE_IS_PROMOTE(to)) return false;
75
inc = PAWN_MOVE_INC(me);
77
ASSERT(delta_is_ok(delta));
79
if (capture == Empty) {
83
if (delta == inc) return true;
86
&& PAWN_RANK(from,me) == Rank2
87
&& board->square[from+inc] == Empty) {
95
if (delta == (inc-1) || delta == (inc+1)) return true;
100
if (PIECE_ATTACK(board,piece,from,to)) return true;
108
bool quiet_is_pseudo(int move, board_t * board) {
115
ASSERT(move_is_ok(move));
118
ASSERT(!board_is_check(board));
122
if (MOVE_IS_CASTLE(move)) {
123
return move_is_pseudo_debug(move,board);
124
} else if (MOVE_IS_SPECIAL(move)) {
128
ASSERT((move&~07777)==0);
133
opp = COLOUR_OPP(board->turn);
137
from = MOVE_FROM(move);
138
ASSERT(SQUARE_IS_OK(from));
140
piece = board->square[from];
141
if (!COLOUR_IS(piece,me)) return false;
143
ASSERT(piece_is_ok(piece));
148
ASSERT(SQUARE_IS_OK(to));
150
if (board->square[to] != Empty) return false; // capture
154
if (PIECE_IS_PAWN(piece)) {
156
if (SQUARE_IS_PROMOTE(to)) return false;
158
inc = PAWN_MOVE_INC(me);
160
ASSERT(delta_is_ok(delta));
164
if (delta == inc) return true;
167
&& PAWN_RANK(from,me) == Rank2
168
&& board->square[from+inc] == Empty) {
174
if (PIECE_ATTACK(board,piece,from,to)) return true;
182
bool pseudo_is_legal(int move, board_t * board) {
191
ASSERT(move_is_ok(move));
197
opp = COLOUR_OPP(me);
199
from = MOVE_FROM(move);
202
piece = board->square[from];
203
ASSERT(COLOUR_IS(piece,me));
205
// slow test for en-passant captures
207
if (MOVE_IS_EN_PASSANT(move)) {
209
move_do(board,move,undo);
210
legal = !IS_IN_CHECK(board,me);
211
move_undo(board,move,undo);
216
// king moves (including castle)
218
if (PIECE_IS_KING(piece)) {
220
legal = !is_attacked(board,to,opp);
223
ASSERT(board->square[from]==piece);
224
board->square[from] = Empty;
225
ASSERT(legal==!is_attacked(board,to,opp));
226
board->square[from] = piece;
234
if (is_pinned(board,from,me)) {
235
king = KING_POS(board,me);
236
return DELTA_INC_LINE(king-to) == DELTA_INC_LINE(king-from); // does not discover the line
242
// move_is_pseudo_debug()
244
static bool move_is_pseudo_debug(int move, board_t * board) {
248
ASSERT(move_is_ok(move));
251
ASSERT(!board_is_check(board));
253
gen_moves(list,board);
255
return list_contain(list,move);
258
// end of move_legal.cpp