Esempio n. 1
0
 private static bool IsHasTransitionToNextLevel(ISectorNode sectorNode, ISectorSubScheme x)
 {
     return(sectorNode.SectorScheme.TransSectorSids
            .Where(x => x != null).Select(x => x !)
            .Select(trans => trans.SectorLevelSid)
            .Contains(x.Sid));
 }
        /// <summary>
        /// Возвращает генератор карты.
        /// </summary>
        /// <param name="sectorNode">
        /// Схема сектора, на основе которой будет принято решение,
        /// какой генератор карты использовать.
        /// </param>
        /// <returns> Возвращает фабрику карт для сектора. </returns>
        public IMapFactory GetMapFactory(ISectorNode sectorNode)
        {
            if (sectorNode is null)
            {
                throw new System.ArgumentNullException(nameof(sectorNode));
            }

            var sectorScheme = sectorNode.SectorScheme;

            if (sectorScheme.MapGeneratorOptions == null)
            {
                //TODO Прописать для всех схем конкретный генератор.
                // После явного прописывания здесь нужно будет выбрасывать исключение.
                return(RoomMapFactory);
            }

            switch (sectorScheme.MapGeneratorOptions.MapGenerator)
            {
            case SchemeSectorMapGenerator.Room:
                return(RoomMapFactory);

            case SchemeSectorMapGenerator.CellularAutomaton:
                return(CellularAutomatonMapFactory);

            //TODO Прописать для всех схем конкретный генератор.
            // После явного прописывания здесь нужно будет выбрасывать исключение.
            default:
                return(RoomMapFactory);
            }
        }
Esempio n. 3
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);
            }
        }
Esempio n. 4
0
        private void CreateNextSectorNodes(ISectorNode sectorNode, IBiome biom)
        {
            var nextSectorLevels = biom.LocationScheme.SectorLevels
                                   .Where(x => sectorNode.SectorScheme.TransSectorSids.Select(trans => trans.SectorLevelSid)
                                          .Contains(x.Sid));

            foreach (var nextSectorLevelScheme in nextSectorLevels)
            {
                var nextSectorNode = new SectorNode(biom, nextSectorLevelScheme);

                biom.AddNode(nextSectorNode);

                biom.AddEdge(sectorNode, nextSectorNode);
            }

            // Если в секторе есть переход в другой биом, то
            // Генерируем новый биом, стартовый узел и организуем связь с текущим узлом.
            if (sectorNode.SectorScheme.TransSectorSids.Any(x => x.SectorLevelSid is null))
            {
                var nextBiomeCount = NEXT_BIOME_COUNT;

                for (var nextBiomeIndex = 0; nextBiomeIndex < nextBiomeCount; nextBiomeIndex++)
                {
                    var nextSectorNode = RollAndBindBiome();

                    // Организуем связь между двумя биомами.

                    biom.AddEdge(sectorNode, nextSectorNode);

                    var nextBiom = nextSectorNode.Biome;

                    nextBiom.AddEdge(sectorNode, nextSectorNode);
                }
            }
        }
Esempio n. 5
0
        public IResourceDepositData GetDepositData(ISectorNode sectorNode)
        {
            if (sectorNode is null)
            {
                throw new System.ArgumentNullException(nameof(sectorNode));
            }

            // Алгоритм.

            // Первое, что делаем, это проверяем, не является ли узел стартовым. То есть еще ничего нет.
            // В этом случае задаём случайные стартовые ресурсы.

            // Если не стартовый, тогда собираем данные с соседних, уже сгенерированных узлов.
            // Для каждого ресурса из соседних получаем усреднённое значение.
            // Затем, для каждого ресурса либо снижаем долю, либо увеличиваем.

            if (!_map.Any())
            {
                var data = CreateStartResourceData();

                _map[sectorNode] = data;

                return(data);
            }
            else
            {
                var data = CalcCurrentResouceData(sectorNode);

                _map[sectorNode] = data;

                return(data);
            }
        }
        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. 7
0
        private async Task ExpandGlobeInternalAsync(IGlobe globe, ISectorNode sectorNode)
        {
            await _biomeInitializer.MaterializeLevelAsync(sectorNode).ConfigureAwait(false);

            // Фиксируем новый узел, как известную, материализованную часть мира.
            // Далее этот узел будет обрабатываться при каждом изменении мира.
            globe.AddSectorNode(sectorNode);
        }
        private static void PrintLocationName(ISectorNode playerActorSectorNode)
        {
            var locationScheme = playerActorSectorNode.Biome.LocationScheme;
            var scheme         = playerActorSectorNode.SectorScheme;

            var sectorName = $"{locationScheme.Name} {scheme.Name}".Trim();

            Console.WriteLine($"Current Level: {sectorName}");
        }
        private static void SelectActor(ISectorUiState uiState, ISectorNode playerActorSectorNode, int targetId)
        {
            var actorManager = playerActorSectorNode.Sector.ActorManager;

            var targetObject = actorManager.Items.SingleOrDefault(x => x.Id == targetId);

            uiState.SelectedViewModel = new ActorViewModel {
                Actor = targetObject
            };
        }
