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); } }
/// <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); } } } }
/// <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); //} } } }