Everything the game does, in plain words.
23 sections
messages/uk.json, es, pt-BR, zh-Hans, de). New text goes in messages/en.json only — other languages fall back
to English on their own. We translate everything in one go right before launch.messages/. Edit the
section files in src/routes/manual/sections/.GAME_DESIGN.md § Survival has every rule; README.md has the tech.Code: src/routes/manual/, messages/en.json, locale-parity.test.ts
The point: get people outside walking — without staring at their phone. The game plays itself while you walk; you open it to eat, cook and plan.
Kept from the old game: chat (now with combat and game lines) and the walking pills (GPS, steps). Everything else from it is hidden — see Leftovers from the old game.
Code: VitalChips.svelte, BackpackButton.svelte, HudFan.svelte, LootDrops.svelte, XpDrops.svelte, land-tap.ts, SurvivalLayer.svelte, ChatFeedPane.svelte, survival-log.ts, say.ts
What fills you up
| Item | Do | Calories | Water | Leaves behind |
|---|---|---|---|---|
| Bottled water | Drink | — | +500 ml | Empty bottle |
| Can of soda | Drink | +140 | +330 ml | — |
| Pot of clean water | Drink | — | +1,000 ml | Cooking pot |
| Bag of chips | Eat | +300 | −50 ml | — |
| Can of beans | Eat | +450 | — | — |
| Protein bar | Eat | +250 | — | — |
| Cooked rat meat | Eat | +250 | — | — |
| Cooked perch | Eat | +300 | — | — |
| Cooked trout | Eat | +450 | — | — |
| Cooked pike | Eat | +650 | — | — |
| Pot of stew | Eat | +600 | +600 ml | Cooking pot |
Can’t be eaten: Raw rat meat, Burnt rat meat, Raw perch, Raw trout, Raw pike, Burnt fish, Pot of raw stew. Cook the raw stuff (see Fire & cooking); burnt food is junk.
Code: vitals.ts, items-food.ts, items-water.ts, advance.ts, PassOutDialog.svelte
What stacks
| Item | Per slot |
|---|---|
| Matches | 1,000 |
| Twine | 20 |
| Purification tablets | 20 |
| Rags | 10 |
| Split log | 2 |
Code: inventory.ts, items.ts, InventorySheet.svelte, slot-gesture.ts, SlotMenu.svelte, ground.service.ts, ground-items-layer.ts
What can be worn
| Item | Worn |
|---|---|
| Rusty hatchet | Either hand |
| Hatchet | Either hand |
| Felling axe | Either hand |
| Fire axe | Either hand |
| Wooden club | Either hand |
| Wooden spear | Either hand |
| Wrapped spear | Either hand |
| Improvised fishing rod | Either hand |
| Fishing rod | Either hand |
| Carbon fishing rod | Either hand |
| Pocket knife | Either hand |
| Bow drill | Either hand |
| Water filter | Either hand |
gear.ts; an item names its slot with wear, a tool says hand. Clothing is content: give an item a slot in
the admin panel and it is wearable. What clothing does is still open.Code: gear.ts, GearSheet.svelte, GearStencil.svelte, SurvivorStats.svelte, items-gear.ts
The kinds
| Kind | Pace | Bite | Attack speed | Hit points | Bare-handed blows | Share |
|---|---|---|---|---|---|---|
| Shambler | 0.6 m/s | 40 kcal | 3 s | 30 | about 3 | 80% |
| Runner | 2 m/s | 25 kcal | 1.5 s | 20 | about 2 | 15% |
| Brute | 0.45 m/s | 120 kcal | 4 s | 80 | about 16 | 5% |
Damage types
| Type | What it does | Weapons | Best against | Weak against |
|---|---|---|---|---|
| Bash | Hits hard and flat | Bare hands, Wooden club | Runner ×1.5 | Brute ×0.5 |
| Stab | Goes in deep | Wooden spear, Wrapped spear | Shambler ×1.25 | Runner ×0.75 |
| Chop | Hacks through | Rusty hatchet, Hatchet, Felling axe, Fire axe | Brute ×1.5 | Runner ×0.75 |
Weapons
| Weapon | Type | Attack speed | Damage |
|---|---|---|---|
| Bare hands | Bash | 1.5 s | 5–15 |
| Rusty hatchet | Chop | 2 s | 10–22 |
| Hatchet | Chop | 1.9 s | 12–24 |
| Felling axe | Chop | 2.6 s | 16–34 |
| Fire axe | Chop | 2.8 s | 20–40 |
| Wooden club | Bash | 2 s | 10–20 |
| Wooden spear | Stab | 1.8 s | 8–16 |
| Wrapped spear | Stab | 1.64 s | 8–16 |
What each kind takes from a blow
| Kind | Bash | Stab | Chop |
|---|---|---|---|
| Shambler | ×1 | ×1.25 | ×1 |
| Runner | ×1.5 | ×0.75 | ×0.75 |
| Brute | ×0.5 | ×1 | ×1.5 |
Code: zombies.ts, spawn.ts, pursuit.ts, fight.ts, zombie-step.ts, zombie-manager.ts
Everything you can find
| Find | From Looting | Also needs | Per find | Weight | Rarity |
|---|---|---|---|---|---|
| Bottled water | 1 | — | 1 | 30 | Common |
| Bag of chips | 1 | — | 1 | 25 | Common |
| Wood | 1 | — | 1 | 25 | Common |
| Raw rat meat | 1 | — | 1 | 20 | Common |
| Twine | 1 | Crafting | 2–4 | 8 | Uncommon |
| Rusty hatchet | 1 | Woodcutting | 1 | 5 | Uncommon |
| Campfire Cooking | 1 | — | 1 | 1.5 | Rare |
| Firestarter's Guide | 1 | — | 1 | 1.5 | Rare |
| Woodcutter's Manual | 1 | — | 1 | 1 | Epic |
| Angler's Almanac | 1 | — | 1 | 1 | Epic |
| Maker's Notebook | 1 | — | 1 | 1 | Epic |
| Scavenger's Handbook | 1 | — | 1 | 0.75 | Epic |
| Matches | 2 | — | 3–8 | 12 | Uncommon |
| Bucket | 3 | — | 1 | 6 | Uncommon |
| Fishing rod | 3 | Fishing | 1 | 3 | Rare |
| Cooking pot | 4 | — | 1 | 5 | Uncommon |
| Can of soda | 5 | — | 1 | 10 | Uncommon |
| Pocket knife | 5 | Crafting | 1 | 2 | Rare |
| Hatchet | 5 | Woodcutting | 1 | 1.5 | Rare |
| Can of beans | 6 | — | 1 | 10 | Uncommon |
| Rags | 6 | Crafting | 1–3 | 5 | Uncommon |
| Protein bar | 8 | — | 1 | 8 | Uncommon |
| Felling axe | 10 | Woodcutting | 1 | 0.5 | Epic |
| Purification tablets | 12 | — | 2–5 | 4 | Rare |
| Carbon fishing rod | 12 | Fishing | 1 | 0.75 | Epic |
| Fire axe | 20 | Woodcutting | 1 | 0.4 | Epic |
Weight is how often it turns up next to everything else you can currently find. Rarity is worked out from the weight and only changes how loud the loot pop is.
Code: loot.ts, looting.ts, foot-traffic.service.ts
Code: BuildingSheet.svelte, ScavengePanel.svelte, building-search.ts, building-about.ts, GET /api/survival/building
The skills
| Skill | How you get it | One action is | Actions an hour | XP an action |
|---|---|---|---|---|
| Looting | Known from day one | a find | 30 | 29.8 |
| Fighting | Known from day one | a kill | 30 | 29.8 |
| Agility | Known from day one | a step | 2,500 | 0.357 |
| Cooking | Read “Campfire Cooking” | a cook | 120 | 7.4 |
| Firemaking | Read “Firestarter's Guide” | a fire lit or fed | 60 | 14.9 |
| Woodcutting | Read “Woodcutter's Manual” | a log | 30 | 29.8 |
| Fishing | Read “Angler's Almanac” | a fish | 30 | 29.8 |
| Crafting | Read “Maker's Notebook” | a thing made | 15 | 59.5 |
XP an action = XP an hour ÷ actions an hour XP_TARGET_HOURS_TO_MAX or a skill’s actions an hour. There’s no per-action XP number to edit.Each skill you know is one bar: your level on its badge, the XP still to go printed on it, and what the next level brings waiting at its far end (just the number when that level brings nothing new). Skills you haven’t learned yet stand as books on a shelf below. Tap a bar or a book for its guide: XP banked, about how much play the next level takes, how to train it, what its level does outside its own job (Agility’s attack speed), and every level that unlocks something — ticked when you have it. Before you know a skill, it tells you which book teaches it.
Code: skills.ts, xp-curve.ts, walking.ts, skill-guide.ts, SkillsSheet.svelte, SkillDetailSheet.svelte
Book prize for a skill you know
| Chance | Prize | XP |
|---|---|---|
| 70% | 1 h of play | 893 |
| 22% | 3 h of play | 2,678 |
| 7% | 8 h of play | 7,142 |
| 1% | 40 h of play (jackpot) | 35,711 |
Books come from looting — see the Looting table for which ones and how rare.
Code: config/survival/reading.ts, shared/survival/reading.ts, ReadingBanner.svelte
fail chance = at 1 + (at 99 − at 1) × (level − 1) ÷ 98 progression.test.ts). Add a
recipe in the recipes-*.ts file for what it makes.Code: interactions.ts, interact.ts, recipes-*.ts, progression.test.ts
Fire recipes
| Use | On | Needs | You get | Fails |
|---|---|---|---|---|
| Matches | Wood (either order) | Firemaking 1 | Lights a fire (3 min) | 50% → 2% at 99; wastes Matches + Wood |
| Wood | The fire | Firemaking 10 | +3 min of fire | Never |
| Bow drill | Wood (either order) | Firemaking 20 | Lights a fire (3 min); keeps the bow drill | 58% → 10% at 99; wastes Wood |
Cooking recipes
| Use | On | Needs | You get | Fails |
|---|---|---|---|---|
| Raw rat meat | The fire | Cooking 1 | Cooked rat meat | 60% → 3% at 99; leaves Burnt rat meat |
| Raw perch | The fire | Cooking 1 | Cooked perch | 60% → 3% at 99; leaves Burnt fish |
| Raw trout | The fire | Cooking 15 | Cooked trout | 61% → 5% at 99; leaves Burnt fish |
| Raw rat meat | Pot of clean water (either order) | Cooking 20 | Pot of raw stew | Never |
| Raw perch | Pot of clean water (either order) | Cooking 20 | Pot of raw stew | Never |
| Pot of raw stew | The fire | Cooking 20 | Pot of stew | 57% → 5% at 99; leaves Cooking pot |
| Raw pike | The fire | Cooking 30 | Cooked pike | 59% → 8% at 99; leaves Burnt fish |
Code: recipes-fire.ts, recipes-food.ts, world.ts (STATIONS), FireTarget.svelte
Drinking gives the container back, so the loop never ends. The first bottle you refill is usually a bottled water you found and drank.
Water recipes
| Use | On | Needs | You get | Fails |
|---|---|---|---|---|
| Bucket | Water nearby | — | Bucket of dirty water | Never |
| Empty bottle | Water nearby | — | Bottle of dirty water | Never |
| Bucket of dirty water | Cooking pot (either order) | — | Bucket + Pot of dirty water | Never |
| Pot of dirty water | The fire | — | Pot of clean water | Never |
| Purification tablets | Bottle of dirty water (either order) | — | Bottled water | Never |
| Bottle of dirty water | Water filter (either order) | — | Bottled water; keeps the water filter | Never |
Code: recipes-water.ts, items-water.ts
Crafting recipes
| Use | On | Needs | You get | Fails |
|---|---|---|---|---|
| Twine | Wood (either order) | Crafting 1 | Improvised fishing rod | Never |
| Rusty hatchet | Wood (either order) | Crafting 1 | 2 × Split log; keeps the rusty hatchet | Never |
| Hatchet | Wood (either order) | Crafting 1 | 2 × Split log; keeps the hatchet | Never |
| Felling axe | Wood (either order) | Crafting 1 | 2 × Split log; keeps the felling axe | Never |
| Fire axe | Wood (either order) | Crafting 1 | 2 × Split log; keeps the fire axe | Never |
| Rags | Split log (either order) | Crafting 1 | Wooden club | Never |
| Rusty hatchet | Split log (either order) | Crafting 5 | Wooden spear; keeps the rusty hatchet | Never |
| Hatchet | Split log (either order) | Crafting 5 | Wooden spear; keeps the hatchet | Never |
| Pocket knife | Wood (either order) | Crafting 10 | Bow drill; keeps the pocket knife | Never |
| Rags | Wooden spear (either order) | Crafting 15 | Wrapped spear | Never |
| Rags | Empty bottle (either order) | Crafting 20 | Water filter | Never |
Code: recipes-crafting.ts, items-gear.ts
chance = base(level) × tool × weather × length Why short runs win (level 1, first tool, everything else ×1)
| Length | Length factor | One run gives | Same time in 10 min runs |
|---|---|---|---|
| 10 min | ×1 | 2 | 2 |
| 30 min | ×0.58 | 3.5 | 6 |
| 1 h | ×0.41 | 4.9 | 12 |
| 2 h | ×0.29 | 6.9 | 24 |
| 4 h | ×0.2 | 9.8 | 48 |
| 8 h | ×0.14 | 13.9 | 96 |
Each log or fish pays one action of XP. While a job runs, a marker stands over where it’s happening — the building, or the trees or water you tapped — with the job at work, a rim that fills up and the time left. Stop it from the backpack (a scavenge from the building’s card too); you keep what it made. The phone refreshes the moment it ends, so the next one can start at once.
Code: activities.ts, activity.ts, activity-odds.ts, ActivitySheet.svelte, ActivityBanner.svelte, ActivityMarker.svelte
chance = base × hatchet × tree × stand × weather × length Hatchets — you swing the best one your level allows
| Hatchet | Power | Needs | Where from |
|---|---|---|---|
| Rusty hatchet | ×1 | Woodcutting 1 | Loot, from Looting 1 |
| Hatchet | ×1.25 | Woodcutting 10 | Loot, from Looting 5 |
| Felling axe | ×1.5 | Woodcutting 30 | Loot, from Looting 10 |
| Fire axe | ×1.75 | Woodcutting 45 | Loot, from Looting 20 |
Tree land — the kind that covers most of your circle counts
| Land | Wood factor | Chance a 14 m patch holds a tree |
|---|---|---|
| Forest | ×1.2 | 70% |
| Woodland | ×1.2 | 70% |
| Nature reserve | ×1.1 | 18% |
| Park | ×1 | 25% |
| Orchard | ×0.9 | 50% |
| Garden | ×0.8 | 35% |
| Dog park | ×0.8 | 15% |
| Scrub | ×0.6 | 40% |
| Meadow | ×0.5 | 6% |
0.5 + 0.2 × log2(1 + trees), never more than ×1.3: ×0.7 for one tree, ×1.02
at five,
×1.3 at fifteen.
Trees are counted from the map’s land, not the drawn trees: how much of your circle each land covers, times how thickly it’s wooded — the same odds the 3D map plants its trees with.
Code: config/survival/woodcutting.ts, shared/survival/woodcutting.ts, tree-stand.ts
chance = base × rod × weather × length Rods — you use the best one your level allows
| Rod | Power | Needs | Where from |
|---|---|---|---|
| Improvised fishing rod | ×1 | Fishing 1 | Made at Crafting 1 |
| Fishing rod | ×1.25 | Fishing 5 | Loot, from Looting 3 |
| Carbon fishing rod | ×1.5 | Fishing 30 | Loot, from Looting 12 |
What bites
| Fish | Bites from | Weight | Cooked gives |
|---|---|---|---|
| Raw perch | Fishing 1 | 60 | +300 kcal (Cooking 1) |
| Raw trout | Fishing 15 | 30 | +450 kcal (Cooking 15) |
| Raw pike | Fishing 30 | 15 | +650 kcal (Cooking 30) |
Code: fishing.ts, activities.ts
chance = base(level) × size × length Size — bigger floors, more finds a minute
| Floor | Size × |
|---|---|
| 100 m² | ×0.7 |
| 400 m² | ×0.96 |
| 1,500 m² | ×1.3 |
| 5,000 m² | ×1.3 |
What each kind of place leans to (× on the loot table's weights; anything unlisted ×1)
| Place | Categories | Items |
|---|---|---|
| Home | — | — |
| Store | food ×2.5, drink ×2.5, container ×1.5, tool ×1.5, material ×1.2 | Wood ×0.3, Raw rat meat ×0.5 |
| Eatery | food ×2.5, drink ×2, container ×2.5 | Matches ×2, Raw rat meat ×2, Wood ×0.5 |
| Pharmacy | tool ×0.3, book ×0.5 | Purification tablets ×8, Rags ×3, Bottled water ×1.5, Protein bar ×2 |
| Library | book ×4, food ×0.5, drink ×0.5, tool ×0.5, material ×0.5, container ×0.5 | — |
| Workshop | tool ×3, material ×3, container ×1.5, food ×0.3, drink ×0.5 | Matches ×2, Purification tablets ×0.3 |
| Hall | book ×1.5, drink ×1.2 | Wood ×0.5 |
Why short runs win (Looting 1, size ×1)
| Length | Length factor | One run gives | Same time in 10 min runs |
|---|---|---|---|
| 10 min | ×1 | 2 | 2 |
| 30 min | ×0.58 | 3.5 | 6 |
| 1 h | ×0.41 | 4.9 | 12 |
| 2 h | ×0.29 | 6.9 | 24 |
| 4 h | ×0.2 | 9.8 | 48 |
| 8 h | ×0.14 | 13.9 | 96 |
Code: scavenge.ts, scavenge.service.ts, ScavengePanel.svelte, activities.ts
| Tap | Opens | Needs |
|---|---|---|
| Trees | The woodcutting timer | Woodcutting, a hatchet your level can swing, a free slot, no job running |
| Water | The fishing timer, or a sheet with Go fishing and Fill bucket / Fill bottle when you carry an empty one | To fish: Fishing, a rod your level can use, a free slot, no job running. To fill: an empty bucket or bottle |
| Stuff on the ground | Picks it up | You can tell what it is, and all of it fits (see Backpack) |
| A building | Its sheet, with the scavenge rows (see Scavenging) | To look: nothing, from any distance. To scavenge: in reach, a free slot, no job running |
The real sky over you, read by the server — never by your phone. Very strong wind turns any sky into a storm. If the weather can’t be read, nothing changes. It’s locked in when a job starts.
Weather against each job
| Sky | Woodcutting | Fishing |
|---|---|---|
| Clear sky | ×1.1 | ×0.9 |
| Cloudy | ×1 | ×1.1 |
| Fog | ×0.9 | ×1 |
| Drizzle | ×0.9 | ×1.2 |
| Rain | ×0.75 | ×1 |
| Snow | ×0.7 | ×0.8 |
| Storm | ×0.5 | ×0.5 |
| Weather unknown | ×1 | ×1 |
Code: world.ts, land-tap.ts, world-targets.ts, WaterSheet.svelte, survival-weather.ts
src/lib/shared/survival/. A pure function of (state,
command, time, dice): no database, no clock, no Math.random.src/lib/shared/config/survival/. Every item, recipe, loot
entry, tool, fish and number. Change the game here.survival.service.ts locks the survivor’s row, runs the engine,
saves, then fires hooks. Dice are crypto-random.GET /api/survival (state now), POST /api/survival (one command: move, drop, act, use, stopReading, startActivity, stopActivity, ackPassOut), GET /api/survival/building, GET /api/survival/weather. A refusal is
a 200 with a rejected code, because time still passed.lootBatch).survivors and survivor_skills. Every save
bumps a version; the phone keeps the newest reply, whatever order they land in.SurvivalEvent. Server: onSurvivalEvent(type, fn) runs after commit. Phone: survival.onEvents(fn). Plug new mechanics in there, or add an effect type in effects.ts.survival-store.svelte.ts holds the state and burns the bars
down between replies.Want to change…
| This | Edit |
|---|---|
| Bars, burn rate, wake-up snack | vitals.ts |
| Items, stack sizes, eat/drink values | items.ts + items-water/food/gear.ts |
| Loot odds and level gates | loot.ts |
| Recipes | recipes-fire/food/water/crafting.ts |
| Skills and XP pace | skills.ts |
| Book length and prizes | reading.ts |
| Timed jobs, tools, catches | activities.ts, woodcutting.ts, fishing.ts |
| Fire length, tree land, weather kinds | world.ts |
progression.test.ts — no dead ends: every item has a source, every skill trains from
1.engine.test.ts, recipes.test.ts, fishing.test.ts and friends
next to the engine.tests/integration/ground, npm run ground).src/routes/manual/lib/.legacy-features.ts.legacy-hud.ts.Heads-up: GAME_DESIGN.md below its Survival section still describes the old game.
Git history here starts on 2026-10-17; the old game’s history lives in the walkstreet repo.
Code: legacy-features.ts, legacy-hud.ts, GAME_DESIGN.md § Legacy Features
Open work and its priority live in docs/BACKLOG.md.
Code: docs/BACKLOG.md, GAME_DESIGN.md § Survival