Esempio n. 10
0
        private async Task GenerateStaticObjectsAsync(
            ISector sector,
            ISectorSubScheme sectorScheme,
            ISectorNode sectorNode)
        {
            var resourceDepositData = _resourceMaterializationMap.GetDepositData(sectorNode);
            var context             = new StaticObjectGenerationContext(sector, sectorScheme, resourceDepositData);

            await _staticObstaclesGenerator.CreateAsync(context).ConfigureAwait(false);
        }
Esempio n. 11
0
        private static void SelectStaticObject(ISectorUiState uiState, ISectorNode playerActorSectorNode, int targetId)
        {
            var entitiesManager = playerActorSectorNode.Sector.StaticObjectManager;

            var targetObject = entitiesManager.Items.SingleOrDefault(x => x.Id == targetId);

            uiState.SelectedViewModel = new StaticObjectViewModel {
                StaticObject = targetObject
            };
        }
Esempio n. 12
0
        private static void HandleLookCommand(ISectorUiState uiState, ISectorNode playerActorSectorNode)
        {
            var nextMoveNodes = playerActorSectorNode.Sector.Map.GetNext(uiState.ActiveActor.Actor.Node);
            var actorFow      = uiState.ActiveActor.Actor.Person.GetModule <IFowData>();
            var fowNodes      = actorFow.GetSectorFowData(playerActorSectorNode.Sector)
                                .Nodes.Where(x => x.State == SectorMapNodeFowState.Observing)
                                .Select(x => x.Node);

            var fowNodesAll = actorFow.GetSectorFowData(playerActorSectorNode.Sector)
                              .Nodes.Where(x =>
                                           x.State == SectorMapNodeFowState.Explored || x.State == SectorMapNodeFowState.Observing)
                              .Select(x => x.Node);

            Console.WriteLine($"{UiResource.NodesLabel}:");
            Console.WriteLine();
            foreach (var node in fowNodes)
            {
                Console.Write(node);

                if (nextMoveNodes.Contains(node))
                {
                    Console.Write($" {UiResource.NextNodeMarker}");
                }

                if (playerActorSectorNode.Sector.Map.Transitions.TryGetValue(node, out var _))
                {
                    Console.Write($" {UiResource.TransitionNodeMarker}");
                }

                var undiscoveredNodes = playerActorSectorNode.Sector.Map.GetNext(node)
                                        .Where(x => !fowNodesAll.Contains(x));
                if (undiscoveredNodes.Any())
                {
                    Console.Write($" {UiResource.UndiscaveredNodeMarker}");
                }

                var monsterInNode =
                    playerActorSectorNode.Sector.ActorManager.Items.SingleOrDefault(x => x.Node == node);
                if (monsterInNode != null && monsterInNode != uiState.ActiveActor.Actor)
                {
                    Console.Write(
                        $" {UiResource.MonsterNodeMarker} {monsterInNode.Person.Id}:{monsterInNode.Person}");
                }

                var staticObjectInNode =
                    playerActorSectorNode.Sector.StaticObjectManager.Items.SingleOrDefault(x => x.Node == node);
                if (staticObjectInNode != null)
                {
                    Console.Write(
                        $" {UiResource.StaticObjectNodeMarker} {staticObjectInNode.Id}:{staticObjectInNode.Purpose}");
                }

                Console.WriteLine();
            }
        }
Esempio n. 13
0
        private bool IsActorInSector(ISectorNode node)
        {
            var sector = node.Sector;

            if (sector is null)
            {
                throw new InvalidOperationException();
            }

            return(sector.ActorManager.Items.Any(x => x.Person == MainPerson));
        }
Esempio n. 14
0
    private void InitServices()
    {
        SectorNode = _humanPlayer.SectorNode;

        _staticObjectManager = SectorNode.Sector.StaticObjectManager;

        _staticObjectManager.Added   += StaticObjectManager_Added;
        _staticObjectManager.Removed += StaticObjectManager_Removed;

        SectorNode.Sector.TrasitionUsed += Sector_HumanGroupExit;
    }
