map.rs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. use rand::Rng;
  2. #[derive(PartialEq, Clone, Copy, Debug)]
  3. pub enum TileType {
  4. Wall,
  5. Floor,
  6. }
  7. impl TileType {
  8. pub fn glyph(&self) -> carpet::CP437 {
  9. match self {
  10. TileType::Wall => carpet::CP437::from_char('#'),
  11. TileType::Floor => carpet::CP437::from_u8(0),
  12. }
  13. }
  14. }
  15. pub struct Map {
  16. pub tiles: carpet::Board<TileType>,
  17. pub rooms: Vec<carpet::Rect>,
  18. }
  19. impl Map {
  20. pub fn new() -> Map {
  21. let mut rng = rand::thread_rng();
  22. let mut map = Map {
  23. tiles: carpet::Board::new_with_default(80, 50, TileType::Wall),
  24. rooms: Vec::new(),
  25. };
  26. const MAX_ROOMS: usize = 30;
  27. const MIN_SIZE: usize = 6;
  28. const MAX_SIZE: usize = 10;
  29. for _ in 0..MAX_ROOMS {
  30. let w = rng.gen_range(MIN_SIZE, MAX_SIZE);
  31. let h = rng.gen_range(MIN_SIZE, MAX_SIZE);
  32. let x = rng.gen_range(1, 80 - w);
  33. let y = rng.gen_range(1, 50 - h);
  34. let room = carpet::Rect::new([x, y], [w, h]);
  35. if map.rooms.iter().any(|r| r.overlaps(room)) {
  36. continue;
  37. }
  38. map.carve(room);
  39. if let Some(prev) = map.rooms.first() {
  40. let c1 = room.center();
  41. let c2 = prev.center();
  42. let join = if rng.gen() {
  43. carpet::Coord { x: c1.x, y: c2.y }
  44. } else {
  45. carpet::Coord { x: c2.x, y: c1.y }
  46. };
  47. map.carve(carpet::Rect::from_points(c1, join));
  48. map.carve(carpet::Rect::from_points(join, c2));
  49. }
  50. map.rooms.push(room);
  51. }
  52. map
  53. }
  54. fn carve(&mut self, rect: carpet::Rect) {
  55. let iter = self
  56. .tiles
  57. .window_iter_mut(rect)
  58. .expect(&format!("Rect {:?} of map bounds", rect));
  59. for (_, _, t) in iter {
  60. *t = TileType::Floor;
  61. }
  62. }
  63. pub fn passable(&self, (x, y): (usize, usize)) -> bool {
  64. Some(&TileType::Floor) == self.tiles.get(x, y)
  65. }
  66. }