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
use bevy::{ecs::component::TableStorage, prelude::Component};
use dyn_clone::DynClone;

use super::{BoardPosition, PieceColor, PieceType};

mod bishop;
mod king;
mod knight;
mod pawn;
mod queen;
mod rook;

dyn_clone::clone_trait_object!(Piece);

pub(super) trait Piece:
    Send + Sync + DynClone + 'static + Component<Storage = TableStorage>
{
    fn get_type(&self) -> &PieceType;
    fn get_color(&self) -> &PieceColor;
    fn get_position(&self) -> &BoardPosition;
    fn get_starting_position(&self) -> &BoardPosition;
    fn set_position(&mut self, new_position: &BoardPosition);
    fn get_moves(&self, include_captures: &bool) -> Vec<BoardPosition>;
    fn valid_move(&self, end_position: &BoardPosition) -> bool;
    fn valid_capture(&self, end_position: &BoardPosition) -> bool;
    fn is_sliding(&self) -> bool;
}

pub(super) fn new_piece(
    piece_color: PieceColor,
    piece_type: PieceType,
    position: BoardPosition,
) -> Box<dyn Piece> {
    let piece: Box<dyn Piece> = match piece_type {
        PieceType::Pawn => pawn::Pawn::new(position, piece_color),
        PieceType::King => king::King::new(position, piece_color),
        PieceType::Queen => queen::Queen::new(position, piece_color),
        PieceType::Bishop => bishop::Bishop::new(position, piece_color),
        PieceType::Knight => knight::Knight::new(position, piece_color),
        PieceType::Rook => rook::Rook::new(position, piece_color),
    };
    piece
}