Esempio n. 15
0
        public void AddSectorNode(ISectorNode sectorNode)
        {
            if (sectorNode is null)
            {
                throw new ArgumentNullException(nameof(sectorNode));
            }

            _sectorNodes.Add(sectorNode);
            sectorNode.Sector.TrasitionUsed        += Sector_TrasitionUsed;
            sectorNode.Sector.ActorManager.Removed += ActorManager_Removed;
        }
Esempio n. 16
0
        private IResourceDepositData CalcCurrentResouceData(ISectorNode sectorNode)
        {
            var neighborNodes = sectorNode.Biome.GetNext(sectorNode);
            var items         = CalcAverageResourceByNeightbors(neighborNodes);

            items = AddNewResourceIfNeed(items);

            var data = new ResourceDepositData(items);

            return(data);
        }
Esempio n. 17
0
        public async Task <ISector> GenerateAsync(ISectorNode sectorNode)
        {
            var transitions = MapFactoryHelper.CreateTransitions(sectorNode).ToArray();

            var map = await SquareMapFactory.CreateAsync(transitions.Count() + 1);

            CreateTransitions(transitions, map);

            var locationScheme = sectorNode.Biome.LocationScheme;

            var sector = _sectorFactory.Create(map, locationScheme);

            return(sector);
        }
Esempio n. 18
0
        /// <summary>
        /// Создание переходов на основе схемы.
        /// </summary>
        /// <param name="sectorNode"> Схема сектора. </param>
        /// <returns> Набор объектов переходов. </returns>
        public static IEnumerable <RoomTransition> CreateTransitions(ISectorNode sectorNode)
        {
            if (sectorNode is null)
            {
                throw new ArgumentNullException(nameof(sectorNode));
            }

            if (sectorNode.State != SectorNodeState.SchemeKnown)
            {
                throw new ArgumentException("Узел сектора должен быть материализован", nameof(sectorNode));
            }

            var next = sectorNode.Biome.GetNext(sectorNode);

            return(next.Select(node => new RoomTransition(node as ISectorNode)));
        }
Esempio n. 19
0
        /// <summary>
        /// Создание переходов на основе схемы.
        /// </summary>
        /// <param name="sectorNode"> Схема сектора. </param>
        /// <returns> Набор объектов переходов. </returns>
        public static IEnumerable <SectorTransition> CreateTransitions(ISectorNode sectorNode)
        {
            if (sectorNode is null)
            {
                throw new ArgumentNullException(nameof(sectorNode));
            }

            if (sectorNode.State != SectorNodeState.SchemeKnown)
            {
                throw new ArgumentException($"Sector node {sectorNode} is not materialized.", nameof(sectorNode));
            }

            var nextSectorNodes = sectorNode.Biome.GetNext(sectorNode);

            return(nextSectorNodes.Select(node => new SectorTransition(node as ISectorNode)));
        }
Esempio n. 20
0
        private static string GetVisualString(ISectorNode currentNode, ISectorNode nextNode, IResourceDepositData currentResource, IResourceDepositData nextResource)
        {
            var str = new StringBuilder($"    {currentNode.GetHashCode()}{ResourceToString(currentResource)}-->{nextNode.GetHashCode()}{ResourceToString(nextResource)};");

            if (currentResource.Items.Any())
            {
                var currentResColor = ResourceToStyle(currentResource);
                str.AppendLine($"    style {currentNode.GetHashCode()} fill:{ColorTranslator.ToHtml(currentResColor)}");
            }

            if (nextResource.Items.Any())
            {
                var nextResColor = ResourceToStyle(nextResource);
                str.AppendLine($"    style {nextNode.GetHashCode()} fill:{ColorTranslator.ToHtml(nextResColor)}");
            }

            return(str.ToString());
        }
Esempio n. 21
0
        public async Task <ISector> GenerateAsync(ISectorNode sectorNode)
        {
            var sectorFactoryOptions = new SectorMapFactoryOptions(sectorNode.SectorScheme.MapGeneratorOptions);

            var map = await _mapFactory.CreateAsync(sectorFactoryOptions);

            var actorManager        = new ActorManager();
            var staticObjectManager = new StaticObjectManager();

            var sector = new Sector(map,
                                    actorManager,
                                    staticObjectManager,
                                    _dropResolver,
                                    _schemeService,
                                    _equipmentDurableService);

            return(sector);
        }
