diff --git a/world/src/site/dungeon/mod.rs b/world/src/site/dungeon/mod.rs index c96e76a9e1..aa0c13dad8 100644 --- a/world/src/site/dungeon/mod.rs +++ b/world/src/site/dungeon/mod.rs @@ -375,7 +375,9 @@ impl Floor { } }; - let tunnel_dist = self.nearest_wall(rpos).map(|nearest| 1.0 - (nearest.distance_squared(rpos) as f32).sqrt() / TILE_SIZE as f32).unwrap_or(0.0); + let wall_thickness = 3.0; + let dist_to_wall = self.nearest_wall(rpos).map(|nearest| nearest.distance(rpos) as f32).unwrap_or(TILE_SIZE as f32); + let tunnel_dist = 1.0 - (dist_to_wall.powf(2.0) - wall_thickness).max(0.0).sqrt() / TILE_SIZE as f32; move |z| { match self.tiles.get(tile_pos) { @@ -387,7 +389,7 @@ impl Floor { BlockMask::nothing() } }, - Some(Tile::Room(_)) | Some(Tile::DownStair) if z as f32 >= self.hollow_depth as f32 - 13.0 * tunnel_dist.powf(4.0) => BlockMask::nothing(), + Some(Tile::Room(_)) | Some(Tile::DownStair) if dist_to_wall < wall_thickness || z as f32 >= self.hollow_depth as f32 - 13.0 * tunnel_dist.powf(4.0) => BlockMask::nothing(), Some(Tile::Room(room)) => { let room = &self.rooms[*room]; if z == 0 && RandomField::new(room.seed).chance(Vec3::from(pos), room.loot_density) {