use crate::coretypes::{Cp, PlyKind};
use crate::eval::evaluate;
use crate::movelist::MoveInfoList;
use crate::moveorder::pick_best_move;
use crate::Position;
use std::cmp::max;
pub fn quiescence(
position: &mut Position,
mut alpha: Cp,
beta: Cp,
ply: PlyKind,
nodes: &mut u64,
) -> Cp {
let mut best_score = evaluate(position);
if ply == 0 {
return best_score;
}
if best_score >= beta {
return best_score;
}
if best_score > alpha {
alpha = best_score;
}
let cache = position.cache();
let mut legal_captures: MoveInfoList = position
.get_legal_moves()
.into_iter()
.map(|move_| position.move_info(move_))
.filter(|move_info| move_info.is_capture())
.collect();
while let Some(capture) = pick_best_move(&mut legal_captures, None) {
*nodes += 1;
position.do_move_info(capture);
let score = -quiescence(position, -beta, -alpha, ply - 1, nodes);
position.undo_move(capture, cache);
best_score = max(best_score, score);
if best_score >= beta {
return best_score;
}
if best_score > alpha {
alpha = best_score;
}
}
return best_score;
}