1 
2 // move_legal.c
3 
4 // includes
5 
6 #include "attack.h"
7 #include "colour.h"
8 #include "fen.h"
9 #include "list.h"
10 #include "move.h"
11 #include "move_do.h"
12 #include "move_gen.h"
13 #include "move_legal.h"
14 #include "piece.h"
15 #include "square.h"
16 #include "util.h"
17 
18 // prototypes
19 
20 static bool move_is_legal_debug (int move, const board_t * board);
21 
22 // functions
23 
24 // move_is_pseudo()
25 
move_is_pseudo(int move,const board_t * board)26 bool move_is_pseudo(int move, const board_t * board) {
27 
28    list_t list[1];
29 
30    ASSERT(move_is_ok(move));
31    ASSERT(board_is_ok(board));
32 
33    gen_moves(list,board);
34 
35    return list_contain(list,move);
36 }
37 
38 // pseudo_is_legal()
39 
pseudo_is_legal(int move,const board_t * board)40 bool pseudo_is_legal(int move, const board_t * board) {
41 
42    board_t new_board[1];
43 
44    ASSERT(move_is_ok(move));
45    ASSERT(board_is_ok(board));
46 
47    ASSERT(move_is_pseudo(move,board));
48 
49    board_copy(new_board,board);
50    move_do(new_board,move);
51 
52    return !is_in_check(new_board,colour_opp(new_board->turn));
53 }
54 
55 // move_is_legal()
56 
move_is_legal(int move,const board_t * board)57 bool move_is_legal(int move, const board_t * board) {
58 
59    bool legal;
60 
61    ASSERT(move_is_ok(move));
62    ASSERT(board_is_ok(board));
63 
64    legal = move_is_pseudo(move,board) && pseudo_is_legal(move,board);
65    ASSERT(legal==move_is_legal_debug(move,board));
66 
67    return legal;
68 }
69 
70 // filter_legal()
71 
filter_legal(list_t * list,const board_t * board)72 void filter_legal(list_t * list, const board_t * board) {
73 
74    int pos;
75    int i, move, value;
76 
77    ASSERT(list_is_ok(list));
78    ASSERT(board_is_ok(board));
79 
80    pos = 0;
81 
82    for (i = 0; i < list_size(list); i++) {
83 
84       ASSERT(pos>=0&&pos<=i);
85 
86       move = list_move(list,i);
87       value = list_value(list,i);
88 
89       if (pseudo_is_legal(move,board)) {
90          list->move[pos] = move;
91          list->value[pos] = value;
92          pos++;
93       }
94    }
95 
96    ASSERT(pos>=0&&pos<=list_size(list));
97    list->size = pos;
98 }
99 
100 // move_is_legal_debug()
101 
move_is_legal_debug(int move,const board_t * board)102 static bool move_is_legal_debug(int move, const board_t * board) {
103 
104    list_t list[1];
105 
106    ASSERT(move_is_ok(move));
107    ASSERT(board_is_ok(board));
108 
109    gen_legal_moves(list,board);
110 
111    return list_contain(list,move);
112 }
113 
114 // end of move_legal.cpp
115 
116