Esempio n. 1
0
        private static void HandleMoveCommand(IServiceScope serviceScope, ISectorUiState uiState,
                                              ISectorNode playerActorSectorNode, string inputText)
        {
            var components   = inputText.Split(' ');
            var x            = int.Parse(components[1], CultureInfo.InvariantCulture);
            var y            = int.Parse(components[2], CultureInfo.InvariantCulture);
            var offsetCoords = new OffsetCoords(x, y);

            ISectorMap map = playerActorSectorNode.Sector.Map;

            var targetNode = map.Nodes.OfType <HexNode>()
                             .SingleOrDefault(node => node.OffsetCoords == offsetCoords);

            var command = serviceScope.ServiceProvider.GetRequiredService <MoveCommand>();

            uiState.SelectedViewModel = new NodeViewModel {
                Node = targetNode
            };

            if (command.CanExecute())
            {
                command.Execute();
            }
            else
            {
                Console.WriteLine(UiResource.CommandCantExecuteMessage);
            }
        }
        private static void HandleMoveCommand(
            IServiceScope serviceScope,
            ISectorUiState uiState,
            ICommandPool commandManager,
            ISectorNode playerActorSectorNode,
            string inputText)
        {
            var components   = inputText.Split(' ');
            var x            = int.Parse(components[1], CultureInfo.InvariantCulture);
            var y            = int.Parse(components[2], CultureInfo.InvariantCulture);
            var offsetCoords = new OffsetCoords(x, y);

            ISectorMap map = playerActorSectorNode.Sector.Map;

            var targetNode = map.Nodes.OfType <HexNode>()
                             .SingleOrDefault(node => node.OffsetCoords == offsetCoords);

            var command = serviceScope.ServiceProvider.GetRequiredService <MoveCommand>();

            uiState.SelectedViewModel = new NodeViewModel {
                Node = targetNode
            };

            PushCommandToExecution(commandManager, command);
        }
Esempio n. 3
0
    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);
    }
Esempio n. 4
0
        public Sector(ISectorMap map,
                      IActorManager actorManager,
                      IStaticObjectManager staticObjectManager,
                      IDropResolver dropResolver,
                      ISchemeService schemeService,
                      IEquipmentDurableService equipmentDurableService)
        {
            ActorManager             = actorManager ?? throw new ArgumentNullException(nameof(actorManager));
            StaticObjectManager      = staticObjectManager ?? throw new ArgumentNullException(nameof(staticObjectManager));
            _dropResolver            = dropResolver ?? throw new ArgumentNullException(nameof(dropResolver));
            _schemeService           = schemeService ?? throw new ArgumentNullException(nameof(schemeService));
            _equipmentDurableService = equipmentDurableService ??
                                       throw new ArgumentNullException(nameof(equipmentDurableService));

            _diseases = new List <IDisease>();

            ActorManager.Added          += ActorManager_Added;
            ActorManager.Removed        += ActorManager_Remove;
            StaticObjectManager.Added   += StaticObjectManager_Added;
            StaticObjectManager.Removed += StaticObjectManager_Remove;

            Map = map ?? throw new ArgumentException("Не передана карта сектора.", nameof(map));

            PatrolRoutes = new Dictionary <IActor, IPatrolRoute>();
        }
Esempio n. 5
0
 public RoamingLogic(IActor actor,
                     ISectorMap map,
                     IActorManager actors,
                     IDecisionSource decisionSource,
                     ITacticalActUsageService actService) : base(actor, map, actors, decisionSource, actService)
 {
 }
Esempio n. 6
0
        public MoveTask(IActor actor, IActorTaskContext context, IGraphNode targetNode, ISectorMap map, int cost) :
            base(actor, context)
        {
            TargetNode = targetNode ?? throw new ArgumentNullException(nameof(targetNode));
            _map       = map ?? throw new ArgumentNullException(nameof(map));
            Cost       = cost;
            if (actor.Node == targetNode)
            {
                // Это может произойти, если источник команд выбрал целевую точку ту же, что и сам актёр
                // в результате рандома.
                IsComplete = true;

                _path = new List <IGraphNode>(0);
            }
            else
            {
                _path = new List <IGraphNode>();

                CreatePath();

                if (!_path.Any())
                {
                    IsComplete = true;
                }
            }
        }
