Add forgotten files 1.4.70b
[polyglot.git] / move_legal.c
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
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
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
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
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
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