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
}