protected IBenchmarkableLayoutGenerator <MapDescription <int>, IMapLayout <int> > GetGenerator(MapDescription <int> mapDescription) { IBenchmarkableLayoutGenerator <MapDescription <int>, IMapLayout <int> > generator; if (mapDescription.IsWithCorridors) { var gen = UnityLayoutGeneratorFactory.GetChainBasedGeneratorWithCorridors <int>(mapDescription.CorridorsOffsets); gen.InjectRandomGenerator(Payload.Random); generator = gen; } else { var gen = UnityLayoutGeneratorFactory.GetDefaultChainBasedGenerator <int>(); gen.InjectRandomGenerator(Payload.Random); generator = gen; } return(generator); }
protected IMapLayout <int> GenerateLayout(MapDescription <int> mapDescription) { if (Config.Timeout <= 0) { throw new ArgumentException("Timeout must be a positive number."); } // Setup layout generator IBenchmarkableLayoutGenerator <MapDescription <int>, IMapLayout <int> > generator; if (mapDescription.IsWithCorridors) { var gen = UnityLayoutGeneratorFactory.GetChainBasedGeneratorWithCorridors <int>(mapDescription.CorridorsOffsets); gen.InjectRandomGenerator(Payload.Random); generator = gen; } else { var gen = UnityLayoutGeneratorFactory.GetDefaultChainBasedGenerator <int>(); gen.InjectRandomGenerator(Payload.Random); generator = gen; } // Run generator IMapLayout <int> layout = null; var task = Task.Run(() => layout = generator.GetLayouts(mapDescription, 1)[0]); var taskCompleted = task.Wait(Config.Timeout); if (!taskCompleted) { throw new DungeonGeneratorException("Timeout was reached when generating the layout"); } if (Config.ShowDebugInfo) { Debug.Log($"Layout generated in {generator.TimeFirst / 1000f:F} seconds"); Debug.Log($"{generator.IterationsCount} iterations needed, {(generator.IterationsCount / (generator.TimeFirst / 1000d)):0} iterations per second"); } return(layout); }