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