The Levers That Matter Most

Doing a balance pass and only want to touch a few things? Touch these. It's the roughly ten highest-impact knobs in Underroot, the ones that move the whole difficulty curve. Every value here lives in a data/*.json file, so these are true tuning edits, not code changes, and each wants the validate-and-smoke pass afterwards (The Safe Change Workflow).

In plain terms

Most of the game's feel comes from a handful of levers: how soon the Maw wakes and how fast it grows, how long a day is, how fast supplies drain, how much cushion the player can bank, how good the villager economy is, and how hard the deep game gets. Nudge them gently. Several compound, so a 10% change can feel like much more.

Values below are the current defaults, copied from the data files. A multiplier scales a base value; a tile is one 32px world cell.


The Maw: how fast the clock runs

The Maw is the run timer. These knobs set how much runway the player gets and how fast it burns off.

Setting Where it lives Default What it controls Turn it up / down
grace_period balance.jsonmaw 360.0 Seconds before the Maw moves at all — the opening breather. Same value as one full day. Higher = a longer safe setup window; lower = immediate pressure. The single biggest lever on early-game feel.
pressure_growth_per_day balance.jsonmaw 0.04 How fast the Maw's hunger escalates each day. Pressure = 1 + this × days, capped at pressure_max. Higher = the mid/late game tightens much faster. This compounds — small changes hit hard.
base_chew_rate balance.jsonmaw 1.0 The baseline speed the Maw chews through walls, before escalation and adaptation multiply it. Higher = every wall buys less time at all depths. A flat difficulty shift across the whole run.
chew_increase_base balance.jsonastrolabe 0.08 The floor growth rate each Ritual applies to the Maw's permanent chew stack. Every ritual multiplies the stack by 1 + increase. The dominant late-game lever. It compounds and is uncapped, so it is raised to a power across a run — see the care note below.

pressure_max (balance.json → maw, default 5.0) is the ceiling those escalation multipliers climb toward. Raise it only if you want very long runs to keep getting harder past the current cap.

Why the Ritual knob is on this list. Pressure caps at ×5 and familiarity caps at ×3 per material — both flatten. The Astrolabe stack does neither: it compounds per ritual with no ceiling, reaching ×351 after twelve most-expensive rituals against a combined pressure-and-familiarity ceiling of ×15. In any deep-ritual run it is the term that decides the difficulty. The three sibling keys (chew_increase_volume 0.18, chew_increase_discovery_min 0.22, chew_increase_discovery_max 0.37) shape the spread between cautious and greedy play. Full Maw detail lives in Maw Threat and Escalation; the ritual curve and its calibration anchor are in The Astrolabe Consequence Curve.


Time: the length of a day

Setting Where it lives Default What it controls Turn it up / down
day_duration balance.jsontime 360.0 Seconds in one game-day. Nearly everything paces off this: village daily ticks, per-day drain, pressure growth, weather cadence. Higher = the whole game slows down and each day's costs spread over more real time; lower = everything accelerates. A global tempo dial — change it last and test widely.

Survival: how fast the larder empties

How fast the player-carried food and water bars fall, and how much the player can stockpile. Village population drains from a separate pool (see below).

Setting Where it lives Default What it controls Turn it up / down
food_drain_per_second balance.jsonsurvival 0.04 Base food drain per second for the digger. Higher = tighter supply pressure; lower = supplies feel generous.
water_drain_per_second balance.jsonsurvival 0.04 Base water drain per second. Same as food; the two are usually tuned together.
work_mult balance.jsonsurvival 2.0 Drain multiplier while actively working (digging/gathering). Higher = active play burns supplies faster, pushing rest-vs-work tension.
idle_mult balance.jsonsurvival 0.15 Drain multiplier while the window is idle/unfocused — the core idle-game throttle. Higher = offline/idle costs more; lower = the game is kinder while away.
storage_cap balance.jsonsurvival 500.0 Maximum food or water the player can bank. Higher = players can hoard a bigger safety buffer against storms and bad stretches; lower = forces steadier resupply. A key lever on how forgiving the run feels.

