Пример #1
0
        private void CreateMonstersForRegion(ISector sector, IBotPlayer monsterPlayer, ISectorSubScheme sectorScheme, List <IActor> resultMonsterActors, MapRegion region, int[] rarityCounter)
        {
            var regionNodes           = region.Nodes.OfType <HexNode>();
            var staticObjectsNodes    = sector.StaticObjectManager.Items.Select(x => x.Node);
            var availableMonsterNodes = regionNodes.Except(staticObjectsNodes);

            var freeNodes = new List <IGraphNode>(availableMonsterNodes);

            var monsterCount = _generatorRandomSource.RollRegionCount(
                sectorScheme.MinRegionMonsterCount,
                sectorScheme.RegionMonsterCount);

            for (var i = 0; i < monsterCount; i++)
            {
                // если в комнате все места заняты
                if (!freeNodes.Any())
                {
                    break;
                }

                var rollIndex   = _generatorRandomSource.RollNodeIndex(freeNodes.Count);
                var monsterNode = freeNodes[rollIndex];

                var monster = RollRarityAndCreateMonster(sector, monsterPlayer, sectorScheme, monsterNode, rarityCounter);

                freeNodes.Remove(monster.Node);
                resultMonsterActors.Add(monster);
            }
        }
Пример #2
0
        /// <summary>Создаёт монстров в секторе по указанной схеме.</summary>
        /// <param name="sector">Целевой сектор.</param>
        /// <param name="monsterPlayer">Бот, управляющий монстрами. По сути, команда монстров.</param>
        /// <param name="monsterRegions">Регионы сектора, где могут быть монстры.</param>
        /// <param name="sectorScheme">Схема сектора. Отсюда берутся параметры генерации монстров.</param>
        public void CreateMonsters(ISector sector,
                                   IBotPlayer monsterPlayer,
                                   IEnumerable <MapRegion> monsterRegions,
                                   ISectorSubScheme sectorScheme)
        {
            var rarityCounter    = new int[3];
            var rarityMaxCounter = new[] { -1, 10, 1 };

            foreach (var region in monsterRegions)
            {
                var freeNodes = new List <IMapNode>(region.Nodes);

                var monsterCount = _generatorRandomSource.RollRegionCount(sectorScheme.RegionMonsterCount);

                for (int i = 0; i < monsterCount; i++)
                {
                    // если в комнате все места заняты
                    if (!freeNodes.Any())
                    {
                        break;
                    }

                    var currentRarity       = GetMonsterRarity(rarityCounter, rarityMaxCounter);
                    var availableSchemeSids = GetAvailableSchemeSids(sectorScheme, currentRarity);

                    var availableMonsterSchemes = availableSchemeSids.Select(x => _schemeService.GetScheme <IMonsterScheme>(x));

                    var monsterScheme = _generatorRandomSource.RollMonsterScheme(availableMonsterSchemes);

                    // первый монстр ходит по маршруту
                    // остальные бродят произвольно
                    if (i == 0)
                    {
                        // генерируем маршрут обхода
                        var startPatrolNode = region.Nodes.First();
                        var endPatrolNode   = region.Nodes.Last();

                        // генерируем моснтра
                        var patrolRoute = new PatrolRoute(startPatrolNode, endPatrolNode);
                        var monster     = CreateMonster(monsterScheme, startPatrolNode, monsterPlayer);
                        sector.PatrolRoutes[monster] = patrolRoute;

                        freeNodes.Remove(monster.Node);
                    }
                    else
                    {
                        var rollIndex   = _generatorRandomSource.RollNodeIndex(freeNodes.Count);
                        var monsterNode = freeNodes[rollIndex];
                        var monster     = CreateMonster(monsterScheme, monsterNode, monsterPlayer);

                        freeNodes.Remove(monster.Node);
                    }
                }
            }
        }
Пример #3
0
        /// <summary>Создаёт монстров в секторе по указанной схеме.</summary>
        /// <param name="sector">Целевой сектор.</param>
        /// <param name="monsterPlayer">Бот, управляющий монстрами. По сути, команда монстров.</param>
        /// <param name="monsterRegions">Регионы сектора, где могут быть монстры.</param>
        /// <param name="sectorScheme">Схема сектора. Отсюда берутся параметры генерации монстров.</param>
        public void CreateMonsters(ISector sector,
                                   IBotPlayer monsterPlayer,
                                   IEnumerable <MapRegion> monsterRegions,
                                   ISectorSubScheme sectorScheme)
        {
            var rarityCounter    = new int[3];
            var rarityMaxCounter = new[] { -1, 10, 1 };

            foreach (var region in monsterRegions)
            {
                var regionNodes           = region.Nodes.OfType <HexNode>().Where(x => !x.IsObstacle);
                var containerNodes        = _propContainerManager.Items.Select(x => x.Node);
                var availableMonsterNodes = regionNodes.Except(containerNodes);

                var freeNodes = new List <IMapNode>(availableMonsterNodes);

                var monsterCount = _generatorRandomSource.RollRegionCount(
                    sectorScheme.MinRegionMonsterCount,
                    sectorScheme.RegionMonsterCount);

                for (int i = 0; i < monsterCount; i++)
                {
                    // если в комнате все места заняты
                    if (!freeNodes.Any())
                    {
                        break;
                    }

                    var currentRarity       = GetMonsterRarity(rarityCounter, rarityMaxCounter);
                    var availableSchemeSids = GetAvailableSchemeSids(sectorScheme, currentRarity);

                    var availableMonsterSchemes = availableSchemeSids.Select(x => _schemeService.GetScheme <IMonsterScheme>(x));

                    var monsterScheme = _generatorRandomSource.RollMonsterScheme(availableMonsterSchemes);

                    //TODO Восстановить патруллирование марштуров позже
                    // первый монстр ходит по маршруту
                    // остальные бродят произвольно
                    //if (i == 0)
                    //{
                    //    // генерируем маршрут обхода
                    //    var startPatrolNode = region.Nodes.First();
                    //    var endPatrolNode = region.Nodes.Last();

                    //    // генерируем моснтра
                    //    var patrolRoute = new PatrolRoute(startPatrolNode, endPatrolNode);
                    //    var monster = CreateMonster(monsterScheme, startPatrolNode, monsterPlayer);
                    //    sector.PatrolRoutes[monster] = patrolRoute;

                    //    freeNodes.Remove(monster.Node);
                    //}
                    //else
                    //{
                    var rollIndex   = _generatorRandomSource.RollNodeIndex(freeNodes.Count);
                    var monsterNode = freeNodes[rollIndex];
                    var monster     = CreateMonster(monsterScheme, monsterNode, monsterPlayer);

                    freeNodes.Remove(monster.Node);
                    //}
                }
            }
        }