Caves, village forms and biome edges

Research notes for three follow-ups to the geo-world demo (geography.md, settling.md): caves made by the rock instead of by noise, villages whose form comes from their site, and biome edges that blend instead of running straight along world cells. Sources are linked inline. Claims read only in a search-result summary, not on the page, are marked “(via search summary)”. Text marked (inference) is reasoning, not a sourced fact. Timings marked “measured” are from the demo in headless Chrome on the same 2019 Intel i9-9880H laptop the other study pages use.

Caves

How real caves form

Karst. Most solutional caves are in limestone; some are in dolomite, chalk, marble, gypsum and salt. Rain and soil water carry carbonic acid (H₂O + CO₂ → H₂CO₃, then CaCO₃ + H₂CO₃ → Ca²⁺ + 2HCO₃⁻; most of the CO₂ comes from the soil), and the water works along bedding planes, faults and joints until the crevices become caves. Passages below the water table are flooded (Wikipedia, Solutional cave; Wikipedia, Karst). About 20% of the United States is underlain by karst, about 40% of its drinking groundwater comes from karst aquifers, and many spring outlets are cave entrances (NPS, Karst landscapes). Hypogenic caves dissolve from below instead: Carlsbad Caverns and Lechuguilla are thought to have formed from H₂S rising off petroleum, making sulfuric acid (Wikipedia, Solutional cave).

Palmer 1991, “Origin and morphology of limestone caves”, GSA Bulletin 103:1–21 (abstract read; full text not reached) (USF repository; DOI):

How common each pattern is. In Palmer’s sample of about 500 caves: about 57% branchwork, 17% network maze, 14% a single rudimentary passage, 5% ramiform or spongework and 3% anastomotic, matching “within 1% all known caves in the world >3 km long” (quoted by Dom and Wicks 2003, J. Cave and Karst Studies 65(3):155–159, via search summary; the PDF returned 403, and whether the shares are by count or by length wasn’t confirmed) (PDF). Dom and Wicks’s own count of 633 Missouri caves found branchwork at 71.7%, 83.4% and 84.4% in three karst areas, which they put down to point recharge running along bedding-plane partings (abstract).

Mazes form in two settings (Palmer 1975, “The Origin of Maze Caves”, abstract): diffuse recharge, where every fracture gets water and they all grow at similar rates, as under a permeable insoluble caprock or in isolated hills of soluble rock; and floodwater, where water ponds behind constrictions at peak flow and quickly cuts blind fissures and diversion mazes (USF repository).

Levels. Audra and Palmer (2015) sort epigenic caves into juvenile (perched above an impermeable bed), looping (epiphreatic loops from variable recharge), water-table and equilibrium types (abstract). Ford and Ewers’s four-state model ties the depth of phreatic loops to how many fissures the rock has (via search summary) (McMaster). A keyhole passage is a phreatic tube with a vadose trench cut in its floor; cave levels record stands of a base-level river, and Palmer ties Mammoth Cave’s sharp levels to “intermittent episodes of rapid valley entrenchment” of the Green River (via search summary) (Palmer 1987). No primary number for typical passage diameters or gradients was found.

Where they open and drain. Dolines (closed depressions that drain underground), poljes, ponors where surface water sinks, and rivers that sink and rise again: the Ljubljanica, “the river of seven names”, and the Popo Agie, which rises about 800 m down its canyon (Wikipedia, Karst). Sinkholes are usually “tens to hundreds of meters” across and deep, and karst can hold “thousands of sinkholes within a small area” (Wikipedia, Sinkhole). Poljes run 5 to 400 km², flat-floored, and many flood in the wet season because their ponors can’t take the flow (Wikipedia, Polje). The type spring, Fontaine de Vaucluse, is the single outlet of a 1,100 km² basin, about 21 m³/s on average; a robot reached 308 m down its flooded shaft (Wikipedia). So a karst cave runs from many dolines to few springs, and the springs sit at base level: the valley floor, the sea, or the top of an impermeable bed (inference from the above).

Speleothems. “Degassing is the one main cause of calcite deposition”: water entering a cave carries far more CO₂ than the cave air, loses it, and drops calcite. Stalactites often line up along ceiling fractures, stalagmites form where the drops land, flowstone where water runs down walls; the oldest dated stalagmite is about 2.2 million years old (NPS, Great Basin). Degassing needs air, so speleothems belong in the dry (vadose) passages, the abandoned upper levels (inference).

