diff --git a/tetris/src/blocks.rs b/tetris/src/blocks.rs index 021c21b..fd91145 100644 --- a/tetris/src/blocks.rs +++ b/tetris/src/blocks.rs @@ -17,7 +17,10 @@ impl Plugin for BlocksPlugin { .init_asset_loader::() .add_systems(OnEnter(Loading(true)), load_assets.run_if(run_once)) .add_systems(OnEnter(GameState::Setup), (setup_camera, setup_blocks)) - .add_systems(Update, updated_shape_asset.run_if(on_message::>)) + .add_systems( + Update, + updated_shape_asset.run_if(on_message::>), + ) .add_observer(add_shape); } } @@ -53,7 +56,7 @@ impl ShapeAsset { } /// Block positions relative to the shape's center -#[derive(Component, PartialEq, Debug)] +#[derive(Component, PartialEq, Debug, Clone, Copy)] pub(crate) struct RelativePosition { pub x: isize, pub y: isize, @@ -70,20 +73,37 @@ impl From<(isize, isize)> for RelativePosition { pub(crate) struct ShapeLayout(pub Vec>); impl ShapeLayout { - pub(crate) fn positions(&self) -> [RelativePosition;4] { + pub(crate) fn positions(&self) -> [RelativePosition; 4] { let mut c: Vec = Vec::with_capacity(4); - let center = { - + let center: (isize, isize) = { + // This could be less lines of code but it would be confusing af + let y = if self.0.len() % 2 == 1 { + self.0.len() / 2 + } else { + self.0.len() / 2 - 1 + }; + + let x = if self.0[0].len() % 2 == 1 { + self.0[0].len() / 2 + } else { + self.0[0].len() / 2 - 1 + }; + + (x as isize, y as isize) }; - for (y, nested) in self.0.iter().enumerate() { + + for (y, nested) in self.0.iter().rev().enumerate() { for (x, val) in nested.iter().enumerate() { if *val == 1 { - println!("{x}{y}"); + c.push(RelativePosition { + x: x as isize - center.0, + y: y as isize - center.1, + }); } } } - todo!() + [c[0], c[1], c[2], c[3]] } } @@ -195,17 +215,16 @@ fn updated_shape_asset( mut messages: MessageReader>, query: Query<&AssetComponent>, ) { - messages.read().for_each(|asset_event| { - match asset_event { - AssetEvent::Added { id } => debug!("Asset added: {id:?}"), - AssetEvent::Modified { id } => query.iter().filter(|AssetComponent { handle }| { - handle.id() == *id - }).for_each(|ac| { + messages.read().for_each(|asset_event| match asset_event { + AssetEvent::Added { id } => debug!("Asset added: {id:?}"), + AssetEvent::Modified { id } => query + .iter() + .filter(|AssetComponent { handle }| handle.id() == *id) + .for_each(|ac| { warn!("TODO: Update {ac:?}"); }), - AssetEvent::Removed { id } => warn!("Asset removed: {id:?}"), - AssetEvent::Unused { id } => warn!("Asset is unused: {id:?}"), - AssetEvent::LoadedWithDependencies { id } => debug!("Asset lodaed: {id:?}"), - } + AssetEvent::Removed { id } => warn!("Asset removed: {id:?}"), + AssetEvent::Unused { id } => warn!("Asset is unused: {id:?}"), + AssetEvent::LoadedWithDependencies { id } => debug!("Asset lodaed: {id:?}"), }) } diff --git a/tetris/src/test/shape_layout.rs b/tetris/src/test/shape_layout.rs index 41597e6..51de15f 100644 --- a/tetris/src/test/shape_layout.rs +++ b/tetris/src/test/shape_layout.rs @@ -1,70 +1,51 @@ use super::*; #[test] -fn test_shape_layout_01() { - let actual = ShapeLayout(vec![ - vec![0, 1, 0], - vec![1, 1, 1], - ]).positions(); +fn test_shape_layout_01a() { + let actual = ShapeLayout(vec![vec![0, 1, 0], vec![1, 1, 1]]).positions(); - let expected: [RelativePosition;4] = [ - (1, 1).into(), - (-1, 0).into(), - (0, 0).into(), - (1, 0).into() - ]; + let expected: [RelativePosition; 4] = + [(-1, 0).into(), (0, 0).into(), (1, 0).into(), (0, 1).into()]; + + debug_assert_eq!(expected, actual); +} + +#[test] +fn test_shape_layout_01b() { + let actual = ShapeLayout(vec![vec![1, 0], vec![1, 1], vec![1, 0]]).positions(); + + let expected: [RelativePosition; 4] = + [(0, -1).into(), (0, 0).into(), (1, 0).into(), (0, 1).into()]; debug_assert_eq!(expected, actual); } #[test] fn test_shape_layout_02a() { - let actual = ShapeLayout(vec![ - vec![1], - vec![1], - vec![1], - vec![1], - ]).positions(); + let actual = ShapeLayout(vec![vec![1], vec![1], vec![1], vec![1]]).positions(); - let expected: [RelativePosition;4] = [ - (0, 2).into(), - (0, 1).into(), - (0, 0).into(), - (0, -1).into() - ]; + let expected: [RelativePosition; 4] = + [(0, -1).into(), (0, 0).into(), (0, 1).into(), (0, 2).into()]; debug_assert_eq!(expected, actual); } #[test] fn test_shape_layout_02b() { - let actual = ShapeLayout(vec![ - vec![1, 1, 1, 1], - ]).positions(); + let actual = ShapeLayout(vec![vec![1, 1, 1, 1]]).positions(); - let expected: [RelativePosition;4] = [ - (-1, 0).into(), - (0, 0).into(), - (0, 1).into(), - (0, 2).into() - ]; + let expected: [RelativePosition; 4] = + [(-1, 0).into(), (0, 0).into(), (1, 0).into(), (2, 0).into()]; debug_assert_eq!(expected, actual); } #[test] fn test_shape_layout_03() { - let actual = ShapeLayout(vec![ - vec![1, 1, 0], - vec![0, 1, 1], - ]).positions(); + let actual = ShapeLayout(vec![vec![1, 1, 0], vec![0, 1, 1]]).positions(); - let expected: [RelativePosition;4] = [ - (-1, 1).into(), - (0, 1).into(), - (0, 0).into(), - (1, 0).into() - ]; + let expected: [RelativePosition; 4] = + [(0, 0).into(), (1, 0).into(), (-1, 1).into(), (0, 1).into()]; debug_assert_eq!(expected, actual); }