summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.rs96
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);
}