summaryrefslogtreecommitdiff
path: root/dungeon/src/bsp.rs
diff options
context:
space:
mode:
Diffstat (limited to 'dungeon/src/bsp.rs')
-rw-r--r--dungeon/src/bsp.rs29
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);