Maw Threat and Escalation

The Maw is your difficulty dial. It's the creature that grinds toward the village and ends the run if it breaks through, and everything about how hard it pushes lives in the maw block of balance.json. This page lists every knob, its current value, and what changing it does to a run. A couple of these numbers are safe to play with; one or two will quietly wreck a playtest, and those are flagged.

Every value here is read once at startup by MawController. Each has a fallback baked into the script, but that only kicks in if the key is missing — so the JSON is always the real dial.

How does the threat grow?

The Maw starts far to the right (start_x) and sits still for a while (grace_period). Then it eases up to full speed over a short window (ramp_duration) and starts moving — chewing through any wall in front of it, or crawling across open ground at free_advance_rate where there's no wall.

On top of that steady march, three things make it hungrier the longer a run runs. They multiply together, so they compound:

  1. Time. The longer the run, the faster the Maw chews. That's pressure_growth_per_day, capped at pressure_max.
  2. Familiarity. The more of a material it eats, the faster it eats that material next time. This one's tuned in code, not here (details below).
  3. The Astrolabe. Each end-game ritual permanently multiplies the chew rate — the ritual stack compounds and has no ceiling, so it is the only one of the three forces that keeps growing without limit. Tuned in balance.jsonastrolabe, on its own page.

If you're new to the term: a "multiplier" is just a number the chew speed gets multiplied by. 1.0 is no change, 2.0 is twice as fast, 0.5 is half. A wall that takes an hour to chew early on can fall in a fraction of that once all three stack up.

The core threat values

Setting Where it lives Default What it controls Turn it up / down
start_x balance.jsonmaw 620.0 How far right (in world pixels) the Maw begins. The base is near x=0, so this is roughly its head start. Higher = starts further away, more opening breathing room. Lower = pressure arrives sooner.
chew_offset balance.jsonmaw 75.0 Pixel gap between the Maw's body and the tile it actually chews. Matches the art (MawDisplay). Leave it unless the mouth visually misaligns with the wall it's eating.
grace_period balance.jsonmaw 360.0 Seconds at the start of a run where the Maw doesn't move at all. At day_duration 360, that's one full day. Higher = longer safe setup. Lower = the run gets dangerous right away. Big lever for the new-player experience.
ramp_duration balance.jsonmaw 90.0 Seconds after grace over which the Maw eases from stopped to full speed. Higher = gentler onset. Lower = it snaps to full speed the instant grace ends.
free_advance_rate balance.jsonmaw 8.0 Pixels per second the Maw crawls across open ground. One tile is 32 px, so this is a quarter-tile per second. Higher = gaps in the wall are far more dangerous. Lower = walls matter less and travel time dominates.
base_chew_rate balance.jsonmaw 1.0 The Maw's baseline wall-eating speed before any escalation, familiarity, or resistance. Every other multiplier sits on top of this one. Small changes scale the whole threat. The single most sensitive knob — nudge by 0.05–0.1, not whole numbers.

Time pressure

Pressure is a multiplier that starts at 1.0 and climbs steadily as the run goes on, which is what makes a fortified wall line buy time instead of removing the threat for good. It runs off a separate "hunger clock" that only ticks at full speed while the game window is focused (it slows to the idle rate when the game is backgrounded or closed), so escalation is mostly an active-play thing.

The formula: pressure = 1.0 + pressure_growth_per_day × days_elapsed, capped at pressure_max.

Setting Where it lives Default What it controls Turn it up / down
pressure_growth_per_day balance.jsonmaw 0.04 How much the chew-speed multiplier grows per in-game day. At 0.04, the Maw chews 40% faster after 10 days (×1.4) and twice as fast after 25 (×2.0). Higher = a harder time limit; the threat never plateaus. This compounds — adjust in steps of 0.01 and test a long run.
pressure_max balance.jsonmaw 5.0 The ceiling pressure can reach. At default growth, hitting it takes 100 days. Higher = late runs can escalate further before flattening. Lower = a firm difficulty ceiling.

Hunger step thresholds

Setting Where it lives Default What it controls
hunger_step_thresholds balance.jsonmaw [1.25, 1.5, 2.0, 2.5, 3.0, 4.0, 4.5] The total-hunger multipliers that each fire a one-time "the Maw grows hungrier" toast as a run escalates.

"Total hunger" here means the time-pressure multiplier times the Astrolabe stack — familiarity doesn't count toward these. Each time that combined number crosses the next value in the list, the player gets one warning. The crossed step is saved, so a warning never repeats and none replay after an offline session. These are notification breakpoints only; they don't change how fast the Maw actually chews. Move them to reshape where the "this is getting scary" beats land, and keep the list in ascending order.

These are a pre-Astrolabe readout by design. The list tops out at 4.5, which a run crosses on time pressure alone by roughly day 90 — and the first ritual clears the whole list at once. That is intentional: these beats teach the early escalation, and once the player is firing rituals the "Hunger ×N" figure in the threat panel is the live readout that matters. Don't extend the list to chase the post-ritual numbers.

Repel, breach, and stun

A root-bound wall throws the Maw back and stuns it. When the Maw does reach the base, it gets stunned too — that's the lineage hand-off, not an instant loss.