Esempio n. 7
0
 private static void SaveMapAsImage(ISectorMap map, string outputPath)
 {
     using (var bmp = MapDrawer.DrawMap(map))
     {
         bmp.Save(outputPath);
     }
 }
Esempio n. 8
0
        private static IEnumerable <IActor> CheckForIntruders(IActor actor, ISectorMap map, IActorManager actorManager)
        {
            foreach (var target in actorManager.Items)
            {
                if (target.Person.Fraction == actor.Person.Fraction ||
                    (target.Person.Fraction == Fractions.MilitiaFraction &&
                     actor.Person.Fraction == Fractions.MainPersonFraction) ||
                    (target.Person.Fraction == Fractions.MainPersonFraction &&
                     actor.Person.Fraction == Fractions.MilitiaFraction) ||
                    (target.Person.Fraction == Fractions.InterventionistFraction &&
                     actor.Person.Fraction == Fractions.TroublemakerFraction) ||
                    (target.Person.Fraction == Fractions.TroublemakerFraction &&
                     actor.Person.Fraction == Fractions.InterventionistFraction))
                {
                    continue;
                }

                if (target.Person.CheckIsDead())
                {
                    continue;
                }

                var isVisible = LogicHelper.CheckTargetVisible(map, actor.Node, target.Node);
                if (!isVisible)
                {
                    continue;
                }

                yield return(target);
            }
        }
Esempio n. 9
0
        private void CreateOneRoomNodes(ISectorMap map, HashSet <string> edgeHash, Room room, Size cellSize)
        {
            var interiorObjects = _randomSource.RollInteriorObjects(room.Width, room.Height);

            for (var x = 0; x < room.Width; x++)
            {
                for (var y = 0; y < room.Height; y++)
                {
                    var nodeX = x + room.PositionX * cellSize.Width;
                    var nodeY = y + room.PositionY * cellSize.Height;

                    var isObstacle          = false;
                    var interiorObjectMetas = interiorObjects
                                              .SingleOrDefault(o => o.Coords.CompsEqual(x, y));

                    if (interiorObjectMetas != null)
                    {
                        //TODO Сделать так, чтобы укрытия не генерировались на узлах с выходами
                        // Как вариант - если выбираем узел, как выход, то снимаем флаг укрытия.
                        // Вообще, нужно поискать алгоритмы, которые бы расставляли укрытия и выходы, оставляя комнату проходимой.
                        isObstacle = true;
                    }

                    var node = new HexNode(nodeX, nodeY, isObstacle);

                    room.Nodes.Add(node);
                    map.AddNode(node);

                    RoomHelper.AddAllNeighborToMap(map, edgeHash, room, node);
                }
            }

            CreateTransitions(map, room);
        }
Esempio n. 10
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} не имеет подступов.");
            }
        }
Esempio n. 11
0
        /// <summary>
        /// Проверяет, допустимая ли дистанция для совершения действия.
        /// </summary>
        /// <param name="act"> Проверяемое действие. </param>
        /// <param name="currentNode"> Узел, из которого совершается действие. </param>
        /// <param name="targetNode"> Целевой узел. </param>
        /// <returns>Возвращает true, если дистанция допустима.</returns>
        public static bool CheckDistance(this ITacticalAct act,
                                         IGraphNode currentNode,
                                         IGraphNode targetNode,
                                         ISectorMap map)
        {
            if (act is null)
            {
                throw new System.ArgumentNullException(nameof(act));
            }

            if (currentNode is null)
            {
                throw new System.ArgumentNullException(nameof(currentNode));
            }

            if (targetNode is null)
            {
                throw new System.ArgumentNullException(nameof(targetNode));
            }

            if (map is null)
            {
                throw new System.ArgumentNullException(nameof(map));
            }

            var range        = act.Stats.Range;
            var distance     = map.DistanceBetween(currentNode, targetNode);
            var isInDistance = range.Contains(distance);

            return(isInDistance);
        }
