/// <summary> /// Обновление состояния тумана войны для актёра с учётом карты и опорного узла карты. /// </summary> /// <param name="fowData">Состояние тумана войны которого обновляется.</param> /// <param name="fowContext">Контекст тумана войны.</param> /// <param name="baseNode">Опорный узел.</param> /// <param name="radius">Радиус обзора персонажа.</param> public static void UpdateFowData(ISectorFowData fowData, IFowContext fowContext, IGraphNode baseNode, int radius) { if (fowData is null) { throw new ArgumentNullException(nameof(fowData)); } if (fowContext is null) { throw new ArgumentNullException(nameof(fowContext)); } if (baseNode is null) { throw new ArgumentNullException(nameof(baseNode)); } // Все наблюдаемые из базового узла узлы карты. var observingNodes = GetObservingNodes(fowContext, baseNode, radius); var currentObservedFowNodes = fowData.GetFowNodeByState(SectorMapNodeFowState.Observing); var newObservedFowNodes = UpdateOrCreateFowNodes(fowData, observingNodes); var notObservingFowNodes = currentObservedFowNodes.Except(newObservedFowNodes).ToArray(); foreach (var fowNode in notObservingFowNodes) { fowData.ChangeNodeState(fowNode, SectorMapNodeFowState.Explored); } }
private void ProcessNodeFow(ISectorFowData sectorFowData) { if (_nodeViewModels == null) { return; } foreach (var nodeViewModel in _nodeViewModels) { var fowNode = sectorFowData.Nodes.SingleOrDefault(x => x.Node == nodeViewModel.Node); var fowState = (fowNode?.State).GetValueOrDefault(SectorMapNodeFowState.TerraIncognita); var fowController = nodeViewModel.GetComponent <FowNodeController>(); if (fowController != null) { fowController.ChangeState(fowState); } } }
private void ProcessContainerFow(ISectorFowData sectorFowData) { if (_staticObjectViewModels == null) { return; } foreach (var containerViewModel in _staticObjectViewModels.ToArray()) { var fowNode = sectorFowData.Nodes.SingleOrDefault(x => x.Node == containerViewModel.Container.Node); var fowState = (fowNode?.State).GetValueOrDefault(SectorMapNodeFowState.TerraIncognita); var fowController = containerViewModel.GetComponent <FowContainerController>(); if (fowController != null) { fowController.ChangeState(fowState); } } }
private static SectorMapFowNode[] UpdateOrCreateFowNodes(ISectorFowData fowData, IGraphNode[] observingNodes) { var observedFowNodes = new List <SectorMapFowNode>(); foreach (var observingNode in observingNodes) { // Если узла нет в данных о тумане войны, то добавляем его. // Текущий узел в тумане войны переводим в состояние наблюдаемого. var fowNode = GetFowNodeByMapNode(fowData, observingNode); if (fowNode == null) { fowNode = new SectorMapFowNode(observingNode); fowData.AddNodes(new[] { fowNode }); } fowData.ChangeNodeState(fowNode, SectorMapNodeFowState.Observing); observedFowNodes.Add(fowNode); } return(observedFowNodes.ToArray()); }
private static SectorMapFowNode?GetFowNodeByMapNode(ISectorFowData fowData, IGraphNode observingNode) { return(fowData.GetNode(observingNode)); }