use std::collections::HashSet; use ::bracket_lib::prelude::*; use super::common::draw_corridor; use super::{BuilderMap, MetaMapBuilder}; use crate::Rect; pub struct NearestCorridors {} impl MetaMapBuilder for NearestCorridors { #[allow(dead_code)] fn build_map(&mut self, build_data: &mut BuilderMap) { self.corridors(build_data); } } impl NearestCorridors { #[allow(dead_code)] pub fn new() -> Box { Box::new(NearestCorridors {}) } fn corridors(&mut self, build_data: &mut BuilderMap) { let rooms: Vec; if let Some(rooms_builder) = &build_data.rooms { rooms = rooms_builder.clone(); } else { panic!("Nearest Corridors requires a builder with room structures"); } let mut connected: HashSet = HashSet::new(); let mut corridors: Vec> = Vec::new(); for (i, room) in rooms.iter().enumerate() { let mut room_distance: Vec<(usize, f32)> = Vec::new(); let room_center = room.center(); let room_center_pt = Point::new(room_center.0, room_center.1); for (j, other_room) in rooms.iter().enumerate() { if i != j && !connected.contains(&j) { let other_center = other_room.center(); let other_center_pt = Point::new(other_center.0, other_center.1); let distance = DistanceAlg::Pythagoras.distance2d(room_center_pt, other_center_pt); room_distance.push((j, distance)); } } if !room_distance.is_empty() { room_distance.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap()); let dest_center = rooms[room_distance[0].0].center(); let corridor = draw_corridor( &mut build_data.map, room_center.0, room_center.1, dest_center.0, dest_center.1, ); connected.insert(i); corridors.push(corridor); build_data.take_snapshot(); } } build_data.corridors = Some(corridors); } }