Esempio n. 12
0
        public static IStaticObject FindContainer(IActor actor, IStaticObjectManager staticObjectManager,
                                                  ISectorMap map)
        {
            if (actor is null)
            {
                throw new ArgumentNullException(nameof(actor));
            }

            if (staticObjectManager is null)
            {
                throw new ArgumentNullException(nameof(staticObjectManager));
            }

            if (map is null)
            {
                throw new ArgumentNullException(nameof(map));
            }

            var containerStaticObjects = staticObjectManager.Items
                                         .Where(x => x.HasModule <IPropContainer>());

            var foundContainers = LootHelper.FindAvailableContainers(containerStaticObjects,
                                                                     actor.Node,
                                                                     map);

            var orderedContainers = foundContainers.OrderBy(x => map.DistanceBetween(actor.Node, x.Node));
            var nearbyContainer   = orderedContainers.FirstOrDefault();

            return(nearbyContainer);
        }
Esempio n. 13
0
 public override void CreateRoomNodes(ISectorMap map, IEnumerable <Room> rooms, HashSet <string> edgeHash)
 {
     foreach (var room in rooms)
     {
         CreateOneRoomNodes(map, edgeHash, room);
     }
 }
        public async Task SetUpAsync()
        {
            _map = await SquareMapFactory.CreateAsync(10);


            var playerMock = new Mock <IPlayer>();

            _player = playerMock.Object;


            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(() => _factActorNode);
            actorMock.Setup(x => x.MoveToNode(It.IsAny <IMapNode>()))
            .Callback <IMapNode>(node => _factActorNode = node);
            actorMock.SetupGet(x => x.Owner).Returns(_player);
            _actor = actorMock.Object;

            // Маршрут из 3-х точек
            var patrolRoute3PointsMock = new Mock <IPatrolRoute>();
            var route3Points           = new IMapNode[] {
                _map.Nodes.OfType <HexNode>().SelectBy(1, 1),
                _map.Nodes.OfType <HexNode>().SelectBy(5, 3),
                _map.Nodes.OfType <HexNode>().SelectBy(3, 5)
            };

            patrolRoute3PointsMock
            .SetupGet(x => x.Points)
            .Returns(route3Points);
            _patrolRoute3Points = patrolRoute3PointsMock.Object;

            // Маршрут из 2-х точек по диагонали комнаты
            var patrolRoute2DiagonalPointsMock = new Mock <IPatrolRoute>();
            var route2DiagonalPoints           = new IMapNode[] {
                _map.Nodes.OfType <HexNode>().SelectBy(0, 0),
                _map.Nodes.OfType <HexNode>().SelectBy(9, 9)
            };

            patrolRoute2DiagonalPointsMock
            .SetupGet(x => x.Points)
            .Returns(route2DiagonalPoints);
            _patrolRoute2DiagonalPoints = patrolRoute2DiagonalPointsMock.Object;


            var actors = new List <IActor> {
                _actor
            };
            var actorListMock = new Mock <IActorManager>();

            actorListMock.SetupGet(x => x.Items).Returns(actors);
            _actorList = actorListMock.Object;


            var decisionSourceMock = new Mock <IDecisionSource>();

            decisionSourceMock.Setup(x => x.SelectIdleDuration(It.IsAny <int>(), It.IsAny <int>()))
            .Returns(ExpectedIdleDuration);
            _decisionSource = decisionSourceMock.Object;
        }
 public DefeatTargetLogicState(ISectorManager sectorManager,
                               ITacticalActUsageService actService,
                               IActorManager actorManager)
 {
     _map          = sectorManager.CurrentSector.Map;
     _actService   = actService ?? throw new ArgumentNullException(nameof(actService));
     _actorManager = actorManager ?? throw new ArgumentNullException(nameof(actorManager));
 }
        /// <summary>
        /// Создаёт узлы комнат на карте.
        /// </summary>
        /// <param name="map">Карта, в рамках которой происходит генерация.</param>
        /// <param name="rooms">Комнаты, для которых создаются узлы графа карты.</param>
        /// <param name="edgeHash">Хэш рёбер. Нужен для оптимизации при создании узлов графа карты.</param>
        public void CreateRoomNodes(ISectorMap map, IEnumerable <Room> rooms, HashSet <string> edgeHash)
        {
            var cellSize = CalcCellSize(rooms);

            foreach (var room in rooms)
            {
                CreateOneRoomNodes(map, edgeHash, room, cellSize);
            }
        }
