1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use rand::prelude::*;
use crate::MapFilter;
use crate::geometry::Rect;
use crate::random::Rng;
use crate::MapBuffer;
pub struct SimpleRooms {
max_rooms: usize,
min_room_size: usize,
max_room_size: usize,
}
impl MapFilter for SimpleRooms {
fn modify_map(&self, rng: &mut StdRng, map: &MapBuffer) -> MapBuffer {
self.build_rooms(map, rng)
}
}
impl SimpleRooms {
pub fn new() -> Box<SimpleRooms> {
Box::new(SimpleRooms{
max_rooms: 30,
min_room_size: 6,
max_room_size: 10
})
}
fn build_rooms(&self, map: &MapBuffer, rng : &mut StdRng) -> MapBuffer {
let mut new_map = map.clone();
for _ in 0..self.max_rooms {
let w = rng.random_range(self.min_room_size, self.max_room_size);
let h = rng.random_range(self.min_room_size, self.max_room_size);
let x = rng.random_range(1, new_map.width - w);
let y = rng.random_range(1, new_map.height - h);
let new_room = Rect::new(x, y, w, h);
let intersects = new_map.rooms.iter().any(|r| new_room.intersect(r));
if !intersects {
new_map.add_room(new_room);
}
}
new_map
}
}