Village-side consumption (food_per_person_per_day 0.15, water_per_person_per_day 0.11, both in balance.json → village) scales drain with population, worth a look on the same pass. Full detail in Survival and Supply Drain.


The economy: how good the villager trades are

The villager economy is priced off Value-Points, but two efficiency knobs decide how much the player actually gets back.

Setting Where it lives Default What it controls Turn it up / down
basic_efficiency balance.jsontrading 0.45 How much value the player recovers on ordinary material-for-supply trades. Below 1.0, trading always loses value — it is a convenience, not a profit. Higher = trading becomes a stronger supply source; lower = players must self-supply.
astrolabe_efficiency balance.jsontrading 0.85 The improved exchange rate after the Astrolabe/Ritual is active. The gap between this and basic_efficiency is the reward for progressing. Widen it to make the Ritual feel more transformative.

See the full trade tables in The Villager Economy.


Village scale and progression gates

Setting Where it lives Default What it controls Turn it up / down
base_population balance.jsonvillage 47 Starting village size on a normal run. Sets baseline consumption and the scale everything else is measured against. Higher = more mouths to feed from turn one; lower = a leaner start.
artificer_population balance.jsonvillage 120 Population threshold that unlocks the Artificer specialist. Higher = the Artificer arrives later, gating its content behind more growth; lower = players reach it sooner. A progression gate, not a difficulty dial.

building_milestones (balance.json → village, [63, 85, 113, 137, 167, 213, 263, 321, 376]) are the population thresholds that unlock each bell building — the spine of village progression. See Village Buildings.


Task feed: what work the village asks for

Villager tasks come from projects.json. The lever that shapes the whole feed is per-task spawn weight.

Setting Where it lives Default What it controls Turn it up / down
spawn_weight projects.json → each task Absent = 1.0; explicit values range 0.30.9 How likely a given task is to appear, relative to others. Tasks with no spawn_weight field default to weight 1.0 (the most common). Epic tasks sit at 0.3 (rare); many mid/deep tasks at 0.70.9. Raise a task's weight to surface it more often; lower it to make it a rare event. Also gated by min_depth/max_depth, so weight only matters once a task is eligible.

Full task-tuning rules (ask budgets, reward pools, the reward-must-not-match-ask rule) are in Villager Tasks and Projects.


Skills and classes: the passive power curve

Six use-trained skills each grant a live percentage bonus, and each run's chosen class champions one of them. Three knob families here move the whole system. All live in balance.json → skills; full detail in Skills, Classes, and Handicaps.

Setting Where it lives Default What it controls Turn it up / down
node_pct balance.jsonskills [0.04, 0.10, 0.18, 0.30, 0.45, 0.60, 0.75] The cumulative bonus at each of the 7 skill nodes. The whole power budget of the system — every dig-speed, craft-speed, yield, trade, wall, and growth bonus reads off this vector. Raise the top values to make trained skills (and champions) stronger; flatten them to make the system cosmetic. Keep it strictly increasing.
anchors balance.jsonskills {digging 4000, foraging 500, crafting 800, building 20000, population 80, trading 60} The node-5 XP for each skill — the clean single-number lever on how long each skill takes to climb. Halve an anchor and its skill maxes twice as fast; double it to slow the climb. Tune per skill.
champion_fill_mult + cap gap balance.jsonskills 2.0; non-champion caps node 5 (+45%), champion reaches node 7 (+75%) The class identity lever: how much better a champion is at its calling than anyone else who trains that skill. The champion fills at 2× rate and climbs two nodes higher. Widen (raise top node_pct, raise fill) to make class choice matter; narrow to make classes near-interchangeable.

Two more skill knobs sit just below this tier: inherit_factor (0.5 — how much skill XP an heir keeps on a lineage death) and the six per-class handicaps in class_info.<class>.handicap.mults (each class's small downside; want ±0.10, no more). The six node-5 capstone perks (Rich Veins, Beloved, Silver Tongue, …) are code constants, not JSON — see the skills page.


Safe to change / handle with care