feat: Implemented Inventory.find_free_space

- Added tests for find_free_space
This commit is contained in:
Alexey 2026-03-07 22:00:00 +03:00
commit 5f59e02788
3 changed files with 120 additions and 1 deletions

View file

@ -1,3 +1,5 @@
use std::mem::swap;
use bevy::prelude::*;
#[derive(Component, Clone)]
@ -32,4 +34,16 @@ impl Item {
!rect.intersect(other_rect).is_empty()
}
/// Swap size.x with size.y
pub fn swap_size(&mut self) {
swap(&mut self.size.x, &mut self.size.y);
}
/// Get clone of item with swapped size
pub fn clone_swapped(&self) -> Self {
let mut new = self.clone();
new.swap_size();
new
}
}

View file

@ -53,4 +53,39 @@ impl Inventory {
.collect::<Vec<Entity>>();
self.can_fit(item_query, children.as_slice(), *size, queried_position)
}
fn find_free_space_inner(
&self,
item_query: Query<&item::Item>,
contained_items: &[Entity],
queried_size: UVec2,
was_swapped: bool,
) -> Option<(UVec2, bool)> {
let Some(UVec2 {x: tries_x, y: tries_y}) = self.size.checked_sub(queried_size) else {
return None;
};
for x in 0..=tries_x {
for y in 0..=tries_y {
let tested_pos = UVec2::new(x, y);
if self.can_fit(item_query, contained_items, queried_size, tested_pos) {
return Some((tested_pos, was_swapped));
}
}
}
None
}
pub fn find_free_space(
&self,
item_query: Query<&item::Item>,
contained_items: &[Entity],
queried_size: UVec2,
) -> Option<(UVec2, bool)> {
let result = self.find_free_space_inner(item_query, contained_items, queried_size, false);
if result.is_some() {
return result;
}
let swapped_size = UVec2::new(queried_size.y, queried_size.x);
self.find_free_space_inner(item_query, contained_items, swapped_size, true)
}
}