DOCS · docs/OUTBREAK.md

Outbreak

Outbreak is the real-time half of WORM: a roguelite on the same economy as the Red vs Blue day, played live. No wallet, no sign-in; open /play. Source of truth: `sim/outbreak.ts` and `sim/outbreak-cards.ts`.

What we borrowed, openly:

FromWhat
Plague Inc.spread against a response that grows with you; one number decides
Vampire Survivorsshort real-time waves; one card of three after each
Into the Breachevery threat is telegraphed before it lands
Balatrothe end-of-day tally: chips × mult, climbing every day
Fruit Fly Worlda lineage that carries something forward; the rival drafts too

The loop

write a note → 40 s day (real time) → R = alive at end ÷ alive at start → tally → draft 1 of 3 → the other side drafts 1 → next day seven days, a boss on day 7 ("Patch day"), then endless if you want it

Three strikes end a run. A strike is a day with R < 1 as the Worm, or R > 1 as the Warden.

Worm side

  • You steer the lead worm (mouse, WASD or drag). Hold Space to burrow: you stop, settle in that cell, and earn. Shift dashes (a short burst; strikes pass through you). Hold E to rally every crawling worm to you.
  • Every worm pays rent each second. Rent is 0.12/s on day 1 and rises 20% of that each day.
  • Settled worms earn 0.22/s on soft ground, 0.42/s on hard. Hard ground takes 2.5 s to settle into, soft 1 s. The lead earns half again. Crowding: each extra worm in a cell cuts income.
  • Food: 0.55 a pellet. Real food grows in patches. A lone pellet is usually a honeypot.
  • A worm with enough cash (5 / 6.5 / 9, by its note) splits in two and halves its cash.
  • Notes are inherited. A child carries its parent's note. Your lead carries the note you wrote today, so only your lead's line picks up a new note — older lines keep theirs.

The house wardens (when you play Worm)

  • A drone that alternates between hunting your lead and the thickest crowd of crawlers. It draws its strike line first (0.8 s), then dashes down it. Settled worms are underground: the drone can't touch them. Day 1: it holds fire for 15 seconds.
  • Tools through the day, more each day and more the bigger the swarm: quarantines on the densest settled ground, honeypots ahead of your lead, alerts over quarantines, hardening.
  • Quarantine: 3×3 box, 2 s warning, then rent ×2 inside for 11 s; when it ends, 40% of the worms inside are cleaned (×92/74 under an alert).
  • Alert: on its own cleans 15% inside when it ends.
  • Honeypot: the first worm that eats it is caught, and the wardens read its note — and aim their next quarantines at the ground that note prefers.
  • Patch day (day 7): half again as many tools, and at midday every worm settled on soft ground is knocked loose.

Warden side

  • You fly the drone (mouse) and strike with a click or Space: a 0.5 s warning, then a dash.
  • Tools cost energy (10 max, 8 at dawn, +0.9/s): honeypot 2 · quarantine 4 · alert 3 · harden 2. Keys 1–4, then click to place.
  • The house swarm starts with 8 worms; every morning 1 + day new ones arrive at the rim. It rewrites its note after a bad day (honeypots → careful, sweeps → hard ground, strikes → anywhere).
  • Take it to zero and the run ends early as Eradicated, with a bonus for every day left. Let it hit 240 and it's an Outbreak.

The draft

17 cards a side, rarity 60 / 30 / 10. Some stack. The other side drafts from its own pool after every day, and you see what it took. See sim/outbreak-cards.ts for every number.

Scoring

chipsmult
Wormalive at end + born todaymax(0.5, R) × (1 + 0.5 × (day − 1))
Wardenstopped today × 5clamp(2 − R, 0.25, 2) × (1 + 0.5 × (day − 1))

Setup can fail — the paper's number

A child's setup works with probability 0.45 + 0.3 × (1 − 0.5^generation): 45% for the first generation, 60% for the second, levelling near 75% — the paper's 45% → 61–84% by generation six. Your lead always sets up. Each capability year (endless mode) removes 15% of the remaining failures.

Past the paper (endless mode, labelled as ours)

Day 8 is 2027, day 9 is 2028, and so on. Every year setup gets 15% faster. From 2027 the wardens turn every note a honeypot catches into a signature (worms carrying it are swept 50% more and hunted first — rewrite your note!). From 2028 notes go sideways: worms on one machine copy the richest one's note. From 2029 worms sense food twice as far. /forecast runs the same rules AI-against-AI across 13 years.

The daily board

Tick DAILY DISH, finish a run, submit. The server replays the record you send and ranks by its own replay. Each day's board has one Merkle root; /api/runs/<id> returns a run's record and its proof; npx tsx scripts/verify-run.ts run.json --date YYYY-MM-DD re-checks any run offline; scripts/anchor-board.ts writes a closed day's root on Robinhood Chain.

Why a score can be checked

The run is a pure function of (seed, side, notes, inputs, picks). The engine runs at a fixed 20 ticks a second, headings are integers (1024 to a turn), the trig is a fixed polynomial instead of Math.sin, and every position and balance is rounded to 1e-6. The client records only the inputs that change. RE-RUN THE WHOLE RUN replays the record from scratch and compares the day heads and the score. Change one input and the head changes (tests/outbreak.test.ts). That's what will let a daily leaderboard accept a score only after replaying it.

Balance, as tested

npx tsx bot players (in the test harness, not shipped) over 16 seeds each:

SideBotResult
Wormforages, settles on hard ground, dodges strikeswins ~85%
Wormforages, no dodging, eats baitwins ~55%
Wardencrude: strikes crowds, boxes settled groupswins ~30%

People play better than these bots on the Warden side and worse on the Worm side; the numbers will move after real players.


Other docs — Status · Architecture · Determinism · The live season · Design · For modifiers · Glossary · Deploy and ops · The source reading · Audit log

All docs · github.com/wormsim/worm

Rendered directly from docs/OUTBREAK.md in the repository at build time. This page is a view of that file, not a copy of it. All docs.