Prevent rooms from generating right next to each other

This commit is contained in:
Alex Bethel 2021-12-19 11:40:26 -06:00
parent 626093e694
commit ec4b06c721

View file

@ -62,8 +62,9 @@ impl RoomBounds {
(y_min..y_max).flat_map(move |y| (x_min..x_max).map(move |x| (x, y))) (y_min..y_max).flat_map(move |y| (x_min..x_max).map(move |x| (x, y)))
} }
/// Returns whether the two rooms are overlapping. /// Returns whether the two rooms are overlapping, i.e., there
pub fn overlapping(&self, other: &Self) -> bool { /// exists at least one tile that is contained in both rooms.
pub fn intersects(&self, other: &Self) -> bool {
fn range_overlapping(a: Range<usize>, b: Range<usize>) -> bool { fn range_overlapping(a: Range<usize>, b: Range<usize>) -> bool {
if a.start > b.start { if a.start > b.start {
range_overlapping(b, a) range_overlapping(b, a)
@ -80,6 +81,19 @@ impl RoomBounds {
other.ul_corner.1..other.ul_corner.1 + other.size.1, other.ul_corner.1..other.ul_corner.1 + other.size.1,
) )
} }
/// Returns whether the two rooms are within distance `dist` of
/// one another or intersecting.
pub fn near(&self, other: &Self, dist: usize) -> bool {
RoomBounds {
size: (self.size.0 + dist, self.size.1 + dist),
..*self
}
.intersects(&RoomBounds {
size: (other.size.0 + dist, other.size.1 + dist),
..*other
})
}
} }
/// The possible sizes of a room, on both the x and y axes. /// The possible sizes of a room, on both the x and y axes.
@ -105,7 +119,7 @@ fn gen_room_bounds(
); );
let new_room = RoomBounds { ul_corner, size }; let new_room = RoomBounds { ul_corner, size };
if v.iter().all(|room| !room.overlapping(&new_room)) { if v.iter().all(|room| !room.near(&new_room, 2)) {
v.push(new_room) v.push(new_room)
} }
} }