#![allow(dead_code)]
use rand_pcg::Pcg64Mcg;
use crate::engine::common::{File, Move, Promotion, Rank, Square};
use crate::engine::magics::{find_and_print_all_magics, load_magics_table, BISHOP, ROOK};
use crate::engine::move_generator::MoveGenerator;
mod engine;
pub fn run_perft(depth: usize, fen: &str, moves: Vec<&str>) -> usize {
let mut board = engine::board::Board::from_fen(fen).unwrap();
let tables = load_magics_table();
for input_move in moves {
println!("Applying move: {}", input_move);
board = board.apply_move(parse_move(input_move)).unwrap();
}
let move_gen = MoveGenerator::new(board, &tables);
engine::move_generator::perft(move_gen, depth)
}
pub fn generate_slider_moves() {
println!("// Automatically generated");
println!("use crate::engine::magics::MagicEntry;");
println!();
let mut rng = Pcg64Mcg::new(0);
find_and_print_all_magics(&ROOK, "ROOK", &mut rng);
println!();
find_and_print_all_magics(&BISHOP, "BISHOP", &mut rng);
println!();
}
fn parse_move(input: &str) -> Move {
let chars: Vec<char> = input.chars().collect();
assert!(chars.len() == 4 || chars.len() == 5);
let from_file = File::from_char(chars[0]).unwrap();
let from_rank = Rank::from_char(chars[1]).unwrap();
let to_file = File::from_char(chars[2]).unwrap();
let to_rank = Rank::from_char(chars[3]).unwrap();
let mut promotion = None;
if chars.len() == 5 {
promotion = Promotion::from_char(chars[4]);
}
let from = Square::new(from_file, from_rank);
let to = Square::new(to_file, to_rank);
Move::new(from, to, promotion)
}