use arrayvec::ArrayVec;
use crate::{
color::Color,
piece::Piece,
role::{PromotableRole, Role},
side::Side,
square::Square,
};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Move {
pub piece: Piece,
pub orig: Square,
pub dest: Square,
pub capture: Option<Square>,
pub captured_role: Option<Role>,
pub promotion: Option<PromotableRole>,
pub castle: Option<Side>,
pub enpassant: Option<()>,
}
impl Move {
pub fn quiet(piece: Piece, orig: Square, dest: Square) -> Self {
Self {
piece,
orig,
dest,
capture: None,
captured_role: None,
promotion: None,
castle: None,
enpassant: None,
}
}
pub fn capture(
piece: Piece,
orig: Square,
dest: Square,
captured: Square,
captured_role: Role,
) -> Self {
Self {
piece,
orig,
dest,
capture: Some(captured),
captured_role: Some(captured_role),
promotion: None,
castle: None,
enpassant: None,
}
}
pub fn castle(color: Color, side: Side, king_from: Square, king_to: Square) -> Self {
Self {
piece: Piece {
role: Role::King,
color,
},
orig: king_from,
dest: king_to,
capture: None,
captured_role: None,
promotion: None,
castle: Some(side),
enpassant: None,
}
}
pub fn enpassant(color: Color, orig: Square, dest: Square, captured: Square) -> Self {
Self {
piece: Piece {
role: Role::Pawn,
color,
},
orig,
dest,
capture: Some(captured),
captured_role: Some(Role::Pawn),
promotion: None,
castle: None,
enpassant: Some(()),
}
}
pub fn promotion(
color: Color,
orig: Square,
dest: Square,
role: PromotableRole,
captured: Option<(Square, Role)>,
) -> Self {
let (capture, captured_role) = match captured {
Some((sq, r)) => (Some(sq), Some(r)),
None => (None, None),
};
Self {
piece: Piece {
role: Role::Pawn,
color,
},
orig,
dest,
capture,
captured_role,
promotion: Some(role),
castle: None,
enpassant: None,
}
}
}
pub type MoveList = ArrayVec<Move, 270>;