Lava tubes. They start as ankle-to-knee-deep pahoehoe, “inflated” by lava injected into the molten interior to flows a few meters thick; flow concentrates into narrow paths as the rest freezes, and “a river of lava flowing under an insulating crust is a lava tube”; where the roof falls in, it leaves a skylight (USGS). Tubes also form when a channel crusts over from its levees inward. They are up to 15 m wide and 1 to 15 m below the surface; the Mauna Loa 1859 tube reaches the sea about 50 km from its vent, and tubes drain downslope when the supply stops (Wikipedia, Lava tube). Kazumura Cave in Hawaiʻi is 65.5 km long with 1,101 m of vertical extent, in a flow about 500 years old (Wikipedia). So a tube is shallow, follows the surface downslope from a vent, and opens through skylights (inference).

Sea, talus and glacier caves. Waves cut sea caves along weak zones (faults and dikes in igneous rock, bedding planes and contacts in sedimentary rock), helped by compressed air and abrasion; caves facing the prevailing swell grow larger; collapses leave littoral sinkholes and stacks; Norway has raised sea caves over 100 ft above today’s sea (Wikipedia, Sea cave). Talus caves are voids among boulders in scree under cliffs, most likely in competent rock such as granite or gneiss; most are short, but Bodagrottorna runs about 2.6 km (Wikipedia, Talus cave). Glacier caves are melted by water running through or under the ice, often from a moulin to the snout; “ice cave” properly means a bedrock cave that holds ice (Wikipedia, Glacier cave).

How games and tools make caves

System How Notes
Dwarf Fortress CAVERN_LAYER_COUNT 3 by default (not counting the magma sea and bottom layer); per layer, openness 0–100 and passage density 0–100 (low openness and high density give “a maze-like network of small criss-crossing passages”), water 0–100; LEVELS_ABOVE_LAYER_1..5 set the stone between layers (DF wiki) Layers are horizontal and world-wide, not tied to the rock above
Minecraft 1.18 noise caves Cheese caves keep one side of a 3D noise threshold (the largest, with noise pillars); spaghetti caves keep “the edge of black and white”, a band near the threshold; noodle caves are thinner, 1–5 blocks wide. Carver caves, the old “worm” caves, are added after terrain: an ellipsoid room plus trunks and branches thick in the middle, from Y = −56 to 180. Aquifers: 16×12×16 cells, each flooded, partly flooded or dry (Minecraft Wiki, Cave) Per block, no global pass; no relation to drainage
Perlin worms (libnoise) Each worm’s segment angles come from a 3-octave Perlin module sampled along a sliding line (via search summary) (libnoise) The ancestor of carver caves
Noita A biome map image assigns a biome per pixel; each biome is filled with “corner-based herringbone Wang tiles” from Sean Barrett’s stb library, colors standing for materials; a pathfinder checks the result and regenerates if there’s no way through; hand-made pixel scenes go on top (noita.wiki.gg staging page; GDC 2019). Herringbone tiles can be generated in any order and look less grid-like than square Wang tiles (Barrett) Authored tiles, so caves read as designed
Terraria 109 passes in 1.4.4.9, among them “Tunnels”, “Small Holes”, “Dirt Layer Caves”, “Rock Layer Caves”, “Surface Caves” (straight or zig-zag), “Mountain Caves” and “Create Ocean Caves” (Terraria wiki). WorldGen.TileRunner(x, y, strength, steps, type, ...) is a randomly steered blob walk; type −1 carves (tModLoader) Which passes call TileRunner wasn’t confirmed
Spelunky A 4×4 grid of 10×8-tile rooms; the solution path starts in the top row and rolls 1–5 each step (1–2 left, 3–4 right, 5 down); room types 1–3 guarantee exits; 8–16 templates per type, with probabilistic tiles and 5×3 obstacle chunks (Kazemi; part 2) A guaranteed path, not geology
Cellular automata Fill 50% with rock, then n passes of “rock if at least 5 of 8 neighbors are rock”; 0.41 ms per 50×50 in C# (Johnson et al. 2010) Blobby rooms, no direction
Agent diggers Agents “dig paths into a primeval mass of matter” (PCG book, ch. 3, via search summary) (Liapis)  
World Machine, Gaea Classic World Machine is heightfield-only, so no caves (via search summary); build 4059 (2026) adds a vector displacement datatype for “overhangs, undercuts, caves, and proper cliffs” (World Machine). Nothing found for Gaea  
Paris et al. 2021 A gridless anisotropic shortest-path search between given inlets and outlets builds the skeleton, steered by faults, inception horizons, fractures and permeability contrasts; conduits are a signed-distance construction tree with blending and warping (project page) Offline; water-table handling and timings not verified
KarstNSim (Gouy, Collon, Bailly-Comte, Galin et al. 2024) Shortest paths over an anisotropic cost on an n-nearest-neighbor graph; near-vertical conduits in the vadose zone, near-horizontal in the phreatic zone (via search summary) (HAL). Related: anisotropic fast marching in pyKasso (Fandel et al. 2022) and SKS (Borghi et al. 2012) (via search summary) Hydrogeology tools

