1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use crate::bitboard::{BitBoard, EMPTY};
use crate::game::pieces::{get_anti_diagonal, get_main_diagonal, Color, FILES, RANKS};
use crate::game::Board;
pub fn get_sliding_straight_moves(board: &Board, color: Color, origins: &BitBoard) -> BitBoard {
let mut result = EMPTY;
let all_pieces = board.white.pieces | board.black.pieces;
let side = board.get_side(color);
let own_pieces = side.pieces;
for origin in *origins {
let file_mask = &FILES[origin.file_x as usize];
let rank_mask = &RANKS[origin.rank_y as usize];
let blockers = all_pieces & file_mask;
let square_board = BitBoard::from(origin);
let difference = blockers - (square_board * 2);
result |= (all_pieces ^ difference) & file_mask & !own_pieces;
{
let blockers = blockers.swap();
let all_pieces = all_pieces.swap();
let own_pieces = own_pieces.swap();
let square_board = square_board.swap();
let difference = blockers - (square_board * 2);
result |= ((all_pieces ^ difference) & file_mask & !own_pieces).swap();
}
let blockers = all_pieces & rank_mask;
let difference = blockers - (square_board * 2);
result |= (all_pieces ^ difference) & rank_mask & !own_pieces;
let blockers = blockers.mirror_horizontally();
let all_pieces = all_pieces.mirror_horizontally();
let own_pieces = own_pieces.mirror_horizontally();
let square_board = square_board.mirror_horizontally();
let difference = blockers - (square_board * 2);
result |= ((all_pieces ^ difference) & rank_mask & !own_pieces).mirror_horizontally();
}
result
}
pub fn get_sliding_diagonal_moves(board: &Board, color: Color, origins: &BitBoard) -> BitBoard {
let mut result = EMPTY;
let all_pieces = board.white.pieces | board.black.pieces;
let side = board.get_side(color);
let own_pieces = side.pieces;
for origin in *origins {
let main_mask = get_main_diagonal(&origin);
let anti_mask = get_anti_diagonal(&origin);
let blockers = all_pieces & main_mask;
let square_board = BitBoard::from(origin);
let difference = blockers - (square_board * 2);
result |= (all_pieces ^ difference) & main_mask & !own_pieces;
{
let blockers = all_pieces & anti_mask;
let difference = blockers - (square_board * 2);
result |= (all_pieces ^ difference) & anti_mask & !own_pieces;
let blockers = blockers.swap();
let all_pieces = all_pieces.swap();
let own_pieces = own_pieces.swap();
let square_board = square_board.swap();
let difference = blockers - (square_board * 2);
result |= ((all_pieces ^ difference) & anti_mask.swap() & !own_pieces).swap();
}
let blockers = blockers.swap();
let all_pieces = all_pieces.swap();
let own_pieces = own_pieces.swap();
let square_board = square_board.swap();
let difference = blockers - (square_board * 2);
result |= ((all_pieces ^ difference) & main_mask.swap() & !own_pieces).swap();
}
result
}