Beispiel #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);
            }
        }
Beispiel #2
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());
        }