Every game method in the table makes caves from noise, random walks or templates, with no tie to rock or water; only the hydrogeology tools (Paris, KarstNSim, pyKasso) grow passages from inlets to outlets the way Palmer describes. Their core, a shortest-path tree from springs out to sinkholes over a cost that is cheap along fractures, is a single Dijkstra on a grid, cheap at region size (inference).

What geo-world does now

Village forms

Nucleated and dispersed, rows and agglomerations

German village forms (Dorfformen)

Form Shape What made it
Haufendorf Clustered, irregular “Unplanmäßig angelegt”, laid out without a plan, often with the open-field Gewannflur; many classic forms are “oft nur Sekundärformen”, reshaped later (de.wikipedia, Dorf)
Straßendorf Farmsteads directly on one road at roughly regular intervals, a kind of Reihendorf Planned (colonization) or grown; often at important road junctions (de.wikipedia)
Reihendorf, Hufendorf Farmsteads at “more or less regular intervals” along a road, dike, valley, ridge or stream, one row or two, each with its land behind it Subtypes Hagenhufendorf (Hufen of 20–40 Morgen), Marschhufendorf, Moorhufendorf (strips about 50–800 m wide between ditches), Waldhufendorf (de.wikipedia)
Zeilendorf One row along a path or stream “Geländebedingt”, shaped by the terrain; along rivers often one-sided, the street on the terrace edge above flood level; strips often under 10 m wide after inheritance division (de.wikipedia)
Angerdorf Farmsteads facing a common green, “meist die Form einer Linse oder eines Auges”, lens- or eye-shaped, often with a pond; church, school and smithy added on the green later; barns at the plots’ backs The medieval eastward colonization, on moraine and loess plateaus (de.wikipedia; en.wikipedia)
Platzdorf, Rundling Round a square; the Rundling’s wedge-shaped farmsteads round a round or oval green with “nur einen einzigen Zugang”, one entrance, originally 3 to 10 farms Planned by lords regrouping Slavic settlers, from about 1150; the round shape’s purpose is unexplained (de.wikipedia, Platzdorf; Rundling)
Waldhufendorf Farms along a road “like beads on a chain”, outside the floodplain of the stream on the valley axis; each holding a strip the size of a Hufe running at right angles up to the ridge, forest left at the far end Upland colonization: Erzgebirge, Vogtland, Odenwald (Zotzenbach, 877), the northern Black Forest; chains of villages up to 25 km in Saxon valleys (de.wikipedia; en.wikipedia)
Streusiedlung Single farms “mindestens 100 Meter voneinander entfernt”, at least 100 m apart Spontaneous (irregular) or planned (regular) settlement (de.wikipedia)

Numbers: a Frankish Hufe is 24.2 ha in strips “bis zu fast zweieinhalb Kilometer lange”, up to almost 2.5 km long, with farmsteads about 50 to 100 m apart (de.wikipedia, Hufe); so a Waldhufe strip is roughly 100 to 240 m wide (inference: 24.2 ha over 1 to 2.5 km). After Lienau, a Weiler has 10 to 20 house sites, a small village under 100 (de.wikipedia, Dorf). Regular plans occur only with deliberate planning. Partible inheritance (Realteilung, roughly south of an Aachen–Erfurt line) splits holdings “oft in Form schmaler Streifen”, into narrow strips (de.wikipedia, Realteilung); that it makes Haufendörfer wasn’t confirmed. The French village-rue has buildings “de part et d’autre d’une rue unique”, on plots that are “longues bandes étroites, de la largeur de l’habitation” (fr.wikipedia). Linear villages form along a road, river or canal, or between physical limits such as a coast or a valley; Sułoszowa in Poland has a 9 km main street (Wikipedia, Linear settlement).

