use crate::ppu::oam;
#[repr(align(8))]
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
pub struct SpriteData {
obj_attributes: oam::Entry,
row_color_index_bytes: Option<(u8, u8)>,
oam_index: u8,
}
impl SpriteData {
pub fn with_oam_index(obj_attributes: oam::Entry, oam_index: u8) -> Self {
Self {
obj_attributes,
row_color_index_bytes: None,
oam_index,
}
}
pub fn obj_attributes(&self) -> oam::Entry {
self.obj_attributes
}
pub fn oam_index(&self) -> u8 {
self.oam_index
}
pub fn row_color_index_bytes(&self) -> Option<(u8, u8)> {
self.row_color_index_bytes
}
pub fn set_row_color_index_bytes(&mut self, row_color_index_bytes: (u8, u8)) {
self.row_color_index_bytes = Some(row_color_index_bytes);
}
pub fn set_row_color_index_byte(&mut self, value: u8, high_byte: bool) {
let mut row_color_index_bytes = self.row_color_index_bytes.unwrap_or((0, 0));
if high_byte {
row_color_index_bytes.0 = value;
} else {
row_color_index_bytes.1 = value;
}
self.row_color_index_bytes = Some(row_color_index_bytes);
}
#[cfg(test)]
pub fn set_draw_front(&mut self) {
self.obj_attributes.set_draw_front()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn set_row_color_index_byte_initializes_then_updates() {
let mut sprite = SpriteData::with_oam_index(oam::Entry::default(), 0);
sprite.set_row_color_index_byte(0xAA, false); assert_eq!(sprite.row_color_index_bytes(), Some((0x00, 0xAA)));
sprite.set_row_color_index_byte(0xBB, true); assert_eq!(sprite.row_color_index_bytes(), Some((0xBB, 0xAA)));
}
#[test]
fn set_row_color_index_byte_overwrites_previous() {
let mut sprite = SpriteData::with_oam_index(oam::Entry::default(), 0);
sprite.set_row_color_index_bytes((0x11, 0x22));
sprite.set_row_color_index_byte(0x33, false); assert_eq!(sprite.row_color_index_bytes(), Some((0x11, 0x33)));
sprite.set_row_color_index_byte(0x44, true); assert_eq!(sprite.row_color_index_bytes(), Some((0x44, 0x33)));
}
}