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