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:
- Time. The longer the run, the faster the Maw chews. That's
pressure_growth_per_day, capped atpressure_max. - 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).
- 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.json→astrolabe, 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.json → maw |
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.json → maw |
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.json → maw |
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.json → maw |
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.json → maw |
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.json → maw |
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.json → maw |
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.json → maw |
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.json → maw |
[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.json → maw |
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.json → maw |
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.json → maw |
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.json → maw |
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.json → maw |
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.json → maw |
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.json → maw |
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.json → maw |
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.json → maw |
10.0 |
Average in-game days between surges. | Higher = rarer. Lower = frequent lunges and a much twitchier threat. |
light_surge_min_days |
balance.json → maw |
3.0 |
Earliest the first surge can fire. | Higher = a safer early game. |
light_surge_boost_seconds |
balance.json → maw |
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.json → maw |
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.json → maw |
450.0 |
Within this many pixels of the base, the threat reads at least "near". |
threat_critical_distance |
balance.json → maw |
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):
- Weak materials (
base_chew_resistanceunder 2.0) learn fast then flatten, saturating around 40 units eaten. - Strong materials learn slowly at first then accelerate, and tougher ones take proportionally more exposure to cap.
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:
base_chew_rate(1.0) — the master multiplier under everything else. Nudge by 0.05, never by 1.0.pressure_growth_per_day(0.04) — compounds daily and multiplies with the Astrolabe stack. A change that looks tiny on day 5 is enormous by day 50. Move it in steps of 0.01 and test a long run.grace_period(360.0) andramp_duration(90.0) — these are the entire opening. Cut grace too far and new players get overrun before they've built anything.free_advance_rate(8.0) — how punishing a gap in the wall is. Raise it and open ground turns lethal fast. Note it is also multiplied by the Astrolabe stack, so in a deep-ritual run the Maw crosses open ground very fast indeed.
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.json → astrolabe).