Exemple #1
0
        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);
        }