| 812 | } |
| 813 | |
| 814 | void WorldGenerator::generateMicroDungeons(WorldStorage* worldStorage, ServerTileSectorArray::Sector const& sector) { |
| 815 | auto facade = make_shared<DungeonGeneratorWorld>(m_worldServer, false); |
| 816 | |
| 817 | RectI sectorTiles = worldStorage->tileArray()->sectorRegion(sector); |
| 818 | RectI bounds = sectorTiles.padded(WorldSectorSize - 1); |
| 819 | |
| 820 | List<pair<BiomeItemPlacement, QueuedPlacement*>> placementQueue; |
| 821 | for (int x = sectorTiles.xMin(); x < sectorTiles.xMax(); ++x) { |
| 822 | for (int y = sectorTiles.yMin(); y < sectorTiles.yMax(); ++y) { |
| 823 | auto potential = m_worldServer->worldTemplate()->potentialBiomeItemsAt(x, y); |
| 824 | for (auto const& placement : m_worldServer->worldTemplate()->validBiomeItems(x, y, potential)) |
| 825 | placementQueue.append({placement, {}}); |
| 826 | |
| 827 | for (auto& p : m_queuedPlacements) { |
| 828 | WorldTemplate::PotentialBiomeItems queuedItems; |
| 829 | m_worldServer->worldTemplate()->addPotentialBiomeItems(x, y, queuedItems, p.distributions, BiomePlacementArea::Surface); |
| 830 | m_worldServer->worldTemplate()->addPotentialBiomeItems(x, y, queuedItems, p.distributions, BiomePlacementArea::Underground); |
| 831 | for (auto placement : m_worldServer->worldTemplate()->validBiomeItems(x, y, queuedItems)) |
| 832 | placementQueue.append({std::move(placement), &p}); |
| 833 | } |
| 834 | } |
| 835 | } |
| 836 | |
| 837 | sort(placementQueue); |
| 838 | for (auto const& p : placementQueue) { |
| 839 | auto& placement = p.first; |
| 840 | auto queued = p.second; |
| 841 | if (queued && queued->fulfilled) |
| 842 | continue; |
| 843 | |
| 844 | if (placement.item.is<MicroDungeonNames>()) { |
| 845 | auto seed = m_worldServer->worldTemplate()->seedFor(placement.position[0], placement.position[1]); |
| 846 | auto const& dungeonName = staticRandomFrom(placement.item.get<MicroDungeonNames>(), seed); |
| 847 | Maybe<DungeonId> dungeonId; |
| 848 | starAssert(!dungeonName.empty()); |
| 849 | if (auto generateResult = m_microDungeonFactory->generate(bounds, dungeonName, placement.position, seed, m_worldServer->threatLevel(), facade)) { |
| 850 | if (queued) { |
| 851 | dungeonId = queued->dungeonId; |
| 852 | queued->promise.fulfill(placement.position); |
| 853 | queued->fulfilled = true; |
| 854 | } |
| 855 | for (auto position : generateResult->second) { |
| 856 | if (ServerTile* tile = m_worldServer->modifyServerTile(position)) { |
| 857 | replaceBiomeBlocks(tile); |
| 858 | tile->dungeonId = dungeonId.value(tile->dungeonId); |
| 859 | } |
| 860 | } |
| 861 | } |
| 862 | } |
| 863 | } |
| 864 | |
| 865 | m_queuedPlacements = m_queuedPlacements.filtered([&](QueuedPlacement& p) { |
| 866 | return !p.fulfilled; |
| 867 | }); |
| 868 | } |
| 869 | |
| 870 | void WorldGenerator::generateCaveLiquid(WorldStorage* worldStorage, ServerTileSectorArray::Sector const& sector) { |
| 871 | Set<Vec2I> openNodes = caveLiquidSeeds(worldStorage, sector); |
nothing calls this directly
no test coverage detected