diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 96 |
1 files changed, 84 insertions, 12 deletions
diff --git a/src/main.rs b/src/main.rs index f285976..12d0208 100644 --- a/src/main.rs +++ b/src/main.rs @@ -174,7 +174,10 @@ struct Level { fn place_template(level: &mut Level, template: &RoomTemplate, x: u32, y: u32) -> Result<(RoomId), (u32)> { let region = &mut level.region; - if x >= region.width() || y >= region.height() { + let width = region.width(); + let height = region.height(); + + if x >= width || x + template.width() > width || y >= height || y + template.height() > height { return Err(1); } @@ -210,14 +213,11 @@ fn tunnel<R: Rng + ?Sized>(level: &mut Level, from: (u32, u32), to: (u32, u32), let mut from = from; let diff: (i64, i64) = (from.0 as i64 - to.0 as i64, from.1 as i64 - to.1 as i64); let abs_diff = (i64::abs(diff.0), i64::abs(diff.1)); - println!("{:?} {:?}", diff, abs_diff); - println!("{:?} {:?}", from, to); let mut direction = if abs_diff.1 < abs_diff.0 { if diff.0 < 0 { Direction::RIGHT } else { Direction::LEFT } } else { if diff.1 < 0 { Direction::DOWN } else { Direction::UP } }; - println!("{:?}", direction); /*TODO: Pick an random number of steps*/ let mut steps = match direction { @@ -256,7 +256,6 @@ fn tunnel<R: Rng + ?Sized>(level: &mut Level, from: (u32, u32), to: (u32, u32), } }, None => { - println!("SET -> {} {}", from.0, from.1); level.region.set(from.0, from.1, Some(Tile { owner: owner, flags: TILE_IS_PATH, connections: opposite})); } } @@ -271,7 +270,6 @@ fn tunnel<R: Rng + ?Sized>(level: &mut Level, from: (u32, u32), to: (u32, u32), } else { if -1 < diff.1 { Direction::UP } else { Direction::DOWN } }; - println!("{:?}", direction); steps = match direction { Direction::RIGHT | Direction::LEFT => { @@ -304,7 +302,6 @@ fn connect_rooms<R: Rng + ?Sized>(level: &mut Level, from_id: RoomId, to_id: Roo if diff.1 < 0 { Direction::DOWN } else { Direction::UP } }; - println!("{:?}", direction); /*Find a suitable starting location*/ match direction { Direction::UP => { @@ -443,11 +440,8 @@ fn random_walk<R: Rng + ?Sized>(level: &mut Level, rng: &mut R) -> Result<(), u3 } let direction = options[rng.gen_range(0, neighbours)]; - println!("dir x {} y {} -> {}",x, y, direction); if let Some(tile) = level.region.get_mut(x, y)? { - println!("is some"); tile.connections |= direction; - println!("{}", tile.connections); }; let mut pos = (x, y); @@ -465,7 +459,6 @@ fn random_walk<R: Rng + ?Sized>(level: &mut Level, rng: &mut R) -> Result<(), u3 let direction = options[rng.gen_range(0, neighbours)]; let mut length = rng.gen_range(0, 2) + 1; - println!("len {}", length); while length > 0 { let old_pos = pos.clone(); let m_pos = Direction::step_towards(direction, pos); @@ -579,11 +572,87 @@ fn add_terminals() -> Result<u32, u32> { } */ + +fn random_dungeon<R: Rng + ?Sized>(templates: Vec<VecRegion<Option<TileTemplate>>>, mut rng: &mut R) -> Result<Level, u32> { + let mut region: VecRegion<Option<Tile>> = Region::new_with(15, 15); + let mut level = Level { + rooms: Vec::new(), + region: Box::new(region), + tunnels: 0, + }; + + let mut attempts = 20; + let first = loop { + let template = &templates[0]; + let x = rng.gen_range(0, level.region.width() - 2) + 1; + let y = rng.gen_range(0, level.region.height() - 2) + 1; + let res = place_template(&mut level, template, x, y); + if attempts <= 0 && res.is_err() { panic!() } + if res.is_ok() { break res.unwrap() } + attempts += -1; + }; + + let mut attempts = 20; + let second = loop { + let template = &templates[0]; + let x = rng.gen_range(0, level.region.width() - 2) + 1; + let y = rng.gen_range(0, level.region.height() - 2) + 1; + let res = place_template(&mut level, template, x, y); + if attempts <= 0 && res.is_err() { panic!() } + if res.is_ok() { break res.unwrap() } + attempts += -1; + }; + + connect_rooms(&mut level, first, second, &mut rng)?; + let mut additional_rooms = rng.gen_range(0, 3) + 4; + + while additional_rooms >= 0 { + let mut attempts = 20; + let room_id = loop { + let template = &templates[0]; + let x = rng.gen_range(0, level.region.width() - 2) + 1; + let y = rng.gen_range(0, level.region.height() - 2) + 1; + let res = place_template(&mut level, template, x, y); + if attempts <= 0 && res.is_err() { panic!() } + if res.is_ok() { break res.unwrap() } + attempts += -1; + }; + let to_room = (level.rooms.len() - 1) as u32; + connect_rooms(&mut level, room_id, rng.gen_range(0, to_room), &mut rng)?; + additional_rooms += -1; + } + + let mut connections = rng.gen_range(0, 3) + 1; + while connections > 0 { + let upper = level.rooms.len(); + let mut from = 0; + let mut to = 0; + while to == from { + from = rng.gen_range(0, upper); + to = rng.gen_range(0, upper); + } + connect_rooms(&mut level, from as u32, to as u32, &mut rng)?; + connections += -1; + } + + let mut deadends = rng.gen_range(0, 3) + 1; + while deadends > 0 { + create_deadend(&mut level, &mut rng); + deadends += -1; + } + + random_walk(&mut level, &mut rng); + random_walk(&mut level, &mut rng); + random_walk(&mut level, &mut rng); + + Ok(level) +} + fn main() { println!("Hello, world!"); let mut thread_rng = thread_rng(); //18 - let mut rng = SmallRng::from_seed([33;16]); + let mut rng = SmallRng::from_seed([14;16]); let mut template:VecRegion<Option<TileTemplate>> = Region::new_with(3, 3); @@ -625,5 +694,8 @@ fn main() { println!("{:?}", res); print_level(&level); pretty_print(&level); + + let l = random_dungeon(vec!(template), &mut rng).unwrap(); + pretty_print(&l); //println!("{:?}", level); } |