/// <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); }
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); } } }
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); }
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); }
public IEnumerable <IGraphNode> GetNext(IGraphNode node) { return(_sectorMap.GetNext(node)); }