generated from 2ndbeam/bevy-template
feat: Implemented Inventory.can_rotate
- Added tests for rotating items in place
This commit is contained in:
parent
55c4e3a1d1
commit
9a09b4da96
2 changed files with 67 additions and 0 deletions
|
|
@ -59,6 +59,27 @@ impl Inventory {
|
|||
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(
|
||||
&self,
|
||||
item_query: Query<&item::Item>,
|
||||
|
|
|
|||
46
src/tests.rs
46
src/tests.rs
|
|
@ -125,6 +125,9 @@ mod inventory {
|
|||
#[derive(Component, Resource)]
|
||||
struct MovableItem(UVec2, bool);
|
||||
|
||||
#[derive(Component)]
|
||||
struct RotatingMarker(bool);
|
||||
|
||||
fn insert_item(
|
||||
mut commands: Commands,
|
||||
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]
|
||||
fn everything_fits() {
|
||||
let mut world = World::new();
|
||||
|
|
@ -300,4 +317,33 @@ mod inventory {
|
|||
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue