| 1234 | } |
| 1235 | |
| 1236 | MapExtras::MapCache::MapCache() |
| 1237 | { |
| 1238 | valid = 0; |
| 1239 | Maps::getSize(x_bmax, y_bmax, z_max); |
| 1240 | x_tmax = x_bmax*16; y_tmax = y_bmax*16; |
| 1241 | std::vector<df::coord2d> geoidx; |
| 1242 | std::vector<std::vector<int16_t> > layer_mats; |
| 1243 | validgeo = Maps::ReadGeology(&layer_mats, &geoidx); |
| 1244 | valid = true; |
| 1245 | |
| 1246 | if (auto data = df::global::world->world_data) |
| 1247 | { |
| 1248 | for (size_t i = 0; i < data->midmap_data.region_details.size(); i++) |
| 1249 | { |
| 1250 | auto info = data->midmap_data.region_details[i]; |
| 1251 | region_details[info->pos] = info; |
| 1252 | } |
| 1253 | } |
| 1254 | |
| 1255 | biomes.resize(layer_mats.size()); |
| 1256 | |
| 1257 | for (size_t i = 0; i < layer_mats.size(); i++) |
| 1258 | { |
| 1259 | biomes[i].pos = geoidx[i]; |
| 1260 | biomes[i].biome = Maps::getRegionBiome(geoidx[i]); |
| 1261 | biomes[i].details = region_details[geoidx[i]]; |
| 1262 | |
| 1263 | biomes[i].geo_index = biomes[i].biome ? biomes[i].biome->geo_index : -1; |
| 1264 | biomes[i].geobiome = df::world_geo_biome::find(biomes[i].geo_index); |
| 1265 | |
| 1266 | biomes[i].lava_stone = -1; |
| 1267 | biomes[i].default_soil = -1; |
| 1268 | biomes[i].default_stone = -1; |
| 1269 | |
| 1270 | if (biomes[i].details) |
| 1271 | biomes[i].lava_stone = biomes[i].details->lava_stone; |
| 1272 | |
| 1273 | memset(biomes[i].layer_stone, -1, sizeof(biomes[i].layer_stone)); |
| 1274 | |
| 1275 | for (size_t j = 0; j < std::min<size_t>(BiomeInfo::MAX_LAYERS,layer_mats[i].size()); j++) |
| 1276 | { |
| 1277 | biomes[i].layer_stone[j] = layer_mats[i][j]; |
| 1278 | |
| 1279 | auto raw = df::inorganic_raw::find(layer_mats[i][j]); |
| 1280 | if (!raw) |
| 1281 | continue; |
| 1282 | |
| 1283 | bool is_soil = raw->flags.is_set(inorganic_flags::SOIL_ANY); |
| 1284 | if (is_soil) |
| 1285 | biomes[i].default_soil = layer_mats[i][j]; |
| 1286 | else if (biomes[i].default_stone == -1) |
| 1287 | biomes[i].default_stone = layer_mats[i][j]; |
| 1288 | } |
| 1289 | |
| 1290 | while (layer_mats[i].size() < 16) |
| 1291 | layer_mats[i].push_back(-1); |
| 1292 | } |
| 1293 | } |