feat: Implemented Inventory.can_rotate

- Added tests for rotating items in place
This commit is contained in:
Alexey 2026-03-12 11:45:01 +03:00
commit 9a09b4da96
2 changed files with 67 additions and 0 deletions

View file

@ -59,6 +59,27 @@ impl Inventory {
self.can_fit(item_query, children.as_slice(), *size, queried_position) self.can_fit(item_query, children.as_slice(), *size, queried_position)
} }
pub fn can_rotate(
&self,
item_query: Query<&item::Item>,
contained_items: &[Entity],
queried_item: Entity,
) -> bool {
let Ok(item) = item_query.get(queried_item) else {
error!("Could not query item");
return false;
};
let Some(position) = &item.position else {
warn!("Trying to query rotated item without position");
return false;
};
let children = contained_items.iter()
.filter_map(|e| if e.ne(&&queried_item) { Some(*e) } else { None })
.collect::<Vec<Entity>>();
let rotated_item = item.clone_rotated();
self.can_fit(item_query, children.as_slice(), rotated_item.size, *position)
}
fn find_free_space_inner( fn find_free_space_inner(
&self, &self,
item_query: Query<&item::Item>, item_query: Query<&item::Item>,

View file

@ -125,6 +125,9 @@ mod inventory {
#[derive(Component, Resource)] #[derive(Component, Resource)]
struct MovableItem(UVec2, bool); struct MovableItem(UVec2, bool);
#[derive(Component)]
struct RotatingMarker(bool);
fn insert_item( fn insert_item(
mut commands: Commands, mut commands: Commands,
mut items: ResMut<Items>, mut items: ResMut<Items>,
@ -175,6 +178,20 @@ mod inventory {
} }
} }
fn rotate_in_place(
item_query: Query<&Item>,
rotated_item: Query<(Entity, &RotatingMarker)>,
inventory_query: Query<(&Inventory, &Children)>,
) {
let (inventory, children) = inventory_query.single().unwrap();
let (rotatable_id, RotatingMarker(assertion)) = rotated_item.single().unwrap();
if *assertion {
assert!(inventory.can_rotate(item_query, children, rotatable_id));
} else {
assert!(!inventory.can_rotate(item_query, children, rotatable_id));
}
}
#[test] #[test]
fn everything_fits() { fn everything_fits() {
let mut world = World::new(); let mut world = World::new();
@ -300,4 +317,33 @@ mod inventory {
world.run_system(system).expect("Error on running system"); world.run_system(system).expect("Error on running system");
} }
#[test]
fn rotate_item_in_place() {
let mut world = World::new();
let system = world.register_system(rotate_in_place);
world.spawn(inventory())
.with_child((item_a(), RotatingMarker(true)))
.with_child(item_b())
.with_child(item_d());
world.run_system(system).expect("Error on running system");
}
#[test]
fn failed_rotate_item_in_place() {
let mut world = World::new();
let system = world.register_system(rotate_in_place);
world.spawn(inventory())
.with_child((item_a(), RotatingMarker(false)))
.with_child(item_b())
.with_child(item_c())
.with_child(item_d());
world.run_system(system).expect("Error on running system");
}
} }