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)
|
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>,
|
||||||
|
|
|
||||||
46
src/tests.rs
46
src/tests.rs
|
|
@ -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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue