public void Generate(VoronoiCell closestPathCell, List <VoronoiCell> caveCells, Rectangle area, bool mirror = false) { corridors.Clear(); rooms.Clear(); //area = new Rectangle(area.X, area.Y - area.Height, area.Width, area.Height); int iterations = Rand.Range(3, 4, Rand.RandSync.Server); float verticalProbability = Rand.Range(0.4f, 0.6f, Rand.RandSync.Server); BTRoom baseRoom = new BTRoom(area); rooms = new List <BTRoom> { baseRoom }; for (int i = 0; i < iterations; i++) { rooms.ForEach(l => l.Split(0.3f, verticalProbability, 300)); rooms = baseRoom.GetLeaves(); } foreach (BTRoom leaf in rooms) { leaf.Scale ( new Vector2(Rand.Range(0.5f, 0.9f, Rand.RandSync.Server), Rand.Range(0.5f, 0.9f, Rand.RandSync.Server)) ); } baseRoom.GenerateCorridors(200, 256, corridors); walls = new List <Line>(); rooms.ForEach(leaf => { leaf.CreateWalls(); //walls.AddRange(leaf.Walls); }); //--------------------------- BTRoom entranceRoom = null; float shortestDistance = 0.0f; foreach (BTRoom leaf in rooms) { Vector2 leafPos = leaf.Rect.Center.ToVector2(); if (mirror) { leafPos.X = area.Center.X + (area.Center.X - leafPos.X); } float distance = Vector2.Distance(leafPos, closestPathCell.Center); if (entranceRoom == null || distance < shortestDistance) { entranceRoom = leaf; shortestDistance = distance; } } rooms.Remove(entranceRoom); //--------------------------- foreach (BTRoom leaf in rooms) { foreach (Corridor corridor in corridors) { leaf.SplitWalls(corridor.Rect); } walls.AddRange(leaf.Walls); } foreach (Corridor corridor in corridors) { corridor.CreateWalls(); foreach (BTRoom leaf in rooms) { corridor.SplitWalls(leaf.Rect); } foreach (Corridor corridor2 in corridors) { if (corridor == corridor2) { continue; } corridor.SplitWalls(corridor2.Rect); } walls.AddRange(corridor.Walls); } //leaves.Remove(entranceRoom); BTRoom.CalculateDistancesFromEntrance(entranceRoom, corridors); allShapes = GenerateStructures(caveCells, area, mirror); }