From 59d12e3c7bbbb1d97d08429617268e106c34d62e Mon Sep 17 00:00:00 2001 From: Aaron Seilis Date: Sat, 16 Nov 2024 09:10:54 -0800 Subject: [PATCH] Fix hang on repeated dungeon generation calls --- src/rpgtools/map/gridmap.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/rpgtools/map/gridmap.rs b/src/rpgtools/map/gridmap.rs index 430387b..1dd3684 100644 --- a/src/rpgtools/map/gridmap.rs +++ b/src/rpgtools/map/gridmap.rs @@ -300,6 +300,8 @@ impl GridMap { } pub fn generate_dungeon(&mut self, num_rooms: usize, room_size: usize) { + self.clear(); + for _ in 0..num_rooms { self.place_random_room(room_size, false); } @@ -582,4 +584,30 @@ impl GridMap { // Room processing is done. Return. out } + + /// Delete everything in this map and reset to nothing + fn clear(&mut self) { + for x in 0..self.xmax { + for y in 0..self.ymax { + self.cells[x][y].area = AreaType::Nothing; + } + } + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + /// Ensure that regenerating halls multiple times doesn't hang + #[test] + fn regenerate_dungeon() { + let mut map = GridMap::new(25, 25); + + // This used to fail due to an infinite loop in the halls algorithm. + for _ in 0..10 { + map.generate_dungeon(10, 10); + } + } }