Esempio n. 17
0
 public PatrolLogic(IActor actor,
                    IPatrolRoute patrolRoute,
                    ISectorMap map,
                    IActorManager actors,
                    IDecisionSource decisionSource,
                    ITacticalActUsageService actService) : base(actor, map, actors, decisionSource, actService)
 {
     _patrolRoute = patrolRoute;
 }
Esempio n. 18
0
 private static IGraphNode[] CreateExpectedPath(ISectorMap map)
 {
     return(new IGraphNode[] {
         map.Nodes.SelectByHexCoords(4, 4),
         map.Nodes.SelectByHexCoords(3, 4),
         map.Nodes.SelectByHexCoords(2, 4),
         map.Nodes.SelectByHexCoords(1, 5),
     });
 }
Esempio n. 19
0
 public OpenContainerTask([NotNull] IActor actor,
                          [NotNull] IStaticObject staticObject,
                          [NotNull] IOpenContainerMethod method,
                          [NotNull] ISectorMap map) : base(actor)
 {
     _staticObject = staticObject ?? throw new ArgumentNullException(nameof(staticObject));
     _method       = method ?? throw new ArgumentNullException(nameof(method));
     _map          = map ?? throw new ArgumentNullException(nameof(map));
 }
        private void CreateOneRoomNodes(ISectorMap map, HashSet <string> edgeHash, Room room, Size cellSize)
        {
            var interiorObjects = _randomSource.RollInteriorObjects(room.Width, room.Height);

            for (var x = 0; x < room.Width; x++)
            {
                for (var y = 0; y < room.Height; y++)
                {
                    var nodeX = x + room.PositionX * cellSize.Width;
                    var nodeY = y + room.PositionY * cellSize.Height;

                    var isObstacle = false;
                    var interiorObjectForCoords = interiorObjects
                                                  .SingleOrDefault(o => o.Coords.CompsEqual(x, y));

                    if (interiorObjectForCoords != null)
                    {
//TODO Сделать так, чтобы укрытия не генерировались на узлах с выходами
// Как вариант - если выбираем узел, как выход, то снимаем флаг укрытия.
// Вообще, нужно поискать алгоритмы, которые бы расставляли укрытия и выходы, оставляя комнату проходимой.
                        isObstacle = true;
                    }

                    var node = new HexNode(nodeX, nodeY, isObstacle);


                    room.Nodes.Add(node);
                    map.AddNode(node);

                    var neighbors = HexNodeHelper.GetSpatialNeighbors(node, room.Nodes);

                    foreach (var neighbor in neighbors)
                    {
                        var isExists = IsExistsEdge(edgeHash, node, neighbor);

                        if (!isExists)
                        {
                            AddEdgeToMap(map, edgeHash, node, neighbor);
                        }
                    }
                }
            }

            // создаём переходы, если они есть в данной комнате
            if (room.Transitions.Any())
            {
                //TODO Отфильтровать узлы, которые на входах в коридор
                var availableNodes = room.Nodes.Where(x => !x.IsObstacle);
                var openRoomNodes  = new List <HexNode>(availableNodes);
                foreach (var transition in room.Transitions)
                {
                    var transitionNode = _randomSource.RollTransitionNode(openRoomNodes);
                    map.Transitions.Add(transitionNode, transition);
                    openRoomNodes.Remove(transitionNode);
                }
            }
        }
 public OpenContainerTask([NotNull] IActor actor,
                          [NotNull] IPropContainer container,
                          [NotNull] IOpenContainerMethod method,
                          [NotNull] ISectorMap map) : base(actor)
 {
     _container = container ?? throw new ArgumentNullException(nameof(container));
     _method    = method ?? throw new ArgumentNullException(nameof(method));
     _map       = map ?? throw new ArgumentNullException(nameof(map));
 }
Esempio n. 22
0
        private static void CreateTransitions(SectorTransition[] transitions, ISectorMap map)
        {
            var nodes = map.Nodes.ToArray();

            for (var i = 0; i < transitions.Count(); i++)
            {
                map.Transitions.Add(nodes[i], transitions[i]);
            }
        }