Setting Where it lives Default What it controls Turn it up / down
repel_pushback balance.jsonmaw 200.0 Pixels a root-bound wall shoves the Maw back when it fires. Higher = each root trigger buys more distance. Lower = roots feel weaker.
repel_stun balance.jsonmaw 30.0 Seconds the Maw sits stunned after a root repel. Note: the live game currently sources the actual stun from the Astrolabe bounce system; this is the baseline. Higher = a repel is a bigger reprieve.
breach_stun balance.jsonmaw 9.0 Seconds every front is stunned after a breach, giving the successor a beat before the Maw resumes. Higher = gentler post-breach recovery.
root_trigger_delay balance.jsonmaw 3.0 Seconds an actively-chewed bound wall waits before firing its root. Higher = roots are slower to snap. Lower = near-instant defense.
root_fire_hp_pct balance.jsonmaw 0.10 The HP fraction at which a root-bound wall fires. It triggers with a sliver still standing (10% of max HP), not at zero, so the player sees the root throw the Maw back before the wall dies. Higher = roots fire earlier (wall more intact). Lower = they wait until the wall is nearly gone.

Breach debris

After the Maw breaks through and retreats, it leaves half-eaten wall columns in the corridor so the successor has something to chew instead of a clear run.

Setting Where it lives Default What it controls Turn it up / down
breach_debris_count balance.jsonmaw 3 How many partial wall columns are left standing in the corridor after a breach. Set to 0 to turn debris off. Higher = more speed bumps for the successor. Lower / 0 = open ground after a breach.
breach_debris_hp_min balance.jsonmaw 0.4 Lowest HP fraction a debris column spawns at (40% of full). Raise both min and max for sturdier debris.
breach_debris_hp_max balance.jsonmaw 0.6 Highest HP fraction a debris column spawns at (60% of full).

Light surge

The light surge is a random forward lunge: the Maw suddenly eats a whole column and speeds up for a moment. The timing is exponential, so surges are unpredictable but average out to a set cadence.

Setting Where it lives Default What it controls Turn it up / down
light_surge_mean_days balance.jsonmaw 10.0 Average in-game days between surges. Higher = rarer. Lower = frequent lunges and a much twitchier threat.
light_surge_min_days balance.jsonmaw 3.0 Earliest the first surge can fire. Higher = a safer early game.
light_surge_boost_seconds balance.jsonmaw 25.0 How long the speed boost lasts after a lunge (when a root wall doesn't absorb it). Higher = a surge stays dangerous longer.
light_surge_boost_mult balance.jsonmaw 1.5 Speed multiplier during that boost (50% faster). Higher = surges hit much harder.

Threat display distances

These only affect how the threat readout colors the danger — the top-right panel on the classic HUD, or the Maw's carved bar on the talisman HUD (both use the same thresholds). They don't change the Maw's behavior. (The readout also flips to "critical" whenever a breach is under 60 minutes away or a single unbound column is all that's left, regardless of these.)

Setting Where it lives Default What it controls
threat_near_distance balance.jsonmaw 450.0 Within this many pixels of the base, the threat reads at least "near".
threat_critical_distance balance.jsonmaw 150.0 The closeness band for the readout. Closeness alone won't force "critical" if the player has walls buying time.

Familiarity (tuned in code, not here)

Familiarity is the second escalation force, and it's the one thing on this page you can't tune from balance.json — its curve constants live in MawAdaptation. It's here so you know what's stacking on top of pressure.

Every unit the Maw eats teaches it that material. The chew multiplier for that material climbs from 1.0 toward a cap of 3.0 — a fully-learned material gets eaten three times as fast. The curve depends on the material's base_chew_resistance (set per material in materials.json):

The lever you do have over familiarity is each material's base_chew_resistance in materials.json (see the Materials page). Familiarity is shared across all Maw fronts and credited per unit, so a 9-unit wall stack teaches nine times what a single mound does. One practical consequence worth knowing: building the same material over and over makes it steadily cheaper for the Maw to eat, so variety in the wall line is a genuine defensive strategy — not just a cosmetic choice.

How the three forces combine

The actual chew rate against a wall material works out to:

base_chew_rate
  × pressure (time)
  × familiarity (per material, up to ×3)
  ÷ that material's base_chew_resistance
  × Astrolabe chew stack

Because these multiply rather than add, escalation runs away from you late in a heavily-ritualed, familiar-material run — the Maw can eat many times faster than base_chew_rate alone suggests. So when you're balancing, change one force at a time and re-check. The product is what the player actually feels.

Two of the three forces flatten out: pressure caps at pressure_max (5.0, around day 100) and familiarity caps at ×3 per material. The Astrolabe stack does not. It compounds per ritual and has no ceiling, so in a deep-ritual run it is the term that dominates everything else — at twelve most-expensive rituals it alone reaches ×351, against a combined pressure-and-familiarity ceiling of ×15. If a late-run threat number looks impossible, check the ritual count first.

Handle with care

Four knobs do the most damage when mishandled:

Two related dials live elsewhere and feed the same chew-rate math: base_chew_resistance (per material, in materials.json) and the Astrolabe stack (balance.jsonastrolabe).