/// <summary>
        /// Преобразовывет черновые регионы в узлы реальной карты.
        /// </summary>
        private static void MapDraftRegionsToSectorMap(Matrix <bool> matrix, RegionDraft[] draftRegions, ISectorMap map)
        {
            var cellMap   = matrix.Items;
            var mapWidth  = matrix.Width;
            var mapHeight = matrix.Height;

            var regionNodeCoords = draftRegions.SelectMany(x => x.Coords);
            var hashSet          = new HashSet <OffsetCoords>(regionNodeCoords);

            for (var x = 0; x < mapWidth; x++)
            {
                for (var y = 0; y < mapHeight; y++)
                {
                    if (cellMap[x, y])
                    {
                        var offsetCoord = new OffsetCoords(x, y);

                        if (!hashSet.Contains(offsetCoord))
                        {
                            var node = new HexNode(x, y);
                            map.AddNode(node);
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        private void CreateOneRoomNodes(ISectorMap map, HashSet <string> edgeHash, Room room, Size cellSize)
        {
            var interiorObjects = _randomSource.RollInteriorObjects(room.Width, room.Height);

            for (var x = 0; x < room.Width; x++)
            {
                for (var y = 0; y < room.Height; y++)
                {
                    var nodeX = x + room.PositionX * cellSize.Width;
                    var nodeY = y + room.PositionY * cellSize.Height;

                    var isObstacle          = false;
                    var interiorObjectMetas = interiorObjects
                                              .SingleOrDefault(o => o.Coords.CompsEqual(x, y));

                    if (interiorObjectMetas != null)
                    {
                        //TODO Сделать так, чтобы укрытия не генерировались на узлах с выходами
                        // Как вариант - если выбираем узел, как выход, то снимаем флаг укрытия.
                        // Вообще, нужно поискать алгоритмы, которые бы расставляли укрытия и выходы, оставляя комнату проходимой.
                        isObstacle = true;
                    }

                    var node = new HexNode(nodeX, nodeY, isObstacle);

                    room.Nodes.Add(node);
                    map.AddNode(node);

                    RoomHelper.AddAllNeighborToMap(map, edgeHash, room, node);
                }
            }

            CreateTransitions(map, room);
        }
Exemplo n.º 3
0
        private void CreateOneRoomNodes(ISectorMap map, HashSet <string> edgeHash, Room room, Size cellSize)
        {
            var interiorObjects = _randomSource.RollInteriorObjects(room.Width, room.Height);

            for (var x = 0; x < room.Width; x++)
            {
                for (var y = 0; y < room.Height; y++)
                {
                    var nodeX = x + room.PositionX * cellSize.Width;
                    var nodeY = y + room.PositionY * cellSize.Height;

                    var isObstacle = false;
                    var interiorObjectForCoords = interiorObjects
                                                  .SingleOrDefault(o => o.Coords.CompsEqual(x, y));

                    if (interiorObjectForCoords != null)
                    {
//TODO Сделать так, чтобы укрытия не генерировались на узлах с выходами
// Как вариант - если выбираем узел, как выход, то снимаем флаг укрытия.
// Вообще, нужно поискать алгоритмы, которые бы расставляли укрытия и выходы, оставляя комнату проходимой.
                        isObstacle = true;
                    }

                    var node = new HexNode(nodeX, nodeY, isObstacle);


                    room.Nodes.Add(node);
                    map.AddNode(node);

                    var neighbors = HexNodeHelper.GetSpatialNeighbors(node, room.Nodes);

                    foreach (var neighbor in neighbors)
                    {
                        var isExists = IsExistsEdge(edgeHash, node, neighbor);

                        if (!isExists)
                        {
                            AddEdgeToMap(map, edgeHash, node, neighbor);
                        }
                    }
                }
            }

            // создаём переходы, если они есть в данной комнате
            if (room.Transitions.Any())
            {
                //TODO Отфильтровать узлы, которые на входах в коридор
                var availableNodes = room.Nodes.Where(x => !x.IsObstacle);
                var openRoomNodes  = new List <HexNode>(availableNodes);
                foreach (var transition in room.Transitions)
                {
                    var transitionNode = _randomSource.RollTransitionNode(openRoomNodes);
                    map.Transitions.Add(transitionNode, transition);
                    openRoomNodes.Remove(transitionNode);
                }
            }
        }
Exemplo n.º 4
0
 private static void FillMap(ISectorMap map, int mapWidth, int mapHeight, int mapSize, HexNode centerNode)
 {
     for (var x = 0; x < mapWidth; x++)
     {
         for (var y = 0; y < mapHeight; y++)
         {
             var testOffsetCoords = new OffsetCoords(x, y);
             var testCubeCoords   = HexHelper.ConvertToCube(testOffsetCoords);
             var distanceToCenter = centerNode.CubeCoords.DistanceTo(testCubeCoords);
             if (distanceToCenter > 0 && distanceToCenter <= mapSize)
             {
                 var node = new HexNode(testOffsetCoords);
                 map.AddNode(node);
             }
         }
     }
 }
Exemplo n.º 5
0
        private void CreateOneRoomNodes(ISectorMap map, HashSet <string> edgeHash, Room room, Size cellSize)
        {
            for (var x = 0; x < room.Width; x++)
            {
                for (var y = 0; y < room.Height; y++)
                {
                    var nodeX = x + (room.PositionX * cellSize.Width);
                    var nodeY = y + (room.PositionY * cellSize.Height);

                    var node = new HexNode(nodeX, nodeY);

                    room.Nodes.Add(node);
                    map.AddNode(node);

                    RoomHelper.AddAllNeighborToMap(map, edgeHash, room, node);
                }
            }

            CreateTransitions(map, room);
        }
        private static void FillMapRegions(RegionDraft[] draftRegions, ISectorMap map)
        {
            var regionIdCounter = 1;

            foreach (var draftRegion in draftRegions)
            {
                var regionNodeList = new List <IGraphNode>();

                foreach (var coord in draftRegion.Coords)
                {
                    var node = new HexNode(coord.X, coord.Y);
                    map.AddNode(node);

                    regionNodeList.Add(node);
                }

                var region = new MapRegion(regionIdCounter, regionNodeList.ToArray());

                map.Regions.Add(region);

                regionIdCounter++;
            }
        }