Esempio n. 23
0
        public LootLogicState(ISectorManager sectorManager)
        {
            if (sectorManager is null)
            {
                throw new System.ArgumentNullException(nameof(sectorManager));
            }

            _map           = sectorManager.CurrentSector.Map;
            _sectorManager = sectorManager;
        }
Esempio n. 24
0
        protected MoveLogicStateBase(IDecisionSource decisionSource, ISectorManager sectorManager)
        {
            if (sectorManager is null)
            {
                throw new ArgumentNullException(nameof(sectorManager));
            }

            DecisionSource = decisionSource ?? throw new ArgumentNullException(nameof(decisionSource));
            Map            = sectorManager.CurrentSector.Map;
        }
Esempio n. 25
0
        private void UseAct(IActor actor, ActTargetInfo target, ITacticalAct act, ISectorMap map)
        {
            bool isInDistance;

            if ((act.Stats.Targets & TacticalActTargets.Self) > 0 && actor == target)
            {
                isInDistance = true;
            }
            else
            {
                isInDistance = IsInDistance(actor, target.TargetNode, act, map);
            }

            if (!isInDistance)
            {
                // Это может произойти, если цель, в процессе применения действия
                // успела выйти из радиуса применения.
                // TODO Лучше сделать, чтобы этот метод возвращал объект с результатом выполнения действия.
                // А внешний код пусть либо считает исход допустимым, либо выбрасывает исключения типа UsageOutOfDistanceException
                return;
            }

            var targetNode = target.TargetNode;

            var targetIsOnLine = map.TargetIsOnLine(
                actor.Node,
                targetNode);

            if (targetIsOnLine)
            {
                actor.UseAct(targetNode, act);

                var tacticalActRoll = GetActEfficient(act);

                var actHandler = _actUsageHandlerSelector.GetHandler(target.TargetObject);
                actHandler.ProcessActUsage(actor, target.TargetObject, tacticalActRoll);

                UseActResources(actor, act);
            }
            else
            {
                // Ситация, когда цель за стеной может произойти по следующим причинам:
                // 1. В момент начала применения действия цель была доступна. К моменту выполнения дейтвия цель скрылась.
                // В этом случае изымаем патроны и начинаем КД по действию, так как фактически ресурсы на него потрачены. Но на цель не воздействуем.
                // 2. Ошибка во внешнем коде, когда не провели предварительную проверку. Это проверяется сравнением ячейки в которую целились
                // на момент начала действия и текущую ячейку цели.

                if (target.TargetNode == target.TargetObject.Node)
                {
                    throw new UsageThroughtWallException();
                }

                UseActResources(actor, act);
            }
        }
        public async System.Threading.Tasks.Task SetUpAsync()
        {
            _container = new ServiceContainer();

            _map = await SquareMapFactory.CreateAsync(10);

            var sectorMock = new Mock <ISector>();

            sectorMock.SetupGet(x => x.Map).Returns(_map);
            var sector = sectorMock.Object;

            var sectorManagerMock = new Mock <ISectorManager>();

            sectorManagerMock.SetupGet(x => x.CurrentSector).Returns(sector);
            var sectorManager = sectorManagerMock.Object;

            _actorListInner = new List <IActor>();

            _testedActor = CreateBotActor(1, 1);

            var actorManagerMock = new Mock <IActorManager>();

            actorManagerMock.SetupGet(x => x.Items).Returns(_actorListInner);
            var actorManager = actorManagerMock.Object;

            var routePoints = new IMapNode[] {
                _map.Nodes.Cast <HexNode>().SelectBy(1, 1),
                _map.Nodes.Cast <HexNode>().SelectBy(9, 9)
            };
            var routeMock = new Mock <IPatrolRoute>();

            routeMock.SetupGet(x => x.Points).Returns(routePoints);
            var route = routeMock.Object;

            var patrolRoutes = new Dictionary <IActor, IPatrolRoute>
            {
                { _testedActor, route }
            };

            sectorMock.SetupGet(x => x.PatrolRoutes).Returns(patrolRoutes);

            var decisionSourceMock = new Mock <IDecisionSource>();
            var decisionSource     = decisionSourceMock.Object;

            var tacticalActUsageServiceMock = new Mock <ITacticalActUsageService>();
            var tacticalActUsageService     = tacticalActUsageServiceMock.Object;

            _container.Register(factory => sectorManager, new PerContainerLifetime());
            _container.Register(factory => (IBotPlayer)_testedActor.Owner, new PerContainerLifetime());
            _container.Register(factory => actorManager, new PerContainerLifetime());
            _container.Register(factory => tacticalActUsageService, new PerContainerLifetime());
            _container.Register(factory => decisionSource, new PerContainerLifetime());
            _container.Register <MonsterActorTaskSource>(new PerContainerLifetime());
        }
        /// <summary>
        /// Проверяет, допустимая ли дистанция для совершения действия.
        /// </summary>
        /// <param name="act"> Проверяемое действие. </param>
        /// <param name="currentNode"> Узел, из которого совершается действие. </param>
        /// <param name="targetNode"> Целевой узел. </param>
        /// <returns>Возвращает true, если дистанция допустима.</returns>
        public static bool CheckDistance(this ITacticalAct act,
                                         IMapNode currentNode,
                                         IMapNode targetNode,
                                         ISectorMap map)
        {
            var range        = act.Stats.Range;
            var distance     = map.DistanceBetween(currentNode, targetNode);
            var isInDistance = range.Contains(distance);

            return(isInDistance);
        }
