use crate::constants::ITILE_SIZE; use crate::entities::shared_components::Ambulatory; use bevy::prelude::*; use rustc_hash::FxHashMap; #[derive(Resource, Default)] pub struct TileOccupancy { pub counts: FxHashMap<(i32, i32), u8>, } impl TileOccupancy { #[inline] pub fn count_at(&self, world_pos: Vec3) -> u8 { let tx = (world_pos.x as i32) / ITILE_SIZE; let ty = (world_pos.y as i32) / ITILE_SIZE; *self.counts.get(&(tx, ty)).unwrap_or(&0) } } pub fn rebuild_tile_occupancy( mut occupancy: ResMut, query: Query<&Transform, With>, ) { occupancy.counts.clear(); for transform in query.iter() { let tx = (transform.translation.x as i32) / ITILE_SIZE; let ty = (transform.translation.y as i32) / ITILE_SIZE; let count = occupancy.counts.entry((tx, ty)).or_insert(0); if *count < 255 { *count += 1; } } }