maikor-platform 0.1.29

Maikor Platform specifications (language, addresses, etc)
Documentation
use crate::graphics::sprite::{byte4, byte5};
use crate::models::{Byteable, Sprite};

impl Sprite {
    #[allow(clippy::too_many_arguments)]
    pub fn new(
        x: usize,
        y: usize,
        id: usize,
        flip_v: bool,
        flip_h: bool,
        palette: usize,
        large: bool,
        order: usize,
        half_alpha: bool,
        rotated: bool,
        atlas: usize,
        enabled: bool,
    ) -> Self {
        Self {
            x,
            y,
            id,
            flip_v,
            flip_h,
            palette,
            large,
            order,
            half_alpha,
            rotated,
            atlas,
            enabled,
        }
    }
}

impl Byteable for Sprite {
    const SIZE: usize = 5;

    fn from_bytes(bytes: &[u8]) -> Sprite {
        Sprite {
            x: bytes[0] as usize,
            y: bytes[1] as usize,
            id: bytes[2] as usize,
            flip_v: bytes[3] & byte4::MASK_FLIP_V == byte4::MASK_FLIP_V,
            flip_h: bytes[3] & byte4::MASK_FLIP_H == byte4::MASK_FLIP_H,
            palette: (bytes[4] & byte5::MASK_PALETTE) as usize,
            large: bytes[4] & byte5::MASK_LARGE == byte5::MASK_LARGE,
            order: ((bytes[4] & byte5::MASK_ORDER) >> byte5::OFFSET_ORDER) as usize,
            half_alpha: bytes[3] & byte4::MASK_HALF_ALPHA == byte4::MASK_HALF_ALPHA,
            rotated: bytes[3] & byte4::MASK_ROTATED == byte4::MASK_ROTATED,
            atlas: ((bytes[4] & byte5::MASK_ATLAS) >> byte5::OFFSET_ATLAS) as usize,
            enabled: bytes[3] & byte4::MASK_ENABLED == byte4::MASK_ENABLED,
        }
    }

    fn to_bytes(&self) -> Vec<u8> {
        let mut byte4 = 0;
        let mut byte5 = 0;
        if self.flip_h {
            byte4 |= byte4::MASK_FLIP_H;
        }
        if self.flip_v {
            byte4 |= byte4::MASK_FLIP_V;
        }
        if self.half_alpha {
            byte4 |= byte4::MASK_HALF_ALPHA;
        }
        if self.enabled {
            byte4 |= byte4::MASK_ENABLED;
        }
        if self.rotated {
            byte4 |= byte4::MASK_ROTATED;
        }
        if self.large {
            byte5 |= byte5::MASK_LARGE;
        }
        byte5 |= (self.atlas << byte5::OFFSET_ATLAS) as u8;
        byte5 |= (self.order << byte5::OFFSET_ORDER) as u8;
        byte5 |= self.palette as u8;
        vec![self.x as u8, self.y as u8, self.id as u8, byte4, byte5]
    }
}

#[cfg(test)]
mod test {
    use crate::graphics::sprite::{byte4, byte5};
    use crate::models::{Byteable, Sprite};

    #[test]
    fn write_test() {
        let sprite = Sprite::default();
        assert_eq!(sprite.to_bytes(), [0, 0, 0, 0, 0]);
        let sprite = Sprite::new(255, 255, 255, true, true, 3, true, 3, true, true, 3, true);
        assert_eq!(sprite.to_bytes(), [255, 255, 255, 241, 251]);
        let sprite = Sprite::new(51, 120, 34, true, false, 1, true, 2, true, false, 0, true);
        let bytes = sprite.to_bytes();
        assert_eq!(bytes, [51, 120, 34, 161, 193]);
        assert_eq!(bytes[3] & byte4::MASK_ENABLED, byte4::MASK_ENABLED);
        assert_eq!(bytes[3] & byte4::MASK_FLIP_V, byte4::MASK_FLIP_V);
        assert_eq!(bytes[3] & byte4::MASK_FLIP_H, 0);
        assert_eq!(bytes[3] & byte4::MASK_ROTATED, 0);
        assert_eq!(bytes[3] & byte4::MASK_HALF_ALPHA, byte4::MASK_HALF_ALPHA);
        assert_eq!(bytes[4] & byte5::MASK_LARGE, byte5::MASK_LARGE);
        assert_eq!((bytes[4] & byte5::MASK_ORDER) >> byte5::OFFSET_ORDER, 2);
        assert_eq!(bytes[4] & byte5::MASK_PALETTE, 1);
        assert_eq!((bytes[4] & byte5::MASK_ATLAS) >> byte5::OFFSET_ATLAS, 0);
    }

    #[test]
    fn read_test() {
        let sprite = Sprite::from_bytes(&[0, 0, 0, 0, 0]);
        assert_eq!(sprite, Sprite::default());
        let sprite = Sprite::from_bytes(&[255, 255, 255, 255, 255]);
        assert_eq!(
            sprite,
            Sprite::new(255, 255, 255, true, true, 3, true, 3, true, true, 3, true)
        );
        let sprite = Sprite::from_bytes(&[
            126,
            69,
            99,
            byte4::MASK_ENABLED | byte4::MASK_FLIP_V | byte4::MASK_HALF_ALPHA,
            byte5::MASK_LARGE | 1,
        ]);
        assert_eq!(
            sprite,
            Sprite::new(126, 69, 99, true, false, 1, true, 0, true, false, 0, true)
        );
    }
}