diff --git a/src/inventory/mod.rs b/src/inventory/mod.rs index e929f6b..62af730 100644 --- a/src/inventory/mod.rs +++ b/src/inventory/mod.rs @@ -15,7 +15,7 @@ impl Inventory { pub fn can_fit( &self, item_query: Query<&item::Item>, - contained_items: &Children, + contained_items: &[Entity], queried_size: UVec2, queried_position: UVec2, ) -> bool { @@ -36,4 +36,21 @@ impl Inventory { } true } + + pub fn can_move( + &self, + item_query: Query<&item::Item>, + contained_items: &[Entity], + queried_item: Entity, + queried_position: UVec2, + ) -> bool { + let Ok(item::Item {size, ..}) = item_query.get(queried_item) else { + error!("Could not query inventory child ({queried_item}), probably not item?"); + return false; + }; + let children = contained_items.iter() + .filter_map(|e| if e.ne(&&queried_item) { Some(*e) } else { None }) + .collect::>(); + self.can_fit(item_query, children.as_slice(), *size, queried_position) + } } diff --git a/src/tests.rs b/src/tests.rs index 9f494c6..5760339 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -115,6 +115,9 @@ mod inventory { #[derive(Resource)] struct Items(Vec, usize); + #[derive(Component)] + struct MovableItem(UVec2); + fn insert_item( mut commands: Commands, mut items: ResMut, @@ -153,6 +156,16 @@ mod inventory { items.1 += 1; } + fn try_to_move( + item_query: Query<&Item>, + inventory_query: Query<(&Inventory, &Children)>, + movable_item: Query<(Entity, &MovableItem)>, + ) { + let (inventory, children) = inventory_query.single().unwrap(); + let (movable_item, MovableItem(query_pos)) = movable_item.single().unwrap(); + assert!(inventory.can_move(item_query, children, movable_item, *query_pos)); + } + #[test] fn everything_fits() { let mut world = World::new(); @@ -186,4 +199,18 @@ mod inventory { world.run_system(system).expect("Error on running system"); } } + + #[test] + fn can_move_item() { + let mut world = World::new(); + + let system = world.register_system(try_to_move); + + world.spawn(inventory()) + .with_child((item_a(), MovableItem(UVec2::new(3, 2)))) + .with_child(item_b()) + .with_child(item_c()); + + world.run_system(system).expect("Error on running system"); + } }