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
44
45
46
47
48
49
50
51
52
53
54
55
56
use bevy::prelude::{default, Bundle, Component, Res, Transform, Vec2};
use bevy::sprite::{Sprite, SpriteBundle};

use crate::chess_board::PieceColor;

use super::{BoardPosition, BoardProperties};

#[derive(Component)]
pub struct Square;

#[derive(Component)]
pub struct SquareColor(PieceColor);

impl SquareColor {
    pub(super) fn get(&self) -> PieceColor {
        self.0
    }
}

#[derive(Bundle)]
pub(super) struct SquareBundle {
    _p: Square,
    position: BoardPosition,
    color: SquareColor,
    sprite: SpriteBundle,
}

impl SquareBundle {
    pub(super) fn new(
        position: BoardPosition,
        size: f32,
        color: PieceColor,
        properties: &Res<BoardProperties>,
    ) -> Self {
        let (x, y) = properties.position_to_transform(&position);
        let square_color = match color {
            PieceColor::Black => properties.color_black,
            PieceColor::White => properties.color_white,
        };
        let sprite_bundle = SpriteBundle {
            sprite: Sprite {
                color: square_color,
                custom_size: Some(Vec2::new(size, size)),
                ..default()
            },
            transform: Transform::from_xyz(x, y, 0.),
            ..default()
        };
        SquareBundle {
            _p: Square,
            position,
            color: SquareColor(color),
            sprite: sprite_bundle,
        }
    }
}