maikor-platform 0.1.29

Maikor Platform specifications (language, addresses, etc)
Documentation
use crate::graphics::layer_tile::byte2;
use crate::models::{Byteable, LayerTile};

impl LayerTile {
    pub fn new(
        id: usize,
        flip_v: bool,
        flip_h: bool,
        palette: usize,
        half_alpha: bool,
        rotated: bool,
    ) -> Self {
        Self {
            id,
            flip_v,
            flip_h,
            palette,
            half_alpha,
            rotated,
        }
    }
}

impl Byteable for LayerTile {
    const SIZE: usize = 2;

    fn from_bytes(bytes: &[u8]) -> LayerTile {
        LayerTile {
            id: bytes[0] as usize,
            flip_v: bytes[1] & byte2::MASK_FLIP_V == byte2::MASK_FLIP_V,
            flip_h: bytes[1] & byte2::MASK_FLIP_H == byte2::MASK_FLIP_H,
            palette: ((bytes[1] & byte2::MASK_PALETTE) >> byte2::OFFSET_PALETTE) as usize,
            half_alpha: bytes[1] & byte2::MASK_HALF_ALPHA == byte2::MASK_HALF_ALPHA,
            rotated: bytes[1] & byte2::MASK_ROTATED == byte2::MASK_ROTATED,
        }
    }

    fn to_bytes(&self) -> Vec<u8> {
        let mut byte2 = 0;
        if self.flip_h {
            byte2 |= byte2::MASK_FLIP_H;
        }
        if self.flip_v {
            byte2 |= byte2::MASK_FLIP_V;
        }
        if self.half_alpha {
            byte2 |= byte2::MASK_HALF_ALPHA;
        }
        if self.rotated {
            byte2 |= byte2::MASK_ROTATED;
        }
        byte2 |= (self.palette as u8) << byte2::OFFSET_PALETTE;
        vec![self.id as u8, byte2]
    }
}

#[cfg(test)]
mod test {
    use crate::graphics::layer_tile::byte2;
    use crate::models::{Byteable, LayerTile};

    #[test]
    fn write_test() {
        let tile = LayerTile::new(0, false, false, 0, false, false);
        assert_eq!(tile.to_bytes(), vec![0, 0]);

        let tile = LayerTile::new(255, true, true, 3, true, true);
        let bytes = tile.to_bytes();
        assert_eq!(bytes, vec![255, 252]);
        assert_eq!(bytes[1] & byte2::MASK_FLIP_V, byte2::MASK_FLIP_V);
        assert_eq!(bytes[1] & byte2::MASK_FLIP_H, byte2::MASK_FLIP_H);
        assert_eq!(bytes[1] & byte2::MASK_HALF_ALPHA, byte2::MASK_HALF_ALPHA);
        assert_eq!(bytes[1] & byte2::MASK_ROTATED, byte2::MASK_ROTATED);
        assert_eq!((bytes[1] & byte2::MASK_PALETTE) >> byte2::OFFSET_PALETTE, 3);

        let tile = LayerTile::new(58, true, false, 1, true, false);
        let bytes = tile.to_bytes();
        assert_eq!(bytes, vec![58, 152]);
        assert_eq!(bytes[1] & byte2::MASK_FLIP_V, byte2::MASK_FLIP_V);
        assert_eq!(bytes[1] & byte2::MASK_FLIP_H, 0);
        assert_eq!(bytes[1] & byte2::MASK_HALF_ALPHA, byte2::MASK_HALF_ALPHA);
        assert_eq!(bytes[1] & byte2::MASK_ROTATED, 0);
        assert_eq!((bytes[1] & byte2::MASK_PALETTE) >> byte2::OFFSET_PALETTE, 1);
    }

    #[test]
    fn read_test() {
        let tile = LayerTile::from_bytes(&[0, 0]);
        assert_eq!(tile, LayerTile::default());
        let tile = LayerTile::from_bytes(&[255, 252]);
        assert_eq!(tile, LayerTile::new(255, true, true, 3, true, true));
        let tile = LayerTile::from_bytes(&[91, byte2::MASK_FLIP_V | byte2::MASK_HALF_ALPHA]);
        assert_eq!(tile, LayerTile::new(91, true, false, 0, true, false));
    }
}