Layers and Progression Pacing

Depth is how Underroot gates content. The underground is a stack of bands, each one a main material with a small chance of rarer ores mixed in, and how deep the player has to dig sets what they can make. Time paces the rest: the length of a day decides how much escalation the player buys with every dig. The bands live in layers.json; the day length is balance.jsontimeday_duration. DataRegistry reads the bands at startup, and LayerGenerator uses them to decide what material fills each undug tile.

In plain terms: depth is progression

The surface is depth 0. Digging goes downward into positive depth, counted in tiles (one tile is 32 px). As the digger descends, the ground shifts from dirt to clay to stone and on down to quartz. Each band is defined by a depth_start and depth_end (inclusive, in tiles), a main_material filling most of it, and an optional ore_inclusions list of rarer materials scattered through it.

Tools, recipes, and defensive walls all depend on which materials the player can reach, which makes the depth table the main progression gate. Push a material deeper and it becomes a later-game resource; pull it shallower and the player gets it sooner. Recipes unlock once the player has seen all their input materials, so where a material first appears sets when its whole downstream tech opens up.

Between bands sits a blend zone. Near the bottom of a band, tiles start mixing in the next band's material with rising probability, so the boundary feels gradual instead of a hard line. That's the blend_depth field — the number of tiles at the bottom of the band where blending happens. It's a feel knob, not a progression gate.

The depth bands (top to bottom)

Depths are in tiles. "Ore inclusions" lists each scattered material with its per-tile chance (a chance of 0.09 means roughly 9% of that band's tiles).

Band (display name) Depth start–end Main material Ore inclusions (chance)
Surface / Roots 0 – 2 dirt none
Dirt 3 – 12 dirt none
Clay 13 – 26 clay ancient_clay (0.004)
Stone 27 – 51 stone coal (0.09)
Shale / Coal 52 – 76 coal sulfur (0.03)
Iron-Rich Rock 77 – 112 iron_ore coal (0.10)
Dense Stone 113 – 140 dense_stone prismatic_shard (0.003)
Copper-Tin Ore 141 – 200 dense_stone tin_ore (0.40), copper_ore (0.40), prismatic_shard (0.003)
Limestone 201 – 232 limestone sulfur (0.03), ancient_clay (0.004)
Deep Coal 233 – 262 deep_coal ember_essence (0.001)
Quartz 263 – 342 quartz dense_stone (0.20), void_iron (0.004), ember_essence (0.002)

A few things to read from this table when tuning:

The fields on each band

Field What it controls
depth_start / depth_end The inclusive tile range the band occupies. This is the progression gate — it decides at what depth a material appears.
main_material The material that fills most tiles in the band. Two bands may share a main material (Copper-Tin reuses dense_stone) and differ only by their inclusions.
ore_inclusions Optional list of {material, chance} scattered through the band. Chance is per tile, rolled cumulatively. Controls how rich and how surprising a band feels.
blend_depth How many tiles at the bottom of the band gradually mix in the next band's material, softening the boundary. A feel knob, not a gate. Set to 0 for a hard edge (Quartz uses 0).
color_hex, display_name, description Presentation only — the band's tint, name, and flavor text. No gameplay effect.

Pacing in time: day duration

Setting Where it lives Default What it controls Turn it up / down
day_duration balance.jsontime 360.0 The length of one in-game day in real seconds (6 minutes). This is the master time unit the whole game paces off. Higher = everything time-based slows down. Lower = the whole run compresses. High-impact — see below.

day_duration isn't just the day/night cosmetic. It's the denominator for most time-based systems, so changing it re-times the entire game at once:

So much reads off day_duration that you should treat it as a global pacing dial, not a local tweak. Change it and re-check the Maw and survival feel afterward.

The shape of the curve

Read together, the depth table and the day length draw the run's difficulty curve:

Two coarse dials shift the overall pace: the band depths in layers.json (how far the player must dig to reach each tier) and day_duration in balance.json (how much real time each day of escalation costs). Material toughness (terrain_hp, base_chew_resistance) and tool power fine-tune within that frame and are tuned on their own pages.

Safe to change / handle with care