示例#1
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);
                }
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }