Black Sea map -- data sources and attribution ============================================= Built by mapgen.py (with mapgen_continent.py) from configs/blacksea.json on 2026-10-09. Every input is public and needs no account or key. Rebuilt from open data in Front+ 1.0.6 in place of the OpenFront map of the same name (CC BY-SA); nothing of that map is used except its size, the shape it was fitted to (see Geometry) and its nations' names, flags and spawn places. Datasets used ------------- Land Natural Earth 1:10m Physical Vectors, PUBLIC DOMAIN (https://www.naturalearthdata.com, 'Made with Natural Earth'; no permission needed). Downloaded from https://naciscdn.org/naturalearth/10m/physical/.zip ne_10m_land (version 5.1.1, 6836 polygon parts), ne_10m_minor_islands (version 4.1.0, 8 polygon parts): every land polygon in the map's box is land (no country is cut out). Lakes Natural Earth 1:10m (ne_10m_lakes, ne_10m_lakes_europe), public domain. Rivers Natural Earth 1:10m ne_10m_rivers_lake_centerlines (version 5.0.0), public domain. Elevation ETOPO 2022 Global Relief Model v1, ice surface elevation, NOAA National Centers for Environmental Information. PUBLIC DOMAIN (a work of the U.S. Government; NOAA: "freely available to use for all private, academic, or commercial purposes"). From https://www.ncei.noaa.gov/products/etopo-global-relief-model, files: ETOPO_2022_v1_15s_N45E015_surface.tif, ETOPO_2022_v1_15s_N45E030_surface.tif, ETOPO_2022_v1_15s_N60E015_surface.tif, ETOPO_2022_v1_15s_N60E030_surface.tif (15 arc-second cells). Cite as: NOAA National Centers for Environmental Information. 2022: ETOPO 2022 15 Arc-Second Global Relief Model. NOAA National Centers for Environmental Information. DOI: 10.25921/fd45-gt74. ETOPO 2022's land elevation is built from, among others, Copernicus DEM 30 m, credited by NOAA's User Guide as: The European Space Agency. Copernicus DEM - Global and European Digital Elevation Model (COP-DEM); and FABDEM (Hawker et al. 2022, Environmental Research Letters 17(2), 024016, doi:10.1088/1748-9326/ac4d4f). Geometry -------- Projection +proj=eqc +lat_ts=43.8281 +lon_0=36.2500 +ellps=WGS84 +units=m +no_defs (pyproj 3.8.0) equirectangular (plate carree) with true scale along 43.8 N: the projection the old map fits best (fit_old.py). Not conformal: a tile is 1062.9 m tall everywhere and 1062.9 m wide at 43.8 N, 2.4% narrower on the ground at 38.7 N and 3.5% wider at 49.2 N (cos 38.7 / cos 43.8 and cos 49.2 / cos 43.8), as on the old map; the game treats tiles as square, so no aspect correction is used. Fitted by fit_old.py to the old map's land (its map16x.bin): the eqc projection and box under which Natural Earth's land, rasterised on the old grid, best matches the old land: intersection over union 0.9191 at 16x (0.9741 with the old map's one-tile river channels counted as land). Grid 1500 x 1100 tiles at 1062.9 m/tile (1594.4 x 1169.2 km), the old map's size Origin tile (x,y) covers E = -916669.3 + 1062.9*x, N = 5451278.8 - 1062.9*y Latitude row 0 = 49.2 N, last row = 38.7 N (crates/of_app/src/view.rs latitude_range: "blacksea" => (49.2, 38.7)), set in the config: the centre column (a row is a parallel in this projection). Centre column (49.2, 38.7): off by 0.00 deg on average over the land (0.00 at worst); least squares (49.2, 38.7): 0.00 deg (0.00 at worst). Coastline Natural Earth's outline refined by ETOPO 2022: a tile is land when at least half of its ETOPO cells are above 0 m (2.29 to ~2.3 cells across a tile), within 3 km of Natural Earth's coast inside the land and within 40 km of it out at sea (the small islands Natural Earth leaves out); deeper inland Natural Earth decides. ETOPO made 3,183 tiles land that Natural Earth has as sea and 3,082 the other way. Elevation curve magnitude = round(curve(u)), clamped 0..31, where e is the tile's mean ETOPO elevation (area average of its cells) and u = e + 1*(e - gaussian(e, sigma = 4 tiles)), the blur taken over land only so the sea does not drag the coast down. The curve is the auto_bands fit (--tune) on the sharpened field u: half the land below 214 m is Plains, 17% above 1304 m is Mountain, and the top segment runs to the highest u so peaks are not clamped. The mask (+1 over a 4-tile sigma, 4.3 km) is the --tune row whose slope is nearest 0.6 with rock under 12%: 0.61 and 9.1%. Measured alternatives: +2 over 2 tiles 0.63 / 9.8%; +2 over 4 tiles 0.77 / 15.0%; no mask 0.45 / 4.7%; Switzerland's own recipe (120 m per step, +2) makes the map 80% Plains with a slope of 0.43; 60 m per step, +1, 0.57 / 16.5% rock. curve: piecewise-linear [[0.0, 0.0], [213.6, 9.5], [1304.4, 19.5], [4871.3, 31.0]]. Result: mean slope 0.613 magnitude steps/tile, 9.14% rock, bands 50.0% Plains / 33.0% Highland / 17.0% Mountain, mean magnitude 10.18 (Switzerland 0.62 / 8.8% / 51-34-15 / 11.10, Britannia 0.67 / 12.4% / 39-53-9 / 10.12, measured the same way by validate_map.py). map4x / map16x: slope 0.766 / 1.038, rock 12.43% / 19.19%. Water magnitude OpenFront's convention: min(ceil(d/2), 31), d = Manhattan distance from the shoreline water. Lake policy Natural Earth lakes are lakes; a lake that touches the map's edge, the sea or a river that reaches the sea is ocean. A lake under 40 tiles at full res (45.2 km2), 10 at 4x or 3 at 16x is filled back to land at the ground height. Island policy land bodies under 2 tiles at full resolution are dropped; every island that survives the downsample is kept at 4x and 16x. Downsampling map4x / map16x: plurality vote of each 2x2 block (a 2-2 tie goes to the side with the larger sub-tile land fraction); sea cut off by the vote is reconnected along its real channel; then the small-body cleanup above. 16x is built from 4x. Carved channel tiles: 4x 42, 16x 20. River policy Natural Earth centre lines (all) burnt as water: every tile whose centre is within 0.71 tile of the line (1.5 km wide at full resolution), and burnt again from the same lines into map4x and map16x (half width 0.71 tile) after the plurality vote, so each river is one continuous 4-connected channel at every resolution. A river that reaches the sea is ocean, so boats can use it. A river end short of other water by <= 10 tiles is extended to it. The old map had river water: 20,127 tiles of one- and two-tile channels at full detail, open to the sea, at all three resolutions. The same rivers are burnt here from Natural Earth's centre lines with scalerank <= 9, the cut whose lines best match the old channels (fit_old.py: 11,959 tiles, 83% of them within 3 tiles of an old channel, 59% of the old channels within 3 tiles of one), one tile wide. Straits kept open: Bosporus, Dardanelles: the strait's centre line (traced on ETOPO's cells below sea level) burnt as water like a river, at every detail. Climate (climate.bin) --------------------- Source Beck, H.E., N.E. Zimmermann, T.R. McVicar, N. Vergopolan, A. Berg, E.F. Wood: Present and future Koppen-Geiger climate classification maps at 1-km resolution, Scientific Data 5, 180214 (2018), doi:10.1038/sdata.2018.214. Data: figshare, doi:10.6084/m9.figshare.6396959 (Beck_KG_V1.zip, no login), Beck_KG_V1_present_0p0083.tif (present day, 1980-2016, ~1 km). Licence CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/): attribution required; the classes were turned into moisture values and reprojected (changes made). Grid the map16x grid, 375 x 275: one byte per 16x tile, 0 = driest, 255 = wettest, on the terrain shader's own moisture scale (x 255). Method each Koppen class -> a moisture (table below); reprojected with the map's projection, each 16x tile the area average of the 1 km cells in it; the sea and the neighbours (water on this map) take the nearest own land's value; Gaussian smoothing, sigma 8 km (1.9 tiles of 4.25 km). Classes BWh, BWk 0.06; BSh, BSk 0.28; Csa 0.34; Dsa 0.40; Csb, Csc, Dsb 0.46; Dsc, Dsd 0.48; Aw, ET, EF 0.50; Cwa, Cwb, Cwc, Dwa, Dfa 0.52; Cfb, Cfc, Dwb, Dwc, Dwd, Dfb 0.53; Dfc, Dfd 0.58; Cfa 0.60; Am 0.66; Af 0.76. The shader's temperate ladder: desert under 0.22, steppe to 0.33, grass to 0.56, forest above; in hot country savanna from 0.24, grass from 0.45, jungle above 0.56. Tundra and snow come from the temperature. Land the largest classes by 16x land tile: BSk 27%, Dfb 25%, Dfa 20%, Dsb 9%, Csa 5%, Cfa 5%, Dfc 3%, Cfb 2%, Dsa 1%, Csb 1%. As the temperate ladder reads it: desert 0.1%, steppe 23.7%, grass 71.4%, forest 4.8% (before the shader's noise, heat and altitude). Colour (colour.jpg) ------------------- Source the ESA WorldCover Sentinel-2 median L2A (RGBNIR) composite of 2021, v200 (the ESA WorldCover project; made by the ESA WorldCover consortium from Copernicus Sentinel-2 data), its true-colour bands B04, B03 and B02 (the NIR band not used): one cloud-optimised GeoTIFF a 1 x 1 degree cell in the open-data bucket https://esa-worldcover-s2.s3.eu-central-1.amazonaws.com/rgbnir/2021//ESA_WorldCover_10m_2021_v200__S2RGBNIR.tif, read at its overview level 4 (750 pixels a degree), only that level, by range requests (Front+ 1.0.9 step s02, 16 October 2026; every piece in mapdata/DOWNLOADS.txt). 227 cells used; of the cells under the land and its one-tile ring 0 the bucket does not have (open sea) and 0 are missing. Licence CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/); the terms: https://esa-worldcover.org/en/data-access ("provided free of charge, without restriction of use"). Attribution © ESA WorldCover project / Contains modified Copernicus Sentinel data (2021) processed by ESA WorldCover consortium Grid the full map grid, 1500 x 1100: RGB, 8 bits a channel, sRGB, one texel a tile (1.063 km in the map's projection); JPEG, quality 90. Changed the source pixels averaged in blocks of 3 x 3 (2.4 x 3.3 of them a texel, north-south x east-west, at the land's middle), reprojected with the map's projection onto its grid, each texel the area average of the pixels in it in linear light (reflectance); water left out by the map's own land mask, and within 2 tiles of the map's own water also the imagery's own water (dark and blue pixels); clouds left out under the game's snow line (mean reflectance over 1.50 and spread under 0.05 of the mean; 0 texels touched); the 1,606 land texels with no data or mostly left-out pixels filled from the land round them, every texel that is not land from the nearest land texel; the tone: 1.6 x reflectance, to the power 0.9, highlights rolled off above 0.6, the colours 1.45 x as far from grey, exposure 1. Built 2026-10-16 (mapgen_imagery.py). Land mean colour 112, 108, 85 (sRGB), spread 23 / 15 / 16; 16 of 1,182,351 land texels had no source pixel with data (0.00%). Game the terrain shader takes the land's base colour from this instead of its biome palette, under its own light, relief shading, territory tint, borders, haze, snow and water, while the Realistic look is on (the Settings switch is the default for every map; each map can change it on the Singleplayer page; off, it draws the palette). Land a match raises where this map has sea keeps the palette. Nations ------- The old map's nine nations, with their names and flags exactly as its manifest had them and in its order. Each spawn is the lon/lat of the old spawn tile on the fitted grid (the same tile, since the grid keeps the old size and fits its shape), snapped to the nearest tile that is land at all three resolutions, on the landmass of the land nearest that point, off the 16x coast where one is within 8 tiles more. Circassia is the historic region in the north-west Caucasus, at its old spot. Bulgaria bg ( 122, 647) the old map's spawn (122, 647) on the fitted grid; snapped 0 tiles Turkiye tr ( 513, 929) the old map's spawn (513, 929) on the fitted grid; snapped 0 tiles Romania ro ( 123, 237) the old map's spawn (123, 237) on the fitted grid; snapped 0 tiles Moldova md ( 300, 188) the old map's spawn (300, 188) on the fitted grid; snapped 0 tiles Ukraine ua ( 737, 120) the old map's spawn (737, 120) on the fitted grid; snapped 0 tiles Russia ru (1180, 354) the old map's spawn (1180, 354) on the fitted grid; snapped 0 tiles Georgia ge (1362, 722) the old map's spawn (1362, 722) on the fitted grid; snapped 0 tiles Armenia am (1382, 943) the old map's spawn (1382, 943) on the fitted grid; snapped 0 tiles Circassia Circassia (1115, 555) the old map's spawn (1115, 555) on the fitted grid; snapped 0 tiles