From 5ff4a92c449788dffa6ae3f9b1363ddeea5c2e1a Mon Sep 17 00:00:00 2001 From: Nolan Darilek Date: Tue, 29 Jun 2021 10:36:59 -0500 Subject: [PATCH] Migrate area description logger to new areas. --- src/lib.rs | 1 + src/map.rs | 63 ++++++++++++++++++++++------------------------------ src/utils.rs | 18 +++++++++++++++ 3 files changed, 45 insertions(+), 37 deletions(-) create mode 100644 src/utils.rs diff --git a/src/lib.rs b/src/lib.rs index 5e5f84e..833607d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,4 +20,5 @@ pub mod navigation; pub mod pathfinding; pub use rand; pub mod sound; +pub mod utils; pub mod visibility; diff --git a/src/map.rs b/src/map.rs index f292c54..b9b4a8d 100644 --- a/src/map.rs +++ b/src/map.rs @@ -12,6 +12,7 @@ use crate::{ core::{Area, Coordinates, Player, PointLike}, exploration::{ExplorationType, Mappable}, log::Log, + utils::target_and_other, visibility::BlocksVisibility, }; @@ -296,50 +297,38 @@ fn portal_spawner( } fn area_description( + mut events: EventReader, + areas: Query<&AreaTag>, + players: Query<&Player>, + names: Query<&Name>, config: Res, - mut prev_area: Local>, - query: Query<(&Player, &Coordinates), Changed>, - map: Query<(&Map, &Areas)>, + shapes: Query<&ColliderShape>, mut log: Query<&mut Log>, ) { - for (_, coordinates) in query.iter() { - for (_, areas) in map.iter() { - let mut should_describe_area = false; - let mut current_area: Option = None; - for area in areas.iter() { - if area.contains(&*coordinates) { - current_area = Some(area.clone()); - if let Some(prev_area) = &*prev_area { - if prev_area != area { - should_describe_area = true; - } - } else { - should_describe_area = true; - } - break; - } - } - if should_describe_area { - if let Some(ref area) = current_area { - let description = if area.description.is_some() { - area.description.clone() - } else if config.describe_undescribed_areas { - Some(format!( - "{} by {} area.", - area.rect.width(), - area.rect.height() - )) - } else { - None - }; - if let Some(description) = description { - for mut log in log.iter_mut() { - log.push(description.clone()); + for event in events.iter() { + if event.intersecting { + if let Some((area, other)) = + target_and_other(event.collider1.entity(), event.collider2.entity(), &|v| { + areas.get(v).is_ok() + }) + { + if players.get(other).is_ok() { + if let Ok(mut log) = log.single_mut() { + if let Ok(name) = names.get(area) { + log.push(name.to_string()); + } else if config.describe_undescribed_areas { + if let Ok(shape) = shapes.get(area) { + let aabb = shape.compute_local_aabb(); + log.push(format!( + "{}-by-{} area", + aabb.extents().x, + aabb.extents().y + )); + } } } } } - *prev_area = current_area; } } } diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..ec7c107 --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,18 @@ +use bevy::prelude::*; + +pub fn target_and_other( + entity1: Entity, + entity2: Entity, + mut predecate: F, +) -> Option<(Entity, Entity)> +where + F: FnMut(Entity) -> bool, +{ + if predecate(entity1) { + Some((entity1, entity2)) + } else if predecate(entity2) { + Some((entity2, entity1)) + } else { + None + } +}