MCPcopy Create free account
hub / github.com/OpenStarbound/OpenStarbound / generateMicroDungeons

Method generateMicroDungeons

source/game/StarWorldGeneration.cpp:814–868  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

812}
813
814void 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
870void WorldGenerator::generateCaveLiquid(WorldStorage* worldStorage, ServerTileSectorArray::Sector const& sector) {
871 Set<Vec2I> openNodes = caveLiquidSeeds(worldStorage, sector);

Callers

nothing calls this directly

Calls 15

sectorRegionMethod · 0.80
paddedMethod · 0.80
xMinMethod · 0.80
xMaxMethod · 0.80
yMinMethod · 0.80
yMaxMethod · 0.80
potentialBiomeItemsAtMethod · 0.80
worldTemplateMethod · 0.80
validBiomeItemsMethod · 0.80
seedForMethod · 0.80
modifyServerTileMethod · 0.80

Tested by

no test coverage detected