示例#1
0
        /// <summary>
        /// Проверяем, что к сундуку есть подход.
        /// </summary>
        private static void ValidatePassability(
            HexNode currentContainerHex,
            ISectorMap sectorMap,
            IGraphNode[] allContainerNodes)
        {
            var neighborNodes   = sectorMap.GetNext(currentContainerHex);
            var hasFreeNeighbor = false;

            foreach (var neighborNode in neighborNodes)
            {
                var neighborHex = (HexNode)neighborNode;

                var isContainer = allContainerNodes.Contains(neighborHex);

                if (!isContainer)
                {
                    hasFreeNeighbor = true;
                    break;
                }
            }

            if (!hasFreeNeighbor)
            {
                throw new SectorValidationException($"Контейнер {currentContainerHex} не имеет подступов.");
            }
        }
    private List <MapNodeVM> InitNodeViewModels(ISectorMap map)
    {
        var nodeViewModels = new List <MapNodeVM>();

        foreach (var node in map.Nodes)
        {
            var mapNodeObj = _diContainer.InstantiatePrefab(MapNodePrefab, transform);

            var mapNodeVm = mapNodeObj.GetComponent <MapNodeVM>();

            var hexNode = (HexNode)node;
            var nodeWorldPositionParts = HexHelper.ConvertToWorld(hexNode.OffsetCoords);
            var worldPosition          = new Vector3(nodeWorldPositionParts[0], nodeWorldPositionParts[1] / 2);
            mapNodeVm.transform.position = worldPosition;
            mapNodeVm.Node      = hexNode;
            mapNodeVm.Neighbors = map.GetNext(node).Cast <HexNode>().ToArray();

            if (map.Transitions.ContainsKey(node))
            {
                mapNodeVm.IsExit = true;
            }

            nodeViewModels.Add(mapNodeVm);

            mapNodeVm.OnSelect   += MapNodeVm_Select;
            mapNodeVm.MouseEnter += MapNodeVm_MouseEnter;
        }

        return(nodeViewModels);
    }
示例#3
0
        private IEnumerable <IGraphNode> GetActorNodes(IPerson person, IGraphNode baseNode)
        {
            yield return(baseNode);

            if (person.PhysicalSize == PhysicalSizePattern.Size7)
            {
                var neighbors = _map.GetNext(baseNode);
                foreach (var neighbor in neighbors)
                {
                    yield return(neighbor);
                }
            }
        }
示例#4
0
        private IEnumerable <IMapNode> WriteObservedNodes(IActor actor, ILogicStrategyData strategyData)
        {
            var observeNodes = _map.Nodes.Where(x => _map.DistanceBetween(x, actor.Node) < 5);

            foreach (var mapNode in observeNodes)
            {
                strategyData.ObserverdNodes.Add(mapNode);
            }

            var edgeNodes = new HashSet <IMapNode>();

            foreach (var observedNode in strategyData.ObserverdNodes)
            {
                var nextNodes = _map.GetNext(observedNode);

                var notObservedNextNodes = nextNodes.Where(x => !strategyData.ObserverdNodes.Contains(x));

                foreach (var edgeNode in notObservedNextNodes)
                {
                    edgeNodes.Add(edgeNode);
                }

                // Примечаем выходы
                if (_map.Transitions.ContainsKey(observedNode))
                {
                    strategyData.ExitNodes.Add(observedNode);
                }
            }

            var emptyEdgeNodes   = !edgeNodes.Any();
            var allNodesObserved = _map.Nodes.All(x => strategyData.ObserverdNodes.Contains(x));

            if (!((emptyEdgeNodes && allNodesObserved) || !emptyEdgeNodes))
            {
            }
            Debug.Assert((emptyEdgeNodes && allNodesObserved) || !emptyEdgeNodes,
                         "Если нет крайних узлов карты, значит все узлы карты исследованы.");

            return(edgeNodes);
        }
示例#5
0
        private IEnumerable <IMapNode> WriteObservedNodes(IActor actor, ILogicStrategyData strategyData)
        {
            var observeNodes = _map.Nodes.Where(x => _map.DistanceBetween(x, actor.Node) < 5);

            foreach (var mapNode in observeNodes)
            {
                strategyData.ObserverdNodes.Add(mapNode);
            }

            // Собираем пограничные неисследованные узлы.
            var frontNodes = new HashSet <IMapNode>();

            foreach (var observedNode in strategyData.ObserverdNodes)
            {
                var nextNodes = _map.GetNext(observedNode);

                var notObservedNextNodes = nextNodes.Where(x => !strategyData.ObserverdNodes.Contains(x));

                foreach (var edgeNode in notObservedNextNodes)
                {
                    frontNodes.Add(edgeNode);
                }

                // Примечаем выходы
                if (_map.Transitions.ContainsKey(observedNode))
                {
                    strategyData.ExitNodes.Add(observedNode);
                }
            }

            var emptyFrontNodes  = !frontNodes.Any();
            var allNodesObserved = _map.Nodes.All(x => strategyData.ObserverdNodes.Contains(x));

            Debug.Assert((emptyFrontNodes && allNodesObserved) || !emptyFrontNodes,
                         "Это состояние выполняется, только если есть неисследованые узлы.");

            return(frontNodes);
        }
示例#6
0
 public IEnumerable <IGraphNode> GetNext(IGraphNode node)
 {
     return(_sectorMap.GetNext(node));
 }