Esempio n. 28
0
        public ISector Create(ISectorMap map)
        {
            var sector = new Sector(map,
                                    _actorManager,
                                    _propContainerManager,
                                    _dropResolver,
                                    _schemeService,
                                    _equipmentDurableService);

            return(sector);
        }
Esempio n. 29
0
        protected AgressiveLogicBase(IActor actor,
                                     ISectorMap map,
                                     IActorManager actorManager,
                                     IDecisionSource decisionSource,
                                     ITacticalActUsageService actService)
        {
            Actor          = actor;
            Map            = map;
            DecisionSource = decisionSource;

            _actorManager   = actorManager;
            _actService     = actService;
            _pursuitCounter = PursuitCounter;
        }
Esempio n. 30
0
        private void CreateRegionsAndTranstions(ISectorMap map, int mapSize, HexNode centerNode,
                                                IEnumerable <SectorTransition> transitions)
        {
            var availableNodes = map.Nodes.OfType <HexNode>().ToList();

            // start region

            var startX = _dice.Roll(mapSize / 2) + centerNode.OffsetCoords.X;
            var startY = _dice.Roll(mapSize / 2) + centerNode.OffsetCoords.Y;

            var startRegionNodes = new[] { availableNodes.Single(x => x.OffsetCoords.CompsEqual(startX, startY)) };
            var startRegion      = new MapRegion(START_REGION_ID, startRegionNodes)
            {
                IsStart = true
            };

            map.Regions.Add(startRegion);
            foreach (var node in startRegionNodes)
            {
                availableNodes.Remove(node);
            }

            // transition regions

            var transitionsList = transitions.ToArray();

            for (var i = 0; i < transitionsList.Length; i++)
            {
                var roundPart = Math.PI * 2 * i / transitionsList.Length;
                var x         = (int)(Math.Cos(roundPart) * mapSize) + centerNode.OffsetCoords.X;
                var y         = (int)(Math.Sin(roundPart) * mapSize) + centerNode.OffsetCoords.Y;

                var transitionRegionNodes = new[] { availableNodes.Single(node => node.OffsetCoords.CompsEqual(x, y)) };
                var transitionRegionId    = START_REGION_ID + i + 1;
                var transitionRegion      = new MapRegion(transitionRegionId, transitionRegionNodes);
                transitionRegion.ExitNodes = transitionRegion.Nodes;
                map.Regions.Add(transitionRegion);

                foreach (var node in transitionRegionNodes)
                {
                    availableNodes.Remove(node);
                    map.Transitions[node] = transitionsList[i];
                }
            }

            // main region
            var mainRegion = new MapRegion(1000, availableNodes.ToArray());

            map.Regions.Add(mainRegion);
        }
Esempio n. 31
0
 public void AddSectorMap(ISectorMap sectorMap)
 {
     //_sectorMaps.Add(sectorMap);
 }