/// <summary> /// Создание карты. /// </summary> /// <returns> /// Возвращает экземпляр карты. /// </returns> public Task <ISectorMap> CreateAsync(ISectorMapFactoryOptions generationOptions) { if (generationOptions is null) { throw new System.ArgumentNullException(nameof(generationOptions)); } var roomFactoryOptions = generationOptions.OptionsSubScheme as ISectorRoomMapFactoryOptionsSubScheme; if (roomFactoryOptions is null) { throw new System.ArgumentException("Не задана схема генерации в настройках", nameof(generationOptions)); } var map = CreateMapInstance(); var edgeHash = new HashSet <string>(); // Генерируем случайные координаты комнат var transitions = generationOptions.Transitions; var rooms = _roomGenerator.GenerateRoomsInGrid(roomFactoryOptions.RegionCount, RoomMinSize, roomFactoryOptions.RegionSize, transitions); // Создаём узлы и рёбра комнат _roomGenerator.CreateRoomNodes(map, rooms, edgeHash); // Соединяем комнаты _roomGenerator.BuildRoomCorridors(map, rooms, edgeHash); // Указание регионов карты var regionIdCounter = 1; foreach (var room in rooms) { var passableRoomNodes = room.Nodes; var region = new MapRegion(regionIdCounter, passableRoomNodes.Cast <IGraphNode>().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)); }
/// <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)); }