Other forms

Generators

What geo-world does now

Roads are laid first, then the village is sited (its score now includes nearness to a road, and to the shore when its world cell is coastal) and its form read from the site (inference: a rule set from the forms above). The world keeps three of its sixteen village places for the best shore sites, since fishing villages never win on arable land. In seeds 4242 and 777 the 32 villages came out as 9 forest strip, 9 hill, 5 street, 4 green, 3 fishing and 2 Anger villages; regions built in 0.09 to 0.33 s, 0.42 s for the first (measured).

Site Form Layout
Sea or lake within 7 tiles Fishing hamlet One row along the shore, facing the water, boats drawn up in front, gardens behind
On a hilltop (most of the ring 5–7 tiles out lies lower) or rough ground Hill village (Haufendorf) Houses packed irregularly on the top terrace round a small square, fields on the slopes below
A road through, woods around Forest strip village (Waldhufendorf) Farms spaced along the road, each with one long strip behind it into the forest
A road along a valley (flat runs further along the road than across it) Street village (Straßendorf) Houses on both sides of the road, each toft with a croft strip behind it
A road through open flats Anger village A lens-shaped green along the road, houses in two rows facing it, open-field strips around
No road, open flats Green village Houses round a round green, open-field furlongs of strips around

Biome edges

Ecotones

How games draw them

System How Numbers
Minecraft before 1.18 A stack of layers. Zoom doubles resolution, each edge child a coin flip between two parents, the diagonal the most common of four; FuzzyZoom picks the diagonal at random; Smooth removes single-cell spikes; the final Voronoi zoom jitters a feature point per 4-block cell by ((rand&1023)-512)*36/10240 blocks, about ±1.8 blocks, and each block takes the nearest point (cubiomes layers.c). Shore and edge layers put a buffer biome between incompatible ones (VanillaGenLayers) Jitter about 0.9 of a cell (inference)
Minecraft 1.18 multi-noise Six climate parameters (temperature, humidity, continentalness, erosion, weirdness, depth); each biome is a box of intervals, and a point outside all of them takes “the closest biome interval” (Minecraft Wiki), so edges follow the contours of smooth noise (inference) Temperature noise’s lowest octave −10, 6 octaves (mcmeta)
Minecraft biome blend A color setting only: grass, foliage and water colors are averaged over a square round each block (Minecraft Wiki, Biome); biomeBlendRadius 0–7, default 2 (Options.txt) 1×1 to 15×15, 5×5 by default
Dwarf Fortress “Biomes are calculated for each region tile… then noise is calculated and applied which causes the irregular region boundaries on the local map”; an embark square is 48×48 tiles (DF wiki) The same problem as geo-world’s: a coarse map shown fine
Terraria Hard edges; oceans at both ends, snow on one side, jungle on the other; the biome the player is in is decided by tile counts in a box round them (snow 1,500, jungle 140) (Terraria wiki)  
Red Blob noisy edges Recursively subdivide each boundary inside the quadrilateral of its two cell centers and two corners, so neighboring edges can’t cross; amplitude 0.25 to 0.5; stop at “a few pixels/tiles” (Red Blob Games)  
Domain warping f(p + h(p)): q = (fbm(p), fbm(p + (5.2, 1.3))); fbm(p + 4q) (Quilez) Strength 4 in the example
Dual-grid autotiles Tiles drawn at a half-cell offset, marching squares on the base cells: 6 tiles with rotation, 16 without, credited to Oskar Stålberg (Boris the Brave); 15 tiles instead of the blob’s 47 (TileMapDual)  
Height-blended splatting ma = max(t1.a + a1, t2.a + a2) − depth, bᵢ = max(tᵢ.a + aᵢ − ma, 0), depth 0.2, so sand fills the cracks between stones instead of a linear fade (Mishkinis 2013)  

What geo-world does now