| 1334 | } |
| 1335 | |
| 1336 | bool VeinGenerator::place_orphan(t_veinkey key, int size, GeoLayer *from) |
| 1337 | { |
| 1338 | std::map<int, VeinExtent::PVec> best; |
| 1339 | |
| 1340 | for (auto it = biomes.begin(); it != biomes.end(); ++it) |
| 1341 | { |
| 1342 | auto &layers = it->second->layers; |
| 1343 | |
| 1344 | for (size_t i = 0; i < layers.size(); i++) |
| 1345 | { |
| 1346 | if (layers[i]->mineral_tiles >= layers[i]->unmined_tiles) |
| 1347 | continue; |
| 1348 | |
| 1349 | VeinExtent::Ptr vein = map_find(layers[i]->veins, key); |
| 1350 | if (!vein) |
| 1351 | continue; |
| 1352 | |
| 1353 | int dist = std::min( |
| 1354 | layers[i]->min_z() - from->max_z(), |
| 1355 | from->min_z() - layers[i]->max_z() |
| 1356 | ); |
| 1357 | |
| 1358 | best[std::max(0, dist)].push_back(vein); |
| 1359 | } |
| 1360 | } |
| 1361 | |
| 1362 | if (best.empty()) |
| 1363 | { |
| 1364 | WARN(process,out).print( |
| 1365 | "Could not place orphaned vein {} {} anywhere.\n", |
| 1366 | MaterialInfo(0,key.first).getToken(), |
| 1367 | ENUM_KEY_STR(inclusion_type, key.second) |
| 1368 | ); |
| 1369 | |
| 1370 | return true; |
| 1371 | } |
| 1372 | |
| 1373 | for (auto it = best.begin(); size > 0 && it != best.end(); ++it) |
| 1374 | { |
| 1375 | auto &vec = it->second; |
| 1376 | |
| 1377 | int free = 0; |
| 1378 | for (size_t i = 0; i < vec.size(); i++) |
| 1379 | { |
| 1380 | auto layer = vec[i]->layers[0]; |
| 1381 | free += layer->unmined_tiles - layer->mineral_tiles; |
| 1382 | } |
| 1383 | float coeff = float(size)/free; |
| 1384 | |
| 1385 | for (size_t i = 0; i < vec.size(); i++) |
| 1386 | { |
| 1387 | auto layer = vec[i]->layers[0]; |
| 1388 | int cfree = std::max(0, layer->unmined_tiles - layer->mineral_tiles); |
| 1389 | int cnt = std::min(size, std::min(cfree, int(ceilf(cfree*coeff)))); |
| 1390 | vec[i]->add_tiles(cnt); |
| 1391 | layer->mineral_tiles += cnt; |
| 1392 | size -= cnt; |
| 1393 | } |