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); } } }
private SectorNode RollAndBindBiome() { var rolledLocationScheme = _biomeSchemeRoller.Roll(); var biome = new Biome(rolledLocationScheme); var startSectorScheme = biome.LocationScheme.SectorLevels.Single(x => x.IsStart); var newBiomeSector = new SectorNode(biome, startSectorScheme); return(newBiomeSector); }
private async Task CreateAndAddSectorByScheme(IBiome biome, ISectorSubScheme startSectorScheme) { var sectorNode = new SectorNode(biome, startSectorScheme); // Важно генерировать соседние узлы до начала генерации сектора, // чтобы знать переходы из сектора. biome.AddNode(sectorNode); CreateNextSectorNodes(sectorNode, biome); var sector = await _sectorGenerator.GenerateAsync(sectorNode).ConfigureAwait(false); sectorNode.MaterializeSector(sector); }