Пример #1
0
        /// <summary>
        /// Создание карты.
        /// </summary>
        /// <returns>
        /// Возвращает экземпляр карты.
        /// </returns>
        public Task <ISectorMap> CreateAsync(object options)
        {
            if (options is null)
            {
                throw new System.ArgumentNullException(nameof(options));
            }

            var sectorScheme = (ISectorSubScheme)options;

            var map = CreateMapInstance();

            var edgeHash = new HashSet <string>();

            // Генерируем случайные координаты комнат
            var transitions = MapFactoryHelper.CreateTransitions(sectorScheme);

            var rooms = _roomGenerator.GenerateRoomsInGrid(sectorScheme.RegionCount,
                                                           RoomMinSize,
                                                           sectorScheme.RegionSize,
                                                           transitions);

            // Создаём узлы и рёбра комнат
            _roomGenerator.CreateRoomNodes(map, rooms, edgeHash);

            // Соединяем комнаты
            _roomGenerator.BuildRoomCorridors(map, rooms, edgeHash);

            // Указание регионов карты
            var regionIdCounter = 1;

            foreach (var room in rooms)
            {
                var passableRoomNodes = room.Nodes.Where(x => !x.IsObstacle);
                var region            = new MapRegion(regionIdCounter, passableRoomNodes.Cast <IMapNode>().ToArray());
                regionIdCounter++;
                map.Regions.Add(region);

                if (room.IsStart)
                {
                    region.IsStart = true;
                    continue;
                }

                if (room.Transitions?.Any() == true)
                {
                    region.ExitNodes = (from regionNode in region.Nodes
                                        where map.Transitions.Keys.Contains(regionNode)
                                        select regionNode).ToArray();

                    continue;
                }
            }

            return(Task.FromResult(map));
        }
Пример #2
0
        public async Task <ISector> GenerateAsync(ISectorNode sectorNode)
        {
            var transitions = MapFactoryHelper.CreateTransitions(sectorNode).ToArray();

            var map = await SquareMapFactory.CreateAsync(transitions.Count() + 1);

            CreateTransitions(transitions, map);

            var locationScheme = sectorNode.Biome.LocationScheme;

            var sector = _sectorFactory.Create(map, locationScheme);

            return(sector);
        }
Пример #3
0
        /// <inheritdoc />
        public async Task <ISector> GenerateAsync(ISectorNode sectorNode)
        {
            var transitions = MapFactoryHelper.CreateTransitions(sectorNode);

            var sectorFactoryOptions =
                new SectorMapFactoryOptions(sectorNode.SectorScheme.MapGeneratorOptions, transitions);

            var map = await _mapFactory.CreateAsync(sectorFactoryOptions).ConfigureAwait(false);

            var actorManager        = new ActorManager();
            var staticObjectManager = new StaticObjectManager();

            var sector = new Sector(map,
                                    actorManager,
                                    staticObjectManager,
                                    _dropResolver,
                                    _schemeService,
                                    _equipmentDurableService);

            return(sector);
        }
        /// <summary>
        /// Создаёт карту сектора.
        /// </summary>
        /// <param name="options">Настройки генерации.
        /// Должны быть типа ISectorSubScheme с заданным значением MapGeneratorOptions.
        /// Значение MapGeneratorOptions должно быть типа ISectorCellularAutomataMapFactoryOptionsSubScheme.</param>
        /// <returns></returns>
        public Task <ISectorMap> CreateAsync(object options)
        {
            if (options is null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            var sectorScheme = (ISectorSubScheme)options;
            var transitions  = MapFactoryHelper.CreateTransitions(sectorScheme);

            var cellularAutomatonOptions = (ISectorCellularAutomataMapFactoryOptionsSubScheme)sectorScheme.MapGeneratorOptions;

            if (cellularAutomatonOptions == null)
            {
                throw new ArgumentException($"Для {nameof(options)} не задано {nameof(ISectorSubScheme.MapGeneratorOptions)} равно null.");
            }

            var matrixWidth  = cellularAutomatonOptions.MapWidth;
            var matrixHeight = cellularAutomatonOptions.MapHeight;

            var chanceToStartAlive = cellularAutomatonOptions.ChanceToStartAlive;

            var targetRegionDraftCount = transitions.Count() + 1;
            var createResult           = CreateInner(
                targetRegionDraftCount,
                chanceToStartAlive,
                matrixWidth,
                matrixHeight);

            var matrix       = createResult.Matrix;
            var draftRegions = createResult.Regions;

            var map = CreateSectorMap(matrix, draftRegions, transitions);

            return(Task.FromResult(map));
        }