diff options
Diffstat (limited to 'dungeon/src/bsp.rs')
| -rw-r--r-- | dungeon/src/bsp.rs | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/dungeon/src/bsp.rs b/dungeon/src/bsp.rs index e0ac001..09b4433 100644 --- a/dungeon/src/bsp.rs +++ b/dungeon/src/bsp.rs @@ -3,7 +3,7 @@ use core::panic; use rand::prelude::IndexedRandom; -use rand::{Rng, SeedableRng}; +use rand::{Rng, rngs::SmallRng}; use std::cmp; // for min/max use crate::Floor; @@ -40,7 +40,7 @@ impl Rect { } /// Returns a random point in this rectangle. - fn random_point<R: Rng>(&self, rng: &mut R) -> Pos { + fn random_point(&self, rng: &mut SmallRng) -> Pos { let rx = rng.random_range(self.x..(self.x + self.w)); let ry = rng.random_range(self.y..(self.y + self.h)); Pos::new(rx, ry).unwrap_or(self.center()) @@ -70,7 +70,7 @@ impl Node { /// Try to split the node. Returns true if split happened. /// Splitting is done either horizontally or vertically, /// depending on the dimensions of the node. - fn split<R: Rng>(&mut self, rng: &mut R) -> bool { + fn split(&mut self, rng: &mut SmallRng) -> bool { // Already split if self.left.is_some() || self.right.is_some() { return false; @@ -150,7 +150,7 @@ impl Node { /// Create a room inside this node (called for leaves). /// Room size and position chosen randomly. - fn create_room<R: Rng>(&mut self, rng: &mut R) { + fn create_room(&mut self, rng: &mut SmallRng) { if self.left.is_some() || self.right.is_some() { // This is not a leaf if let Some(left) = &mut self.left { @@ -213,7 +213,7 @@ impl Node { /// Return a random point for a room in this subtree: /// if node has a room, return a randiom point in it, else try left then right. - fn random_point_in_room<R: Rng>(&self, rng: &mut R) -> Pos { + fn random_point_in_room(&self, rng: &mut SmallRng) -> Pos { // Base case: if this node has a room, return a random point in it if let Some(room) = &self.room { return room.random_point(rng); @@ -230,7 +230,7 @@ impl Node { /// Connect rooms of child nodes recursively and collect corridors to carve. /// returns corridors: output vector of (Pos, Pos) pairs to connect - fn connect_children(&self, rng: &mut rand::rngs::StdRng) -> Vec<(Pos, Pos)> { + fn connect_children(&self, rng: &mut SmallRng) -> Vec<(Pos, Pos)> { let mut corridors = Vec::new(); if let (Some(left), Some(right)) = (&self.left, &self.right) { @@ -288,9 +288,7 @@ fn carve_v_corridor(tiles: &mut [Tile; TILE_COUNT], y1: u16, y2: u16, x: u16) { /// Top-level generator function for the dungeon using BSP. /// Returns a `Floor` -pub fn generate(seed: u64) -> Floor { - let mut rng = rand::rngs::StdRng::seed_from_u64(seed); - +pub fn generate(seed: u64, mut rng: SmallRng) -> Floor { // Initialize all tiles to walls let mut tiles_box: Box<[Tile; TILE_COUNT]> = Box::new([Tile::Wall; TILE_COUNT]); @@ -403,6 +401,8 @@ pub fn generate(seed: u64) -> Floor { /// BSP Unit Tests #[cfg(test)] mod tests { + use rand::SeedableRng; + use super::*; use crate::map::MAP_SIZE; @@ -418,7 +418,7 @@ mod tests { fn test_node_split() { let rect = Rect::new(0, 0, 20, 20); let mut node = Node::new(rect); - let mut rng = rand::rngs::StdRng::seed_from_u64(12345); + let mut rng = SmallRng::seed_from_u64(12345); let splitted = node.split(&mut rng); assert!(splitted); assert!(node.left.is_some()); @@ -429,7 +429,7 @@ mod tests { fn test_node_create_room() { let rect = Rect::new(0, 0, 20, 20); let mut node = Node::new(rect); - let mut rng = rand::rngs::StdRng::seed_from_u64(12345); + let mut rng = SmallRng::seed_from_u64(12345); node.create_room(&mut rng); assert!(node.room.is_some()); match &node.room { @@ -447,7 +447,7 @@ mod tests { fn test_node_collect_leaves() { let rect = Rect::new(0, 0, 20, 20); let mut node = Node::new(rect); - let mut rng = rand::rngs::StdRng::seed_from_u64(12345); + let mut rng = SmallRng::seed_from_u64(12345); node.split(&mut rng); let mut leaves = Vec::new(); node.collect_leaves(&mut leaves); @@ -458,7 +458,7 @@ mod tests { fn test_node_connect_children() { let rect = Rect::new(0, 0, 20, 20); let mut node = Node::new(rect); - let mut rng = rand::rngs::StdRng::seed_from_u64(12345); + let mut rng = SmallRng::seed_from_u64(12345); node.split(&mut rng); node.create_room(&mut rng); let corridors = node.connect_children(&mut rng); @@ -468,7 +468,8 @@ mod tests { #[test] fn test_generate() { let seed = 12345u64; - let floor = generate(seed); + let rng = SmallRng::seed_from_u64(seed); + let floor = generate(seed, rng); // Check that tiles contain some Room tiles let room_count = floor.tiles().iter().filter(|&&t| t == Tile::Room).count(); assert!(room_count > 0); |