Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 2
0
    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);
            }
        }
    }
Exemplo n.º 3
0
    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);
            }
        }
    }
Exemplo n.º 4
0
        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());
        }
Exemplo n.º 5
0
 private static SectorMapFowNode?GetFowNodeByMapNode(ISectorFowData fowData, IGraphNode observingNode)
 {
     return(fowData.GetNode(observingNode));
 }