Esempio n. 22
0
        public Task ExpandGlobeAsync(IGlobe globe, ISectorNode sectorNode)
        {
            if (globe is null)
            {
                throw new ArgumentNullException(nameof(globe));
            }

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

            if (sectorNode.State == SectorNodeState.SectorMaterialized)
            {
                throw new InvalidOperationException("В этом случае такой узел должен уже быть использован.");
            }

            return(ExpandGlobeInternalAsync(globe, sectorNode));
        }
Esempio n. 23
0
        /// <summary>
        /// Создаёт экземпляр сектора подземелий с указанными параметрами.
        /// </summary>
        /// <param name="sectorNode"> Схема генерации сектора. </param>
        /// <returns> Возвращает экземпляр сектора. </returns>
        public async Task <ISector> GenerateAsync(ISectorNode sectorNode)
        {
            if (sectorNode is null)
            {
                throw new ArgumentNullException(nameof(sectorNode));
            }

            var mapFactory = _mapFactorySelector.GetMapFactory(sectorNode);

            var transitions = MapFactoryHelper.CreateTransitions(sectorNode);

            var mapGeneratorOptions = sectorNode.SectorScheme.MapGeneratorOptions;

            if (mapGeneratorOptions is null)
            {
                throw new InvalidOperationException();
            }

            var sectorFactoryOptions = new SectorMapFactoryOptions(mapGeneratorOptions, transitions);

            var map = await mapFactory.CreateAsync(sectorFactoryOptions).ConfigureAwait(false);

            var locationScheme = sectorNode.Biome.LocationScheme;

            var sector = _sectorFactory.Create(map, locationScheme);

            DefineDiseases(sector);

            var gameObjectRegions = map.Regions.Where(x => !x.IsStart).ToArray();

            var sectorScheme = sectorNode.SectorScheme;

            await GenerateStaticObjectsAsync(sector, sectorScheme, sectorNode).ConfigureAwait(false);

            var monsterRegions = gameObjectRegions.ToArray();

            _monsterGenerator.CreateMonsters(sector,
                                             monsterRegions,
                                             sectorScheme);

            return(sector);
        }
Esempio n. 24
0
        /// <summary>
        /// Создаёт экземпляр сектора подземелий с указанными параметрами.
        /// </summary>
        /// <param name="sectorNode"> Схема генерации сектора. </param>
        /// <returns> Возвращает экземпляр сектора. </returns>
        public async Task <ISector> GenerateAsync(ISectorNode sectorNode)
        {
            if (sectorNode is null)
            {
                throw new ArgumentNullException(nameof(sectorNode));
            }

            var mapFactory = _mapFactorySelector.GetMapFactory(sectorNode);

            var transitions = MapFactoryHelper.CreateTransitions(sectorNode);

            var sectorFactoryOptions = new SectorMapFactoryOptions(sectorNode.SectorScheme.MapGeneratorOptions, transitions);

            var map = await mapFactory.CreateAsync(sectorFactoryOptions).ConfigureAwait(false);

            var locationScheme = sectorNode.Biome.LocationScheme;

            var sector = _sectorFactory.Create(map, locationScheme);

            DefineDiseases(sector);

            var gameObjectRegions = map.Regions.Where(x => !x.IsStart).ToArray();

            var sectorScheme = sectorNode.SectorScheme;

            var resourceDepositData = _resourceMaterializationMap.GetDepositData(sectorNode);

            var staticObjectgenerationContext = new StaticObjectGenerationContext(sector, sectorScheme, resourceDepositData);

            await _staticObstaclesGenerator.CreateAsync(staticObjectgenerationContext).ConfigureAwait(false);

            var monsterRegions = gameObjectRegions.ToArray();

            _monsterGenerator.CreateMonsters(sector,
                                             _botPlayer,
                                             monsterRegions,
                                             sectorScheme);

            return(sector);
        }
Esempio n. 25
0
        private static void HandleAttackCommand(string inputText, IServiceScope serviceScope, ISectorUiState uiState,
                                                ISectorNode playerActorSectorNode, ICommandPool commandManager)
        {
            var components = inputText.Split(' ');
            var targetId   = int.Parse(components[1], CultureInfo.InvariantCulture);

            if (components.Length == 3)
            {
                var targetMarker = components[2].ToUpper(CultureInfo.InvariantCulture);
                switch (targetMarker)
                {
                case "A":
                    SelectActor(uiState, playerActorSectorNode, targetId);
                    break;

                case "S":
                    SelectStaticObject(uiState, playerActorSectorNode, targetId);
                    break;

                default:
                    SelectActor(uiState, playerActorSectorNode, targetId);
                    break;
                }
            }
            else
            {
                SelectActor(uiState, playerActorSectorNode, targetId);
            }

            var acts = uiState.ActiveActor.Actor.Person.GetModule <ICombatActModule>().GetCurrentCombatActs();

            uiState.TacticalAct = acts
                                  .OrderBy(x => x.Equipment is null)
                                  .First(x => x.Constrains is null);

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

            PushCommandToExecution(commandManager, command);
        }
