public static Layout Generate(System.Random rng, int width, int height) { ChamberGeneratorConfig chamberCfg = new ChamberGeneratorConfig() { mapSize = new Point2i(width, height), minChamberSize = 10, maxChamberSize = 20, numChambers = width * height / 500, maxIterations = 10000 }; IList <Chamber> chambers = GenerateChambers(rng, chamberCfg); IList <Corridor> corridors = GenerateCorridors(rng, chambers, chambers.Count, 2 * chamberCfg.maxChamberSize); Chamber startChamber = ChooseStartChamber(chambers); return(new Layout() { MapSize = new Point2i(width, height), Chambers = chambers, Corridors = corridors, StartChamber = startChamber, ExitChamber = ChooseExitChamber(rng, chambers, startChamber), Tiles = GenerateTiles(width, height, chambers, corridors) }); }
private static IList <Chamber> GenerateChambers(System.Random rng, ChamberGeneratorConfig cfg) { IList <Chamber> chambers = new List <Chamber>(); for (int i = 0; i < cfg.maxIterations && chambers.Count < cfg.numChambers; ++i) { Chamber newChamber = Chamber.Random(rng, cfg.mapSize.x, cfg.mapSize.y, cfg.minChamberSize, cfg.maxChamberSize); if (!chambers.Any(c => c.CollidesWith(newChamber, 5)) && newChamber.IsNotBorder(cfg.mapSize)) { chambers.Add(newChamber); } } return(chambers); }