| 249 | } |
| 250 | |
| 251 | void WorldStorage::generateQueue(Maybe<size_t> sectorGenerationLevelLimit, function<bool(Sector, Sector)> sectorOrdering) { |
| 252 | try { |
| 253 | if (sectorOrdering) { |
| 254 | m_generationQueue.sort([§orOrdering](auto const& a, auto const& b) { |
| 255 | return sectorOrdering(a.first, b.first); |
| 256 | }); |
| 257 | } |
| 258 | |
| 259 | while (!m_generationQueue.empty()) { |
| 260 | if (sectorGenerationLevelLimit && *sectorGenerationLevelLimit == 0) |
| 261 | break; |
| 262 | |
| 263 | auto p = generateSectorToLevel(m_generationQueue.firstKey(), SectorGenerationLevel::Complete, sectorGenerationLevelLimit.value(NPos)); |
| 264 | if (p.first) |
| 265 | m_generationQueue.removeFirst(); |
| 266 | if (sectorGenerationLevelLimit) |
| 267 | *sectorGenerationLevelLimit -= p.second; |
| 268 | } |
| 269 | } catch (std::exception const& e) { |
| 270 | m_db.rollback(); |
| 271 | m_db.close(); |
| 272 | throw WorldStorageException("WorldStorage generation failed while generating from queue", e); |
| 273 | } |
| 274 | } |
| 275 | |
| 276 | void WorldStorage::tick(float dt, String const* worldId) { |
| 277 | try { |