Esempio n. 26
0
        public async Task MaterializeLevelAsync(ISectorNode sectorNode)
        {
            if (sectorNode is null)
            {
                throw new ArgumentNullException(nameof(sectorNode));
            }

            if (sectorNode.State != SectorNodeState.SchemeKnown)
            {
                throw new InvalidOperationException();
            }

            var biom = sectorNode.Biome;

            // Важно генерировать соседние узлы до начала генерации сектора,
            // чтобы знать переходы из сектора.

            CreateNextSectorNodes(sectorNode, biom);

            var sector = await _sectorGenerator.GenerateAsync(sectorNode).ConfigureAwait(false);

            sectorNode.MaterializeSector(sector);
        }
Esempio n. 27
0
        public async System.Threading.Tasks.Task GetDepositDataTestAsync()
        {
            var sectorGeneratorMock = new Mock <ISectorGenerator>();

            sectorGeneratorMock.Setup(x => x.GenerateAsync(It.IsAny <ISectorNode>()))
            .Returns <ISectorNode>(scheme =>
            {
                return(Task.Run(() =>
                {
                    var sectorMock = new Mock <ISector>();
                    var sector = sectorMock.Object;
                    return sector;
                }));
            });

            var sectorGenerator = sectorGeneratorMock.Object;
            var locationSchemes = CreateBiomSchemes();

            var schemeRoundCounter = 0;
            var rollerMock         = new Mock <IBiomeSchemeRoller>();

            rollerMock.Setup(x => x.Roll()).Returns(() =>
            {
                schemeRoundCounter++;
                if (schemeRoundCounter >= locationSchemes.Length)
                {
                    schemeRoundCounter = 0;
                }

                var scheme = locationSchemes[schemeRoundCounter];

                return(scheme);
            });
            var roller = rollerMock.Object;

            var introScheme = locationSchemes.Single(x => x.Sid == "intro");

            var biomService = new BiomeInitializer(sectorGenerator, roller);

            var dice = new LinearDice();
            var resourceMaterializationMap = new ResourceMaterializationMap(dice);

            var resultStringBuilder = new StringBuilder();

            resultStringBuilder.AppendLine("graph TD;");

            // ACT

            var biom = await biomService.InitBiomeAsync(introScheme).ConfigureAwait(false);

            var         introNode       = biom.Sectors.Single(x => x.State == SectorNodeState.SectorMaterialized);
            var         currentResource = resourceMaterializationMap.GetDepositData(introNode);
            ISectorNode currentNode     = introNode;

            var       iteration     = 0;
            const int ITERATION_MAX = 100;

            var openList   = new List <NodeInfo>();
            var nextNodes1 = currentNode.Biome.GetNext(currentNode)
                             .OfType <SectorNode>()
                             .Where(x => x.State != SectorNodeState.SectorMaterialized)
                             .Select(x => new NodeInfo {
                Current = x, Parent = introNode, ParentResource = currentResource
            });

            openList.AddRange(nextNodes1);

            while (iteration < ITERATION_MAX)
            {
                var nextNode = openList[0];
                openList.RemoveAt(0);

                await biomService.MaterializeLevelAsync(nextNode.Current).ConfigureAwait(false);

                var nextResource = resourceMaterializationMap.GetDepositData(nextNode.Current);

                resultStringBuilder.AppendLine(GetVisualString(nextNode.Parent, nextNode.Current, nextNode.ParentResource, nextResource));

                var nextNodes2 = nextNode.Current.Biome.GetNext(nextNode.Current)
                                 .OfType <SectorNode>()
                                 .Where(x => x.State != SectorNodeState.SectorMaterialized)
                                 .Select(x => new NodeInfo {
                    Current = x, Parent = nextNode.Current, ParentResource = nextResource
                });
                openList.AddRange(nextNodes2);

                iteration++;
            }

            Console.Write(resultStringBuilder.ToString());
        }
Esempio n. 28
0
 public void BindSectorNode(ISectorNode sectorNode)
 {
     SectorNode = sectorNode;
 }
Esempio n. 29
0
 public Task ExpandAsync(ISectorNode sectorNode)
 {
     return(MaterializeLevelAsync(sectorNode));
 }
 /// <inheritdoc />
 public IMapFactory GetMapFactory(ISectorNode sectorNode)
 {
     return(_mapFactory);
 }